基于51单片机及DS18B20温度传感器的数字温度计程序(详细注释)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于51单片机及DS18B20温度传感器的数字温度计程序(详细注释)智笔记-1-智笔记-2-电路实物图如下图所示:C语言程序如下所示:/********************************************************************zicreate-----------------------------Copyright(C)*程序名;基于DS18B20的测温系统*功能:实时测量温度,超过上下限报警,报警温度可手动调整。K1是用来*进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限*调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动*退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除*按键音,再按一下启动按键音。在调节上下限温度模式下,K2是实现加1功能,*K1是实现减1功能,K3是用来设定上下限温度正负的。*编程者:Jason*编程时间:2009/10/2*********************************************************************/#includeAT89X52.h//将AT89X52.h头文件包含到主程序#includeintrins.h//将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#defineuintunsignedint//变量类型宏定义,用uint表示无符号整形(16位)#defineucharunsignedchar//变量类型宏定义,用uchar表示无符号字符型(8位)ucharmax=0x00,min=0x00;//max是上限报警温度,min是下限报警温度bits=0;//s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bits1=0;//s1标志位用于上下限查看时的显示voiddisplay1(uintz);//声明display1()函数#includeds18b20.h//将ds18b20.h头文件包含到主程序#includekeyscan.h//将keyscan.h头文件包含到主程序#includedisplay.h//将display.h头文件包含到主程序智笔记-3-/***********************主函数************************/voidmain(){beer=1;//关闭蜂鸣器led=1;//关闭LED灯timer1_init(0);//初始化定时器1(未启动定时器1)get_temperature(1);//首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)while(1)//主循环{keyscan();//按键扫面函数get_temperature(0);//获取温度函数keyscan();//按键扫面函数display(temp,temp_d*0.625);//显示函数alarm();//报警函数keyscan();//按键扫面函数}}/*********************************************************************程序名;__ds18b20_h__*功能:DS18B20的c51编程头文件*编程者:ZPZ*编程时间:2009/10/2*说明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d*(测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度”‘1’表*示“负温度”),标志位f_max(上限温度的标志位‘0’表示“正温度”、‘1’表*示“负温度”),标志位f_min(下限温度的标志位‘0’表示“正温度”、‘1’表*示“负温度”),标志位w(报警标志位‘1’启动报警‘0’关闭报警)。*********************************************************************/#ifndef__ds18b20_h__//定义头文件#define__ds18b20_h__#defineuintunsignedint//变量类型宏定义,用uint表示无符号整形(16位)#defineucharunsignedchar//变量类型宏定义,用uchar表示无符号字符型(8位)sbitDQ=P2^3;//可位寻址变量定义,用DQ表示P2.3口sbitbeer=P1^0;//用beer表示P1.0sbitled=P1^1;//用led表示P1.1uchartemp=0;//测量温度的整数部分uchartemp_d=0;//测量温度的小数部bitf=0;//测量温度的标志位,0’表示“正温度”‘1’表示“负温度”)bitf_max=0;//上限温度的标志位‘0’表示“正温度”‘1’表示“负温度”)bitf_min=0;//下限温度的标志位‘0’表示“正温度”、‘1’表示“负温度”)bitw=0;//报警标志位‘1’启动报警‘0’关闭报警)/*****************************延时子函数******************************/voidds18b20_delayus(uintt)//延时几μs{while(t--);}voidds18b20_delayms(uintt)//延时1ms左右{uinti,j;for(i=t;i0;i--)for(j=120;j0;j--);}/**************************ds18b20初始化函数*************************/voidds18b20_init()//DS18B20初始化{DQ=1;//拉高数据线DQ=0;//控制器向DS18B20发低电平脉冲ds18b20_delayus(30);//延时480μs左右DQ=1;//控制器拉高总线,while(DQ);//等待DS18B20拉低总线智笔记-4-ds18b20_delayus(20);//延时,等待上拉电阻拉高总线DQ=1;//拉高数据线,准备数据传输;}/***************************ds18b20字节读函数************************/uchards18b20_read()//DS18B20字节读取{uchari;//定义一个局部变量i(局部变量只在本函数中有效)uchard=0;//定义一个局部变量dDQ=1;//准备读;for(i=8;i0;i--)//一位一位的读,循环8次{d=1;//d左移一位,低位先发;DQ=0;_nop_();_nop_();_nop_();DQ=1;//必须写1,否则读出来的将是不预期的数据;if(DQ)//在12us处读取数据,送给d的最高位d|=0x80;ds18b20_delayus(10);}returnd;//返回读取的值}/*************************ds18b20字节写函数**************************/voidds18b20_write(uchard)//ds18b20字节写{uchari;for(i=8;i0;i--)//一位一位的写{DQ=0;_nop_();_nop_();_nop_();DQ=d&0x01;//写数据ds18b20_delayus(5);DQ=1;d=1;}}/***************************获取温度函数****************************/voidget_temperature(bitf){uchara=0,b=0,c=0,d=0;uinti;ds18b20_init();//DS18B20初始化ds18b20_write(0xcc);//向DS18B20发跳过读ROM命令ds18b20_write(0x44);//写启动DS18B20进行温度转换命令,转换结果存入内部RAMif(f==1){//首次启动DS18B20进行温度转换需要500ms,若转换时间不够就出错,读出的是85度的错误值。display1(1);//用开机动画耗时}elseds18b20_delayms(1);ds18b20_init();//DS18B20初始化ds18b20_write(0xcc);//向DS18B20发跳过读ROM命令ds18b20_write(0xbe);//写读内部RAM中9字节的内容命令a=ds18b20_read();//读内部RAM(LSB)b=ds18b20_read();//读内部RAM(MSB)if(f==1)//局部位变量f=1时读上下线报警温度{max=ds18b20_read();//读内部RAM(TH)min=ds18b20_read();//读内部RAM(Tl)}if((max&0x80)==0x80)//若读取的上限温度的最高位(符号位)为‘1’表明是负温度智笔记-5-{f_max=1;max=(max-0x80);}//将上限温度符号标志位置‘1’表示负温度,将上限温度装换成无符号数。if((min&0x80)==0x80)//若读取的下限温度的最高位(符号位)为‘1’表明是负温度{f_min=1;min=(min-0x80);}//将下限温度符号标志位置‘1’表示负温度,将下限温度装换成无符号数。i=b;i=4;if(i==0){f=0;//i为0,表示读取的温度是正温度,设立正温度标记temp=((a4)|(b4));//整数部分a=(a&0x0f);temp_d=a;//小数部分}else{f=1;//i为1,表示读取的温度是负温度,设立负温度标记a=~a+1;//负数的小数部分取反加1b=~b;//负数的整数部分取反temp=((a4)|(b4));//整数部分a=(a&0x0f);//小数部分temp_d=a;}}/*************************存储极限温度函数***************************/voidstore_t(){if(f_max==1)//若上限温度为负,将上限温度转换成有符号数(最高1是负,0是正)max=max+0x80;if(f_min==1)//若下限温度为负,将上限温度转换成有符号数min=min+0x80;ds18b20_init();//DS18B20初始化ds18b20_write(0xcc);//向DS18B20发跳过读ROM命令ds18b20_write(0x4e);//向DS18B20发写字节至暂存器2和3(TH和TL)命令ds18b20_write(max);//向暂存器TH(上限温度暂存器)写温度ds18b20_write(min);//向暂存器TL(下限温度暂存器)写温度ds18b20_write(0xff);//向配置寄存器写命令,进行温度值分辨率设置ds18b20_init();//DS18B20初始化ds18b20_write(0xcc);//向DS18B20发跳过读ROM命令ds18b20_write(0x48);//向DS18B20发将RAM中2、3字节的内容写入EEPROM}//DS18B20上电后会自动将EEPROM中的上下限温度拷贝到TH、TL暂存器/**************************温度超限报警函数*************************/voidalarm(){//若上限值是正值if(f_max==0){if(f_min==0)//若下限值是正值{if(f==0)//若测量值是正值{if((temp+temp_d*0.0625)=min||(temp+

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功