在线情况
楼主
  • 头像
  • 级别
    • 积分29
    • 经验413
    • 文章25
    • 注册2011-03-17
    关于多个DS18B20读取温度问题
    在一条数据线上挂接了两个18b20 首先编写函数分别读出了两个18b20的ROM,然后两个 18b20都挂到一条数据线上 实现两个结点读取温度 现在无法实现

    读取温度函数:
    unsigned char rom[][8]={{0xc5,0x2a,0xa8,0x02,0x00,0x00,0xd5,0xff},
                            {0xb3,0x9a,0xa8,0x02,0x00,0x00,0xb0,0xff}
                           };
    void get_tem()
    {
          unsigned char tem1,tem2,i,j;
         
           for(j=0;j<2;j++)            //仅以2路为例,改循环次数即可扩充到8路或更多,
           {
            reset_18b20();           //调用复位函数
            write_b (0x55); //发送ROM匹配命令
            for(i=0;i<8;i++)
            {
              write_b(rom[j][i]); //发送64位序列号
          
            }
          
         write_b(0x44);//温度转换       
         delay_ms(1000);
         reset_18b20();//调用复位函数
          write_b (0x55); //发送ROM匹配命令
            for(i=0;i<8;i++)
            {
              write_b(rom[j][i]); //发送64位序列号
          
            }
         write_b(0xBE);
         tem1=read_b();
         tem2=read_b();
    }
    }
    这个函数读出的tem1和tem2 均为oxff 有时还产生错误数值。
    希望得到指点···[EM07]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    DS18B20对延时比较敏感,在调这个器件时一定要一步一步多试前后时间宽度才行。如果你的延时碰到临界时间有可能会出现一时是对一时是错这些不统一的值发生。
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分29
      • 经验413
      • 文章25
      • 注册2011-03-17
      首先感谢DC版主能帮助解决问题,问题原因找到了,两片18B20的序列号读取错误,正确的序列号前八位应该是0x28,所以定义数组为
      unsigned char rom[][8]={{0x28,0xb3,0x9a,0xa8,0x02,0x00,0x00,0xb0},
                              {0x28,0xc5,0x2a,0xa8,0x02,0x00,0x00,0xd5}    
                             };
      即得到正确结果。
      微控网感谢您的参与
      Powered by LeadBBS 9.2 .
      Page created in 0.2969 seconds with 5 queries.