打印
[STC单片机]

读取18B20传感器,当温度升高到60多度,再读数就成FF ?

[复制链接]
1855|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ningling_21|  楼主 | 2013-8-14 13:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题: STC11F32XE,单个B20

常温下偶尔会出现读到FF,但升温到60度或更高时,几乎全变为FF,降温就恢复成正常数据。

哪位遇到过?

unsigned char ReadOneChar1(void)
{

        unsigned char i=0;
        unsigned char dat = 0;
        EA=0;
        for (i=8;i>0;i--)
        {
                  DQ1 = 0;                         // 给脉冲信号,在15US内完成信号采样
                  delay_18B20(1);        //5us
                  dat>>=1;
                  DQ1 = 1;                         // 给脉冲信号
                  delay_18B20(1);        //5US
                  if(DQ1==1)
                  {
                            dat|=0x80;
                  }
                  delay_18B20(36);  //45us
                  DQ1 = 1;                         // 释放
        }
        EA=1;
        return(dat);
}//

//写一个字节
void WriteOneChar1(unsigned char dat)
{
        unsigned char i=0;
        EA=0;
        for (i=8; i>0; i--)
        {
          DQ1 = 0;
          delay_18B20(7);        //15us
          DQ1 = dat&0x01;
          delay_18B20(32);         //45us
          DQ1 = 1;
          delay_18B20(1);
          dat>>=1;
        }
        EA=1;
}



相关帖子

沙发
ningling_21|  楼主 | 2013-8-15 08:44 | 只看该作者
不会是温度高了,B20也中暑了?

使用特权

评论回复
板凳
fly1974| | 2013-8-15 20:21 | 只看该作者
本帖最后由 fly1974 于 2013-8-15 20:23 编辑

正常现象,时序参数没调整好,参考1wire时序图和18b20时序图仔细调,另外主频不同时参数也要改的,否则可能就读不出来了!别光顾读写函数,初始化也很重要!

使用特权

评论回复
地板
liwei12400| | 2013-8-16 08:05 | 只看该作者
时序要求好严格的,以前我用的时候,两个数值很接近的晶振换一下就读不出来了。现在对数字传感器历历在目啊

使用特权

评论回复
5
ayb_ice| | 2013-8-16 08:06 | 只看该作者
显然驱动有问题

使用特权

评论回复
6
ningling_21|  楼主 | 2013-8-16 16:45 | 只看该作者
本帖最后由 ningling_21 于 2013-8-16 16:53 编辑

问题已解决  ,调整延时时间。
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(BYTE dat)
{
    char i;
        EA=0;
    for (i=0; i<8; i++)             //8位计数器
    {
        DQ = 0;                     //开始时间片
        delay_18B20(1);                //延时等待
        dat >>= 1;                  //送出数据
        DQ = CY;
        delay_18B20(60);               //等待时间片结束
        DQ = 1;                     //恢复数据线
        delay_18B20(1);                //恢复延时
    }
        EA=1;
}
/***************************************************************************************/
/**************************************
从DS18B20读1字节数据
**************************************/
BYTE DS18B20_ReadByte(void )
{
    BYTE i;
    BYTE dat = 0;
        EA=0;
    for (i=0; i<8; i++)             //8位计数器
    {
        dat >>= 1;
        DQ = 0;                     //开始时间片
        delay_18B20(1);                //延时等待
        DQ = 1;                     //准备接收
        delay_18B20(1);                //接收延时
        if (DQ) dat |= 0x80;        //读取数据
        delay_18B20(60);               //等待时间片结束
    }
        EA =1 ;
    return dat;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5013

主题

17740

帖子

51

粉丝