在上电复位的时候,温度寄存器中的值为0x0550,即+85摄氏度。如果在板子上显示的一直是85.5摄氏度,就说明DS18B20根本没有进行温度转换,你读到的是上电复位的初始值
#define uchar unsigned char
#define uint unsigned int
uint SMG_temp=0;
uchar temp=0;
void DS18B20_Get_Tempreature()
{
uchar LSB,MSB;
init_ds18b20(); //复位
Write_DS18B20(0xCC); //跳过ROM指令
Write_DS18B20(0x44); //开始温度转换
Delay_OneWire(800); //延时700-900ms
init_ds18b20(); //复位
Write_DS18B20(0xCC); //跳过ROM指令
Write_DS18B20(800);
LSB=Read_DS18B20();//读取暂存器的低八位
MSB=Read_DS18B20();//读取暂存器的高八位
temp=MSB;
temp=temp<<8|LSB;
/*
我们可知,LSB这个第八位数据的第四位是小数位,MSB这个高八位数据的高五位是符号表示
如果需要读取的数据是整数数据
SMG_temp>>=4; 可以直接获得数据
temp=SMG_temp;
*/
//如果需要读取小数点一位
if(SMG_temp&0xf800==0x0000) //如果高五位都是0,则是正数
{
temp>>=4;
temp=temp+(LSB&0x0f)*0.0625;//将LSB与上0x0f,LSB高4位清零,获得小数位
SMG_temp=temp*10;
//读出数据为负温度时,则需要将LSB和MSB整合成的16位整数,取反加1后,再乘以0.0625,因为温度数据是以补码形式表示的。
}
}