DHT11温湿度传感器(zigbee)

DHT11温湿度传感器(zigbee)

DHT11简介

DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数 字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一 个电阻式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。

电路连接

DHT11实物

  1. VDD 供电 3.5-5.5V DC
  2. DATA 串行数据,单总线
  3. NC 空脚
  4. GND 接地,电源负枀

时序图详解

DHT11最重要的就是时序图的解读,根据时序图来编写代码,得到温湿度数据。
时序图
DHT11上电后,自动采集温湿度数据,等待主机(单片机 / 处理器)信号, DHT11 的 DATA 数据线由上拉电阻拉高一直保持高电平,此时 DHT11 的 DATA 引脚处于输入状态,时刻检测外部信号。

  • 步骤一:主机 I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms,然后微处理器的 I/O 设置为输入状态,由于上拉电阻,微处理器的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待 DHT11 作 出回答信号,发送信号如图所示:
    起始信号
  • 步骤二:DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA 引脚处于输出状态,输出 80 微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接 收数据,微处理器的 I/O 此时处于输入状态,检测到 I/O 有低电平(DHT11 回应信号)后,等待 80 微秒 的高电平后的数据接收,发送信号如图所示:
    准备传输数据
  • 步骤三:由 DHT11 的 DATA 引脚输出 40 位数据,微处理器根据 I/O 电平的变化接收 40 位数据,位数据“0” 的格式为: 50 微秒的低电平和 26-28 微秒的高电平,位数据“1”的格式为: 50 微秒的低电平加 70 微秒的高电平。位数据“0”、“ 1”格式信号如图所示:
    数据格式判断
void DHT11(void){            //温湿传感启动
  DHT11_PIN = 0;
  MicroWait(19000);          //>18MS
  DHT11_PIN=1; 
  P0DIR &= ~0x80;            //重新配置IO口方向,输入
  MicroWait(40);
  if(!DHT11_PIN){            //低电平时,数据输出准备
    while(0 == DHT11_PIN);
    while(1 == DHT11_PIN);
    COM();                   //传输一字节数据
    Hum_H=ComData;
    COM();
    Hum_L=ComData;
    COM();
    Tem_H=ComData;
    COM();
    Tem_L=ComData;
    COM();
    CheckData=ComData;
    DHT11_PIN = 1;
    if(CheckData == (Hum_H+Hum_L+Tem_H+Tem_L)){      //校验数据
     wendu_shi=Tem_H/10; 
     wendu_ge=Tem_H%10;
     shidu_shi=Hum_H/10; 
     shidu_ge=Hum_H%10; 
    }else{
      wendu_shi=0;       
      wendu_ge=0;
      shidu_shi=0; 
      shidu_ge=0;
    }
    } 
  P0DIR |= 0x80; //IO口需要重新配置,输出
}

数据格式

DATA 用于微处理器与 DHT11 之间的通讯和同步,采用单总线数据格式,一次传送 40 位数据,高位先出。
数据格式

  • 数据格式 8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据+8bit 校验位。
  • 校验位数据 定义 “8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据”8bit 校验位等于所 得结果的末 8 位。
void COM(void){              // 温湿写入,一字节,共40bit,一次输出一字节,调动5次       
  for(uchar i=0;i<8;i++){
    while(0 == DHT11_PIN);   //50us高电平后,等待30us,高为1,低为0
    MicroWait(30);
    BitData = 0;
    if(DHT11_PIN){
      BitData = 1;
    }
    while(1 == DHT11_PIN);//等待高电平结束 
    ComData<<=1;
    ComData|=BitData; 
    }    
}

版权声明:本文为qq_39206199原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。