实验三十二 温度传感器温度控制实验
一、实验目的
1.了解温度传感器电路的工作原理 2.了解温度控制的基本原理 3.掌握一线总线接口的使用 二、实验说明
这是一个综合硬件实验,分两大功能:温度的测量和温度的控制。 1.DALLAS最新单线数字温度传感器DS18B20简介
Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。
DS18B20测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。DS18B20可以程序设定9~12位的分辨率,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20内部结构
DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如下:
DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
光刻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为符
号位。
LS Byte: Bit7 2 MS Byte: Bit15 S Bit14 S Bit13 S Bit12 S Bit11 S Bit10 2 63Bit6 2 2Bit5 2 1Bit4 2 0Bit3 2 -1Bit2 2 -2Bit1 2 -3Bit0 2 -4Bit9 2 5Bit8 2 4这是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。 温度 +125℃ +85℃ +25.0625℃ +10.125℃ +0.5℃ 0℃ -0.5℃ -10.125℃ -25.0625℃ -55℃ 数据输出(二进制) 0000 0111 1101 0000 0000 0101 0101 0000 0000 0001 1001 0001 0000 0000 1010 0010 0000 0000 0000 1000 0000 0000 0000 0000 1111 1111 1111 1000 1111 1111 0101 1110 1111 1110 0110 1111 1111 1100 1001 0000 数据输出(十六进制) 07D0h 0550h 0191h 00A2h 0008h 0000h FFF8h FF5Eh FE6Fh FC90h DS18B20温度传感器的存储器
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。
该字节各位的意义如下: TM R1 R0 1 1 1 1 1 低五位一直都是1 ,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位)
分辨率设置表: R1 0 0 1 1 R0 0 1 0 1 分辨率 9位 10位 11位 12位 温度最大转换时间 93.75ms 187.5ms 375ms 750ms 根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收
到此信号表示复位成功。
2.本实验在读取温度的基础上,完成类似空调恒温控制的实验。用加热电阻代替加热电机,制冷采用自然冷却。温度值通过LED静态显示电路以十进制形式显示出来,同时显示电路还将显示设定的恒温值,通过键盘可以改变设定值。按一次‘升高’键,恒温值加1℃,按一次‘降低’键,恒温值减小1℃。恒温值在2℃~50℃范围内可调。当实际温度低于设定的恒定温度2℃时,单片机发出指令信号,继电器吸合,红色LED点亮,加热电阻开始加热。当温度超过设定的恒温值2℃时,单片机发出指令信号,继电器断开,红色LED熄灭,加热电阻停止加热,制冷采用自然冷却。 三、实验内容及步骤
1.用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。
2.打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加“DS18B20.ASM”源程序,编译无误后,全速运行程序。
3.程序正常运行后,按下自锁开关‘控制’。5LED数显为“ XX20”,“XX”为十进制温度测量值,当气温低于0℃,或者模拟信号输入端的电位器没有逆时针旋到底时,温度值前面出现“-” 号。“20”为十进制温度设定值,按设定键‘升高’、‘降低’可以改变设定值。当测量值小于设定值2个字时,加热启动,当实际值超过设定值2个字时,加热停止。
4.可把源程序编译成可执行文件,烧录到89C51芯片中。
四、源程序
LEDBUF EQU 60H ;显示缓存1 TEMP EQU 65H ;显示缓存2
UP EQU 1 ;1键定义为增加键 DOWN EQU 2 ;2键定义为减小键 LOWLIMIT EQU 2 ;设定值最低为2 HIGHLIMIT EQU 50 ;设定值最高为50
FLAG1 EQU 38H ;是否检测到DS18B20标志位 SETTEMP EQU 50H ;温度设定值缓存 CURTEMP EQU 29H ;温度实际值缓存 DIN BIT P3.0 ;串行显示数据口 CLK BIT P3.1 ;串行显示时钟口 ORG 0000H LJMP START ORG 0100H
START: MOV SETTEMP, #20 ;设定值初值20
MLOOP: LCALL TESTKEY ;测试键盘是否有键按下
CJNE A,#03H,KEYPRESSED ;有键按下,处理按键 MLOOP1: ACALL DISPLAYRESULT ;无键按下,调显示
ACALL DISPLAYLED
ACALL GET_TEMPER ;调用读温度子程序 MOV A, CURTEMP
JB ACC.7, LE0 ;为负值 CLR C
MOV B, SETTEMP ;为正值时与设定值比较 DEC B DEC B SUBB A, B
JNC GN2 ;小于(设定值-2),加热 LE0: SETB P3.2 SJMP GN4
GN2: MOV A, CURTEMP SETB C
MOV B, SETTEMP INC B INC B SUBB A, B
JC GN4 ;大于(设定值+2),停止加热 CLR P3.2 SJMP GN4 GN4: ACALL DELAY1
LJMP MLOOP ;大循环 KEYPRESSED: ;处理按键
LCALL GETKEY ;读取键值 MOV B, A XRL A, #DOWN JNZ KEY0
MOV A, SETTEMP XRL A, #LOWLIMIT JZ KEY1
DEC SETTEMP SJMP KEY1 KEY0: MOV A, B XRL A, #UP JNZ KEY1
MOV A, SETTEMP XRL A, #HIGHLIMIT JZ KEY1 INC SETTEMP KEY1: LJMP MLOOP1
INIT_1820: ;这是DS18B20复位初始化子程序
SETB P2.0 NOP
CLR P2.0 ;主机发出延时537微秒的复位低脉冲 MOV R1,#3 TSR1: MOV R0,#107 DJNZ R0,$ DJNZ R1,TSR1
SETB P2.0 ;然后拉高数据线 NOP
NOP NOP
MOV R0,#25H
TSR2: JNB P2.0,TSR3 ;等待DS18B20回应 DJNZ R0,TSR2
LJMP TSR4 ;延时
TSR3: SETB FLAG1 ;置标志位,表示DS1820存在 LJMP TSR5
TSR4: CLR FLAG1 ;清标志位,表示DS1820不存在 LJMP TSR7 TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 TSR7: SETB P2.0 RET
GET_TEMPER: SETB P2.0
LCALL INIT_1820 JB FLAG1,TSS2
RET TSS2: MOV A,#0CCH LCALL WRITE_1820
MOV A,#44H LCALL WRITE_1820
LCALL DELAY1
LCALL INIT_1820 MOV A,#0CCH LCALL WRITE_1820
MOV A,#0BEH LCALL WRITE_1820
LCALL READ_18200 MOV A,CURTEMP
MOV C,40H RRC A MOV C,41H RRC A MOV C,42H RRC A MOV C,43H RRC A
MOV CURTEMP,A RET
WRITE_1820: MOV R2,#8 CLR C WR1: CLR P2.0
;时序要求延时一段时间 ;读出转换后的温度值
;先复位DS18B20 ;判断DS1820是否存在?若DS18B20不存在则返回;跳过ROM匹配 ;发出温度转换命令 ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束
;准备读温度前先复位 ;跳过ROM匹配 ;发出读温度命令 ;将读出的温度数据保存到35H/36H ;将28H中的最低位移入C ;写DS18B20的子程序(有具体的时序要求)
;一共8位数据