本文主要是介绍DS18B20读出85摄氏度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原文出处:https://blog.csdn.net/hubukaixuan/article/details/7933575
在原文的基础上,一定修改。
关于DS18B20初始化时候读出85摄氏度的问题,我相信很多朋友都遇到过。
很多人估计没有解决这个问题。最后不得已的情况下多读了几次,然后才开始显示。
问题就是因为,DS18B20默认是12位采样,具体时间看下表:
配置寄存器
所以每次单片机复位后,进行如下配置:
void DS18B20_Init(void)
{
ow_reset(); //初始化
write_byte(0xcc); //忽略ROM指令
write_byte(0x4e); //写暂存器指令
write_byte(0); //TH值 未使用
write_byte(0); //TL值 未使用
write_byte(0x1f); // 采用bit数。
//配置寄存器 写入R1=0 R0=0 表示只用9位采样
//这样转换时间约为100ms 加快采样转换速度
}
然后以后读温度时候,如此操作即可:
void read_temp(void) //获取温度get the temperature
{
unsigned char a,b;
ow_reset();
write_byte(0xcc); //忽略ROM指令
write_byte(0x44); //温度转换指令
delay_nms(110); //-----特别要注意这个地方。延时在这里,对应上方表格的时间(注解1)
ow_reset(); //初始化
write_byte(0xcc); //忽略ROM指令
write_byte(0xbe); //读暂存器指令
a = read_byte(); //读取到的第一个字节为温度LSB
b = read_byte(); //读取到的第2个字节为温度MSB
a=a>>4; //不要小数点
b=b*16;
tempwd=a+b;
strwd[0]=tempwd/100+48;
strwd[1]=(tempwd%100)/10+48;
strwd[2]=tempwd%10+48;
}
这样,保证不会读出85了。
除非当时的环境就是85摄氏度
注解1:
关于注解1的理解,实际时候发现一个现象,
如果延时不足:
第一次,第二次,第三次,(三次的时间和 > 表中的延时时间 )读取的数据不对,但是第四次及之后读取正确。
可以理解:第四次的读取,是第一次的的结果。那么其实在ds18b20,可能会存在次数统计,或者存储的数据一直在
如果延时足够:
第一次读取,即可回复正确的数值。
---------------------
作者:hubukaixuan
来源:CSDN
原文:https://blog.csdn.net/hubukaixuan/article/details/7933575
版权声明:本文为博主原创文章,转载请附上博文链接!
这篇关于DS18B20读出85摄氏度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!