关于stm32F4 - dht11时序问题

2019-07-20 10:11发布

大神们,请教一个问题,关于dht11的读每一位的过程,时序图上是开始位12-14us的低电平,之后是数据位
0表示是26-28us的高电平
1表示是116-118的高电平
但是代码上的实现不有点不懂。
V5777TD%7U]~}S[FE{OW1VD.png


u8 DHT11_Read_Bit(void)                          
{
         u8 retry=0;
        while(DHT11_DQ_IN&&retry<100)//等待低电平
        {
                retry++;
                delay_us(1);
        }
        retry=0;
        while(!DHT11_DQ_IN&&retry<100)//等待高电平
        {
                retry++;
                delay_us(1);
        }
        delay_us(40);//延时40us
        if(DHT11_DQ_IN)return 1;
        else return 0;                  
}

1.为什么要在100us内等待低电平的到来时?到了后呢,不是还要有12-14us的低电平时间吗
2.为什么要在100us内等待高电平的到来时?
3.为什么要延时40us,假设高电平来了,过了40us后,如果是数据位0,则40us后就是低电平。如果是数据为1,那么现在一定还是高电平
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
l6931639
2019-07-20 22:02
cpsir 发表于 2017-12-23 14:03
我现在暂且只能理解为这样,数据每一位的传输时
开始位:是从低电平开始的。Ok,第一个100us是等待低电 ...

   while(DHT11_DQ_IN&&retry<100)//等待低电平
        {
                retry++;
                delay_us(1);
        }
        retry=0;
        while(!DHT11_DQ_IN&&retry<100)//等待高电平
        {
                retry++;
                delay_us(1);
        }
这个是起始位,检测一个低电平后再检测一个高电平。

  delay_us(40);//延时40us
这个是确定得到1还是0的超时检测。
if(DHT11_DQ_IN)return 1;
        else return 0;
检测高低电平,如果高电平则说明1,如果低电平说明是0

一周热门 更多>