关于DS18B20初始化时候读出85摄氏度的解释。
本帖最后由 hubukaixuan 于 2012-9-2 00:08 编辑关于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);
//配置寄存器 写入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); //-----特别要注意这个地方。
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=tempwd/100+48;
strwd=(tempwd%100)/10+48;
strwd=tempwd%10+48;
}
这样,保证不会读出85了。
除非当时的环境就是85摄氏度。
这个东西要欣然接受,所有的18B20读出来的的首次温度都是85.具体论坛里面有人讨论过!
你那个延时等于让他延时了一段时间在读取温度的,所以你看不到85摄氏度。
楼上的哥们估计是没有看DS18B20的手册,你看一下就明白是怎么回事了。 我的一个18B20也读的是85度,其他的都正常,不知是否是坏了呢 网上的程序都是你抄我,我抄你,看到有的卖家的开发板一上电就是85,卖出去不让人笑死。不过你这个程序说实话也是毫无用处。既可以用定时器,也可以轮询是否转化完,至于怎么轮询datasheet上写的一清二楚。根深蒂固的山寨传统{:lol:} 我开发板的例程就是 上电85 18B20接触不良或不接DQ读出25 yirenonege 发表于 2012-9-6 18:18 static/image/common/back.gif
网上的程序都是你抄我,我抄你,看到有的卖家的开发板一上电就是85,卖出去不让人笑死。不过你这个程序说实 ...
呵呵,希望你看明白程序和DATASHEET之后,就明白我这个程序有没有用了。
至少我通过延时,保证他已经转换完成了。即使在上电第一次读取,
也是正常的,不是有的程序,一上电,读出一个初始化值85。
估计很多人没有自己亲自看DATASHEET,也没有亲自测试过程序,
对于这种人,我没有什么好说的。
LZ的解释应该是对的,默认是12位精度的 我看能不能改到汇编程序里面去,记号 嗯嗯,楼主思维不错! 今天得到了别人的帮助 我来也帮助一下别人
//复位DS18B20,并检测设备是否存在
void DS18B20_Reset()
{
BYTE DN=0;
BYTE CCY = 1;
BYTE TR = app_real.Temp_Data & 0xF0;
while (CCY)
{
DQ = 0; //送出低电平复位信号
DelayXus(240); //延时至少480us
DelayXus(240);
DQ = 1; //释放数据线
DelayXus(60); //等待60us
CCY = DQ; //检测存在脉冲
if(!CCY){
if(TR) //如果上次是DS18B20 ERR 后来又插入DS18B20
mark.SYS_PWR_Start=0x0; //放弃恢复后的第一次转换
app_real.Temp_Data &= 0x0F;
}
DelayXus(240); //等待设备释放数据线
DelayXus(180);
if(DN++>128){ //只检测128次,若不加此判断,如果未接DS18B20,则程序会死循环于此
app_real.Temp_Data |= 0x10;//DS18B20 ERR
CCY=0;
}
}
}
注意(DN++>128)只检测N多次啊否则在没有插入DS18B20传感器 或者传感器失效的情况系统别的外设 别想工作了啊 meesky 发表于 2012-9-12 00:22 static/image/common/back.gif
今天得到了别人的帮助 我来也帮助一下别人
//复位DS18B20,并检测设备是否存在
是用寄生电源的吧?不然就不用延时那么长时间了 我是说你的执行效率啊,100ms卡在哪里等转换结果 yirenonege 发表于 2012-9-12 12:19 static/image/common/back.gif
我是说你的执行效率啊,100ms卡在哪里等转换结果
呵呵,这个只是一个抛砖引玉。
因为给别人写了一个18B20显示,没有多任务。
就是1秒采集一次数据,所以也就没有多想了。
具体应用,可以用定里器,或者您说的查询是不是转换完成。 这个问题论坛上以前讨论过几种解决方法的 奇怪,我怎么上来读的就是对的?
没碰到过85
页:
[1]