用DS18B20做的数字温度计_第1页
用DS18B20做的数字温度计_第2页
用DS18B20做的数字温度计_第3页
用DS18B20做的数字温度计_第4页
用DS18B20做的数字温度计_第5页
免费预览已结束,剩余8页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

10一、总体方案的设计与选择数字温度计的设计标准与要求1、设计温度测量电路;2、测量范围为-40℃~60℃;30.01℃4、制作并调试所设计电路;5、把握数字电路的设计及调试方法;系统根本方案DS18B20为传感器的温度检测模AT89S51温度采集信号转换模块液晶显示模块温度采集信号转换模块液晶显示模块方案的争论与选择方案一:承受二极管做温度传感器PNPN在温度每上升1℃时,下降-2mV,利用这种特性,一般可以直接承受二极管〔如玻璃封装1N4148〕或承受硅三极管〔可将集电极和基极短接〕接成二极管来做PN0.2—2测温范围为-50—+150℃。典型的温度曲线如图1所示。同型号的二极管或三极管特性不完全一样,因此它们的互换性较差。LM35做温度传感器LM35是一种得到广泛使用的温度传感器。芯片从电源吸取的电流几乎是不变的〔约50μ适合,比方在电池供电的场合中,输出可以由第三个引脚取出,根本无需校准。在使用单一电源时,LM35的一个缺点是无法指示低至零度的温度。据称利用LM35可测出20mV的电压,这一值相当于℃〔一些状况下甚至可测出0~2mV示零度或更低的温度时,还需一个负电源和一只下拉电阻。而且精度不够。DS18B20DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简洁,体积小的特点。因此用它来组成一个测温系统,具有线路简洁,在一根通信线,可以挂很多这样的数字温度计,格外便利。DS18B20产品的特点:、只要求一个端口即可实现通信。、在DS18B20中的每个器件上都有独一无二的序列号。、实际应用中不需要外部任何元器件即可实现测温。、测量温度范围在-55。C125。C、数字温度计的区分率用户可以从9位到12位选择。、内部有温度上、下限告警设置。通过比较和对本次设计要求的的考虑,打算承受方案三用可编程器件DS18B20做温度传感器。二、DS18B20该产品承受美国DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用便利,封装形式多样,适用于各种狭小空间设备数字测温顺控制领域。DS16241、无需外围元件即可测量温度2、测量范围为-55℃~+125℃,0.03125℃3、测量结果以9~1243~5V/DCDS18B20引脚定义:DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端〔在寄生电源接线方式时接地〕。2.3.DS18B20内部构造图2.4DS18B20的读写时序和测温原理与DS1820一样只是得到的温度值的位数因区分率不同而不同,且温度转换时的延时时间由 2s减为750ms。DS18B20测温原理如图3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显转变,所产生的信号作为计数器2的脉冲输入。计数器1和温度存放器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进展减法计数,当计数器1的预置值减到0时,温度存放器的值将加1,计数器1的预置将重被装入,计数器1重开头对低温度系数晶振产生的脉冲信号进展计数,如此循环直到计数器2计数到0时,停顿温度存放器值的累加,此时温度存放器中的数值即为所测温度。图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。DS18B20温度值格式表这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,假设测得的温度大于 0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;假设温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H-25.0625℃的数字输出为FE6FH-55℃的数字输FC90H。DS18B20三、LCD1602LCD1602是字符型LCD通常有1416条引脚线的LCD2条线VCC(15脚)GND(16脚)14脚的LCD完全一样,定义如下表所示:LCD的引脚定:四、电路原理图五、设计体会对于单片机的程序编写用了很长的时间,查找了很多资料,特别是关于DS18B20的有关资料以及液晶显示的资料等各种材料。我画出了初步的原理图,但是觉得不够抱负,太麻烦,所以又查询了相关的资料,最终间,自己设计并制作的欢快,获益匪浅!六、程序#include<reg52.h>#include<intrins.h>unsignedcharcodedigit[11]={“0123456789-“};unsignedcharcodeStr[]={“081802Yong“};unsignedcharcodeError[]={“DS18B20ERROR“};unsignedcharcodeError1[]={“PLEASE CHECK“};unsignedcharcodeTemp[]={“wendu:“};unsignedcharcodeCent[]={“C“}; //温度单位unsignedcharflag,tltemp; //负温度标志和临时暂存变量sbitRS=P2^0; //存放器选择位,将RS位定义为P2.0引脚sbitRW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbitE=P2^2; //使能信号位,将E位定义为P2.2引脚sbitBF=P0^7; //劳碌标志位,将BF位定义为P0.7引脚voiddelay1ms{unsignedchari,j;for(i=0;i<4;i++)for(j=0;j<33;j++);}voiddelaynms(unsignedcharn){unsignedchari;for(i=0;i<n;i++)delay1ms;}bitBusyTest(void){bitresult;RS=0; //依据规定,RS为低电平,RW为高电寻常,可以读状态RW=1;E=1; //E=1,才允许读写_nop_; //空操作_nop_;_nop_;_nop_; //空操作四个机器周期,给硬件反响时间result=BF; //将劳碌标志电平赋给resultE=0; //E恢复低电平returnresult;}voidWriteInstruction(unsignedchardictate){while(BusyTest==1); //假设忙就等待RS=0; //依据规定,RSR/W同时为低电寻常,可以写入指令RW=0;E=0; //E置低电平(8-6,写指令时,E为高脉冲,//就是让E01发生正跳变,所以应先置“0“_nop_;_nop_; //空操作两个机器周期,给硬件反响时间P0=dictate; //将数据送入P0口,即写入指令或地址_nop_;_nop_;_nop_;_nop_; //空操作四个机器周期,给硬件反响时间E=1; //E置高电平_nop_;_nop_;_nop_;_nop_; //空操作四个机器周期,给硬件反响时间E=0; //E由高电平跳变成低电寻常,液晶模块开头执行命令}voidWriteAddress(unsignedcharx){WriteInstruction(x|0x80);//显示位置确实定方法规定为“80H+x“}voidWriteData(unsignedchary){while(BusyTest==1);RS=1; //RS为高电平,RW为低电寻常,可以写入数据RW=0;E=0; //E置低电平(8-6,写指令时,E为高脉冲,//就是让E01发生正跳变,所以应先置“0“P0=y; //P0口,马上数据写入液晶模块_nop_;_nop_;_nop_;_nop_; //空操作四个机器周期,给硬件反响时间E=1; //E置高电平_nop_;_nop_;_nop_;_nop_; //空操作四个机器周期,给硬件反响时间E=0; //E由高电平跳变成低电寻常,液晶模块开头执行命令}voidLcdInitiate(void){delaynms(15); //15msLCD一段较长的反响时间WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口delaynms(5); //延时5ms ,给硬件一点反响时间WriteInstruction(0x38);delaynms(5); //延时5ms ,给硬件一点反响时间WriteInstruction(0x38); //连续三次,确保初始化成功delaynms(5); //延时5ms ,给硬件一点反响时间WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪耀delaynms(5); //延时5ms ,给硬件一点反响时间WriteInstruction(0x06); //显示模式设置:光标右移,字符不移delaynms(5); //延时5ms ,给硬件一点反响时间WriteInstruction(0x01); //清屏幕指令,将以前的显示内容去除delaynms(5); //延时5ms ,给硬件一点反响时间}sbitDQ=P3^3;unsignedchartime; //设置全局变量,特地用于严格延时bitInit_DS18B20(void){bitflag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在DQ=1; //先将数据线拉高for(time=0;time<2;time++)//6微秒;DQ=0; //再将数据线从高拉低,要求保持480~960usfor(time=0;time<200;time++) //略微延时约600微秒; //以向DS18B20发出一持续480~960us的低电平复位脉冲DQ=1; //释放数据线〔将数据线拉高〕for(time=0;time<10;time++); //延时约30us〔释放总线后需等待15~60us让DS18B20输出存在脉冲〕flag=DQ; //让单片机检测是否输出了存在脉冲〔DQ=0表示存在〕for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕;return(flag); //返回检测成功标志}unsignedcharReadOneChar(void){unsignedchari=0;unsignedchardat; //储存读出的一个字节数据for(i=0;i<8;i++){DQ=1;//先将数据线拉高_nop_;DQ=0;//等待一个机器周期//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序_nop_;//等待一个机器周期DQ=1;//将数据线“人为“拉高,DS18B20的输出电平作预备for(time=0;time<2;time++); //6us15us内采样dat>>=1;if(DQ==1)dat|=0x80; //11datelsedat|=0x00;//00dat//将单片机检测到的电平信号DQ存入r[i]for(time=0;time<8;time++); //3us,1us的恢复期}return(dat); //返回读出的十六进制数据}WriteOneChar(unsignedchardat){unsignedchari=0;for(i=0;i<8;i++){DQ=1; //先将数据线拉高_nop_; //等待一个机器周期DQ=0; //将数据线从高拉低时即启动写时序DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样for(time=0;time<10;time++);//30us,DS18B2015~60us期间从数据线上采样DQ=1; //释放数据线for(time=0;time<1;time++);//3us,1us的恢复期dat>>=1; //dat1位}for(time=0;time<4;time++);//稍作延时,给硬件一点反响时间}voidReadyReadTemp(void){Init_DS18B20; //DS18B20初始化WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换delaynms(200);//转换一次需要延时一段时间Init_DS18B20; //DS18B20初始化WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);//读取温度存放器,前两个分别是温度的低位和高位}voiddisplay_error(void){unsignedchari;WriteAddress(0x00); //11列开头显示i=0; //从第一个字符开头显示while(Error[i]!=”\0”) //只要没有写到完毕标志,就连续写{的说明

WriteData(Error[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(100); //100ms}WriteAddress(0x40); //11列开头显示i=0; //从第一个字符开头显示while(Error1[i]!=”\0”) //只要没有写到完毕标志,就连续写{的说明

WriteData(Error1[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(100); //100ms}while(1) //进入死循环,等待查明缘由;}voiddisplay_explain(void){unsignedchari;WriteAddress(0x00); //11列开头显示i=0; //从第一个字符开头显示while(Str[i]!=”\0”) //只要没有写到完毕标志,就连续写{的说明}

WriteData(Str[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(100); //100ms}voiddisplay_symbol(void){unsignedchari;WriteAddress(0x40); //21列开头显示i=0; //从第一个字符开头显示while(Temp[i]!=”\0”) //只要没有写到完毕标志,就连续写{WriteData(Temp[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(50); //1ms给硬件一点反响时间}}void display_dot(void){WriteAddress(0x49); //210列开头显示WriteData(”.”); //将小数点的字符常量写入LCDdelaynms(50); //延时1ms给硬件一点反响时间}void display_cent(void){unsignedchari;WriteAddress(0x4c); //213列开头显示i=0; //从第一个字符开头显示while(Cent[i]!=”\0”) //只要没有写到完毕标志,就连续写{WriteData(Cent[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(50); //1ms给硬件一点反响时间}}voiddisplay_temp1(unsignedcharx){unsignedcharj,k,l; //j,k,l分别储存温度的百位、十位和个位j=x/100; //取百位k=(x%100)/10; //取十位l=x%10; //取个位WriteAddress(0x46); //写显示地址,27列开头显示if(flag==1) //负温度时显示“—”{WriteData(digit[10]); //将百位数字的字符常量写入LCD}else{WriteData(digit[j]); //将十位数字的字符常量写入LCD}WriteData(digit[k]);//将十位数字的字符常量写入LCDWriteData(digit[l]);//将个位数字的字符常量写入LCDdelaynms(50); //延时1ms给硬件一点反响时间}voiddisplay_temp2(unsignedcharx){unsignedchara,b,c;a=x;b=x*100%10;WriteAddress(0x4a); //写显示地址,211列开头显示WriteData(digit[a]);WriteData(digit[b]); //将小数局部的第一位数字字符常量写入LCDdelaynms(50); //延时1ms给硬件一点反响时间}voidmain(void){unsignedcharTL; //储存暂存器的温度低位unsignedcharTH; //储存暂存器的温度高位unsignedch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论