当前位置 博文首页 > freemote的博客:DS18B20时序研究

    freemote的博客:DS18B20时序研究

    作者:[db:作者] 时间:2021-07-18 22:14

    ?????? 2012年刚学51单片机的时候,玩过DS18B20,忘的差不多了。最近再次用到,记一片流水账,加深理解,以防又忘掉。

    1、整体把握

    (1)读写数据都是低位先行;

    (2)默认12bit,可以配置为9,10,11,12bit,精度0.5,0.25,0.125,0.0625;

    (3)符号位S为0,表示正值,符号位s为1表示负值。

    2、芯片检测

    static uint8_t DS18B20_Check(void)
    {
      uint8_t retry=0;
      
      while(DS18B20_DQ_READ()&&retry<200)
      {
        retry++;
        _delay_us(1);
      }
      if(retry>=200)
      {
        return 0;//未检测到设备
      }
      else
      {
        retry=0;
      }
      
      while(!DS18B20_DQ_READ()&&retry<240)
      {
        retry++;
        _delay_us(1);
      }
      
      if(retry>=240)
      {
        return 0;//未检测到设备
      }
      else
      {
        return 1;   //检测到设备
      }
    }

    3、写数据

    (1)所有的写逻辑,都是有主机拉低总线再释放总线开始(总线电平:高->低);

    (2)所有的写(写1位)最少持续60us,相邻两个写之间大于1us;

    (3)DS18B20在第15us-60us之间采样。

    static void DS18B20_Write_Byte(uint8_t dat)
    {
        uint8_t j, testb;
        
        for (j=1;j<=8;j++) 
        {
            testb=dat&0x01;
            dat=dat>>1;
            if (testb) 
            {
                DS18B20_DQ_LOW(); // Write 1
                _delay_us(2);                            
                DS18B20_DQ_HIGH();
                _delay_us(60);             
            }
            else 
            {
                DS18B20_DQ_LOW(); // Write 0
                _delay_us(60);             
                DS18B20_DQ_HIGH();
                _delay_us(2);                          
            }
        }
    }

    4、读数据

    (1)所有的读逻辑,都是有主机拉低总线再释放总线开始(总线电平:高->低->高);

    (2)在主机产生读信号之后(下降沿),15us之内读取DS18B20。

    ?

    static uint8_t DS18B20_Read_Bit(void)
    {
      uint8_t dat;
      
      DS18B20_DQ_LOW();
      _delay_us(2);
      DS18B20_DQ_HIGH();
      _delay_us(10);
    
      if(DS18B20_DQ_READ())
      {
        dat=1;
      }
      else
      {
        dat=0;
      }
      _delay_us(45);
      return dat;
    }
    
    static uint8_t DS18B20_Read_Byte(void)
    {
       uint8_t i,j,dat;     
       dat=0;
       for (i=1;i<=8;i++) 
       {
          j=DS18B20_Read_Bit();
          dat=(j<<7)|(dat>>1);
       }    
       return dat;
    }

    5、DS18B20命令

    cs