STM32—驱动DHT11数字温湿度传感器

DHT11模块简介

DHT11数字温湿度传感器,用来测量环境的温度和湿度,而且传输的数据是数字信号,这与DS18B20传输的模拟采集的数据不一样,相比DS18B20而言DHT11的数据采集的处理更加精确,而且驱动也更加方便。
DHT11传感器包括一个电阻式测湿元件和一个NTC测温元件,而且传感器中嵌入一个8位单片机。传感元件测量到数据后经过内嵌MCU处理后,能够直接输出处理好的数据。
DHT11与单片机之间采用单总线通信,只需要初始化一个I/O口即可实现温湿度的实时测量。
其相关参数如下:
在这里插入图片描述

DHT11数据传输

DHT11数据传输是单总线通信方式,即通过一个IO口完成数据的双向输入输出,DHT11每一次向单片机传输数据是传输40Bit的数据包,40Bit的数据包中包含如下内容:

  • (32-39)湿度的整数部分
  • (24-31)湿度的小数部分
  • (16-23)温度的整数部分
  • (8-15)温度的小数部分
  • (0-7)数据校验部分,前四部分的和

例如:
在这里插入图片描述
湿度为:45.0
温度为:28.0
校验为:73=45+28(数据正确)

DHT11通信时序

由于DHT11和单片机是单总线通信的,所以数据的双向传输就依靠严格的时序规定了,DHT11和单片机通信的时序有三部分:

  • 单片机向DHT11发送复位信号
  • DHT11响应单片机的信号
  • DHT11向单片机传输数据包

总的时序图如示:
在这里插入图片描述
第一步:发送复位信号,此时引脚应模式为推挽输出。拉低数据线,持续t1(至少18ms)时间;然后拉高数据线,持续t2(20~40us)时间。
第二步:读取相应,此时引脚应模式为浮空输入。DHT11会先拉低数据线,持续t3(40~50us)时间,作为相应信号;然后DHT11拉高数据线,持续t4(40 ~50us)时间,开始传输数据包。
第三步:传输数据包。传输“1”时,12 ~14us低电平+116 ~118us高电平;传输“0”时,12 ~14us低电平+26 ~28us高电平。
在这里插入图片描述

这三步就完成了一次完整的数据传输,然后就单片机是对接收到的数据包进行处理显示就好了。

代码实现

驱动代码主要实现如下几个模块:

  • 相关引脚初始化
  • 复位模块
  • 判断响应模块
  • 读取数据包模块
  • 显示模块

相关引脚初始化

由于是一个IO口,要满足输出和检测电平,所以我写了俩个函数来切换引脚的模式,可以使引脚在推挽输出和浮空输入之间切换:

/* 相关引脚的配置,DHT是单通道通信,所以一个引脚就够了 */
void DHT_GPIO_Config_Output( void )
{
	GPIO_InitTypeDef GPIO_InitStruct;	
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin = DHT_PIN;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DHT_PORT, &GPIO_InitStruct);
}

/* 同一个引脚 要在输入和输出的时候进行切换引脚模式 */
void DHT_GPIO_Config_Input( void )
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin = DHT_PIN;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DHT_PORT, &GPIO_InitStruct);
}

在初始化的时候会开启时钟,所以这俩个模块就不用开启时钟

复位模块

void DHT11_Rst( void )
{
	DHT_GPIO_Config_Output();
	DHT11_L;
	Delay_ms( 20 );
	DHT11_H;
	Delay_us( 30 );
}

判断响应模块

uint8_t DHT11_Check( void )
{
	uint8_t t;
	/* 浮空输入,判断引脚输入电平 */
	DHT_GPIO_Config_Input();
	while( DHT11_Value_L && t<100 )
	{
		t++;
		Delay_us(1);
	}
	if( t>100 ) return 1;
	t=0;
	while( DHT11_Value_H && t<100 )
	{
		t++;
		Delay_us(1);
	}
	if( t>100 ) return 1;
	return 0;
}

读取数据包模块

void DHT11_Read_Data( uint8_t *temp, uint8_t *humi )
{
	uint8_t i,t;
	uint9_t data[5];
	DHT_GPIO_Config_Input();
	/* 执行40次读取位数据,data指向数据包 */
	for( i=0;i<40;i++ )
	{
		/* 开始低电平 */
		while( DHT11_Value_L && t<100 )
		{
			t++;
			Delay_us(1);
		}
		t=0;
		/* 开始高电平 */
		while( DHT11_Value_H && t<100 )
		{
			t++;
			Delay_us(1);
		}
		Delay_us(40);
		/* 判断高电平持续时间 */
		if( DHT11_Value_H )
		{
			data[i/8] |= 0x01;
			data[i/8] = data[i/8]<<(i%8);
		}
		else
			data[i/8] = data[i/8]<<(i%8);
			
	}
	/* 将数据地址传出去 */
	*humi = data[0];
	*temp = data[2];
}

只是大体总结了一下,有不足之处还望各位朋友指出,有什么问题可以和我交流,大家一起进步!
q:2723808286

  • 16
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: DHT11湿度传感器是一种数字化的湿度传感器,可与STM32单片机相连并进行数据的采集和处理。以下是关于DHT11湿度传感器STM32程序下载的说明。 1. 首先,需要准备一台已安装STM32开发环境的计算机。这个开发环境可以是Keil、IAR等常用的嵌入式开发工具。 2. 接下来,需要根据具体的硬件连接情况,将DHT11传感器STM32单片机相连。一般来说,DHT11传感器的供电线连接到STM32的供电引脚上,数据线连接到STM32的某个IO口,接地线连接到STM32的接地引脚上。 3. 然后,打开STM32开发环境,创建一个新的工程用于DHT11湿度传感器程序的开发。选择适合自己的芯片型号,配置相应的系统时钟等参数。 4. 根据DHT11的通信协议,编写相应的程序代码。代码中需要使用STM32的IO口来读取传感器的数据,将数据转换为度和湿度值,并进行相应的处理。 5. 在代码编写完成后,进行编译和链接,并生成可执行文件。将可执行文件下载到STM32单片机上,可以通过JTAG/SWD等调试工具来完成下载。 6. 最后,将STM32与已下载的程序电路连接好,给STM32供电,开始进行测试。通过使用串口调试助手或者LCD屏幕来显示度和湿度数据,以验证程序的正确性。 以上是关于DHT11湿度传感器STM32程序下载的一般步骤。需要提醒的是,在具体的开发过程中,还需要根据实际情况进行程序的调试和优化,以保证传感器STM32的正常工作。 ### 回答2: DHT11湿度传感器是一种常用的数字湿度传感器,可以与STM32微控制器一起使用。要下载DHT11湿度传感器STM32程序,需要进行以下几个步骤: 1. 配置STM32的开发环境:首先要确保已经安装了适当的开发环境,例如Keil或者STM32CubeIDE等。 2. 编写程序代码:为了读取DHT11传感器的数据,需要编写相应的程序代码。可以使用C语言或者汇编语言来编写。在代码中,需要包含DHT11驱动库或者编写自己的库函数来与传感器进行通信。 3. 配置STM32的引脚:在STM32上,需要选择合适的引脚连接DHT11传感器。可以参考DHT11的数据手册或者资料表来确定引脚的配置。 4. 下载程序到STM32:在完成程序代码编写和引脚配置后,可以通过调试器将程序下载到STM32微控制器上。根据开发环境的不同,下载的具体步骤会有所不同。 5. 测试程序:下载完成后,可以将STM32DHT11传感器连接,并通过串口或者其他方式将读取到的湿度数据传输到电脑或其他设备上,进行测试。在测试过程中,需要确保程序能够正确地读取并解析DHT11传感器的数据,并将其显示出来。 总结起来,下载DHT11湿度传感器STM32程序,需要配置开发环境、编写程序代码、配置引脚、下载程序到STM32,并进行测试。以上这些步骤的具体实现方式,可以根据具体的开发环境和需求进行调整。 ### 回答3: DHT11湿度传感器是一种常用的数字湿度传感器。作为STM32微控制器的用户,我们可以通过编写程序来获取DHT11传感器度和湿度数据。 首先,我们需要连接DHT11传感器STM32微控制器。DHT11传感器有三个引脚:VCC(正电源)、DATA(数据信号)和GND(地)。我们需要将VCC引脚连接到STM32的3.3V电源,将DATA引脚连接到一个GPIO引脚(例如PA0),将GND引脚连接到GND。 其次,我们需要编写STM32的程序来读取DHT11传感器的数据。具体的程序可以通过使用STM32的GPIO库来配置和读取GPIO引脚的状态。我们需要将DATA引脚设置为输出模式,并给它一个高电平(1ms),然后将DATA引脚设置为输入模式,等待DHT11传感器的响应。一旦DHT11传感器给出响应,我们可以开始读取它发送的数据。DHT11发送的数据位共有40位,我们需要通过计时来确定每位数据的1或0的时间长度。 最后,我们可以将获取的数据进行处理,将度和湿度的数值提取出来,并进行进一步的处理或显示。我们可以使用串口或LCD等外设来进行数据的显示和记录。 总之,通过编写STM32的程序,我们可以实现DHT11湿度传感器的数据获取功能。这个程序可以根据具体的需求进行进一步的扩展和优化,以满足不同的应用场景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值