一、DS18B20温度转换与读取流程
1.DS18B20复位。
2.写入字节0xcc,跳过ROM指令。(一个总线上可能有很多设备,匹配存在ROM中的id号确定设备)
3.写入字节0x44,开始温度转换。
4.延时ms级(不要也行)。
5.DS18B20复位。
6.写入字节0xcc,跳过ROM指令。
7.写入字节0xbe,读取高速暂存器。
8.读取暂存器的第0字节,即温度数据的LSB。
9.读取暂存器的第1字节,即温度数据的MSB。
10.将LSB和MSB整合成一个16位数据。
11.判断读取结果的符号,进行正负温度的数据处理。
二、DS18B20数据处理
高5位符号位为0是正数,为1是负数。
三、代码实现
//注意此处接收temp为int型,运算为float型,显示根据小数点位数乘10^n为int型
float temp_ds18b20 = 0; //实际温度值
unsigned int smg_ds18b20 = 0; //数码管显示温度值
//=====DS18B20初次温度读取,避免85℃=====//
void Init_DS18B20_Temp()
{
unsigned char LSB,MSB; //DS18B20数据以16位带符号位二进制补码给出,分为高八位低八位
init_ds18b20();
Write_DS18B20(0xcc); //忽略ROM操作
Write_DS18B20(0x44); //启动温度转换
do
{
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe); //读取内部存储器
LSB = Read_DS18B20(); //第0字节,温度低八位
MSB = Read_DS18B20(); //第1字节,温度高八位
MSB = (MSB << 4) | (LSB >> 4); //LSB去除小数部分,最后只剩下整数部分
}while(MSB == 85); //避免上电时,读取温度默认值85,作为当前采样温度,所以可以这么省去
}
//=====DS18B20温度读出与显示=====//
void Read_DS18B20_Temp()
{
unsigned char LSB,MSB;
unsigned int temp = 0;
init_ds18b20();
Write_DS18B20(0xcc); //忽略ROM操作
Write_DS18B20(0x44); //启动温度转换
DisplaySMG_Ability();//在中间插入多处数码管刷新,可使显示亮度充足
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20(); //第0字节,温度低八位
MSB = Read_DS18B20(); //第1字节,温度高八位
temp = MSB;
temp = (temp << 8) | LSB;
if((temp & 0xf800) == 0x0000) //判断高5位符号位
{
temp_ds18b20 = temp * 0.0625;
//也可分别对整数部分和小数部分分别操作再合并,此处数据应根据实际情况调整
//temp >>= 4;
//temp = temp * 100;
//temp = temp + (LSB & 0x0f) * 6.25;
}
smg_ds18b20 = temp_ds18b20 *10; //小数转换为整数方便数码管显示
DisplaySMG_Ability();
注:本笔记仅作个人学习使用。