这几天老师布置了一个课程设计题目:采用51单片机控制的DS18B20温度检测系统。大概花了我一个礼拜的时间,幸好我的C语言学得还可以,最后还是让我搞出来了,真是高兴,我是采用STC-52单片机和DS18B20数字温度传感器做的一个温度检测系统:实现的主要功能是:能够通过按键设置报警温度,报警温度分为上限温度和下限温度,就是说当温度超过上限温度和下限温度时蜂鸣器就会报警,同时流水灯开始流动。并且由于温度的上下限是写入到DS18B20的ROM中,所以断电之后还是可以保存上次设定的温度上下限值,系统缺陷是开机时由于温度检测装置还未开始工作,会显示85度(默认值),之后就会显示正确的温度,整个程序采用中断显示温度和按键扫描中断程序,检测温度是否超过报警上下限值的函数也放在中断显示温度服务程序中。

下面是流程图:

部分程序如下:(完整的程序我上传到我的CSDN资源中,是免费的。链接http://download.csdn.net/detail/zhulike2011/5627441

/*****************************************************************************/

模块名:基于DS18B20的数字温度计

创建人:  lecco

VERSION:rick  1.0.1  beta

功能描述:本模块采用DALLS公司的单线数字温度传感器DS18B20,抗干扰能力强,便

于远距离测量,因而得到了广泛应用。

功能要求:采用按键设置上下限温度报警值,按确认键生效当温度超过预警值就会发出

蜂鸣声,用STC89C51控制DS18B20,读取数据,并对DS18B20转换后的数据

管显示,最高位为符号位,如果温度值为正,不显示,如果温度为负,则显示 。

温度支持范围:  -50℃  ~ 125℃

/*****************************************************************************/

#include <reg51.h>

#include <helloDemo.h>

#include <intrins.h>

unsigned char tx[10]={0};

unsigned char code table1[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,

0xf8,0x80,0x90};

/*****************************************************************************/

void Delay(int num)//延时函数

{

while(num--) ;

}

/*****************************************************************************/

void Delaynms(unsigned int di) //延时

{

unsigned int da,db;

for(da=0;da<di;da++)

for(db=0;db<100;db++);

}

/*****************************************************************************/

void Init_DS18B20(void)//初始化ds18b20

{

unsigned char x=0;

DQ = 1;    //DQ复位

Delay(8);  //稍做延时

DQ = 0;    //单片机将DQ拉低

Delay(80); //精确延时 大于 480us

DQ = 1;    //拉高总线

Delay(14);

x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

Delay(20);

}

/*****************************************************************************/

unsigned char ReadOneChar(void)//读一个字节

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{

DQ = 0; // 给脉冲信号

dat>>=1;

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80;

Delay(4);

}

return(dat);

}

/*****************************************************************************/

void WriteOneChar(unsigned char dat)//写一个字节

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

Delay(2);

DQ = 1;

dat>>=1;

}

}

/*****************************************************************************/

void ReadTemperature(void)//读取温度和报警温度上下限TH、TL值

{

unsigned char a=0;

unsigned char b=0;

unsigned char Data_L=0;  //用来存放小数部分的温度值

unsigned char num=0;

unsigned int  temp=0;  //临时存放负数温度值

Init_DS18B20();

Delay(20);

WriteOneChar(0xCC); // 跳过读序号列号的操作

Delay(20);

WriteOneChar(0x44); // 启动温度转换

Delay(20);

Init_DS18B20();

Delay(20);

WriteOneChar(0xCC); //跳过读序号列号的操作

Delay(20);

WriteOneChar(0xBE); //读取温度寄存器

Delay(20);

a    =   ReadOneChar();  //读低8位

b    =   ReadOneChar(); //读高8位

Delay(20);

tx[4]=  ReadOneChar();  //报警温度TH

tx[5]=   ReadOneChar();  //报警温度TL

temp =  b*256+a;

temp = temp * 0.625 + 0.5; //0.0625扩大10倍显示1位小数,若显示两位小数则扩大100倍为6.25

tx[2]= temp /1000;     //温度的百位

tx[1]=temp %1000/100 ;  //温度的十位

tx[0]=temp %100/10;  //温度的个位

//读取温度正负值

if((b&0xf8)!=0x00){

tx[6]=1;  //温度值是负数的标志位

//temp为补码,需要减一求反得原码

temp  = ( b * 256 ) + a;

temp  = ~temp + 1;

tx[1] = temp % 1000 / 100;  //温度的十位

tx[0] = temp % 100  / 10;  //温度的个位

}

tx[6]=0;

Data_L=a&0X0F;

tx[3]=table1[Data_L];

}

/*****************************************************************************/

void Display_SMG(void)

{

unsigned char a;

for(a=0;a<=50;a++)

{  //如果得到的温度是负数就显示符号

if(tx[6]==1){

P0=0xbf;

led1 = 0;

Delaynms(4);

led1 = 1;   }

if(tx[2]>0){

P0=table[tx[2]];

led1 = 0;

Delaynms(4);

led1 = 1;  }

P0=table[tx[1]];

led2 = 0;

Delaynms(4);

led2 = 1;

P0=(table[tx[0]])&0x7f;

led3 = 0;

Delaynms(4);

led3 = 1;

P0=table[tx[3]];

led4 = 0;

Delaynms(4);

led4 = 1;

}

}

/*****************************************************************************/

void beep()

{

unsigned char i=0;

if(((tx[1]*10+tx[0])>(tx[4])||(((tx[1]*10+tx[0])==(tx[4]))&&(tx[3]>tx[7]-1)))&&(tx[9]==5))

{

P1=_cror_(P1,1);

WAV=~WAV;

Delaynms(35);    }       if((tx[6]==1)&&((((tx[1]*10+tx[0])>(tx[5]))||(((tx[1]*10+tx[0])==(tx[5]))&&(tx[3]>tx[8]-1)))&&(tx[9]==5)))

{           P1=_crol_(P1,1); WAV=~WAV;Delaynms(35);  }   }

/*****************************************************************************/

void main(void)

{

TMOD=0x11;  //T1,T0均工作于方式一

EA=1;   //开总中断

ET0=1;   //开定时器T0中断

ET1=1;     //开定时器T1中断

TH1=(65536-20000)/256;  //显示温度

TL1=(65536-20000)%256;

TH0=(65536-500)/256;

TL0=(65536-500)%256;

TR1=1;  //启动定时器T1

TR0=1;  //禁止定时器T0

P1=0x7f;

while(1)

{    WAV=1;  }

}

单片机C语言实现的采用DS18B20的温度检测装置的更多相关文章

  1. 单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等(转)

    源:单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等 //modebus_rtu.c /***************************************** ...

  2. 单片机C语言下LCD多级菜单的一种实现方法

    摘要:     介绍了在C 语言环境下,在LCD 液晶显示屏上实现多级嵌套菜单的一种简便方法,提出了一个结构紧凑.实用的程序模型. 关键词: 液晶显示屏; 多级菜单; 单片机; C 语言; LCD 中 ...

  3. 51单片机C语言学习笔记3: 存储器结构

    MCS-51单片机在物理结构上有四个存储空间: 1.片内程序存储器2.片外程序存储器3.片内数据存储器4.片外数据存储器 但在逻辑上,即从用户的角度上,8051单片机有三个存储空间: 1.片内外统一编 ...

  4. 单片机C 语言与汇编语言混合编程

    在单片机应用系统设计中,过去主要采用汇编语言开发程序. 汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统 ...

  5. 如何快速入门单片机C语言

    一.为什么要学单片机技术? 传统的电子产品升级改造成智能化的电子产品需要用到单片机技术.也就是说传统的电子产品如电视机.电子表.计算器.数码相机.手机.MP3.遥控器.洗衣机等产品智能化.微型化,需要 ...

  6. C语言和单片机C语言为什么会有差异?虽不同但理同!

    许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学的C语言有差异呢? 今天小编就来梳理我们平时所学的C语言与单片机C语言的有什么样的不同. 单片机c语言比 ...

  7. 51单片机C语言学习笔记6:51单片机C语言头文件及其使用

    很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这个是在头文件中用sfr定义的,现在定义好了的是这样的 sfr P1 ...

  8. 单片机C语言中标志位的经典应用

    /* 本例程是C语言的位域操作示例 这里为什么位域结构体与联合体一起使用? -->因为这样定义后,即可以单独使用标志位 也可同时使用整个字节数据 主要应用:单片机C语言 好处:用标志位可以节省R ...

  9. 单片机c语言教程:C51循环语句

    单片机c语言教程第十三课 C51循环语句 循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作.如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 ...

随机推荐

  1. 在springmvc中controller的一个方法处理多个不同请求

    value的uri值为以下三类: A) 可以指定为普通的具体值: B)  可以指定为含有某变量的一类值(URI Template Patterns with Path Variables): @Req ...

  2. linux下I2C驱动

    2C协议规定了主机和从机的概念,在驱动中采用的多是适配器(主机)和设备(从机).首先,i2c规定  Bus    -> Algorithm  算法               Adapter   ...

  3. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  4. .NET截断字符串

    /// <summary> /// 截断字符串 /// </summary> /// <param name="s">要截断的字符串</p ...

  5. Arduino 入门程序示例之一片 LED(2015-06-11)

    概述 从点到线,从线到面.现在开始要来一片的 LED 了,一大波的 LED 正在到来! 示例程序 因为手头没有现成的模块,手头只有 595,所以这里每一个示例程序都是使用 74HC595 扩展 IO ...

  6. BZOJ AC 200题留念

    话说本来想200AC就把题目总结一下...但是我现在挺懒的..不想弄...以后再来吧.

  7. [转]apache下htaccess不起作用,linux,windows详解

    可能出现下面这三种的错误可能性: 第一种:启用 rewrite 和 .htaccess 设置 rewrite设置:找到apache的配置文件httpd.conf文件,找到:#LoadModule re ...

  8. Codeforces 468D Tree

    题目 给出一棵带边权的树,求一个排列\(p\),使得\(\sum_{i=1}^{n}{dis(i, p_i)}\)的值最大,其中\(dis(v, u)\)表示\(v\)到\(u\)的距离. 算法 这题 ...

  9. 欢迎大家关注我的微信公众帐号小q机器人(xiaoqrobot)(转)

    一个偶然的机会让我接触到了微信公众平台,赶紧加了几个交流群了解下相关情况,突然间发现好像全部的APP开发人员都在研究微信公众帐号的开发,而我显得有些落舞了.至于为什么热度会这么高,我想一个数字足以说明 ...

  10. uva 10313 Pay the Price(完全背包)

    题目连接:10313 - Pay the Price 题目大意:有0~300这300种价值的金额. 现在可能给出参数: 1个:n, 输出可以组成价值n的方式的个数. 2个:n, a输出用个数小于a的价 ...