DHT11温湿度传感器

一.简介

DHT11作为一款低价、入门级的温湿度传感器,常用于我们的单片机设计实例中;它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。

DHT11为 4 针单排引脚封装,如下图,采用单线制串行接口,只需加适当的上拉电阻,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选择。

二.传感器参数

1.DHT11电气参数如下

2.引脚定义

3.典型电路

DHT11的供电电压为 3-5.5V,电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。DATA引脚并联一个5K以上的上拉电阻,增强信号的抗干扰额能力。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。

 

 

三.传感器控制时序

1.数据格式

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零,操作流程如下:

一次完整的数据传输为40bit,高位先出。

数据格式:

8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和

8位校验和:

"8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据"相加所得结果的末8位。

 

2.控制时序

要实现对DHT11传感器的控制和数据的读取,需先学会分析DHT11的控制时序。时序主要分为三部分:

  1. 触发DHT11采集数据;

  2. 读取数字0;

  3. 读取数字1;

(1)触发DHT11采集数据

总线空闲状态为高电平,单片机把总线拉低等待DHT11响应,单片机把总线拉低必须大于18ms,保证DHT11能检测到起始信号。

当DHT11接收到单片机的开始信号后,等待单片机开始信号结束,然后发送80us低电平响应信号。

单片机发送开始信号结束后,延时等待20-40us后,切换为输入状态,等待DHT11的80us低电平信号结束,然后判断DHT11是否是否发出 80us 的高电平;如果是,即可开始采集数据。

(2)数字0信号时序

当DHT11输出数字0时, 单片机读取到的信号为50 us的低电平,之后为26-28 us的高电平。

(3)数字1信号时序

当DHT11输出数字0时, 单片机读取到的信号为50 us的低电平,之后为70 us的高电平。

由此可知DHT11输出数字0和数字1的区别在于高电平的时间,由此单片机可在读取到高电平后,延时30us后,识别此时总线的电平,高电平为数字1,低电平为数字0;

(4)总时序图

用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。

从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。当一次完整的采集数据后,DHT11会转换到低速模式。

 

四.控制程序

1.单字节采集

void  COM(void)
{
  U8 i;    
  for(i=0;i<8;i++)     
  {
    U8FLAG=2;  
    while((!P2_0)&&U8FLAG++);
    Delay_10us();
    Delay_10us();
    Delay_10us();
    U8temp=0;
     if(P2_0)U8temp=1;
      U8FLAG=2;
     while((P2_0)&&U8FLAG++);
    //超时则跳出for循环      
     if(U8FLAG==1)break;
    //判断数据位是0还是1      
    // 如果高电平高过预定0高电平值则数据位为 1    
     U8comdata<<=1;
     U8comdata|=U8temp;        //0
   }
}

2.完整一次数据采集

void RH(void)
{
  //主机拉低18ms 
  P2_0=0;
   Delay(180);
   P2_0=1;
   //总线由上拉电阻拉高 主机延时20us
   Delay_10us();
   Delay_10us();
   Delay_10us();
   Delay_10us();
   //主机设为输入 判断从机响应信号 
   P2_0=1;
   //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行    
   if(!P2_0)     //T !    
   {
     U8FLAG=2;
     //判断从机是否发出 80us 的低电平响应信号是否结束   
     while((!P2_0)&&U8FLAG++);
     U8FLAG=2;
     //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
     while((P2_0)&&U8FLAG++);
     //数据接收状态     
     COM();
     U8RH_data_H_temp=U8comdata;
     COM();
     U8RH_data_L_temp=U8comdata;
    COM();
     U8T_data_H_temp=U8comdata;
     COM();
     U8T_data_L_temp=U8comdata;
     COM();
     U8checkdata_temp=U8comdata;
     P2_0=1;
     //数据校验 
     U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
    if(U8temp==U8checkdata_temp)
     {
      U8RH_data_H=U8RH_data_H_temp;
      U8RH_data_L=U8RH_data_L_temp;
      U8T_data_H=U8T_data_H_temp;
      U8T_data_L=U8T_data_L_temp;
      U8checkdata=U8checkdata_temp;
     }
   }/
}

 

3.获取DHT11数据

void GetTemp(void)
{
  //------------------------
   //调用温湿度读取子程序 
    RH();
   //串口显示程序 
   //--------------------------
  Send_string("Humidity:");
    str[0]=U8RH_data_H/10+0x30;
    str[1]=U8RH_data_H%10+0x30;
    str[2]='.';
    str[3]=U8RH_data_L/10+0x30;
    str[4]=U8RH_data_L%10+0x30;
    str[5]='\0';
    Send_string(str);
    Send_string("%\r\n");
    
    Send_string("Temperature:");
    str[0]=U8T_data_H/10+0x30;
    str[1]=U8T_data_H%10+0x30;
    str[2]='.';
    str[3]=U8T_data_L/10+0x30;
    str[4]=U8T_data_L%10+0x30;
    str[5]='\0';
    Send_string(str);
    Send_string("℃\r\n");
}

 

  • 9
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值