【STM32】驱动DHT11(CubeMX配置)(HAL库)

DHT11时序逻辑:
在这里插入图片描述
在这里插入图片描述
CubeMX配置:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DHT11.c程序:

#include "stm32f1xx.h"
#include "tim.h"
#include "dht11.h"

uint8_t Data[5]={0x00,0x00,0x00,0x00,0x00};   //Data存储读取的温湿度信息
		
void Delay_us(uint16_t us){     //微秒延时
	uint16_t differ = 0xffff-us-5;				
	__HAL_TIM_SET_COUNTER(&htim1,differ);	//设定TIM1计数器起始值
	HAL_TIM_Base_Start(&htim1);		//启动定时器	
	
	while(differ < 0xffff-5){	//判断
		differ = __HAL_TIM_GET_COUNTER(&htim1);		//查询计数器的计数值
	}
	HAL_TIM_Base_Stop(&htim1);
}

/*------------------------------*/
void DHT_GPIO_SET_OUTPUT(void)     //设置GPIOx为输出模式(MCU的IO口向DHT11发激活信号)
{
	GPIO_InitTypeDef GPIO_InitStructure;    //在GPIO_InitTypeDef结构体中修改IO口参数(结构体成员)
	GPIO_InitStructure.Pin=GPIO_PIN_5;      //设置的格式必须严格遵循注释,比如GPIO_PIN_define
	GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
//	GPIO_InitStructure.Pull=;
	GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
}

void DHT_GPIO_SET_INPUT(void)     //设置GPIOx为输入模式(DHT11向MUC的IO发电平信号,信号里包含了温湿度信息)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.Pin=GPIO_PIN_5;
	GPIO_InitStructure.Mode=GPIO_MODE_INPUT;
	GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
}

/*------------------------------*/

/*
     uint8_t DHT_Read_Byte(void)用于转译采集DHT11发送给IO口的电平信号(8位)。
*/
uint8_t DHT_Read_Byte(void)  //从DHT11读取一位(8字节)信号
{
	 uint8_t ReadData=0;  //ReadData用于存放8bit数据,即8个单次读取的1bit数据的组合
	 uint8_t temp;      //临时存放信号电平(0或1)
	 uint8_t retry=0;   //retry用于防止卡死
	 uint8_t i;    
	 for(i=0; i<8; i++)   //一次温湿度信号读取八位
	 {
			while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==0 && retry<100)  
			//等待直到DHT11输出高电平:当PA5=1,上升沿,表示开始接受数据,可以判断0 or 1,跳出循环,执行后续判断(若PA5=0,将一直循环等待)
			{
					Delay_us(1);
				  retry++;             //retry防止PA5读取不到数据卡死在这一步,当经历100us后retry自增到100,跳出循环。
			}
			retry=0;
			
			Delay_us(40);    //延时30us
			//根据时序图,DHT传回高电平信号维持26us~28us表示0,	维持70us表示1
		  //延时30us后,如果IO读取到仍是高电平,说明采集到1;如果IO读取到低电平,说明采集到0
			//读取电平信号暂存temp内,随后会压入ReadData中
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==1)   temp=1;
			 else   temp=0;

			 while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==1 && retry<100)
			//等待直到DHT11输出低电平,表示退出。本轮1bit信号接收完毕。
			 {
				 Delay_us(1);
				 retry++;
			 }
			 retry=0;
			 
			 ReadData<<=1;    //ReadData内信号先全部左移一位,空出末尾位置
			 ReadData |= temp;        //将temp写入ReadData
	 }

		return ReadData;
}

/*------------------------------*/

/*
     uint8_t DHT_Read(void)表达完整时序
*/
uint8_t DHT_Read(void)
{
	 uint8_t retry=0;
	 uint8_t i;
		
	 DHT_GPIO_SET_OUTPUT();    //IO设置为输出模式。在传输的最开始,MCU要向DHT11发送信号
	 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);   //IO->DHT11:先拉低电平18ms(应时序要求)
	 HAL_Delay(18);
	 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);   //IO->DHT11:随后拉高电平20us
	 Delay_us(20);
	
	//MCU通过IO向DHT11发送请求完毕。接下来DHT11向IO发送响应,IO转为输入模式。在这之后就开始信号的转译读取。
	DHT_GPIO_SET_INPUT();
	Delay_us(20);
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==0) //DHT11发回低电平响应(读取到低电平,说明DHT11有响应)
	{
		//接下来,DHT11拉低电平一段时间后拉高电平一段时间
		while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==0 && retry<100)  
		{
		   Delay_us(1);
			 retry++;
		}
		retry=0;
		while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==1 && retry<100) 
		{
		   Delay_us(1);
			 retry++;
		}
		retry=0;
		
		//一共传输40位,一次DHT_Read_Byte返回8位,共读取5次。存储在Data[]中。(Data[]定义为全局)
		for(i=0; i<5; i++)
		{
			 Data[i] = DHT_Read_Byte();  //每次读取一字节(8位)
		}
		Delay_us(50);
		//说明:Data[0]湿度, Data[2]温度。Data[1]和Data[3]分别为0和2的小数位。Data[4]用于校验。
	}
	
	 uint32_t sum=Data[0]+Data[1]+Data[2]+Data[3];  //校验
	 if((sum)==Data[4])    return 1;  
	   else   return 0;
	
}

DHT11.h文件:

#ifndef __DHT11_H
#define __DHT11_H

#include "stm32f1xx.h"

void Delay_us(uint16_t us);
void DHT_GPIO_SET_OUTPUT(void);
void DHT_GPIO_SET_INPUT(void);
uint8_t DHT_Read_Byte(void);
uint8_t DHT_Read(void);

#endif

主函数:

/* USER CODE BEGIN 0 */
extern uint8_t Data[5];
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	
  /* USER CODE END 2 */
	
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
			if(DHT_Read())
			{
				HAL_UART_Transmit(&huart1,(uint8_t *)Data+0,(uint16_t)sizeof(Data[0]),HAL_MAX_DELAY);    //湿度
				HAL_UART_Transmit(&huart1,(uint8_t *)Data+2,(uint16_t)sizeof(Data[2]),HAL_MAX_DELAY);    //温度
			}
			HAL_Delay(50);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
  • 28
    点赞
  • 209
    收藏
    觉得还不错? 一键收藏
  • 38
    评论
### 回答1: STM32是一款广泛应用于嵌入式系统开发的微控制器,它具有强大的处理能力和丰富的外设接口,可以用来驱动各种传感器。DHT11是一款低成本的数字温湿度传感器,具有简单易用、精度高等特点。下面是关于如何使用STM32驱动DHT11温湿度传感器的压缩包说明: 1. 首先,我们需要在STM32的开发环境中导入对应的DHT11驱动库。这个库提供了与传感器通信的相关函数和数据结构。 2. 接下来,在项目中创建一个新的源文件,并初始化GPIO引脚。DHT11的数据线连接到STM32的一个IO口,通过控制该IO口的输入输出状态来与传感器通信。 3. 在代码中编写相应的函数,以实现与DHT11传感器的通信和数据读取。这些函数应包括发送起始信号、接收传感器的响应信号、读取传感器发送的数据等。 4. 在主函数中,调用相应的函数来获取DHT11传感器的温度和湿度数据。可以通过读取传感器发送的数据来计算温度和湿度数值。 5. 最后,将编写好的代码编译,并下载到STM32开发板中进行测试。可以通过查看串口输出结果或者在LCD屏幕上显示温湿度数据来验证驱动是否正常工作。 总结起来,使用STM32驱动DHT11温湿度传感器的过程主要包括导入驱动库、初始化IO口、编写通信函数、读取温湿度数据以及测试验证等步骤。通过这些步骤,我们可以实现对DHT11传感器的驱动和数据获取。 ### 回答2: DHT11是一种温湿度传感器,可以用于检测环境的温度和湿度。STM32是一种常用的微控制器,具有很强的驱动能力和丰富的外设资源。 要驱动DHT11传感器,首先需要连接STM32DHT11DHT11有三个引脚,分别是VCC、DATA和GND。将DHT11的VCC引脚连接到STM32的3.3V电源,GND引脚连接到STM32的地(GND),DATA引脚连接到STM32的一个GPIO口。 接下来,需要编写驱动程序来读取DHT11传感器的数据。首先,将GPIO口配置为输出模式,并将电平拉低一段时间(如1毫秒),然后将电平拉高,等待一段时间(如20毫秒)。接着,将GPIO口配置为输入模式,并等待DHT11输出低电平,然后等待DHT11输出高电平。最后,读取传感器发送的40位数据,每位数据的持续时间表示0或1的值。 读取到的40位数据包括湿度的整数部分、小数部分、温度的整数部分和小数部分,以及一个校验位。通过解析这些数据,可以得到温度和湿度的具体数值。 为了方便使用DHT11传感器,可以将驱动程序封装为一个温度压缩包。这个压缩包包含了初始化传感器的函数、读取温湿度数据的函数以及其他辅助函数。用户只需要下载并导入这个压缩包,并调用相应的函数,即可读取DHT11传感器的温度和湿度。 总之,使用STM32驱动DHT11传感器需要连接正确的引脚,并编写相应的驱动程序来读取传感器的数据。然后,可以将驱动程序封装为一个温度压缩包,方便用户使用。 ### 回答3: 要编写一个STM32驱动DHT11温湿度传感器的压缩包,需要以下步骤: 1. 首先,需要了解STM32芯片的GPIO接口。通过手册或者官方文档,找到相关的引脚信息,确定用于连接DHT11传感器的GPIO口。 2. 在工程文件中创建一个新的源文件,命名为dht11.c。在该文件中编写DHT11传感器的驱动程序。 3. 驱动程序中需要定义相关的宏和全局变量,以便于后续的操作。例如,可以定义一个用于接收传感器数据的缓冲区数组,并且定义引脚的输入和输出控制宏。 4. 编写初始化函数,用于配置GPIO口的方向为输出,并将引脚设置为低电平。 5. 编写延时函数,用于在不同的传输数据阶段进行适当的延时。DHT11传感器的数据传输需要一定的时间间隔。 6. 编写数据传输函数,包括发送开始信号、接收传感器响应、接收数据等操作。根据DHT11传感器的通信协议,通过操作GPIO口的高低电平来实现数据的传输。 7. 将接收到的数据解析,并将温度和湿度值提取出来。根据DHT11传感器的数据格式,对接收的数据进行相应的处理,得到准确的温度和湿度值。 8. 在主函数中调用初始化函数和数据传输函数,获取温度和湿度值,并可进行相应的处理和显示。 以上就是一个简单的STM32驱动DHT11温湿度传感器的压缩包的基本实现步骤。根据具体工程的需求,可能还需要添加其他功能和优化代码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值