单片机——DHT11 温湿度传感器

本文详细介绍了DHT11温湿度传感器的工作原理及在51单片机中的应用方法。包括传感器参数、电路连接、时序图解析及具体函数实现,帮助读者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DHT11温湿度传感器在51单片机中的应用

DHT11实物图

一、DHT11 模块参数如下:

1 可以检测周围环境的湿度和温度
2 传感器采用 DHT11
3 湿度测量范围: 20%-95%( 0 度-50 度范围)湿度测量误差: ±5%
4 温度测量范围: 0 度-50 度 温度测量误差: ±2 度
4 工作电压 3.3V-5V
5 输出形式 数字输出
6 设有固定螺栓孔,方便安装
7 小板 PCB 尺寸: 3.2cm * 1.4cm
8 电源指示灯(红色)

二、模块电路图

DHT11模块电路图
注意:这是模块的电路图,图中DATA引脚之所以要加上拉电阻,是应为dht11传感器中有如下介绍:
温湿度传感器应用电路图
所以我们如果后面开发不买上面成品温湿度模块,我们可以买那种只有三针引脚的温湿度传感器(如下图)自己按照上面的电路图自己焊电路。最后好奇的童鞋会不会问,那为什么要加上拉电阻呢?这些童鞋可以往后看,在后面时序图中我们可以知道DHT会发送高电平信号,这里加入上拉电阻可以实现输出真正意义上的高电平哦。
在这里插入图片描述

三、 DHT11 模块接线说明

1 VCC 外接 3.3V-5V
2 GND 外接 GND
3 DATA 小板开关数字量输出接口 接单片机 IO 口

四、 DHT11 测试说明

编译环境: keil4
测试单片机 STC89C52
DHT11 模块与单片机连接: VCC-VCC 、GND-GND、 DATA-P2.0
从DHT11的DATA引脚总共接收 40位数据,具体如下:
温度高 8 位 串口发送的第一个数据
温度低 8 位 串口发送的第二个数据(默认为 00)
湿度高 8 位 串口发送的第三个数据
湿度低 8 位 串口发送的第四个数据(默认为 00)
校验 8 位 串口发送的第五个数据

五、 DHT11 功能函数

DHT11.C文件

sbit thd11=P2^0;	//定义DHT11温湿度数据引脚DATA
/*------------------------------------------------
              DHT11延时函数
------------------------------------------------*/
void DHT11_delay_us(uchar n)
{
    while(--n);
}
void DHT11_delay_ms(uint z)
{
   uint i,j;
   for(i=z;i>0;i--)
      for(j=110;j>0;j--);
}
/*--------------------------------------------
              DHT11开始信号
------------------------------------------------*/
void DHT11_start()
{
   thd11=1;
   DHT11_delay_us(2);
   thd11=0;
   DHT11_delay_ms(20);   //延时18ms以上
   thd11=1;
   DHT11_delay_us(30);
}

/*------------------------------------------------
              接收八位二进制
------------------------------------------------*/

uchar DHT11_rec_byte()      //接收一个字节
{
  unsigned char i,dat=0;
  for(i=0;i<8;i++)    //从高到低依次接收8位数据
   {          
      while(!thd11);   等待50us低电平过去
      DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0 
      dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位
      if(thd11==1)    //数据为1时,使dat加1来接收数据1
        dat+=1;
      while(thd11);  //等待数据线拉低    
   }  
    return dat;
}

/*------------------------------------------------
              接收40bit数据(具体的温湿度)
------------------------------------------------*/
void DHT11_receive(uchar *rec_dat)      //接收40位的数据
{
    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; 
    DHT11_start();
    if(thd11==0)
    {
        while(thd11==0);   //等待拉高     
        DHT11_delay_us(80);  //拉高后延时80us
			
        R_H=DHT11_rec_byte();    //接收湿度高八位  
        R_L=DHT11_rec_byte();    //接收湿度低八位  
        T_H=DHT11_rec_byte();    //接收温度高八位  
        T_L=DHT11_rec_byte();    //接收温度低八位
        revise=DHT11_rec_byte(); //接收校正位

        DHT11_delay_us(25);    //结束

        if((R_H+R_L+T_H+T_L)==revise)      //最后一字节为校验位,校验是否正确
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        } 
				
        /*数据处理,转换为字符,方便显示*/
				
        rec_dat[0]='0'+(RH/10);
        rec_dat[1]='0'+(RH%10);
        rec_dat[2]='0'+(TH/10);
        rec_dat[3]='0'+(TH%10);
				
    }

}

是不是很多人和我最开始接触单片机一样,不会用模块手册/芯片手册,我在这里还是附上如何看手册编写源程序的方法吧!

单片机时序是指单片机执行指令时发出的控制信号的时间序列。这些信号在时间上的相互关系就是CPU的时序。
CPU发出的时序有两类:
	1. 用于片内各功能部件的控制,它们是芯片设计师关注的问题,对用户没有什么意义
	2. 用于片外存储器或I/O端口的控制,需要通过器件的控制引脚送到片外,这部分时序
	   对分析硬件电路的原理至关重要,也是软件编程遵循的原则,需要认真掌握。

在这里插入图片描述
上图为单片机和DHT11之间通信的时序图。从时序图中可知:
1、主机先拉低总线进行发送开始信号,然后再将总线拉高等待DHT11响应主机。此时DHT11从低功耗模式转换到高速模式,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。
2、DHT11接收到主机的开始信号后,等待主机开始信号结束,再发送低电平响应信号,然后将总线拉高准备输出。
3、DHT11拉高总线后,就开始给主机传输数据了。
4、DHT11数据传输完后,会将总线拉低50us,通知主机结束(主机将总线拉高)。

1、下面是开始信号的编写方法:

在这里插入图片描述

总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。主机发送开始信号结束后,延时等待20-40us后, 开始读取DHT11的响应信号。

/*--------------------------------------------
              DHT11开始信号
------------------------------------------------*/
void DHT11_start()
{
   thd11=1;//总线先拉高
   DHT11_delay_us(2);
   thd11=0;//总线拉低
   DHT11_delay_ms(20);   //延时18ms以上
   thd11=1;//总线拉高
   DHT11_delay_us(30);//延时等待20-40us后
}

2、下面是接收数据的编写方法

在这里插入图片描述
上图就是DHT11接收到开始信号后,它对总线的时序图。可知:
1、发送80us的低电平响应信号。
2、然后它将总线拉高80us的高电平,为传输数据(温湿度等)做准备。
3、开始在总线上传输数据(此时单片机就可以接收数据了)

作用:所以我们通过上面时序图就可以判断DHT11从什么时候开始响应主机的?而主机也就可以在根据总线的情况,在正确的时间去接收DHT11发送的数据了。

注意:DHT11会一次性发送40位数据,所以主机也要一次性接收40位数据哦。
这个比较简单,就是简单的判断总线电平变化。我这里就不贴代码,最上面有代码,按照时序图一步一步分析就行!

3、接收的数据是0/1的判断方法

在这里插入图片描述
从上面的时序图可知,DHT11在发送数据前都会有一个50us低电平的开始时间,然后输出高电平,这才是真正的数据。根据高电平的时间区分是0还是1。

下面为程序中我们如何按照时序图真确接收数据的方法:
/*------------------------------------------------
              接收八位二进制
------------------------------------------------*/

uchar DHT11_rec_byte()      //接收一个字节
{
  unsigned char i,dat=0;
  for(i=0;i<8;i++)    //从高到低依次接收8位数据
   {          
      while(!thd11);   等待50us低电平过去
      DHT11_delay_us(60);     //延时60us,如果还为高则数据为1,否则为0 
      dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位
      if(thd11==1)    //数据为1时,使dat加1来接收数据1
        dat+=1;
      while(thd11);  //如果为数据1,就要等待数据线拉低,让数据1的信号过去    
   }  
    return dat;
}

总结:从手册中我们可知要接收5次,每次8位二进制,分别对应湿度整数、小数…等。

注意:

在单片机中,只用将上述代码封装在一个“.c”文件中,然后在main函数里 做两步:
1、char dht11_data[4]; //定义用于接收DHT11温湿度数据的数组–保存湿度和温度。
2、DHT11_receive(dht11_data);//调用函数获取温湿度值到dht11_datas数组(博主没有保存最后的校验位),因此就可以显示值了

至于想研究文件中uchar DHT11_rec_byte();void DHT11_start();的写作原理,请参考DHT11的说明手册,都是根据手册中的时序图写的。

手册链接: DHT11说明书.

是不是特别简单,好用记得点赞哦🤭

<think>好的,我需要帮助用户了解DHT11温湿度传感器的内部电路结构。首先,我需要回顾一下已有的引用内容,看看有没有相关的信息。 根据引用[3],DHT11内部包含一个电阻式感湿元件、一个NTC测温元件和一个8位单片机。这说明它的结构可能相对简单,集成了传感器和微控制器。但用户想要的是具体的内部电路图,而引用里提到的资料可能没有直接给出电路图,更多的是功能描述。 接下来,我应该考虑DHT11的工作协议,比如单总线通信,这可能涉及上拉电阻和信号时序。引用[2]提到DHT11使用单线制接口,需要适当的上拉电阻,信号传输距离可达20米以上。这可能意味着内部电路中有用于信号调理的元件,比如上拉电阻或者稳压电路。 不过,用户问的是内部电路结构,而公开的DHT11资料通常不会提供详细的原理图,因为它是集成化的模块。制造商可能将其作为黑盒处理,只提供引脚定义和通信协议。因此,我需要说明这一点,同时解释其内部主要组成部分。 另外,引用[3]提到DHT11采用单线制串行接口,这需要与外部MCU配合,内部可能有负责数据处理的逻辑电路。可能包括模数转换器,将感湿元件和NTC的模拟信号转换为数字信号,再由内部单片机处理。 用户可能还想知道内部如何实现温湿度测量。电阻式感湿元件可能随着湿度变化改变电阻,NTC则是温度变化改变电阻。内部单片机通过测量这些电阻值,转换为数字信号输出。 总结:需要解释DHT11内部的主要组件,如感湿元件、测温元件、单片机,以及它们如何协同工作。同时指出详细电路图通常不公开,但可以描述其结构原理,并参考现有的引脚和通信协议信息。 可能还需要提到外部电路,比如上拉电阻,虽然这不是内部结构,但对理解整体设计有帮助。此外,DHT11的精度和量程参数(引用[2])可以辅助说明其内部设计的限制和特点。</think>### DHT11温湿度传感器内部电路结构解析 DHT11的**内部电路结构**并未在公开资料中完全披露,但根据其工作原理和模块特性,可推断其核心组件包括以下部分: 1. **电阻式感湿元件** 通过湿敏材料电阻值的变化反映环境湿度。当湿度变化时,材料导电性改变,形成对应的模拟信号[^3]。 2. **NTC测温元件** 采用负温度系数热敏电阻,温度升高时电阻值降低,通过测量电阻值间接获取温度数据[^3]。 3. **8位高性能单片机** 集成模数转换(ADC)和逻辑控制单元,负责将模拟信号转换为数字信号,并按照单总线协议输出数据。该单片机还包含校准算法,确保±5%湿度误差和±2℃温度误差[^2][^3]。 4. **信号调理电路** 内部可能包含稳压电路和滤波元件,用于稳定传感器供电并减少噪声干扰,这也是其能在20米长距离传输信号的关键设计。 #### 典型外部电路设计 虽然内部电路未公开,但**外部接线**需配置以下部分(以Arduino为例): - **VCC引脚**:连接3.3V-5V电源 - **DATA引脚**:通过4.7kΩ上拉电阻与MCU连接 - **GND引脚**:接地 ```arduino // 示例接线配置(Arduino) DHT11_DATA --[4.7kΩ]--> 5V DHT11_DATA --> MCU Digital Pin DHT11_GND --> GND DHT11_VCC --> 5V ``` #### 数据协议实现 DHT11采用**单总线通信协议**,数据传输时序如下: 1. **启动信号**:MCU拉低总线18ms后释放,传感器响应80μs低电平+80μs高电平。 2. **数据传输**:40位数据包(16bit湿度+16bit温度+8bit校验和),通过高低电平持续时间区分“0”和“1”。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掏一淘哆啦A梦的奇妙口袋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值