专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

单片机DS18B20水温控制系统设计

作者:佚名   来源:本站原创   点击数:  更新时间:2007年08月25日   【字体:
六.温度转换核心及其算法 1.温度传感器DS18B20原理与特性本系统采用了DS18B20单总线可编程温度传感器,来实现对温度的采集和转换,大大简化了电路的复杂度,以及算法的要求。首先先来介绍一下DS18B20这块传感器的特性及其功能: DSl8B20的管脚及特点 DS18B20可编程温度传感器有3个管脚。(如图:1) GND为接地线,DQ为数据输入输出接口,通过一个较弱的上拉电阻与单片机相连。VDD为电源接口,既可由数据线提供电源,又可由外部提供电源,范围3.O~5.5 V。本文使用外部电源供电。主要特点有: 1. 用户可自设定报警上下限温度值。 2. 不需要外部组件,能测量-55~+125℃ 范围内的温度。 3. -10℃ ~ +85℃ 范围内的测温准确度为±0.5℃ 。 4. 通过编程可实现9~l2位的数字读数方式,可在至多750 ms内将温度转换成12 位的数字,测温分辨率可达0.0625℃ 。 5. 独特的单总线接口方式,与微处理器连接时仅需要一条线即可实现与微处理器双向通讯。 DS18B20的内部结构 DS18B20内部功能模块如图2所示,主要由4部分组成:64位光刻R0M(图3)、温度传感器、非易失性的温度报警触发器TH和TL、配置寄存器。R0M 中的64位序列号是出厂前被光刻好的,他可以看作是该DSISB20的地址序列码,每个DSI8B20的64位序列号均不相同。高低温报警触发器TH 和TL,配置寄存器均由一个字节的E2PROM组成,使用一个存储器功能命令可对 TH,TL或配置寄存器写入。配置寄存器中R1,R0决定温度转换的精度位数:R1R0=’00’,9位精度,最大转换时间为93.75 ms;R1R0 = ‘01’,10位精度,最大转换时间为187.5 ms;R1R0 = ‘10’,11位精度,最大转换时间为375 ms;R1R0 =’11’,12位精度,最大转换时间为750 ms;未编程时默认为12位精度。本系统采用的也是12位的精度。 DS18B20的内存结构 DSI8B20温度传感器的内部存储器包括一个高速暂存RAM (便笺式的内部存储器)和一个非易失性的可电擦除的EEPROM,后者存放高温和低温触发器TH,TL和结构寄存器。便笺存储器包含了9个连续字节(0~8),前两个字节是测得的温度信息(图4),字节0的内容是温度的低8位,字节1是温度的高8位,字节2是TH(温度上限报警),字节3是TL(温度下限报警),字节4是配置寄存器(图5),用于确定输出分辨率9到12位。第5、6、7个字节是预留寄存器,用于内部计算。字节8是冗余检验字节,校验前面所有8个字节的CRC码,可用来保证通信正确。 DS18B20的测温功能当DSI8B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.062 5℃/LSB形式表示。温度值格式如图4所示,其中“S”为标志位,对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值。图4下面的表是对应的一部分温度值。DSI8B20完成温度转换后,就把测得的温度值与 TH做比较,若T>TH或T RoM操作命令 -> 存储器操作命令-> 处理数据 1 初始化 单总线上的所有处理均从初始化开始 2 ROM操作品令 总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如 指令 代码 Read ROM(读ROM) [33H] Match ROM(匹配ROM) [55H] Skip ROM(跳过ROM] [CCH] Search ROM(搜索ROM) [F0H] Alarm search(告警搜索) [ECH] 3 存储器操作命令 指令 代码 Write Scratchpad(写暂存存储器) [4EH] Read Scratchpad(读暂存存储器) [BEH] Copy Scratchpad(复制暂存存储器) [48H] Convert Temperature(温度变换) [44H] Recall EPROM(重新调出) [B8H] Read Power supply(读电源) [B4H] 温度传感器与单片机通讯时序 2.温度转换算法及分析由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。温度高字节(MS Byte)高5位是用来保存温度的正负(标志为S的bit11~bit15),高字节(MS Byte)低3位和低字节来保存温度值(bit0 ~ bit10)。其中低字节(LS Byte)的低4位来保存温度的小数位(bit0 ~ bit 3)。由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可。也就说,本系统的温度精确到了0.1度。 算法核心:首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码。处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位,百位的BCD码存入RAM中。由于百位没有用,默认情况是置为0A,在显示屏上没有任何显示。温度算法核心代码 DATA_DEAL: MOV A,TEMPERATURE_H ;TEMPERATURE_H存放的是DS18B20转换后的高8位的值(上图的MS Byte)ANL A,#80H ;判温度是否零下 JZ TEMPC1 ;A为0,说明是正数,跳往TEMPC1,如果是负数,则对低8为进行补码处理 CLR C MOV A,TEMPERATURE_L ;为负数,对低8 位(上图的LS Byte)求补 CPL A ;取反加1 ADD A,#01H MOV TEMPERATURE_L,A ;取补码后存回TEMPERATURE_L,此时TEMPERATURE_L里面的值就可以表示温度了 MOV A,TEMPERATURE_H CPL A ADDC A,#00H ;高位TEMPERATURE_H取反,加上从低位TEMPERATURE_L进来的位 MOV TEMPERATURE_H,A ;写回TEMPERATURE_H MOV TEMPERATURE_HC,#0BH SJMP TEMPC11 TEMPC1: MOV TEMPERATURE_HC,#0AH TEMPC11:MOV A,TEMPERATURE_HC SWAP A MOV TEMPERATURE_HC,A MOV A,TEMPERATURE_L ANL A,#0FH ;取A低4位(小数位,单位是0.0625),得出来的数要乘以0.0625,通过查表来算出值 MOV DPTR,#TEMPDOTTAB MOVC A,@A+DPTR ;查表 MOV TEMPERATURE_LC,A ;TEMPERATURE_LC的低四位保存 小数部分 BCD MOV DIS_BUF_X,A ;小数位的BCD码送入显示buffer中 MOV A,TEMPERATURE_L ;整数部分 ANL A,#0F0H ;得到个位单个数值 SWAP A ;SWAP后就得到个位真正的个位 MOV TEMPERATURE_L,A MOV A,TEMPERATURE_H ANL A,#0FH SWAP A ORL A,TEMPERATURE_L MOV TEMPERATURE_ZH,A ;组合后的值存入TEMPERATURE_ZH LCALL HtoB ;转换HEx值成为BCD码 MOV TEMPERATURE_L,A ;TEMPERATURE_L目前存入的是十位和个位的BCD编码 ANL A,#0F0H SWAP A ORL A,TEMPERATURE_HC ;TEMPERATURE_HC 低4位 存放 十位数 BCD MOV TEMPERATURE_HC,A MOV A,TEMPERATURE_L ANL A,#0FH SWAP A ;TEMPERATURE_LC高4位 存放 个位数 BCD ORL A,TEMPERATURE_LC MOV TEMPERATURE_LC,A MOV A,R7 JZ TEMPC12 ANL A,#0FH SWAP A MOV R7,A MOV A,TEMPERATURE_HC ;TEMPERATURE_HC高4位 存放 百位数 BCD ANL A,#0FH ORL A,R7 MOV TEMPERATURE_HC,A TEMPC12:RET ;小数部分码表 TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H,06H,07H,08H,08H,09H,09H 结果温度值的BCD码存放到TEMPERATURE_HC(百位和十位),TEMPERATURE_LC(个位和小数位)中七.硬件设计说明 1.系统总体电路图 2.各个模块电路图输入系统 1. 键盘模块我们用的下面四个独立键盘中的三个,分别是:K2,K3,K4。 1. 温度测量模块 DS18B20通过P3.3口和AT89S52进行通讯。
关闭窗口