OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4173|回复: 3

关于stm32F4 - dht11时序问题

[复制链接]

3

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-9-23
在线时间
11 小时
发表于 2017-12-22 22:07:19 | 显示全部楼层 |阅读模式
大神们,请教一个问题,关于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,那么现在一定还是高电平
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-12-22 23:10:14 来自手机 | 显示全部楼层
1.12_14us是初始化信号,因为单片机有中断等,又是单线程的对小延时响应不足,所以先检测下降沿再检测上升沿不好做,直接检测在一个超时周期内/100us内先检测低电平再检测高电平。2.40us延时大于检测0的28us,所以这时如果还能检测到高电平说明检测到的信号是1
回复 支持 反对

使用道具 举报

3

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-9-23
在线时间
11 小时
 楼主| 发表于 2017-12-23 14:03:07 | 显示全部楼层
l6931639 发表于 2017-12-22 23:10
1.12_14us是初始化信号,因为单片机有中断等,又是单线程的对小延时响应不足,所以先检测下降沿再检测上升 ...

我现在暂且只能理解为这样,数据每一位的传输时
开始位:是从低电平开始的。Ok,第一个100us是等待低电平,解决了。
数据位:第二个100us是等待高电平,解决了。

问题就剩下:
1.开始位的12-14us无法体现出来。
2.如果在数据段处,在轮循到99微秒才来高电平,即是高电平时间为则1us+40us < 数据位"1"的时间116 ~ 118us。
回复 支持 反对

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2018-1-1 23:33:37 | 显示全部楼层
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
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-19 20:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表