基于51单片机的温度计设计
单片机原理与接口技术课程课程名称:
设计题目:
专 业:
设 计 者:
指导老师:设计 单片机原理与接口技术 基于51单片机的数字温度计设计 信 息 工 程
摘要
随着现代信息技术的飞速发展和传统工业改造的逐步实现.能够独立工作的温度检测和显示系统应用于诸多领域。传统的温度检测以热敏电阻为温度敏感元件。热敏电阻的成本低,但需后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。与传统的温度计相比,这里设计的数字温度计具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。选用AT89C51型单片机作为主控制器件,DSl8B20作为测温传感器通过2位共阴极LED 数码管串口传送数据,实现温度显示。通过DSl8B20直接读取被测温度值,进行数据转换,该器件的物理化学性能稳定,线性度较好,在0℃~100℃最大线性偏差小于0.1℃。该器件可直接向单片机传输数字信号,便于单片机处理及控制。另外,该温度计还能直接采用测温器件测量温度,从而简化数据传输与处理过程。
关键字:AT89S52 51单片机 DS18B20 温度计
目 录
1 系统硬件设计方案 . ........................................ - 4 -
1.1 温度传感器介绍 ..................................... - 4 -
1.2 温度传感器与单片机的连接 ........................... - 7 -
1.3 复位信号及外部复位电路 ............................. - 8 -
1.4 电源电路 . .......................................... - 8 -
1.5 显示电路 . ........................................... - 8 - 2 软件设计 . ................................................ - 9 - 3 数据测试 . ............................................... - 11 - 4 总结与体会 . ............................................. - 11 - 参考文献 . ................................................. - 13 - 附录1 仿真图 ............................................. - 13 - 附录2 程序源代码 ......................................... - 15 -
DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C 。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EPROM 中,掉电后依然保存。
温度传感器DS18B20引脚如图3所示。
8引脚封装 TO -92封装
图2 温度传感器
引脚功能说明:
NC :空引脚,悬空不使用;
VDD :可选电源脚,电源电压范围3~5.5V。当工作于寄生电源时,此引脚必须接地。
DQ :数据输入/输出脚。漏极开路,常态下高电平。
GND :为电源地
DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH 和TL 、配置寄存器。
光刻ROM 中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM 的排列是:开始8位(28H )是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码
(CRC=X8+X5+X4+1)。光刻ROM 的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩
展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S 为符号位。
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM 中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。 例如+125℃的数字输出为07D0H ,+25.0625℃的数字输出为0191H ,-25.0625℃的数字输出为FF6FH ,-55℃的数字输出为FC90H 。
DS18B20温度传感器的内部存储器包括一个高速暂存RAM 和一个非易失性的可电擦除的E2RAM, 后者存放高温度和低温度触发器TH 、TL 和结构寄存器。
暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是TH 、TL 的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。
该字节各位的意义如下:
TM R1 R0 1 1 1 1 1
低五位一直都是1 ,TM 是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如表1所示:(DS18B20出厂时被设置为12位)
表1 DS18B20温度转换时间表
根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM 指令,最后发送RAM 指令,这样才能对DS18B20进行预定的操作。复位要求主CPU 将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU 收到此信号表示复位成功。
1.2 温度传感器与单片机的连接
温度传感器的单总线(1-Wire)与单片机的P2.0连接,P2.0是单片机的高位地址线A8。P2端口是一个带内部上拉电阻的8位双向I /O ,其输出缓冲级可驱动(吸收或输出电流)4个TTL 逻辑门电路。对该端口写“1”,可通过内部上拉电阻将其端口拉至高电平,此时可作为输入口使用,这是因为内部存在上拉电阻,某一引脚被外部信号拉低时会输出一个电流。在访问外部程序存储器或16位地址的外部数据存储器时。如执行MOVX DPTR指令,则表示P2端口送出高8位的地址数据。在访问8位地址的外部数据存储器时,可执行MOVX RI指令,P2端口内容即为特殊功能寄存器(SFR)区中R2寄存器内容,整个访问期间不改变。在Flash 编程和程序校验时,P2端口也接收高位地址和其他控制信号。图3为DSl8820内部结构。图4为DSl8820与单片机的接口电路。
图3 DS18B20内部结构图
图4 DS18B20和单片机的接口连接
1.3 复位信号及外部复位电路
单片机的P1.6端口是MAX813看门狗电路中喂狗信号的输入端,即单片机每执行一次程序就设置一次喂狗信号,清零看门狗器件。若程序出现异常,单片机引脚RST 将出现两个机器周期以上的高电平,使其复位。该复位信号高电平有效,其有效时间应持续24个振荡脉冲周期即两个机器周期以上。若使用频率为12 MHz的晶体振荡器,则复位信号持续时间应超过2μs才完成复位操作。
1.4 电源电路
由于该系统需要稳定的5 V 电源,因此设计时必须采用能满足电压、电流和稳定性要求的电源。该电源采用三端集成稳压器LM7805。它仅有输入端、输出端及公共端3个引脚,其内部设有过流保护、过热保护及调整管安全保护电路.由于所需外接元件少,使用方便、可靠,因此可作为稳压电源。图5为电源电路连接图。
图5 电源电路连接图
1.5 显示电路
采用技术成熟的74HCl64实现串并转换。LED 显示分为静态显示和动态显示。这里采用静态显示,系统通过单片机的串行口来实现静态显示。串行口为方式零状态,即工作在移位寄存器方式,波特率为振荡频率的1/12。当器件执行任何一条将SBUF 作为目的寄存器的命令时,数据便开始从RXD 端发送。在写信号有效时,相隔一个机器周期后发送控制端SEND 有效,即允许RXD 发送数据,同时允许从TXD 端输出移位脉冲。图6为显示电路的连接图。
图6 显示电路的连接图
2 软件设计
DSl8820的主要数据元件有:64位激光Lasered ROM,温度灵敏元件和非易失性温度告警触发器TH 和TL 。DSBl820可以从单总线获取电源,当信号线为高电平时,将能量贮存在内部电容器中;当单信号线为低电平时,将该电源断开,直到信号线变为高电平重新接上寄生(电容) 电源为止。此外,还可外接5 V电源,给DSl8820供电。DSl8820
的供电方式灵活,利用外接电源还可增加系统的稳定性和可靠性。图7为读取数据流程图。
图7 读取数据的流程图
读出温度数据后,LOW 的低四位为温度的小数部分,可以精确到0.0625℃,LOW 的高四位和HIGH 的低四位为温度的整数部分,HIGH 的高四位全部为1表示负数,全为0表示正数。所以先将数据提取出来,分为三个部分:小数部分、整数部分和符号部分。小数部分进行四舍五入处理:大于0.5℃的话,向个位进1;小于0.5℃的时候,舍去不要。当数据是个负数的时候,显示之前要进行数据转换,将其整数部分取反加一。还因为DS18B20最低温度只能为-55℃,所以可以将整数部分的最高位换成一个“-”,表示为负数。图8为温度数据处理程序的流程图。
图8 温度数据处理流程图
3 数据测试
将温度传感器与冰水混合物接触,经过充分搅拌达到热平衡后调节系统,使显示读数为0.00(标定0℃) ;利用气压计读出当时当地的大气压强,并根据大气压强和当地重力加速度计算出当时的实际压强;根据沸点与压强的关系查出沸点温度。把温度传感器放入沸水中,待显示读数稳定后重新调节,使显示器显示读数等于当地当时沸点温度后工作结束。该温度计的量程为-50℃~150℃,读数精度为0.1℃,实际使用一般在0℃~100℃。采用0℃~50℃和50℃~100℃的精密水银温度计作检验标准,对设计的温度计进行测试,其结果表明能达到该精度要求。
4 总结与体会
作为一名电子信息工程的大三学生,我觉得做单片机课程设计是很有意义的,而且也是必要的。在做这次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。
为了让自己的设计更加完善,查阅这方面的实际资料是十分必要的,也是必不可少的。
其次,在这次课程设计中,我们运用了以前学过的专业课知识,如:proteus 仿真、汇编语言、模拟和数字电路知识等。虽然过去我从未独立应用过他们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
最后,要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机有哪些资源;要有一个清晰的思路和一个完整的软件流程图;在设计程序时,不能妄想一次将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,这样为资料的保留和交流提供了方便;在设计中遇到的问题要记录,以免下次遇到同样的问题。
在这次的课程设计中,我真正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单片机更是如此,程序只有在经常写与读的过程中才能提高,这就是这次课程设计的最大收获。
参考文献
1 李群芳, 肖看. 单片机原理、接口及应用. 清华大学出版社 3张丽娜. 单片机原理及应用. 华中科技大学出版社 5 黄庆华. 单片机开发技术与实训. 电子工业出版社
6于京.51系列单片机C 程序设计与应用方案. 中国电力出版社 7 沙占友. 单片机外围电路设计. 电子工业出版社 8 戴佳.51单片机C 语言设计实例精讲. 电子工业出版社 9 周坚. 单片机C 语言轻松入门. 北京航空航天大学出版社
附录1 仿真图
附录2 程序源代码
DATA_BUS BIT P3.3 FLAG BIT 00H
TEMP_L EQU 30H TEMP_H
EQU 31H TEMP_DP
EQU
32H TEMP_INT EQU 33H TEMP_BW EQU 34H TEMP_SW EQU 35H TEMP_GW EQU 36H DIS_BW EQU 37H DIS_SW EQU 38H DIS_GW
EQU
39H DIS_DP
EQU
3AH DIS_ADD EQU
3BH
ORG 0000H AJMP
START
ORG 0050H
START:
MOV SP,
#40H
MAIN: LCALL READ_TEMP LCALL
PROCESS
AJMP MAIN
; 读温度程序 READ_TEMP: LCALL RESET_PULSE
MOV A, #0CCH
; 标志位 ; 温度值低字节 ; 温度值高字节 ; 温度小数 ; 温度值整数 ; 温度百位数 ; 温度十位数 ; 温度个位数 ; 显示百位数 ; 显示十位数 ; 显示个位数 ; 显示小数位 ; 显示地址
; 初始化
; 调读温度程序 ; 调数据处理程序
; 调用复位脉冲程序; 跳过ROM 命令
LCALL WRITE MOV A, #44H
; 读温度
LCALL
WRITE
LCALL DISPLAY
; 显示温度 LCALL RESET_PULSE ; 调用复位脉冲程序
MOV A,
#0CCH
; 跳过ROM 命令
LCALL WRITE MOV A,
#0BEH
; 读缓存命令
LCALL WRITE LCALL READ
RET
; 复位脉冲程序 RESET_PULSE: RESET:
SETB DATA_BUS NOP NOP CLR
DATA_BUS
MOV R7, #255 DJNZ R7, $ SETB DATA_BUS MOV R7, #30 DJNZ R7,$ JNB DATA_BUS, SETB_FLAG
CLR
FLAG
AJMP NEXT
SETB_FLAG:
SETB FLAG
NEXT:
MOV R7, #120 DJNZ R7, $ SETB DATA_BUS
JNB
FLAG , RESET
RET ; 写命令 WRITE:
SETB DATA_BUS MOV
R6, #8
CLR C
WRITING: CLR
DATA_BUS
MOV R7, #5 DJNZ R7, $ RRC
A
MOV DATA_BUS, C MOV R7, #30H DJNZ R7, $ SETB DATA_BUS NOP
DJNZ R6, WRITING
RET
; 循环显示段位 DISPLAY:
MOV R4, #200
DIS_LOOP:
MOV A, DIS_DP
MOV P2, #0FFH
MOV P0, A
CLR
P2.7
LCALL DELAY2MS MOV A, DIS_GW MOV P2, #0FFH MOV P0, A
SETB P0.7
CLR
P2.6
LCALL DELAY2MS MOV A, DIS_SW MOV P2, #0FFH MOV P0, A
CLR
P2.5
LCALL DELAY2MS
MOV A, DIS_B
MOV P2, #0FFH MOV P0, A
MOV A, TEMP_BW CJNE A, #0,SKIP
AJMP NEXTT
SKIP: CLR P2.4
LCALL DELAY2MS
NEXTT: NOP
DJNZ R4, DIS_LOOP
RET
; 读命令
READ:
SETB DATA_BUS MOV R0, #TEMP_L MOV R6, #8 MOV R5, #2
CLR
C
READING: CLR DATA_BUS
NOP NOP
SETB DATA_BUS NOP NOP NOP NOP
MOV C, DATA_BUS RRC
A
MOV R7, #30H DJNZ R7, $ SETB DATA_BUS DJNZ R6, READING MOV @R0, A INC
R0
MOV R6, #8 SETB DATA_BUS DJNZ R5, READING
RET
; 数据处理
PROCESS: MOV R7, TEMP_L MOV A, #0FH ANL
A, R7
MOV TEMP_DP,A MOV R7, TEMP_L MOV A, #0F0H ANL
A, R7
SWAP A
MOV TEMP_L, A MOV R7, TEMP_H MOV A, #0FH ANL
A, R7
SWAP A ORL
A, TEMP_L
MOV B, #64H DIV
AB
MOV TEMP_BW,A MOV A, #0AH XCH A, B DIV
AB
MOV TEMP_SW,A MOV TEMP_GW,B MOV A, TEMP_DP MOV DPTR, #TABLE_DP MOVC A, @A+DPTR
MOV DPTR, #TABLE_INTER
MOVC A, @A+DPTR
MOV DIS_DP, A
MOV A, TEMP_GW
MOV DPTR, #TABLE_INTER
MOVC A, @A+DPTR
MOV DIS_GW, A
MOV A, TEMP_SW
MOV DPTR, #TABLE_INTER
MOVC A, @A+DPTR
MOV DIS_SW, A
MOV A, TEMP_BW
MOV DPTR, #TABLE_INTER
MOVC A, @A+DPTR
MOV DIS_BW ,A
RET
DELAY2MS:
MOV R6, #3
LOOP3:
MOV R5, #250
DJNZ R5, $
DJNZ R6, LOOP3
RET
TABLE_DP:
DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H DB 06H,07H,08H,08H,09H,09H
TABLE_INTER:
DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,7H,7FH,6FH
END