《基于51单片机的数字温度计设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的数字温度计设计.docx(17页珍藏版)》请在第一文库网上搜索。
1、基于51单片机的数字温度计设计课题选择随着时代的发展,控制智能化,仪器小型化,功耗微量化得到广泛关注。单片机控制系统无疑在这方面起到了举足轻重的作用。单片机的应用系统设计业已成为新的技术热点,其中数字温度计就是一个典型的例子,它可广泛应用与生产生活的各个方面,具有巨大的市场前景。设计目的1 .理解掌握51单片机的功能和实际应用。2 .掌握仿真开发软件的使用。3 .掌握数字式温度计电路的设计、组装与调试方法。三.实验要求1 .以51系列单片机为核心器件,组成一个数字式温度计。2 .采用数字式温度传感器为检测器件,进行单点温度检测。3 .温度显示采用4位1ED数码管显示,三位整数,一位小数。四.设
2、计思路1 .根据设计要求,选择STC89C51RC单片机为核心器件。2 .温度检测采用DS18B20数字式温度传感器。与单片机的接口为P3.6引脚。3 .采用USb数据线连接充电宝供电,接电后由按钮开关控制电路供电。硬件电路设计总体框图为图1:五.系统的硬件构成及功能1 .主控制器2 单片机STC89C51RC具有低电压供电和体积小等特点,有40个引脚,其仿真图像如下图所示:3 .显示电路显示电路采用4位共阳1ED数码管,从P3口RXDJXD串口输出段码。1ED数码管在仿真4 软件中如下图所示:5 .温度传感器DS18B20是美国DA11AS半导体公司最新推出的一种改进型智能温度传感器,与传统
3、的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式CDS18B20的性能特点如下:1 .独特的单线接口仅需一个端口引脚进行通讯。2 .简单的多点分布应用。3 .无需外部器件。4 .可通过数据线供电。5 .零待机功耗。6 .测温范围-55+125摄氏度。6 电路图如下图所示:BOTTOMVIEWDA11ASDS1820DS1B2OTO-92GNDC16JNDQC2Vg匚3PACKAGE5=)N4NDS18B20PTSOC1273611NCTNCI1Inc1gnDS182OZ8-PINSOIC(150-MI1)在仿真软件中如下图所示:DS1
4、8B20的测温原理图如下图所示:在正常测温情况下,DS18B20的测温分辨力为0.5摄氏度,可采用下述方法获得高分辨率的温度测量结果。:首先用DS18B20提供的读暂存器指令(BEH)读出以0.5摄氏度为分辨率的温度测量结果,然后切去测量结果中的最低有效位(1SB),得到所测实际温度的整数部分Tz,然后再利用BEH指令取计数器1的计数剩余值Cs和每度计数值CDo考虑到DS18B20测量温度的整数部分以0.25、0.75摄氏度为进位界限的关系,实际温度Ts可以用下式计算:Ts=(Tz-0.25)+(CD-Cs)CD表I.部分温度值对应的二进制温度数据。温度/1C二进制表示十六进制表示+12500
5、O1111101000007D0H+850000010101010000055011+25.06250000000110010000019111+10.125000000001010000100A2H+0.500000000000000100008H00000000000001000000011-0.5I111I111I1110000FFF8H-10.125H11H1101011110FF5EH-25.0625H11II1O0110I111FEGFH-55I111110010010000FC90II六.系统整体硬件电路根据设计要求与设计思路,硬件电路设计框图如下图所示,在仿真软件Proteus
6、上完成,其中1ED数码管以动态扫描法实现温度显示,由四个PNP型晶体管Q2,Q3,Q4,Q5和8个电阻组成。基极与单片机的P1O,P1.1,P1.2连接,DS18B20的数据I/O端与单片机P3.6引脚连接。外部晶振为12MHZ。gCTV1XV1XZnJW9UIWQVC411NtCCmgcwctnoc(MCgr(Mwu0MJ0dN91494,MCUZTUXK4JA4UOIJ七.系统程序设计数字式温度计的应用程序主要包括主程序,温度检测程序,温度转换程序,1ED显示程序等。其思路如下图所示:八.测量及其结果分析1 .Proteus仿真结果软件方面,在PrOteUS编译下进行,源程序编译及仿真调试
7、。在软件中选定传感器后可对其进行环境温度设置,如下图,将环境温度设为349VCCDQ34.9GND2 .硬件测试结果在硬件测试方面,检查电路板及焊接的质量情况,在焊接无误后通电检查1ED显示器。其中成品图如图所示:通电后,室温下1ED的示数如图所示九.设计心得体会本次实验对我们组来说是一次难得的经历,首先是第一次接触了仿真软件ProteUS,在使用时经历了很多次失败,因为这款软件与以前使用过的软件有很大不同,使用时不停出错,接线时由于原件放置不合理而接的杂乱无章,输入源程序时还算顺利,显示结果比较满意。其次是程序设计,我们在参考别人成功先例的基础上根据自己设计的需要进行编程,其中经历了不少曲折
8、,最后我的收获是编程一定要细心,针对每一个细节,稍有疏忽程序就不能正常运行。在这次的实践与学习中,尽管期间困难重重,但我们还是从中学习了不少新的知识和技能,也体会到了经历失败最终成功的喜悦。总之,通过这次电工电子综合设计,我收获了很多,我希望自己在今后的各项研究工作中也坚持这种精神。十.附录源程序inc1ude#inc1ude#defineucharunsignedchar#defineuintunsignedintsbitDATA=P11;/DS18B20接入口ucharcodetab1e=0x3f,0x06,0x5b,0x4t0x66,0x6c1,0x7c1z0x07z0x7f,0x6f,
9、0x77z0x7cz0x39,0x5e,0x79,0x71;/共阴极字型码inttemp;温度值intss;中间的一个变量intdd;ntj;uchardatab;定时器中断次数uchardatabuf;字型显示中间变量inta1armH=320;默认报警值inta1arm1=100;定义开关的接入口sbitk1=P25;/+sbitk2=P26;/-sbitk3=P2”;确认sbitk4=P24;切换sbitbe11=POO;蜂鸣器sbitH1ight=PIA2;正温指示灯sbit11ight=PM3;负温度指示灯sbitWarn=P1A4;报警指示灯sbitRed=P16;温度上限设置指示
10、灯sbitGreen=PIA7;温度下限设置指示灯bitset=O;初始化bitFIag=O;设置标志intn;函数的声明区voidkey_to1();voidkey-t2();voidde1ay(uint);voidkey();voidShow();函数的定义区*延时子函数*/voidde1ay(uintnum)whi1e(num-);DS18b20温度传感器所需函数,分为初始化,读写字节,读取温度4个函数1nit_DS18B20(void)传感器初始化(ucharx=O;DATA=1;/DQ复位de1ay(10);稍做延时DATA=0;单片机将DQ拉低de1ay(80);精确延时大于480
11、us/450DATA=1;拉高总线de1ay(20);=DATA;稍做延时后如果X=O则初始化成功X=I则初始化失败de1ay(30);ReadOneChar(VOid)读一个字节(uchari=0;uchardat=0;for(i=8;i0;i-)(DATA=0;/给脉冲信号dat=1;DATA=1;/给脉冲信号if(DATA)datI=0x80;de1ay(8);)return(dat);)WriteOneChar(unsignedchardat)写一个字节(uchari=0;for(i=8;i0;i-)(DATA=0;DATA=dat&OxO1;de1ay(10);DATA=1;dat=
12、1;)de1ay(8);)intReadTemperature(VOid)读取温度uchara=0;ucharb=0;intt=0;f1oattt=O;1nit_DS18B20();WriteOneChar(OxCC);/跳过读序号列号的操作WriteOneChar(Ox44);/启动温度转换IniJDS18B20();WriteOneChar(OXCC);跳过读序号列号的操作WriteOneChar(OxBE);读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();低位b=Read0neChar();高位t=b;t=8;t=ta;tt=t*0.0625;t=tt*
13、10+0.5;return(t);)voiddisp1ayOO()*显示负值子函数(dd=(temp-1);buf1=dd100;buf2=dd100;buf3=dd%10010;buf0=dd%10;动态显示for(j=0;j5;j+)(P2=0xff;/初始灯为灭的PO=OxOO;P2=0xfd;显示小数点PO=OX80;显示小数点de1ay(100);P2=0xff;/初始灯为灭的PO=OxOO;P2=0xf7;片选1CD1P0=0x40;de1ay(100);P2=0xff;PO=OxOO;P2=0xfb;片选1CD2P0=tab1ebuf2;de1ay(100);P2=0ff;PO=
14、OxOO;P2=0Xfd;片选1CD3P0=tab1ebuf3;de1ay(100);P2=0ff;PO=OxOO;P2=0Xfe;PO=tab1ebufO;片选1CD4de1ay(100);P2=0xff;)显示正值子函数voiddisp1ay()(buf1=temp/IOO0;显示百位buf2=temp/100%10;显示十位buf3=temp%100/10;显示个位buf0=temp%10;小数位for(j=0;j3;j+)(P2=0ff;PO=OxOO;P2=0xfd;显示小数点P0=0x80;显示小数点de1ay(300);P2=0xff;PO=OxOO;P2=0xf7;PO=tab1ebuf1;de1ay(300);P2=0xff;PO=OxOO;P2