1、个人收集整理资料, 仅供交流学习, 勿作商业用途 题目:基于89C51和DS18B20的数字温度计设计 一 、设计要求 数字式温度计要求测温范围为55125C,精度误差在0.1C以内,LED数 码管直读显示。 二 、方案论证 根据系统的设计要求,选择DS18B20作为本系统的温度传感器,选择单片机AT 89C51为测控系统的核心来完成数据采集、处理、显示、报警等功能。选用数字 温度传感器DS18B20,省却了采样/保持电路、运放、数/模转换电路以及进行长 距离传输时的串/并转换电路,简化了电路,缩短了系统的工作时间,降低了系 统的硬件成本。 该系统的总体设计思路如下:温度传感器DS18B20把
2、所测得的温度发送到AT89 C51单片机上,经过51单片机处理,将把温度在显示电路上显示,本系统显示器 用4位共阳LED数码管以动态扫描法实现。检测范围-55摄氏度到125摄氏度。 按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路和 显示电路。 数字温度计总体电路结构框图如图1所示。 图1 数字温度计总体电路结构框图 三 、系统硬件电路的设计 温度计电路设计原理图如图2所示,控制器使用单片机AT89C51,温度传感器 使用DS18B20,用4位共阳LED数码管实现温度显示。 AT89C51 主 控 制 器 显示电路 温度传感器 DS18B20 扫描驱动 个人收集整理资料, 仅
3、供交流学习, 勿作商业用途 图2 数字温度计设计电路原理图 1、主控制器 AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMO S8位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标 准的MCS- 51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片 中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵 活性高且价廉的方案。 2、显示电路 显示电路采用4位共阳LED数码管,从P0口输出段码,列扫描用P3.0P3.3口 来实现,列驱动用8550三极管。 3、温度传感器工作原理 DS18B20温度
4、传感器是美国DALLAS半导体公司最新推出的一种改进型智能温 度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可 根据实际要求通过简单的编程实现912位的数字值读数方式。 DS18B20 的性能特点如下: 独特的单线接口方式仅需要一个端口引脚进行通信; 多个DS18B20可以并联在唯一的三线上,实现多点组网功能; 无需外部器件; 可通过数据线供电,电压范围:3.05.5V; 测温范围55125,在-10+85时精度为0.5 零待机功耗 温度以9或12位数字量读出; 用户可定义的非易失性温度报警设置 个人收集整理资料, 仅供交流学习, 勿作商业用途 报警搜索命令识别并标志超过
5、程序限定温度温度报警条件)的器件 负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工 作 DS18B20采用3脚PR35 封装或脚SOIC封装,其内部结构框图如图3所示 图3 DS18B20内部结构框图 64 b闪速ROM的结构如下: 开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48 位,最后8位是前面56 位的CRC 检验码,这也是多个DS18B20 可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入户 报警上下限。主机操作ROM的命令有五种,如表1所列 个人收集整理资料, 仅供交流学习, 勿作商业用途 指 令 说 明 读 ROM33H) 读DS
6、1820的序列号 匹配 ROM55H) 继读完64位序列号的一个命令,用 于多个DS1820时定位 跳过ROM CCH) 此命令执行后的存储器操作将针对 在线的所有DS1820 搜ROM F0H) 识别总线上各器件的编码,为操作 各器件作好准备 报警搜索 TH或TTL,则将该器件内的告警标志置位,并对主机发出的告警 搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行告警搜索。 在64位ROM的最高有效字节中存储有循环冗余校验码CRC)。主机根据RO M的前56位来计算CRC值,并和存入DS18B20中的CRC值做比较,以判断主机收 到的ROM数据是否正确。 3)DS18B20测温
7、原理 个人收集整理资料, 仅供交流学习, 勿作商业用途 DS18B20的测温原理如图5所示,图中低温度系数晶振的振荡频率受温度 的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振 随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入 ,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产 生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系 数振荡器来决定,每次测量前,首先将-55 所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度 寄存器被预置在-55 所对应的一个基数值。 减法计数器1对低温度系数晶振产生
8、的脉冲信号进行减法计数,当减法计 数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被 装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此 循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存 器中的数值即为所测温图2中的斜率累加器用于补偿和修正测温过程中的非线 性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述 过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。 另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念, 因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作
9、协议 为:初始化DS18B20发复位脉冲)发ROM功能命令发存储器操作命令处 理数据。 在正常测温情况下,DS1820的测温分辨力为0.5,可采用下述方法获得 高分辨率的温度测量结果:首先用DS1820提供的读暂存器指令BEH)读出以0 .5为分辨率的温度测量结果,然后切去测量结果中的最低有效位LSB), 得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值C s和每度计数值CD。考虑到DS1820测量温度的整数部分以0.25、0.75为进 位界限的关系,实际温度Ts可用下式计算: Ts=/CD 个人收集整理资料, 仅供交流学习, 勿作商业用途 图5 DS18B20测温原理
10、图 四 系统程序的设计 系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算 温度子程序,报警子程序和显示数据刷新子程序等。 1 主程序 主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的测量温 度值。温度测量每1s进行一次。主程序流程图如图6所示。 2 读出温度子程序 读出温度子程的主要功能是读出RAM中的9字节。在读出时须进行CRC校验 ,校验有错时不能进行温度数据的改写。读出温度子程序流程图如图7所示。 3 温度转换命令子程序 温度转换命令子程序主要是发温度转换开始命令。当采用12位分辨率时 ,转换时间约为750 ms。在本程序设计中,采用1s显示程序延时法等待
11、转换的完成。温度转换命 令子程序流程图如图8所示。 4 计算温度子程序 计算温度子程序将RAM中读取的值进行BCD码的抓换运算,并进行温度值 正负的判断。其流程图如图9所示。 5 显示数据刷新子程序 显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当 最高数据显示位为0时,将符号显示位移入下一位。显示数据刷新子程序流程 图如图10所示。 Y 发DS18B20复位命令 发跳过ROM命令 发读取温度命令 读取操作,CRC校 验 9字节完? 结束 CRC校验正确? 移入温度暂存器 N Y N 初始化 显示调用子程序 1s到? 初次上电? 读出温度值 温度计算处理 显示数据刷新 发温度转
12、换开始命令 个人收集整理资料, 仅供交流学习, 勿作商业用途 N Y Y N 发DS18B20复位命令 发跳过ROM命令 发温度转换开始命令 结束 图8 温度转换命令 子程序流程图 开始 温度零下? 温度值取补码置“”标志 计算小数位温度BCD值 计算整数位温度BCD值 结束 置“+ ”标 志 Y N 图6 主程序流程图 图7 读出温度子程序流程图 个人收集整理资料, 仅供交流学习, 勿作商业用途 图9 计算温度子程序流程图 五 汇编程序 。= 。DS18B20温度计 温度数据移入显示寄存器 十位数0? 百位数0? 百位数显示数据 不显示符号) 十位数显示符号 百位数不显示 结束 图10 显示
13、数据刷新子程序流程图 Y N Y N 右图为DS18B20 引脚图DS18S20采用3脚PR35封装或8脚 SOIC封装),DQ为数据输入/输出脚,V DD为电源电压。 个人收集整理资料, 仅供交流学习, 勿作商业用途 。采用4位LED共阳显示器显示测温值,显示精度0.1,测温范围- 55+125 。用AT89C51单片机,12MHz晶振 。=常数定义= = TIMEL EQU 0E0H 。20ms,定时器0时间常数 TIMEH EQU 0B1H TEMPHEAD EQU 36H 。=工作内存定义= = BITST DATA 20H TIME1SOK BIT BITST.1 TEMPONEOK
14、 BIT BITST.2 TEMPL DATA 26H TEMPH DATA 27H TEMPHC DATA 28H TEMPLC DATA 29H 。= 引脚定义= TEMPDIN BIT P3.7 。= 中断向量区= ORG 0000H LJMP START ORG 00BH LJMP T0IT 。=系统初始化= = ORG 100H START: MOV SP,#60H CLSMEM: MOV R0,#20H MOV R1,#60H CLSMEM1: MOV R0,#00H INC R0 DJNZ R1,CLSMEM1 MOV TMOD,#00100001B 。定时器0工作方式116BI
15、T) MOV TH0,#TIMEL MOV TL0,#TIMEH 。20ms SJMP INIT ERROR: NOP LJMP START NOP 个人收集整理资料, 仅供交流学习, 勿作商业用途 INIT: NOP SETB ET0 SETB TR0 SETB EA MOV PSW,#00H CLR TEMPONEOK LJMP MAIN 。= 定时器0中断服务程序= T0IT: PUSH PSW MOV PSW,#10H MOV TH0,#TIMEH MOV TL0,#TIMEL INC R7 CJNE R7,#32H,T0IT1 MOV R7,#00H SETB TIME1SOK 。1
16、s定时到标志 T0IT1: POP PSW RETI 。= 主程序= MAIN: LCALL DISP1 。调用显示子程序 JNB TIME1SOK,MAIN CLR TIME1SOK 。测温每1s一次 JNB TEMPONEOK,MAIN2 。上电时先温度转换一次 LCALL READTEMP1 。读出温度值子程序 LCALL CONVTEMP 。温度BCD码计算处理子程序 LCALL DISPBCD 。显示区BCD码温度值刷新子程序 LCALL DISP1 。消闪烁,显示一次 MAIN2: LCALLREADTEMP 。温度转换开始 SETB TEMPONEOK LJMP MAIN 。=
17、子程序区= 。RESET DS18B20 。= INITDS1820:SETB TEMPDIN NOP NOP CLR TEMPDIN MOV R6,#0A0H 。DELAY 480us DJNZ R6,$ 个人收集整理资料, 仅供交流学习, 勿作商业用途 MOV R6,#0A0H DJNZ R6,$ SETB TEMPDIN MOV R6,#32H 。DELAY 70us DJNZ R6,$ MOV R6,#3CH LOOP1820: MOV C,TEMPDIN JC INITDS1820OUT DJNZ R6,LOOP1820 MOV R6,#064H DJNZ R6,$ SJMP INI
18、TDS1820 RET INITDS1820OUT: SETB TEMPDIN RET 。= 读DS18B20的程序,从DS18B20中读出一个字节的数据= READDS1820: MOV R7,#08H SETB TEMPDIN NOP NOP READDS1820LOOP: CLR TEMPDIN NOP NOP NOP SETB TEMPDIN MOV R6,#07H 。DELAY 15us DJNZ R6,$ MOV C,TEMPDIN MOV R6,#3CH 。DELAY 120us DJNZ R6,$ RRC A SETB TEMPDIN DJNZ R7,READDS1820LOO
19、P MOV R6,#3CH 。DELAY 120 us DJNZ R6,$ RET 。= 写DS18B20的程序,从DS18B20中写一个字节的数据= WRITEDS1820: MOV R7,#08H SETB TEMPDIN NOP 个人收集整理资料, 仅供交流学习, 勿作商业用途 NOP WRITEDS1820LOP: CLR TEMPDIN MOV R6,#07H 。DELAY 15us DJNZ R6,$ RRC A MOV TEMPDIN,C MOV R6,#34H 。DELAY 104us DJNZ R6,$ SETB TEMPDIN DJNZ R7,WRITEDS1820LOP
20、RET 。= READ TEMP = READTEMP: LCALL INITDS1820 MOV A,#0CCH LCALL WRITEDS1820 。SKIP ROM MOV R6,#34H 。DELAY 104us DJNZ R6,$ MOV A,#44H LCALL WRITEDS1820 。START CONVERSION MOV R6,#34H 。DELAY 104 DJNZ R6,$ RET READTEMP1: LCALLINITDS1820 MOV A,#0CCH LCALL WRITEDS1820 。SKIP ROM MOV R6,#34H 。DELAY 104us DJN
21、Z R6,$ MOV A,#0BEH LCALL WRITEDS1820 。SCRATCHPAD MOV R6,#34H 。DELAY 104us DJNZ R6,$ MOV R5,#09H MOV R0,#TEMPHEAD MOV B,#00H READTEMP2: LCALL READDS1820 MOV R0,A INC R0 READTEMP21: LCALL CRC8CAL DJNZ R5,READTEMP2 MOV A,B JNZ READTEMPOUT MOV A,TEMPHEAD+0 个人收集整理资料, 仅供交流学习, 勿作商业用途 MOV TEMPL,A MOV A,TEMP
22、HEAD+1 MOV TEMPH,A READTEMPOUT: RET 。= 处理温度BCD码子程序= CONVTEMP: MOV A,TEMPH ANL A,#80H JZ TEMPC1 CLR C MOV A,TEMPL CPL A ADD A,#01H MOV TEMPL,A MOV A,TEMPH 。- CPL A ADDC A,#00H MOV TEMPH,A 。TEMPHC HI=符号位 MOV TEMPHC,#0BH SJMP TEMPC11 TEMPC1: MOV TEMPHC,#0AH 。+ TEMPC11: MOV A,TEMPHC SWAP A MOV TEMPHC,A
23、MOV A,TEMPL ANL A,#0FH 。乘0.0625 MOV DPTR,#TEMPDOTTAB MOVC A,A+DPTR MOV TEMPLC,A 。TEMPLC LOW=小数部分BCD MOV A,TEMPL 。整数部分 ANL A,#0F0H SWAP A MOV TEMPL,A MOV A,TEMPH ANL A,#0FH SWAP A ORL A,TEMPL LCALL HEX2BCD1 MOV TEMPL,A ANL A,#0F0H SWAP A ORL A,TEMPHC 。TEMPHC LOW=十位数BCD MOV TEMPHC,A 个人收集整理资料, 仅供交流学习,
24、勿作商业用途 MOV A,TEMPL ANL A,#0FH SWAP A 。TEMPLC HI=个位数BCD ORL A,TEMPLC MOV TEMPLC,A MOV A,R7 JZ TEMPC12 ANL A,#0FH SWAP A MOV R7,A MOV A,TEMPHC 。TEMPLC HI=百位数BCD ANL A,#0FH ORL A,R7 MOV TEMPHC,A TEMPC12: RET 。= 小数部分码表= TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H DB 06H,07H,08H,08H,09H,09H 。=
25、 显示区BCD码温度值刷新子程序= DISPBCD: MOV A,TEMPLC ANL A,#0FH MOV 70H,A MOV A,TEMPLC SWAP A ANL A,#0FH MOV 71H,A MOV A,TEMPHC ANL A,#0FH MOV 72H,A MOV A,TEMPHC SWAP A ANL A,#0FH MOV 73H,A MOV A,TEMPHC ANL A,#0F0H CJNE A,#010H,DISPBCD0 SJMP DISPBCD2 DISPBCD0: MOV A,TEMPHC ANL A,#0FH JNZ DISPBCD2 。十位数是0 个人收集整理资料
26、, 仅供交流学习, 勿作商业用途 MOV A,TEMPHC SWAP A ANL A,#0FH MOV 73H,#0AH 。符号位不显示 MOV 72H,A 。十位数显示符号 DISPBCD2: RET 。= 显示子程序= 。显示数据在70H73H单元内,用4位LED共阳数码管显示,P1口输出段码数 据, 。P3口做扫描控制,每个LED数码管亮1ms时间再逐位循环。 DISP1: MOV R1,#70H 。指向显示数据首址 MOV R5,#0FEH 。扫描控制字初值 PLAY: MOV P0,#0FFH MOV A,R5 。扫描字放入A MOV P3,A 。从P3口输出 MOV A,R1 。取
27、显示数据到A MOV DPTR,#TAB 。取段码表地址 MOVC A,A+DPTR 。查显示数据对应段码 MOV P0,A 。段码放入P0口 MOV A,R5 JB ACC.1,LOOP5 。小数点处理 CLR P0.7 LOOP5: LCALL DL1MS 。显示1ms INC R1 。指向下一地址 MOV A,R5 。扫描控制字放入A JNB ACC.3,ENDOUT 。ACC.3=0时一次显示结束 RL A 。A中数据循环左移 MOV R5,A 。放回R5内 AJMP PLAY 。跳回PLAY循环 ENDOUT: MOV P0,#0FFH 。一次显示结束,P0口复位 MOV P3,#0FFH 。P3口复位 RET 。子程序返回 TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH 。共阳段码表 “0”“1”“2”“3”“4”“5”“6”“7”“8”“9”“不亮”“-” DL1MS: MOV R6,#14H 。1ms延时程序,LED显示程序用 DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET