《DS18B20数字温度传感器应用.doc》由会员分享,可在线阅读,更多相关《DS18B20数字温度传感器应用.doc(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流DS18B20数字温度传感器应用.精品文档.传感器课程设计报告温度传感器专业班级应用电子2班姓名方畅、曹文荣、梁锐权时间15周 至18周指导老师冯伟2007年6月23日1. 设计要求n 基本范围 -55 120n 精度误差小于 1n LED数码直读显示2. 扩展功能n 可以任意设定温度的上限报警功能n 有鸣蜂器报警n 温度状态设置指示灯,温度报警指示灯,传感器检测指示灯n 有温度自保功能(在一分钟内降不了温,自动关闭系统)n 传感器检测功能(如果系统检测没有传感器存在,四次提示内没有插入传感器则关闭系统)温度控制器摘要: 随着时代的进步和发展
2、,单片机技术已经普及到我们生活,工作,科研,各个领域,一种数字式温度计以数字温度传感器作感温元件,它以单总线的连接方式,使电路大大的简化;传统的温度检测大多以热敏电阻为传感器,这类传感器可靠性差,测量温度准确率低且电路复杂。因此,本温度计摆脱了传统的温度测量方法,利用单片机对传感器进行控制。这样易于智能化控制。2.1. 总体设计方案2.1.0数字温度计设计方案论证2.1.1方案一由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换
3、电路,感温电路比较麻烦。2.1.2 方案二 进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。方案二的总体设计框图温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S52,温度传感器采用DS18B20,用4位LED数码管以P0和P2控制LED实现温度显示。2.1.3 主控制器单片机AT89S52具有低电压供电和体积小等特点,四个端口就足够能满足
4、电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。2.1.4 显示电路显示电路采用4位共阳LED数码管,从P0口输出显示数据,用P2口来控制位选。2.1.5温度传感器DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现位的数字值读数方式。DS18B20的性能特点如下:独特的单线接口仅需要一个端口引脚进行通信;多个DS18B20可以并联在惟一的三线上,实现多点组网功能;无须外部器件;可通过数据线供电,电压范围为3.05.5;零待机功耗;温度以或位数字
5、;用户可定义报警设置;报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; DS18B20采用脚PR35封装或脚SOIC封装,其内部结构框图如图2所示。64位ROM的结构开始位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器和,可通过软件写入户报警上下限。DS18B20温度传感器的内部存储器还包括一个高速暂存和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为字节的存储器,结构如图3所示。头个字节包含
6、测得的温度信息,第和第字节和的拷贝,是易失的,每次上电复位时被刷新。第个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3所示。低位一直为,是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为,用户要去改动,R1和0决定温度转换的精度位数,来设置分率。由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。高速暂存的第、字节保留未用,表现为全逻辑。第字节读出前面所有字节的CR
7、C码,可用来检验数据,从而保证通信数据的正确性。当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第、字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625LSB形式表示。当符号位时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。 DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、T字节内容作比较。若TH或TTL,则将该器件内的报警标志位置位,并
8、对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间
9、由高温度系数振荡器来决定,每次测量前,首先将55所对应的一个基数分别置入减法计数器、温度寄存器中,计数器和温度寄存器被预置在-55所对应的一个基数值。减法计数器对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器的预置值减到时,温度寄存器的值将加,减法计数器的预置将重新被装入,减法计数器重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍关闭就重复上述过程,直到温度寄存器值大致被测温度值。2.3 DS18B20温度传感器与单片机的接口电路1.DS18B20
10、可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图4 所示单片机端口接单线总线,为保证在有DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。采用寄生电源供电方式时VDD端接地。由于单线制只有一根线,因此发送接口必须是三态的。2.4 系统整体硬件电路2.4.1 主板电路 系统整体硬件电路包括,电源电路,传感器电路,温度显示电路,上限报警调整按键电路,单片机主板电路等,如图5 所
11、示。图5中有三个独立式按键可以分别调整温度计的上限报警设置,图中蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时LED数码管将被测温度值显示,这时可以调整报警上下限,从而测出被测的温度值,有三个LED二极管它们分别是:黄色的是传感器存在指示灯;红色的是设置状态指示灯;绿色的是报警指示灯。图5 中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。2.4.2 电源电路图2.2.4.3上限报警调整按键电路2.4.4 显示电路 显示电路是使用的P0口和P2做LED数据显示,这种动态显示最大的优点就是显示内容丰富,但占
12、用口资源比较多, 2.4.5单片机主板电路3系统软件算法分析系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。 3.1主程序 主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图7所示。3.2读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进温度数据的改写。其程序流程图如图8示3.3温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程
13、序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如上图,图9所示3.4 计算温度子程序计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图10所示。3.5 显示数据刷新子程序显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图11。3.6 温度传感器的使用本传感器有三个按键(RST,SET,UP,DOWN),三个LED二极管(黄色,红色,绿色),一个鸣蜂器。RST(单片机复位)但单片机里面的程序出现死循环时,按这个按键使单片机重新工作。SET(温度传感器开关机和温度
14、状态设置)但第一次短下键时温度传感器开始开机工作,其次短按下键时进行温度状态设置,但进入状态设置时,红色LED二极管和数码关会闪烁,表示已经进入温度上限值设置。但长按键维持3秒是系统就会关闭。UP(温度上限值加)在进入温度设置状态时,对温度上限值加一。如果长按时,会快速加。DOWN(温度上限值减)在进入温度设置状态时,对温度上限值减一。如果长按时,会快速减。黄色LED(传感器检测指示灯)如果这灯亮,表示但前系统检测到没有传感器。在开机时也会提示NO-SENSOR(没有传感器),在开机后系统还检测不到传感器就会每15秒提示一次NO-SENSOR(没 有传感器),提示四次时系统将自动关闭。这样就防
15、止传感器损坏或松动甚至没有接上使系统误测而导致的一些不好后果。绿色LED(温度报警指示灯)但实际温度超过设置温度值时这灯和鸣蜂器就会发出报警信号,如果这信号维持超过1分钟,则认为外部降温设备有故障,系统将自动关闭。这样的好处就是但降温外设备出现故障或发热设备功耗过大发热严重时对这些故障进行有效的控制。 红色LED(温度设置状态指示灯)但温度传感器在温度设置状态时该灯会闪烁。 8段数码管 电源接口(912V) 电源指示灯 RST键 UP键 温度报警指示灯 传感器检测指示灯 设置状态指示灯 DOWN键 温度传感器 SET键 鸣蜂器 传感器实物图4总结与体会 经过将近三周的传感器课程设计,终于完成了
16、我的数字温度计的设计,虽然没有完全达到设计要求,但从心底里说,还是高兴的,毕竟这是第一次搞这样的设计还把实物都做了出来,高兴之余不得不总结经验此次呀! 在本次设计的过程中,我发现了自己的很多的问题,以前还没有做过这样的设计。在这次设计真的让我们长进了很多,明白了传感器课程设计重点就在于对传感器元件的应用和对传感器用途的理解,可以说这次设计是为我们的毕业设计提前的一次练习。以前我们做的很多,都不象这次做的那样系统化的设计,都是一些硬件的搭建就行。而这次并不单单是搭建硬件,还要有软件的支持才能使设计的东西工作。这就体现本次课程设计的难度和对各门知识的应用程度。真的有好多的东西,只有我们去试着做了,
17、才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。 从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习传感器这门课更是如此,所以理论的稳固在实际过程中才能提高,这就是我在这次课程设计中的最大收获。本课程设计资料由以下提供: 书籍: 8051系列单片机C语言设计完全手册 单片机原理及应用 第2版 网页: 5 程序代码本程序采用C语言用KeilC51软件进行编译。用一个接口函数LED_Display.h将主函数Trime+key.c 与LED显示函数LED_Display.c和ASCII转成LED显示的数据函数BCD_ASCI
18、I.C同延时程序Delay.c 所构成。这样使的程序模块化使每段都体现自己的功能,直观易懂再加上注释更便于阅读和理解程序。本程序利用定时中断对按键进行查询,然后再跳到相应的处理程序去执行。在按键功能中用了寻址的状 态寄存器做为按键功能的分配,这样就使的按键功能多样化,使用灵活。 温度控制器 广州工程职业技术学院 传感器课程设计指导老师: 冯伟 作者: GIT-3408-YOUJJYY (方畅,曹文荣,梁锐权) 时间: 2007-4-25温度传感器使用单总线DS18B20接口模式CPU为AT89S52,三个按键(RST,UP,DOWN,SET),晶振为11.0592MHz直流912V供电,四个L
19、ED数码管显示温度调节上限为125度,下限为-55度(本程序只能用于单只18B20)#include #include #include /*-用于按键可位寻址的状态寄存器-*/static unsigned char bdata StateREG; sbit DS1820ON=StateREG0; /DS18B20是否存在sbit SetTF=StateREG1; /是否是在温度设置状态sbit KeySETDown=StateREG2; /1为已按过SET键,0为没按过SET按sbit PowTF=StateREG3; /电源标识(0为开电源,1为关电源)sbit KeyTF=StateR
20、EG4; /0为按键允许,1为不允许sbit KeySETDowning=StateREG5; /SET是否正在按下sbit LEDTF=StateREG6; /开机LOG标志位static unsigned char bdata TLV _at_ 0x0029; /温度变量高低位static unsigned char bdata THV _at_ 0x0028;static signed char TMV; /转换后的温度值static unsigned char KeyV,TempKeyV; /键值static signed char TMRomV _at_ 0x0027; /高温度限制
21、static signed char TMSetV _at_ 0x0026; /温度设定值static unsigned char KSDNum; /SET键连按时的采集次数static unsigned char IntNum,IntNum2,IntNum3; /中断发生次数(IntNum用于SET长按检测,IntNum2用于设定状态时LED闪烁,IntNum用于连按其他键)static unsigned int IntNum4,IntNum5;static signed char Sign; /负号标识static unsigned char LED_One,LED_Two,LED_Thr
22、ee; 数值转换void V2ToV(void) TLV=4; THV7; /取符号 else Sign=TMV7; if(Sign) if(SetTF|!Key_SET) LED_One=(TMSetV-1)/100; /SET状态下显示设定值 LED_Two=(TMSetV-1)-LED_One*100)/10; LED_Three=(TMSetV-1)-LED_One*100-LED_Two*10;else LED_One=(TMV-1)/100; /转换百位数值 LED_Two=(TMV-1)-LED_One*100)/10; LED_Three=(TMV-1)-LED_One*100
23、-LED_Two*10; else if(SetTF|!Key_SET) LED_One=TMSetV/100; /SET状态下显示设定值 LED_Two=(TMSetV-LED_One*100)/10; LED_Three=TMSetV-LED_One*100-LED_Two*10; else LED_One=TMV/100; /转换百位数值 LED_Two=(TMV-LED_One*100)/10; LED_Three=TMV-LED_One*100-LED_Two*10;/=转换LED字段=/ if(LED_One)LED_Two=BCD_ASCIILED_Two+1; /超过百时十位的
24、处理 else if(LED_Two=0)LED_Two=BCD_ASCII0; else LED_Two=BCD_ASCIILED_Two+1; if(Sign)LED_One=0xf7; else if(LED_One=0)LED_One=BCD_ASCII0; else LED_One=BCD_ASCIILED_One+1; LED_Three=BCD_ASCIILED_Three+1; 初始化DS1820 void InitDS1820(void) TMPort=1; _nop_(); TMPort=0; Delay_6n5_8us(77); /延时 DS1820复位时间要500US的
25、抵电平 TMPort=1; Delay_6n5_8us(16); /延时112US 等待DS1820的回应 if(!TMPort)DS1820ON=1;ON_DS1820=1; /检测是否有DS1820 else DS1820ON=0;ON_DS1820=0; Delay_6n5_8us(55); TMPort=1;/*-写数据-*/void Write_Data(uchar T_DATA) uchar i,DATA_T; DATA_T=T_DATA; for(i=0;i=1; Delay_6n5_8us(7); /延时54微秒TMPort=1;_nop_();TMPort=1; 写入温度限制
26、值 发出4EH写ROM指令后连发两个字节void WriteDS1820(void) uchar TM_H,TM_L; TM_H=4; TM_L=4; Write_Data(TM_H); Write_Data(TM_L);/*-读数据-*/uchar ReadTM(void) uchar i,TM_DATA; for(i=0;i=1; TMPort=1; _nop_();_nop_(); TMPort=0; _nop_();_nop_();_nop_(); TMPort=1; Delay_6n5_8us(1); if(TMPort)TM_DATA|=0x80; Delay_6n5_8us(6)
27、; return (TM_DATA); 读出温度值将温度高位和低位,高温度限制位从DS1820中读出 低位存入29H(TEMPER_L), 高位存入28H(TEMPER_H), 高温度限制位存入27H(TMRomV) void ReadDS1820(void) TLV=ReadTM(); THV=ReadTM(); TMRomV=ReadTM();/*=主程序=*/void main(void) StateREG=0; /初始化变量 SetTF=1; /在设置温度状态 PowTF=1; /关电源 THV=0; /温度数据存储(高地址:0x0028,低地址:0x0029) TLV=0; TMV=
28、0;/转换后的温度值 KeyV=0; KSDNum=0;/SET键连按时的采集次数 IntNum=0; /用于SET长按检测 IntNum2=0;/用于设定状态时LED闪烁 IntNum3=0; LED_One=0; LED_Two=0; Beep=1; LEDTF=0; InitDS1820(); /初始化 Write_Data(0xcc); /跳过ROM Write_Data(0xb8); /E2RAM中的温度上限值调入RAM InitDS1820(); Write_Data(0xcc); /跳过ROM Write_Data(0xbe); /读出温度指令 ReadDS1820(); /读出
29、温度值和上限值 TMSetV=TMRomV; /拷贝保存在DS1820ROM里的上限值到TMSet EA=1; /允许CPU中断 ET0=1; /定时器0中断开 TMOD=0x01; /设定时器0为模式1,16位模式 TH0=0XB1; TL0=0XDF; /设定时值为20MS TR0=1; /开定时 while(1); 定时器0中断处理中键扫描和显示 void KeyAndDis_Time0(void) interrupt 1 using 2 TH0=0XB1; TL0=0XDF; /设定时值为20MS LEDPort=0xff; /关闭LED/*-对按下的键值附值-*/ if(!Key_U
30、P)KeyV=1; /检测Key_UP是否按下 if(!Key_DOWN)KeyV=2; /检测Key_DOWN是否按下 if(!Key_SET)KeyV=3; /检测Key_SET是否按下 KeySETDowning=0; /清除/*-检测是否有键按下-*/ if(KeyV!=0) /KeyV不等于零表示有键按下Delay_1ms(10); /延时防抖 按下10MS再测if(!Key_UP)TempKeyV=1; if(!Key_DOWN)TempKeyV=2;if(!Key_SET)TempKeyV=3;if(KeyV=TempKeyV) /两次值相等为确定接下了键/*-判断是否是Key_
31、SET按下-*/ if(KeyV=3) /按下SET键,如在SET状态就退出,否则进入 KeySETDowning=1; /表明SET正在按下 PowTF=0; /电源标识开 if(!KeyTF) /KeyTF为1不允许执行下程序 if(SetTF) SetTF=0; /是否是在温度设置状态标识位标识退出设定 InitDS1820(); Write_Data(0xcc); /跳过ROM Write_Data(0x4e); /写温度上限指令 WriteDS1820(); /写温度上限到DS1820ROM InitDS1820(); Write_Data(0xcc); /跳过ROM匹配 Write
32、_Data(0x48); /温度上限值COPY回E2PRAM else SetTF=1; /为下一次没按SET时,按其他键作准备 if(!KeySETDown)KeySETDown=1;OPen=1; /是否已按过SET键标识 else KSDNum+=1; /前一秒内有按SET则开始计数/*-Key_UP和Key_DOWN的检测-*/ if(SetTF) /在SET状态下 if(KeyV=1)&(!KeyTF)TMSetV+=1,OPen=0; /上调温度 if(KeyV=2)&(!KeyTF)TMSetV-=1,OPen=0; /下调温度 if(TMSetV=125)TMSetV=125;
33、 if(!KeyTF)&(IntNum3=0)KeyTF=1; /判断键盘是否处于可用时/*-按键长按的处理-*/ if(KeySETDown)IntNum+=1; /在2秒内按下了SET则计中断发生次数用于长按SET时计时用 if(IntNum60) IntNum=0; KeySETDown=0;/*-按长SET的处理-*/ if(KSDNum=60) /如一直长按了SET 3秒左右 RelayOutPort=1; /关闭控制对象 PowTF=1; /电源标识关 LED_Display(0,21,2,-_OFF_-2007_6_23_-); LEDPort=0xbf; /显示- LEDOne
34、C=0; LEDTwoC=0; LEDThreeC=0; LED_C=0; Delay_100ms(40); /延时4S LEDOneC=1; /关显示 LEDTwoC=1; LEDThreeC=1; IntNum=0; IntNum2=0; IntNum3=0; IntNum4=0; Beep=1; OPen=1; LEDTF=0; KSDNum=0; KeyV=0; /清空变量准备下次键扫描 TempKeyV=0; OPen=1;/*-开电源程序-*/ if(!PowTF) if(LEDTF=0) LED_Display(0,26,2,-_OPEN_-_3408_YOUJJYY_-); i
35、f(DS1820ON=0)LED_Display(0,14,2,-_NO-SENSOR_-); LEDTF=1; InitDS1820(); if(DS1820ON=0)IntNum5+=1; if(DS1820ON=0)&(IntNum5400) LED_Display(0,14,2,-_ON-SENSOR_-);IntNum5=0;IntNum4+=500; Write_Data(0xcc); Write_Data(0x44); Delay_6n5_8us(152); /延时1000uS 等转换完成 InitDS1820(); Write_Data(0xcc); Write_Data(0x
36、be); /读出温度指令 ReadDS1820(); /读出温度值 V2ToV(); /转换显示值 if(TMVTMSetV)RelayOutPort=0,Beep=0,IntNum4+=1; /根据采集的温度值控制对象 else if(DS1820ON=1) RelayOutPort=1,Beep=1,IntNum4=0; if(IntNum4=2000)KSDNum=60,IntNum=60,KeySETDown=1,KeyV=4; if(SetTF)IntNum2+=1,OPen=1; /用于闪烁计数 if(IntNum250)IntNum2=0,OPen=0;/*-连按Key_UP或K
37、ey_DOWN键时的采集次数-*/ if(KeyTF)IntNum3+=1; /用于防止按键连按 if(IntNum315) /检测按键是否超过 IntNum3=0; KeyTF=0; if(SetTF)&(IntNum220)goto InitEnd; /使LED闪烁 LEDPort=LED_One; LEDOneC=0; Delay_1ms(1); LEDOneC=1; /显示百位数 LEDPort=LED_Two; LEDTwoC=0; Delay_1ms(1); LEDTwoC=1; /显示十位数 LEDPort=LED_Three; LEDThreeC=0; Delay_1ms(1); LEDThreeC=1; /显示个位数InitEnd: if(!PowTF)LEDPort=0x34; LED_C=0; Delay_1ms(1); LED_C=1; LED显示驱动程序文件名:LED_Display.c作者 YOUJJYY 时间:2007.4.6 #include #include #define uchar unsigned char/*显示数据的转换*/uchar TO_DATA(bit n_s,uchar I,uchar led_data) uchar x3,y; if(n_s=1)
限制150内