DHT11温湿度传感器编程详解

一.DHT11介绍

       DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,采用专用的数字模块采集技术和温湿度传感技术,无需复杂的电路处理。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。

       每个DHT11传感器在出厂前都对湿度进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。传感器为 4 针单排引脚封装,采用单线制串行接口,应用电路简单方便。

二.DHT11主要参数

(1)湿度分辨率为8bit,测量精度为±4%RH(25℃),最大的测量范围为20~90%RH,响应时间为6-16秒;

(2)温度分辨率为8bit,测量精度为±1℃,测量范围为0~50℃,响应时间为6~30秒。

(3)传感器工作电压范围为3~5V,工作电流为0.5~2.5mA,采样周期为1s(即每次刷新温湿度数据时间至少1s以上)。

三.DHT11电路图

      电路如图,Pin1接至VDD,Pin2接至单片机引脚,Pin3悬空,Pin4接至GND。DHT11与MCU的连接线长度短于20米时,DATA引脚需外接5K上拉电阻至VDD。

四.DHT11数据格式

       DHT11每读取一次完整的数据为40bit的数据,需要根据以下格式将湿度和温度数据解析出来。

数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据+8bit校验和;

其中,高位在前,低位在后;校验和为前4个字节的累加和的末8位。

五.DHT11操作时序

1.复位时序

        总线空闲状态为高电平,MCU引脚设置为输出状态,把引脚设置为低电平,延时19ms,然后延时30us,并将引脚设置为输入状态,等待DHT11响应;从时序看,MCU需要保持引脚低电平必须大于18ms,保证DHT11能检测到起始信号。

        根据时序进行编程代码如下:

void dht11_reset(void)
{
  // DHT11设置为输出模式
  dht11_gpio_output();
  DHT11_OUT_L;
  delay_us(19000);
  DHT11_OUT_H;
  delay_us(30);
  dht11_gpio_input();
}

        DHT11接收到MCU的开始信号后, 等待MCU开始信号结束,然后发送80us低电平响应信号。MCU发送开始信号结束后,延时等待20-40us后;然后MCU读取DHT11的响应信号(即DHT11信号置低电平80us后,置为高电平80us);确认DHT11响应信号有效后,MCU进入数据读取模式。

u16 dht11_read_data(u8 buffer[5])
{
  u16 i = 0;
  u8 checksum;
  dht11_reset();
  if (dht11_scan() == RESET)
  {
    //MCU读取DHT11响应信号
    while (dht11_scan() == RESET); 
    while (dht11_scan() == SET);
    //确认DHT11发出响应信号后,进入数据读取模式
    for (i = 0; i < 5; i++)
    {
      buffer[i] = dht11_read_byte();
    }
    while (dht11_scan() == RESET);
    dht11_gpio_output();
    DHT11_OUT_H;
    checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];
    if (checksum != buffer[4])
    {
      // checksum error
      return 1;
    }
  }
  return 0;
}

        MCU读取完5个字节数据后,确认DHT11信号是否置为低电平,如果是,此次数据读取完毕;单片机引脚切换到输出模式,并将引脚电平拉高,释放总线。

完整的数据通信时序如图:

2.读取数据时序

        MCU进入数据读取模式时,判断数据位为0或者为1是通过高电平的时间来判断。时序如图:

数据线低电平50us后,拉至高电平,高电平时间为26us-28us内,数据位为0;高电平时间为28us-70us内,数据位为1;

数据位为‘0’

数据位为‘1’

        读数据位程序:程序通过在DHT11数据线拉至高电平时,延时40us,判断此时数据位引脚的状态,如果为高电平,则高电平状态在28us-70us内,数据位为‘1’;否则为‘0’。

u16 dht11_read_bit(void)
{
  while (DHT11_IN == RESET);
  delay_us(40);
  if (DHT11_IN == SET)
  {
    while (DHT11_IN == SET);
    return 1;
  }
  else
  {
    return 0;
  }
}

如需资料可关注公众号-单片机实例设计,发送“DHT11”获取。

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分支预测是计算机中的一种技术,用于提高程序的执行效率。其中,BTB(Branch Target Buffer)和BHT(Branch History Table)是两种常见的分支预测方法。 BTB是一种缓冲区,用于存储分支指令的预测目标地址。在程序中,分支指令会根据特定的条件来选择跳转到不同的代码块。BTB通过记录过去的分支指令及其目标地址,以便在将来遇到相同的分支指令时可以快速预测其目标地址。这样,在预测正确的情况下,可以避免浪费时间等待分支判断的结果,并提前开始执行预测目标地址处的指令流。但是,当预测错误时,需要回退到正确的指令位置,这样会带来额外的开销。 BHT是一种记录分支历史的表格。它用来跟踪分支指令的历史模式,以便在将来遇到相同的分支时预测其行为。BHT可以记录分支指令的条件判断结果,比如“是否进入循环”,然后基于历史记录来预测下一次分支指令的结果。如果历史模式具有一定的规律性,那么BHT能够准确地预测分支的行为,提高程序的性能。但是,当历史模式改变时,预测就会出错,需要进行修正。 综上所述,BTB和BHT是分支预测的两种常见方法。BTB通过存储过去的分支目标地址来预测分支指令的执行位置,而BHT通过记录历史模式来预测分支指令的行为。这些预测技术能够显著提高程序的执行效率,但也有一定的错误率,并且需要额外的硬件支持来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值