DS18B20时序研究

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

1、整体把握

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

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

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

DS18B20时序研究_第1张图片

2、芯片检测

DS18B20时序研究_第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之间采样。

DS18B20时序研究_第3张图片

DS18B20时序研究_第4张图片

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。

DS18B20时序研究_第5张图片

DS18B20时序研究_第6张图片

 

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命令

DS18B20时序研究_第7张图片

你可能感兴趣的:(传感器)