DHT11传感器STM32F103代码
时间: 2024-12-27 18:28:05 浏览: 24
### DHT11传感器驱动代码实现
对于STM32F103微控制器而言,DHT11温度湿度传感器可以通过GPIO接口进行通信。下面提供一段基于HAL库的C语言代码来读取来自DHT11的数据。
```c
#include "stm32f1xx_hal.h"
#define DHT11_PIN GPIO_PIN_0
#define DHT11_PORT GPIOA
void DHT11_Init(void);
uint8_t DHT11_Read_Data(uint8_t *data);
// 初始化函数用于配置端口模式
void DHT11_Init(void){
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = DHT11_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
}
// 数据读取函数返回状态码并填充数据数组
uint8_t DHT11_Read_Data(uint8_t *data){
uint8_t i,j;
for(i=0;i<5;i++) data[i]=0;
// 主机拉低至少18ms让DHT11检测到起始信号
HAL_GPIO_WritePin(DHT11_PORT,DHT11_PIN,GPIO_PIN_RESET);
HAL_Delay(20);
// 上升沿表示请求结束
HAL_GPIO_WritePin(DHT11_PORT,DHT11_PIN,GPIO_PIN_SET);
HAL_Delay(30);
// 改变引脚为输入模式等待应答
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = DHT11_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(DHT11_PORT,&GPIO_InitStruct);
// 等待DHT11响应下降沿
while(HAL_GPIO_ReadPin(DHT11_PORT,DHT11_PIN));
// 延迟约80us直到上升沿到来
for(j=0;j<40;j++);
// 开始接收40位数据流
for (i=0;i<5;i++)
for (j=0;j<8;j++){
while(!HAL_GPIO_ReadPin(DHT11_PORT,DHT11_PIN)); // 等待高电平开始
Delay_us(40); // 测量持续时间判断高低
if(HAL_GPIO_ReadPin(DHT11_PORT,DHT11_PIN)) // 高于40us则认为是'1'
data[i]|=(1<<(7-j));
while(HAL_GPIO_ReadPin(DHT11_PORT,DHT11_PIN)); // 等待高电平结束
}
return 0;
}
```
这段程序实现了基本的功能,即初始化和从DHT11获取原始数据[^1]。为了使上述功能正常工作,还需要定义`Delay_us()`函数来进行精确延时操作,并确保已经正确设置了系统的时钟树以及调用了必要的外设初始化例程。
阅读全文