作者:秦老师,华清远见教育科技集团讲师。
四、温度精度和数据格式分析
(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(); //复位
}