6. 读电源,代码为B4H,用于将DS18B20的供电方式信号送到主机。
若在这条名令发出后发出读时间隙,DS18B20将返回它的供电模式:0代表寄生电源,1代表外部电源。
当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1,2字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.062 5 ℃/LSB形式表示。温度值格式如下:?
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。图中,S表示位。对应的温度计算:当符号位S=0时,表示测得的温度植为正值,直接将二进制位转换为十进制;当S=1时,表示测得的温度植为负值,先将补码变换为原码,再计算十进制值。例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。
DS18B20温度传感器主要用于对温度进行测量,数据可用16位符号扩展的二进制补码读数形式提供,并以0.0625℃/LSB形式表示。表2是部分温度值对应的二进制温度表示数据。?
6
表2 部分温度值
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较,若T>TH或T 在64位ROM的最高有效字节中存储有循环冗余校验码(CRC)。主机根据ROM的前 56位来计算CRC值,并和存入DS18B20中的CRC值做比较,以判断主机收到的ROM数 据是否正确。? 3)DS18B20测温原理 DS18B20的测温原理如图5所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 ℃所对应的一个基数值。 减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器 1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图2中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。 另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。 在正常测温情况下,DS1820的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:首先用DS1820提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度Ts可用下式计算: Ts=(Tz-0.25℃)+(CD-Cs)/CD 7 图5 DS18B20测温原理图 四 系统程序的设计 系统程序主要包括主程序、DS18b20复位与检测子程序、读温度子程序、温度数据处理子程序、温度显示子程序、按键扫描子程序报警值设定子程序、温度比较子程序等。 主程序首先进行初始化,当检测到DS18B20存在时发出温度转换命令和度温度命令,再分别调用相应的子程序,完成测温及显示工作。 DS18B20复位温度与检测子程序的主要功能是位检测DS18b20是否存在。若存在则将标志位FLAG1置1,不存在则将标志位FLEG1置0。后续程序可以通过标志位来决定进行那种操作。 读温度子程序只读出DS18b20暂存器前4个字节的数据:温度值LSB、温度值MSB、温度报警值TH和TL,并将它们分别存入26~29H。 温度数据处理子程序首先判断温度值MSB的符号位,当符号位S=0时,表示测得温度为正值,可以直接将二进制转换成十进制;当符号位为S=1时,表示测得温度为负值,要首先将补码变成原码,再计算十进制。计算时先将温度值LSB的低四位取出,进行小数部分数据处理。再将温度值LSB的高四位和温度值MSB的低四位取出,重新组合后尽心整数部分的数据处理。 温度显示子程序将从DS18b20读出的温度值,经过数据处理后,送往LCD进行实测温度显示。 按键扫描子程序对数字温度计的K1 ~K4键进行扫描,得到键值,根据键值完成相应的操作。按K1键进行查看温度报警值按K3键进行返回。按下K2键设定温度报警值,再次按下K2键调整TH的设定值,按下K3键调 8 整TH的设定值,设定过程中可以通过K1来决定是增施减,再按下K4键确定设定完毕,将温度报警值写入DS18B20的EEROM中保存,每次开机时自动从DS18B20中读出温度报警值。 温度比较子程序将实测温度值与设定的温度报警值进行比较,根据比较结果执行相应处理子程序。当实测温度大于温度报警值TH的设定值时,LCD显示>H并使指示灯闪动,蜂鸣器发出警报声。当实测温度值小于温度报警值TL的设定值时,LCD显示!,同时点亮指示灯。 初始化 显示调用子程序 N 1s到? Y Y 初次上电? N 读出温度值 温度计算处理 显示数据刷新 发温度转换开始命令 图 6 主程序流程图 发DS18B20复位命令 发跳过 ROM命令 发温度转换开始命令 发DS18B20复位命令 发跳过ROM命令 发读取温度命令 读取操作,CRC校验 N 9字节完? Y CRC校验正确? N Y 移入温度暂存器 结束 图7 读出温度子程序流程图 9 开始 图8 温度转换命令 子程序流程图 N 温度零下S=0? Y 温度值取补码置“—”标志 置“+”标志 计算小数位温度BCD值 计算整数位温度BCD值 结束 图9 温度处理子程序流程图 温度数据移入显示寄存器 N 十位数0? Y N 百位数0? 10 Y