hubukaixuan 发表于 2012-9-2 00:07:03

关于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摄氏度。

HeP028 发表于 2012-9-2 21:44:25

这个东西要欣然接受,所有的18B20读出来的的首次温度都是85.具体论坛里面有人讨论过!

你那个延时等于让他延时了一段时间在读取温度的,所以你看不到85摄氏度。

hubukaixuan 发表于 2012-9-6 16:11:03

楼上的哥们估计是没有看DS18B20的手册,你看一下就明白是怎么回事了。

afengjiuling 发表于 2012-9-6 17:00:15

我的一个18B20也读的是85度,其他的都正常,不知是否是坏了呢

yirenonege 发表于 2012-9-6 18:18:06

网上的程序都是你抄我,我抄你,看到有的卖家的开发板一上电就是85,卖出去不让人笑死。不过你这个程序说实话也是毫无用处。既可以用定时器,也可以轮询是否转化完,至于怎么轮询datasheet上写的一清二楚。根深蒂固的山寨传统{:lol:}

gaoyichuan000 发表于 2012-9-7 07:08:12

我开发板的例程就是 上电85 18B20接触不良或不接DQ读出25

hubukaixuan 发表于 2012-9-11 13:55:14

yirenonege 发表于 2012-9-6 18:18 static/image/common/back.gif
网上的程序都是你抄我,我抄你,看到有的卖家的开发板一上电就是85,卖出去不让人笑死。不过你这个程序说实 ...

呵呵,希望你看明白程序和DATASHEET之后,就明白我这个程序有没有用了。
至少我通过延时,保证他已经转换完成了。即使在上电第一次读取,
也是正常的,不是有的程序,一上电,读出一个初始化值85。
估计很多人没有自己亲自看DATASHEET,也没有亲自测试过程序,
对于这种人,我没有什么好说的。

sleet1986 发表于 2012-9-11 15:38:55

LZ的解释应该是对的,默认是12位精度的

tonyone 发表于 2012-9-11 23:42:36

我看能不能改到汇编程序里面去,记号

chenfzg 发表于 2012-9-12 00:09:14

嗯嗯,楼主思维不错!

meesky 发表于 2012-9-12 00:22:15

今天得到了别人的帮助 我来也帮助一下别人

//复位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传感器 或者传感器失效的情况系统别的外设 别想工作了啊

503126063 发表于 2012-9-12 11:55:05

meesky 发表于 2012-9-12 00:22 static/image/common/back.gif
今天得到了别人的帮助 我来也帮助一下别人

//复位DS18B20,并检测设备是否存在


是用寄生电源的吧?不然就不用延时那么长时间了

yirenonege 发表于 2012-9-12 12:19:18

我是说你的执行效率啊,100ms卡在哪里等转换结果

hubukaixuan 发表于 2012-9-13 15:27:38

yirenonege 发表于 2012-9-12 12:19 static/image/common/back.gif
我是说你的执行效率啊,100ms卡在哪里等转换结果

呵呵,这个只是一个抛砖引玉。
因为给别人写了一个18B20显示,没有多任务。
就是1秒采集一次数据,所以也就没有多想了。

具体应用,可以用定里器,或者您说的查询是不是转换完成。

fengyuxiaoxiao 发表于 2012-9-16 16:34:04

这个问题论坛上以前讨论过几种解决方法的

tuy0326 发表于 2012-9-16 16:37:51

奇怪,我怎么上来读的就是对的?
没碰到过85
页: [1]
查看完整版本: 关于DS18B20初始化时候读出85摄氏度的解释。