毕业设计论文
题目 基于单片机的DS18B20数字温度计 电话13812281034
系 电子信息工程系
专业 应用电子
姓名 王水浪 班级 电子061
指导教师 孙玲 职称 讲师
设计时间 2008-11-17——2008-12-20
1 设计要求
■基本范围-50℃-110℃
■精度误差小于0.5℃
■LED数码直读显示
数字温度计
摘要:
随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。
关键词:单片机,数字控制,温度计, DS18B20,AT89C2051
中图分类号: TP311 文献标识码: A
1 引言
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机STC89C51,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。
2 总体设计方案
2.1数字温度计设计方案论证
考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。电路比较简单,软件设计也比较简单。
2.2方案的总体设计框图
温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S51,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。
单片机复位位 |
时钟振荡 |
报警点按键调整 |
图1 总体设计方框图
2.2.1 主控制器
单片机AT89C2051具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
2.2.2 显示电路
显示电路采用3位共阳LED数码管,从P3口RXD,TXD串口输出段码。
2.2.3温度传感器
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下:
●独特的单线接口仅需要一个端口引脚进行通信;
●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
●无须外部器件;
●可通过数据线供电,电压范围为3.0~5.5V;
●零待机功耗;
●温度以9或12位数字;
●用户可定义报警设置;
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2所示。
C |
64 位 ROM 和 单 线 接 口 |
高速缓存 |
存储器与控制逻辑 |
温度传感器 |
高温触发器TH |
低温触发器TL |
配置寄存器 |
8位CRC发生器 |
Vdd |
I/O |
图2 DS18B20内部结构
64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图3所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
温度 LSB |
温度 MSB |
TH用户字节1 |
TL用户字节2 |
配置寄存器 |
保留 |
保留 |
保留 |
CRC |
图3 DS18B20字节定义
由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。
表1 DS18B20温度转换时间表
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。
在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。
DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
表2 一部分温度对应值表
温度/℃ |
二进制表示 |
十六进制表示 |
+125 |
0000 0111 1101 0000 |
07D0H |
+85 |
0000 0101 0101 0000 |
0550H |
+25.0625 |
0000 0001 1001 0000 |
0191H |
+10.125 |
0000 0000 1010 0001 |
00A2H |
+0.5 |
0000 0000 0000 0010 |
0008H |
0 |
0000 0000 0000 1000 |
0000H |
-0.5 |
1111 1111 1111 0000 |
FFF8H |
-10.125 |
1111 1111 0101 1110 |
FF5EH |
-25.0625 |
1111 1110 0110 1111 |
FE6FH |
-55 |
1111 1100 1001 0000 |
FC90H |
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
图4 DS18B20与单片机的接口电路
2.3 DS18B20温度传感器与单片机的接口电路
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图4 所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。采用寄生电源供电方式时VDD端接地。由于单线制只有一根线,因此发送接口必须是三态的。
2.4 系统整体硬件电路
2.4.1 主板电路
系统整体硬件电路包括,传感器数据采集电路,温度显示电路,单片机主板电路等,如图5 所示。
图5中有三个独立式按键可以分别调整温度计的上下限报警设置, LED数码管将没有被测温度值显示,从而测出被测的温度值。
图5 中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。
2.4.2 显示电路
显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用p3口的RXD,和TXD,串口的发送和接收,四只数码管采用74LS164右移寄存器驱动,显示比较清晰。
图5 单片机主板电路
图6 温度显示电路
3系统软件算法分析
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
3.1主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图7所示。
Y |
发DS18B20复位命令 |
发跳过ROM命令 |
发读取温度命令 |
读取操作,CRC校验 |
9字节完? |
CRC校验正?确? |
移入温度暂存器 |
结束 |
N |
N |
Y |
初始化 |
调用显示子程序 |
1S到? |
初次上电 |
读出温度值温度计算处理显示数据刷新 |
发温度转换开始命令 |
N |
Y |
N |
Y |
图7 主程序流程图 图8读温度流程图
3.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图8示
发DS18B20复位命令 |
发跳过ROM命令 |
发温度转换开始命令 |
结束 |
图9 温度转换流程图
3.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如上图,图9所示
3.4 计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图10所示。
开始 |
温度零下? |
温度值取补码置“—”标志 |
计算小数位温度BCD值 |
计算整数位温度BCD值 |
结束 |
置“+”标志 |
N |
Y |
温度数据移入显示寄存器 |
十位数0? |
百位数0? |
十位数显示符号百位数不显示 |
百位数显示数据(不显示符号) |
结束 |
N |
N |
Y |
Y |
图10 计算温度流程图 图11 显示数据刷新流程图
3.5 显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图11。
4.调式及性能分析
系统的调式以程序调试为主
硬件调试比较简单,首先检查电路的焊接是否正确,然后可用万用表测试或通电检测
软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序,读出温度程序子程序.温度转换命令子程序,计算温度子程序和显示刷新子程序等的编程及调试
由于DS18B20与单片机采用的是串行通信 ,因此,对DS18B20进行读/写是必须严格保证读/写时序;是否将无法读取测量结果.本程序采用单片机汇编,用WAVE3.2编程并调试.
性能测试可用制作温度计和已有的成品温度计同时进行观察比较.由于DS18B20的灵敏度很高,所以误差指标可以限制在+0.5度到-0.5度以内.DS18B20温度计还可以在高低温报警,远距离多点测温控制等方面进行应用和开发,但在实际设计中应注意下面问题:
(1) DS18B20工作电流高达1.5mA,总线上挂接点较多且进行转换时要考虑增加总线驱动,可以用单片机端口在温度转换时道统一个MOSFET供电.
(2) 连接DS18B20的总线电缆事实有长度限制的,因此在用DS18B20进行长距离测温系统时,要充分考虑总线的分布电容和阻抗的匹配问题.
5.控制源程序清单
1. 1单片机汇编源程序清单
DS18B20温度计
采用4位LED供阳显示器显示测温值,显示精度0.1度,测温范围-55度--+125度,用AT89CC2051单片机,12MHz晶振
**********************常数定义*************************/
TIMEL EQU 0EOH ;20ms,定时器0时间常数
TIMEL EQU 0B1H
TEMPHEAD EQU 36H
**********************工作内存定义*******************
BITST DATA 20H
TIME1SOK BIT BITST.1
TEMPONEOK BIT BITST.2
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 28H
TEMPLC DATA 29H
*********************引脚定义**************************
TEMPDIN DATA P3.7
********************中段向量区*************************
ORG 0000H
LJMP START
ORG 0OBH
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
MOV TH0,#TIMEL
MOV TL0,#TIMEH
SJMP INIT
ERROR: NOP
LJMP START
NOP
NOP
SETB ET0
SETB TR0
MOV PSW,#00H
CLR TEMPONEOK
LJMP MAIN
定时器0中断服务程序
TOIT: PUSH PSW
MOV PSW,#10H
MOV TH0,#TIMEH
MOV TL0,#TIMEL
INC R7
CJNE R7,#32H,T0IT1
MOV R7,00H
SETB TIME1SOK;1秒定时到标志
T0IT1: POP PSW
RETI
主程序
*******************************************************
MAIN: LCALL DISP1 ;调用显示子程序
JNB TEMPONEOK ; MAIN2
CLR TIME1SOK ;测温每秒一次
JNB TEMPONEOK ; MAIN2;上电时先温度转换一次
LCALL READTEMP1 ;读出温度值子程序
LCALL CONVTEMP ;温度BCD码计算处理子程序
LCALL DISPBCD ;显示区BCD码温度值刷新子程序
LCALL DISP1;秒闪烁一次
MAIN2: LCALL READTEMP;温度转换开始
LJMP MAIN
子程序区
***************复位DE18B20**********************
INITDS18B20: SETB TEMPDIN
NOP
NOP
CLR TEMPDIN
MOV R6,#0AOH
DJNZ R6,$
SETB TEMPDIN
MOV R6,#32H
DJNZ R6 ,$
MOV R6 ,#3CH
LOOP1820: MOV C,TEMPDIN
JC INNITDS1820OUT
DJNZ R6,LOOP1820
MOV R6,#064H
DJNZ R6,$
SJMP INITDS1820
RET
INITDS1820OUT: SETB TEMPIN
RET
*********读DS18B30的程序,从DS18B20中读一个数据*******
READDS1820: MOV R7,#08H
SETB TEMPDIN
NOP
NOP
READDS1820LOOP: CLR TEMPDIN
NOP
NOP
NOP
SETB TEMPDIN
MOV R6,#07H
DJNZ R6,$
MOV C,TEMPDIN
MOV R6 ,#3CH
DJNZ R6,$
RRC A
SETB TEMPDIN
DJNZ R7,READDS1820LOOP
MOV R6,$
RET
************写DS18B20的程序,从DS18B20中写一个数据**
WRITEDS1820: MOV R7,#08H
SETB TEMPDIN
NOP
NOP
WRITEDS1820LOP: CLR TEMPDIN
MOV R6,#07H
DJNZ R6,$
RRC A
MOV TEMPDIN,C
MOV R6,#34H
DJNZ R6,$
SETB TEMPDIN
DJNZ R7,WRITEDS1820LOP
RET
***************读TEMP*************************
READTEMP: LCALL INITDS1820
MOV A,#0CCH
LCALL WRITEDS1820
MOV R6,$
MOV A,#44H
LCALL WRITEDS1820
MOV R6,#34H
DJNZ R6,$
RET
READTEMP1: LCALL INITDS1820
MOV A,#0CCH
LCALL WRITEDS1820
MOV R6,#34H
DJNZ R6,$
MOV A,#0BEH
LCALL WRITEDS1820
MOV R6,#34H
DJNZ R6,$
MOV R5,#09H
MOV R0,#TEMPHEAD
MOV B ,#00H
READTEMP2: LCALL READTEMP2
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,TEMPHEAD+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 TEMP ,A
MOV A,TEMP
CPL A
ADDC A,#00H
MOV TEMP,A
MOV TEMPHC ,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPC,#OAH
TEMPC11: MOV A,TEMPHC
SWAP A
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV TEMPLC ,A
MOV A,TEMPL
ANL A,#0FOH
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ORL A,#0FH
SWAP A
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H
ANL A,#OFOH
SWAP A
ORL A,TEMPHC
MOV TEMP,A
MOV A,TEMP
ANL A,#0FH
SWAP A
ORL A,TEMPC
MOV TEMPLC,A
MOV A,R7
JZ TEMPC12
ANL A,#OFH
SWAP A
MOV R7,A
MOV A,TEMPHC
ANL A,#OFH
ORL A,R7
MOV TEMPHC,A
TEMPC12: RET
*******************小数部分码表**********************
TEMPDOTTAB: DB 00H,01H,02H,03H,04H,05H,06H,07H,06H,08H,09H
*******************显示区BCD码温度值刷新子程序************
DISPBCD: MOV A,TEMPLC
ANL A,#OFH
MOV 70H,A
MOV A,TEMPLC
SWAP A
ANL A,#0FH
MOV 71H,A
MOV A,TEMPHC
ANL A,#0F0H
MOV 72H ,A
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H ,A
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#01H,DISPBCD
SJMP DISPBCD2
DISPBCD0: MOV A,TEMPHC
ANL A,#0F0H
JNZ DISPBCD2
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,#0AH
MOV 72H ,A
DISPBCD2: RET
显示子程序
显示数据在70H到73H内,用4位LED供阳数码管显示,P1口输出端码数据,P3口作扫描控制,每个数码管亮1秒时间再循环
DISP1: MOV R1,#70H
MOV R5,#0FEH
PLAY: MOV P1,#OFEH
MOV A,R5
MOV P3,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV A ,R5
JB ACC.1,LOOP5
CLR P1.7
LOOP5: LCALL DL1MS
INC R1
MOV A,R5
JNB ACC.3,ENDOUT
RL A
MOV R5,A
AJMP PLAY
ENEOUT: MOV P3 ,#0FFH
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
单字节十六进制BCD
CRC8CAL: PUSH ACC
MOV R7,#08H
CRC8LOOP1: XRL A,B
RRC A
MOV A,B
JNC CRC8LOOP2
XRL A,#18H
CRC8LOOP2: RRC A
MOV B,A
POP ACC
RR A
PUSH ACC
DJNZ R7,CRC8LOOP1
POP ACC
RET
END
6总结与体会
经过将近三月的毕业设计,终于完成了我的数字温度计的设计,虽然没有完全达到设计要求,但从心底里说,还是高兴的,高兴之余不得不深思呀!
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是16进制的数直接加减,显示处理时在用除法去删分
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
参考文献
[1] 李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社,1998
[2] 李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994
[3] 阎石.数字电子技术基础(第三版). 北京:高等教育出版社,1989
[4] 廖常初.现场总线概述[J].电工技术,1999.