dht11温湿度传感器stm32f1HSL
时间: 2025-03-20 18:08:46 浏览: 58
### DHT11温湿度传感器与STM32F1系列微控制器的HSL操作
#### 配置教程
为了实现DHT11温湿度传感器与STM32F1系列微控制器之间的通信并完成HSL(硬件串口模拟)相关的操作,以下是详细的配置过程:
1. **硬件接线**
开发板选用的是STM32F103C8T6最小系统板,而DHT11温湿度传感器的数据引脚需连接至PA11。此引脚被指定用于数据交换[^1]。
2. **初始化GPIO端口**
在程序中,需要先设置PA11作为输入/输出模式以便于读取来自DHT11的数据信号。具体来说,在`RCC_APB2ENR`寄存器中使能GPIOA时钟,并通过修改`GPIOA_CRL`来定义PA11的功能为推挽输出或者浮空输入状态。
3. **编写驱动函数**
下面提供了一个简单的驱动框架供参考:
```c
#include "stm32f1xx.h"
#define DHT11_PIN GPIO_Pin_11
#define DHT11_PORT GPIOA
void delay_us(uint32_t us){
// 实现微妙级延时功能
}
uint8_t dht11_read_data(void){
uint8_t data=0;
/* 设置 PA11 输出低电平 */
GPIO_ResetBits(DHT11_PORT, DHT11_PIN);
delay_us(18000); // 延迟至少18ms
/* 切换回高阻态以接收响应 */
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
// 等待DHT11拉低总线...
while(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN));
// ...直到它再次释放总线
while(!GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN));
for(int i=0;i<8;i++){
while(!GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN));
delay_us(40);
if (GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)){
data |= (1 << (7-i));
}
while(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN));
}
return data;
}
```
上述代码片段展示了如何从DHT11获取一位数据的过程[^2]。完整的温度和湿度信息由四个字节组成——第一个字节表示整数部分湿度,第二个字节代表小数部分湿度,第三个字节对应整数部分温度,第四个字节则是校验码。
#### 示例代码
下面给出了一段更全面的例子,展示怎样调用这些基础方法去获得实际环境中的相对湿度百分比以及摄氏度数值:
```c
int main(){
float humidity, temperature;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
GPIO_InitTypeDef gpio_init_struct;
gpio_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;
gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
gpio_init_struct.GPIO_Pin = DHT11_PIN;
GPIO_Init(DHT11_PORT,&gpio_init_struct);
uint8_t buf[5];
memset(buf,0,sizeof(buf));
do{
buf[0]=dht11_read_data();
buf[1]=dht11_read_data();
buf[2]=dht11_read_data();
buf[3]=dht11_read_data();
buf[4]=dht11_read_data();
}while((buf[0]+buf[1]+buf[2]+buf[3])!=buf[4]);
humidity=(float)(buf[0]);
temperature=(float)(buf[2]);
printf("Humidity:%.1f%% Temperature:%.1f°C\n",humidity,temperature);
while(1){};
}
```
该示例实现了连续监测当前空气状况下的湿度水平与周围物体表面的大致热度变化情况。
阅读全文
相关推荐















