《单片机课程设计—数字温度计.doc》由会员分享,可在线阅读,更多相关《单片机课程设计—数字温度计.doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、. . . . 1 课题任务、功能要求说明与总体方案介绍1.1 课题目的随着社会的发展,温度的测量与控制变得越来越重要。本文采用单片机STC89S52设计了温度实时测量与控制系统。单片机STC89S52 能够根据温度传感器DS18B20 所采集的温度在数码管上实时显示,通过控制从而把温度控制在设定的围之。所有温度数据均通过4位数码管LED显示出来。系统可以根据时钟存储相关的数据。通过该课程的学习使我们对计算机控制系统有一个全面的了解、掌握常规控制算法的使用方法、掌握简单微型计算机应用系统软硬的设计方法,进一步锻炼同学们在微型计算机应用方面的实际工作能力。1.2 功能要求说明设计一个具有特定功能
2、的数字温度计。该数字温度计上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。测量温度围099,测量精度小数点后两位,可以通过开始和结束键控制数字温度计的工作状态。1.3 设计课题总体方案介绍与工作原理说明1.3.1 设计课题总体方案(1)根据设计要求,选择AT89C52单片机为核心器件。(2)温度检测器件采用DS18B20数字式温度传感器。与单片机的接口为P3.6引脚。(3)键盘采用独立式按键,由三个按键组成,分别是:设置键(SET),加(+1),确认键(RET)。(4)SET键(上下限温度设置键):当该键按下时,进入上下限温度设置功能。通过P0.1引脚接入。(5)+1键(加一调
3、整键):在输入上下限温度时,该键按下一次,被调整位加一。通过P0.2引脚接入。(6)RET键(确认键):当该键按下时,指向下一个要调整的位。通过P0.3引脚接入。1.3.2 工作原理说明本课题以是80S52单片机为核心设计的一种数字温度控制系统,利用温度传感器DS18B20可以直接读取被测温度值,进行转换的特性,模拟温度值经过DS18B20处理后转换为数字值,然后送到单片机中进行数据处理,并与设置的温度报警限比较,超过限度后通过扬声器报警。同时处理后的数据送到LED中显示。2 硬件系统的设计2.1 课题硬件系统各模块功能简要介绍硬件电路设计总体框图为图1:4位LED显示器LED显示器驱动电路单
4、片机按键输入电路时钟电路复位电路温度检测电源电路图12.1.1主控制器单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。很适合便携手持式产品的设计使用。2.2.2显示电路显示电路采用四位共阳LED数码管,从P3口RXD,TXD串口输出段码。2.2.3温度传感器DS18B20是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实
5、际要求通过简单的编程实现位的数字值读数方式。DS18B20的性能特点如下: 独特的单线接口仅需一个端口引脚进行通讯 简单的多点分布应用 无需外部器件 可通过数据线供电 零待机功耗 测温围-55+125,以0.5递增。华氏器件-67+2570F,以0.90F递增 温度以9 位数字量读出 温度数字量转换时间200ms(典型值) 用户可定义的非易失性温度报警设置 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件。DS18B20部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式如图2所示,DQ 为数据输
6、入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。其电路图如图2所示.。图2外部封装形式在仿真软件中如图3所示图3DS18B20的测温原理如图4所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首
7、先将-55 所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器 1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图4中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。另
8、外,由于DS18B20单线通信功能是分时完成的,有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)发ROM功能命令发存储器操作命令处理数据。图4在正常测温情况下,DS1820的测温分辨力为0.5,可采用下述方法获得高分辨率的温度测量结果:首先用DS1820提供的读暂存器指令(BEH)读出以0.5为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。考虑到DS1820测量温度的整数部分以0.25、0.75为进位界
9、限的关系,实际温度Ts可用下式计算:表1.部分温度值对应的二进制温度数据温度/二进制表示十六进制表示+1250000 0111 1101 000007D0H+850000 0101 0101 00000550H+25.06250000 0001 1001 00000191H+10.1250000 0000 1010 000100A2H+0.50000 0000 0000 00100008H00000 0000 0000 10000000H-0.51111 1111 1111 0000FFF8H-10.1251111 1111 0101 1110FF5EH-25.06251111 1110 01
10、10 1111FE6FH-551111 1100 1001 0000FC90H2.2 课题电路原理图、PCB 图、元器件布局图 见附录3 软件系统的设计3.1 课题软件系统各模块功能简要介绍数字式温度计的应用程序主要包括主程序,温度检测程序,温度转换程序, LED显示程序等。系统的主程序主要用来初始化一些系统参数,对DS18B20的配置数据进行一系列的设定。温度检测程序是对DS18B20的状态不断地查询,读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写,读取当前的温度值后,进行温度转化程序,对温度符号处理和温度值的BCD码处理,进行温度值正负的判定,将其段码送至显
11、示缓冲区,以备定时扫描服务程序处理。LED显示程序主要对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时,将符号显示位移入下一位。3.2 课题软件系统程序流程框图开始显示缓冲区初始化复位DS18B20发跳过ROM命令发温度转换命令延时复位DS18B20发跳过ROM命令发读存储器命令读温度数据温度符号判定将温度转换为BCD码更新显示缓冲区图53.3 课题软件系统程序清单见附录一4 仿真结果、误差分析、设计体会4.1 课题的仿真结果Proteus仿真结果软件方面,在Proteus编译下进行,源程序编译与仿真调试。在软件中选定传感器后可对其进行环境温度设置,如图6,将环境温度设为34.9。图6
12、然后点击软件执行键,按操作步骤实施后,观察LED数码管示数,此时示数如图7。图74.2 硬件测试结果与分析在硬件测试方面,检查电路板与焊接的质量情况,在检查无误后通电检查LED显示器。其中 DS18B20实物图为图8 图8在室温下,LED显示器示数如图9,为56.0摄氏度图9用手盖住温度传感器后,LED显示器示数如图12,为8.0摄氏度。比较可知,硬件调试结果也达到了要求。4.3 设计体会这次课程设计检验了我所学的知识,也培养了我如何去把握一件事。在设计的过程中,与同学相互讨论,相互学习,共同进步。 数字温度计课程设计是单片机课程知识综合应用的实践训练,通过本次课程设计,我体会到学好基本知识和
13、方法最重要。结束语本次课设对我来说是一次难得的经历,首先是接触了仿真软件Proteus,在使用时经历了很多次失败,因为这款软件与以前使用的各种软件有很多不同,使用时不停出错,接线时由于元件放置不合理而接的杂乱无章;输入源程序时还较为顺利,显示结果比较满意。其次是程序设计,我们在参考别人成功先例的基础上根据自己设计的需要编制程序,其中历经不少曲折,最后我的收获是,编程一定要细心,针对每一个细节,稍有疏忽,程序就不能正常工作。最后是单片机实践操作,由于DS18B20温度传感器灵敏度不太高,示数变化不大。另外,我前期花了一些时间专门学习这块芯片,了解了DS18B20的工作原理的时序图。在这次的实践与
14、学习中,尽管期间困难重重,但我还是从中学习了不少新的知识与技能和解决困难的方法,也终于体验到了经历困难到最终获得成功的那种无以言表的喜悦之情,总之,本次课设是我收获最多的一次,也希望自己在以后的各项研究活动中能坚持这种精神。致 通过这一阶段的努力,我的课程设计数字温度计终于完成了。在大学阶段,我在学习上和思想上都受益非浅,这除了自身的努力外,与各位老师、同学和朋友的关心、支持和鼓励是分不开的。在我修改论文的过程中,王韧老师给我提供了许多资料,并对实践中出现的问题给予耐心的解答,在百忙之中仔细阅读,给出修改意见,在此对他表示感。参考文献1素行著.模拟电子技术基础(第二版) .:高等教育,2006
15、.Yang Suhang. Analog electronic technology foundation (second edition). Beijing: higher education press, 20062阎石著.数字电子技术基础(第五版) .:高等教育,2006.Yan Shi. Digital electronic technology base (fifth edition). Beijing: higher education press, 2006.3全利,仲伟峰,徐军著.单片机原理与应用.:清华大学社,2006.Li Quanli ZhongWeiFeng, Xu J
16、unzhu. Single chip microcomputer principle and application. Beijing: tsinghua university club, 20064路明著C语言程序设计教程(第2版) :邮电大学,2005.Yang Luming. C language programming tutorial (second edition). Beijing: Beijing university of posts and telecommunications publishing house, 2005附录一源程序#includetypedef unsi
17、gned char uint8;typedef unsigned int uint16;typedef unsigned long uint32;uint8 x;uint32 tvalue;uint8 keyflag=0;uint8 code table=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F; /012346789sbit DQ=P36;/sbit DQ=P30;/sbit dule=P26;/sbit wele=P27;sbit key1=P10;sbit led1=P30; /18B20初始化成功灯亮void delay(uin
18、t16 i)while(i-);/*温度传感器*/void init_18b20() /18b20的初始化(复位) DQ=1; /初始化DQ线 delay(8); DQ=0; /将DQ拉低,开始初始化时序(下降沿) delay(80); /DQ拉低,保持480960微秒 DQ=1; delay(14); /DQ拉高,保持60微秒 x=DQ; /初始化成功x为1 if(x=1) led1=0; /初始化成功灯亮 void write_18b20(uint8 dat) /18b20写操作 uint8 i; for(i=0;i=1; /将数据向右移一位,准备写入下一个数据 uint8 read_18
19、b20()/*读操作* uint8 i,dat2; for(i=0;i=1; /dat右移一位,使最高位空出 DQ=0; /将DQ拉低,开始读操作时序 delay(1); /*注意不能延时太长,否则读数有误* DQ=1; /将DQ拉高,使单片机检测18B20的输出电平 if(DQ=1) /如果检测到18B20的输出电平为1 dat2|=0x80; /将DQ线的1取出,写在dat2的最高位。位或后最高位为1 delay(6); /两个读时序间至少需要1us的恢复期return(dat2); /返回读出的八位数据uint16 read_temp() /读取温度值并转换 float tt;/floa
20、t型含小数 uint8 TH,TL; init_18b20(); /将DS18B20初始化 write_18b20(0xcc); /跳过读序列号 write_18b20(0x44); /启动温度转换 delay(500); /温度转换需要一点时间 init_18b20(); write_18b20(0xcc); /跳过读序列号 write_18b20(0xbe); /读取温度 TL=read_18b20(); /先读的是温度值低位 TH=read_18b20(); /接着读的是温度值高位 tvalue=TH; /高8位赋给16位的tvalue tvalue=8;/左移8位 tvalue=tva
21、lue|TL;/高、低位合并成为一个16位的数 /* if(tvalue0x0fff) /判断正负 tflag=0; else tvalue=tvalue+1; tflag=1; */ tt=tvalue*0.0625; /乘上分辨率0.0625 tvalue=tt*100+0.5; /*10温度值扩大100倍,精确到1位小数,后一位再四舍五入 return(tvalue); /返回含有温度信息的16位数,前五位代表正负,0000 0表示正温度,1111 1表示负温度 /后11位代表温度,前7位为整数,最后四位为小数,这11位乘上0.0625得出的值就是实际温度 /比如现在LSB的最低四位是0
22、111,那么小数部分就是0.0625*7=0.4375,如果取1位小数乘上10,就是“4”,四舍五入还是4. void disp_1820() /温度值显示uint8 a,b,c,d;tvalue=read_temp();/读出温度 /d=tvalue/10000; /百位数(已扩大100,所以取10000的模)a=tvalue%10000/1000; /温度十位数 b=tvalue%1000/100; /温度个位数c=tvalue%100/10; /温度小数位 d=tvalue%10; /温度小数位 P2=0xf7;P0=tablec;/显示十位 delay(500); P2=0xfb; P
23、0=tableb|0x80; /显示个位与小数点 delay(500);P2=0xfd; P0=tablea;/显示小数位 delay(500);P2=0xfe; P0=tabled;/显示小数位 /delay(500); /*温度传感器*/void disp_p() /p显示P2=0xfe;P0=0xf3;delay(500); void keyscan() /按键扫描函数if(key1=0) /判断第一键是否按下delay(1000); /延时0.01秒,消抖if(key1=0) /再次判断第一键是否真的按下keyflag=keyflag; /如果真的按下while(!key1); /松手检测void main()delay(100);while(1)keyscan(); if(keyflag) disp_1820(); /在数码管上显示温度值else disp_p();附录二元件清单数字温度计电路元器件清单元器件名称参数数量元器件名称参数数量单片机89S521数码管1晶体振荡器12MHz1电阻13电容3温度传感器DS18B201按键1附录三电路原理图附录四PCB图附录五元器件布局图21 / 21
限制150内