DHT11温湿度传感器编程详解

发布于:2023-01-07 ⋅ 阅读:(1327) ⋅ 点赞:(1)

一.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”获取。

本文含有隐藏内容,请 开通VIP 后查看