基于FS4412的DS18B20温度采集编程实现(2—读取流程和相关命令)

作者:秦老师,华清远见教育科技集团讲师。

四、温度精度和数据格式分析

(1)DS18b20温度精度

DS18B20的核心功能是数字量输出的温度传感器。DS18B20温度转换的精度是可配置的(9,10,11,或12位对应这0.5℃,0.25℃,0.125℃,0.0625°C的温度测量精度),出厂默认温度精度是12位(0.0625°C)。

(2)温度数据格式

DS18B20 的温度测量范围是从-55 度到+125 度,而温度数据的表现形式,有正负温度,上表给出了,DS18B20 在高 12 位精度时,输出的数据和确切的温度之间的关系。

DS18B20输出的数据以补码的形式存放在LSB和MSB两个字节内,LSB 8位全为数据位, MSB 低3位为数据位,MSB高5位为符号位。

通过编程我们实现对输出数据的转换为确切温度流程:
                1--判断数据正负
                2--整合 LSB和 MSB的数据
                3--.求得十进制值。正数乘以 0.0625,一位小数点乘以 0.625,二位小数点乘以 6.25
                      数值扩大100倍,打印时方便分割。
                4—打印转换

转化程序:

void print_temp(unsigned char Temp1, unsigned char Temp2)
        {
        char sign = '+';
        unsigned int Temperature;
        printf("\n");
        if(Temp2 & 0xFC) //判断符号位
        {
        sign = '-'; //设置符号位为‘-’
        Temperature = ((Temp2 << 8) | Temp1);
        Temperature = ((~Temperature) + 1) & 0xFFFF; //取反加1,补码转换为源码
        Temperature *= 0.0625 * 10 * 10; //转换温度,扩大100倍
        }
        else
        {
        sign ='+' //设置符号位为‘+’
        Temperature = ((Temp2 << 8) | Temp1);
        Temperature *= 0.0625 * 10 * 10; //转换温度,扩大100倍
        }
        printf("Temperature: %c%d.%d%d\n", sign, \ //打印数据
        Temperature/100, \
        Temperature%100/10, \
        Temperature%100%10);
        }

五、DS18b20存储器命令

(1)DS18b20内部存储器

暂存器空间为八个字节的内存。前2个字节是存储测量的温度信息的内存单元LSB和MSB。第三和第四个字节是TH和TL,用来存放温度报警温度。第五个字节是存放配置信息的内存单元。第六,第七和第八字节用于内部计算,因而不会任何可预测的模式下读出。

(2)ROM指令

FS4412控制器是通过单总线,发送指令的方式来对DS18B20进行控制。ROM 指令,识别DS18B20的指令,也就是访问,搜索,匹配,DS18B20 的 64 位序列号的动作。主要是在多点测量的时候使用。我们当前是单点测量,可以直接跳过 ROM 指令。跳过 ROM 指令的字节是 0xCC。

(3)RAM指令

RAM指令是DS18B20的功能指令。这里我介绍比较常用的几个 DS18B20 功能指令。

指令 指令功能
0x44 开始转换温度,转换好的温度会储存到暂存器0和暂存器1
0xEE 读取暂存器命令,读暂存器指令,会从暂存器0道暂存器9,一个一个字节读取,如果要停止的话,必须写下 DS18B20 复位。
0x4E 写入暂存器命令,写暂存器指令,会从暂存器2(TH寄存器)开始到暂存器4。一个字节一个字节的写入。每个字节写入之前必须复位发出。

六、DS18b20获取温度流程

控制器访问 DS18B20必须遵守,DS18B20 复位-->执行 ROM 指令-->执行 DS18B20 功能指令。而在单点上,可以直接跳过 ROM 指令。DS18B20 的转换精度默认为 12 位,而分辨率是 0.0625。

DS18B20 温度读取流程:
        (1)DS18B20 开始转换:
                1--DS18B20 复位。
                2--写入跳过 ROM 的字节命令,0xCC。
                3--写入开始转换的功能命令,0x44。
        (2)DS18B20 读暂存数据:
                1--DS18B20 复位。
                2--写入跳过 ROM 的字节命令,0xCC。
                3--写入读暂存的功能命令,0xEE。
                4--读入暂存器0(LSB),转换结果的低八位。
                5--读入暂存器1(MSB),转换结果的高八位。
                6--DS18B20 复位,表示读取暂存结束。

DS18B20温度读取程序:

void Read_Temperature (unsigned char *Temp1, unsigned char *Temp2)
        {
                DS18_Reset(); //复位
                DS18_Write(0xCC); //0xCC: 跳过ROM指令
                DS18_Write(0x44); //0x44:温度转换指令
                DS18_Reset(); //复位
                DS18_Write(0xCC); //0xCC: 跳过ROM指令
                DS18_Write(0xBE); //0xBE:读取暂存器指令
                *Temp1 = DS18_Read(); //读取LSB暂存器
                *Temp2 = DS18_Read(); //读取MSB暂存器
                DS18_Reset(); //复位
        }