基于51单片机的数字温度计设计一.课程设计题目温度测量程序设计(二)二.课程设计目的和要求1、目的:通过对做的设计任务的实现,起到串起几年来所学的模数技术、传感器技术、单片机技术及智能仪器等知识,通过理论联系实际,从题目分析、电路设计调试、程序编制调试到传感器的标定等这一完整的实验过程,培养学生正确的设计思想,使学生充分发挥主观能动性,去独立解决实际问题,以达到提升学生的综合能力、动手能力、文献资料查阅能力的作用,为毕业设计和以后工作打下一个良好的基础。2、要求:利用数字温度传感器DS18B20测量温度信号,计算后在LED数码管上显示相应的温度值。其温度测量范围为-55度~125度,精确到0.5度。三.硬件电路设计及描述1、硬件框图与说明:图1硬件总体设计框图控制器采用单片机8031,温度传感器采用DS18B20,用6位共阴极LED数码管通过8279实现温度显示。1.1主控制器:8031,P1口P3口对用户开放,时钟频率为6.0MHz,程序存储器和数据存储器统一编址,最多可达64k,其中4000H-5FFFH为用户实验程序存储区,供用户下载实验程序。所以在编写程序的时候,程序的起始地址为4000H。1.2LED显示模块:由6位共阴极LED数码管、位驱动电路、端输入电路组成,采用动态扫描的方式显示。其中该模块包括了数码管6个、75451位驱动器3个、74LS244段驱动器一个、74LS138一个、8279一个,其具体接线如图4所示。1.3温度传感器1.3.1DS18B20概述:DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下:独特的单线接口仅需要一个端口引脚进行通信;多个DS18B20可以并联在惟一的三线上,实现多点组网功能;无须外部器件;可通过数据线供电,电压范围为3.0~5.5V;零待机功耗;温度以9或12位数字;用户可定义报警设置;报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;1.3.2DS18B20的内部结构:DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2所示。图2DS18B20内部结构64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号。DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为9字节的存储器,结构如图3所示。图3DS18B20字节定义其中1、2字节用来存放当前温度,1为低8位,2为高8位。字节3、4用来预置报警温度的上下限,字节5用于配置寄存器,用于确定温度数据位数,字节6、7、8均为保留字节,字节9存放前8个字节循环冗余校验码。(CRC)1.3.3DS18B20的两个表格:由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。表1DS18B20温度转换时间表R1R0温度位数最大转换时间009位93.75ms0110位187.5ms1011位375ms1112位750ms表2一部分温度对应值表温度/℃二进制表示十六进制表示+125000001111101000007D0H+8500000101010100000550H+25.062500000001100100000191H+10.125000000001010000100A2H+0.500000000000000100008H000000000000010000000H-0.51111111111110000FFF8H-10.1251111111101011110FF5EH-25.06251111111001101111FE6FH-551111110010010000FC90H1.3.4DS18B20的测温原理DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。DS18B20温度传感器与单片机的接口为1接地,2接P1.0口,3接4.7K上拉电阻,2、电路原理图与说明图4总体电路原理图说明:DS18B20的2与单片机P1.0口相连,1接地,3接4.7K上拉电阻。单片机与LED显示模块相连(其中该模块包括了数码管6个、75451位驱动器3个、74LS244段驱动器一个、74LS138一个、8279一个,)。各个芯片如图所示,其接线是按照缔造者电子电气技术综合实验操作平台指导书提供的原理图接线。四.软件设计流程及描述1、主要模块流程图2、源程序代码;数字温度传感器TEMPEQU30HTEMP1EQU40HTEMP2EQU41HORG4000HLJMPSTARTORG4100HSTART:LCALLRESET;ds18b20复位MOVA,#0CCH;发SKIPROM命令LCALLWRITEMOVA,#44H;发开始温度转换命令LCALLWRITELCALLDLY1S;延时LCALLRESET;ds18b20复位MOVA,#0CCH;发SKIPROM命令LCALLWRITEMOVA,#0BEH;发读存储器命令LCALLWRITELCALLREAD;读出温度值1MOVTEMP2,TEMP;温度低8位存放41HLCALLREAD;读出温度值2MOVTEMP1,TEMP;温度高8位存放在40H;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;开始数值转换MOVA,41HRRARRARRA;把D3位右移到D0ANLA,#01H;除D0位,其他全部置零MOVB,#5MULAB;由于原D3位权值为0.5,故扩大10倍乘5后放十分位MOV42H,A;十分位转换结束,送42H保存NOP;设置断点,方便修改和查阅MOVA,40HANLA,#0FH;把40H中高四位置零RLARLARLARLA;40H左移4位MOV40H,A;40H中低四位移到高四位,低四位为零MOVA,41HANLA,#0F0H;把41H中小数点后的值全部置零RRARRARRARRA;41H右移4位MOV41H,A;把41H中高四位移到低四位,高四位置零MOVA,40HORLA,41H;组成新的带符号无小数点的八位数字温度,最高位为符号位MOV43H,A;暂存温度值,原41H的高4位做43H的低4位,原40H的低4位做43H的高4位ANLA,#80H;除最高位有效,其他置零RRARRARRARRAMOV44H,A;判断温度值的符号位,把结果放44H,44H中要只有0和8,0为正,8为负NOPMOVA,43H;恢复带符号八位无小数点温度ANLA,#7FH;屏蔽符号位MOVB,#0AHDIVAB;无符号温度值除以10MOV40H,A;商送40H暂存MOVA,B;余数通过A送41H保存MOV41H,A;存个位十进制温度值MOVA,40HMOVB,#0AHDIVAB;商作为被除数再除以10MOV39H,A;商存入39H,存百位十进制温度值MOVA,B;余数通过A送40H保存MOV40H,A;存十位十进制温度值;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;开始显示程序DISP:MOVDPTR,#0CFE9HMOVA,#08HMOVX@DPTR,AMOVDPTR,#0CFE9H;写显示RAM命令字MOVA,#90HMOVX@DPTR,AMOVA,44H;显示符号ACALLTABLE2;查表TABLE2MOVDPTR,#0CFE8HMOVX@DPTR,AMOVA,39H;显示百位,若百位不存在,则用0表示ACALLTABLE;查表TABLEMOVDPTR,#0CFE8HMOVX@DPTR,AMOVA,40H;显示十位转换结果ACALLTABLE;TABLE,转换为显码MOVDPTR,#0CFE8H;8279数据口地址MOVX@DPTR,A;送显码输出MOVA,41H;显示个位转换结果ACALLTABLE1;TABLE1,转换为显码MOVDPTR,#0CFE8H;8279数据口地址MOVX@DPTR,A;送显码输出MOVA,42H;显示十分位ACALLTABLE;查表TABLEMOVDPTR,#0CFE8HMOVX@DPTR,ACALLDELAY;延时LJMPSTART;循环扫描;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DELAY:MOVR6,#255;延时DEL2:MOVR5,#255DEL3:NOPNOPDJNZR5,DEL3DJNZR6,DEL2RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;TABLE:INCA;不带小数点0-15,提供百、十、十分位查表MOVCA,@A+PCRETDB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HTABLE1:INCA;带小数点0-15,提供个位查表MOVCA,@A+PCRETDB0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87HDB0FFH,0EFH,0F7H,0FCH,0B9H,0CEH,0F9H,0F1HTABLE2:INCA;全灭或者负号,提供符号位查表MOVCA,@A+PCRETDB00H,00H,00H,00H,00H,00H,00H,00HDB40H,00H,00H,00H,00H,00H,00H,00H;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;初始化,复位操作RESET:L0:CLRP1.0MOVR2,#120L1:NOPDJNZR2,L1SETBP1.0;主机发置位脉冲持续600usMOVR2,#15L4:DJNZR2,L4;等待60usCLRCORLC,P1.0;数据线应变低JCL0;没准备好,重来MOVR6,#24L5:ORLC,P1.0JCL3;数据线变高初始化成功DJNZR6,L5;数据线低电平可持续240usSJMPL0;初始化失败,重来L3:MOVR2,#125L2:DJNZR2,L2;应答过程最少480usRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;把从P1.0口数据读入寄存器READ:MOVR6,#8RE1:CLRP1.0MOVR4,#4NOP;低电平持续4usNOPSETBP1.0;P1.