使用STM32微控制器读取和显示DHT11温湿度传感器数据

在本文中,我们将介绍如何使用STM32微控制器读取和显示DHT11温湿度传感器的数据。我们将使用C语言和STM32的库函数来实现这个功能。本文包含硬件连接和软件编程两个方面的内容。

硬件连接
首先,我们需要将DHT11温湿度传感器连接到STM32微控制器上。DHT11传感器有4个引脚:VCC(电源)、DATA(数据)、NC(未连接引脚)和GND(地)。下面是一个示例连接图:

```
DHT11                STM32
 VCC    -------------- 3.3V
 DATA   -------------- GPIO引脚
 NC     -------------- 未连接
 GND    -------------- GND
```

请注意,VCC引脚连接到STM32的3.3V电源引脚,而非5V引脚。DHT11是一个3.3V电平设备,直接连接到5V可能导致损坏。

软件编程
接下来,我们将使用C语言和STM32的库函数来实现读取和显示DHT11温湿度传感器数据的功能。

1. 配置GPIO引脚
首先,我们需要配置STM32的GPIO引脚,使其能够与DHT11传感器通信。

```c
#include "stm32fxxx.h" // 包含适用于您的STM32系列的头文件

#define DHT11_DATA_PIN GPIO_PIN_0
#define DHT11_GPIO_PORT GPIOA

void GPIO_Configuration(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 使能GPIO时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    
    // 配置GPIO为输入模式
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Pin = DHT11_DATA_PIN;
    GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
}
```

使用STM32微控制器读取和显示DHT11温湿度传感器数据_第1张图片

2. 读取DHT11传感器数据
接下来,我们将编写函数来读取DHT11传感器的温湿度数据。

```c
uint8_t DHT11_Read(uint8_t* temperature, uint8_t* humidity) {
    uint8_t data[5] = { 0 };
    uint8_t bit_count = 0;
    uint8_t byte_count = 0;
    uint8_t checksum = 0;
    
    // 拉低总线
    GPIO_ResetBits(DHT11_GPIO_PORT, DHT11_DATA_PIN);
    Delay_us(18000); // 延时18ms
    
    // 拉高总线
    GPIO_SetBits(DHT11_GPIO_PORT, DHT11_DATA_PIN);
    Delay_us(40); // 延时40us
    
    // 配置总线为输入模式
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = DHT11_DATA_PIN;
    GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
    
    // 等待DHT11响应
    while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == RESET);
    while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == SET);
    while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == RESET);
    
    // 读取数据
    for (bit_count = 0; bit_count < 40; bit_count++) {
        while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == RESET);
        
        Delay_us(60); // 延时60us
        
        if (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == SET) {
            data[byte_count] |= (1 << (7 - bit_count % 8));
        }
        
        while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_DATA_PIN) == SET);
        
        if (bit_count % 8 == 7) {
            byte_count++;
        }
    }
    
    // 恢复总线为输出模式
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Pin = DHT11_DATA_PIN;
    GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
    
    // 计算校验和
    checksum = data[0] + data[1] + data[2] + data[3];
    
    // 检查校验和是否正确
    if (checksum != data[4]) {
        return 0;
    }
    
    // 提取温湿度数据
    *humidity = data[0];
    *temperature = data[2];
    
    return 1;
}
```

3. 显示数据
最后,我们将使用LCD显示屏来显示DHT11传感器的温湿度数据。

```c
#include "lcd.h" // 包含LCD显示屏的库函数

void DisplayData(uint8_t temperature, uint8_t humidity) {
    char temp_str[10];
    char humid_str[10];
    
    sprintf(temp_str, "Temperature: %d C", temperature);
    LCD_Print(0, 0, temp_str);
    
    sprintf(humid_str, "Humidity: %d %%", humidity);
    LCD_Print(1, 0, humid_str);
}
```

4. 主函数
最后,我们在主函数中调用上述函数,并添加一个延时来控制数据的刷新频率。

```c
int main(void) {
    uint8_t temperature, humidity;
    
    // 初始化系统和外设
    System_Init();
    GPIO_Configuration();
    LCD_Init();
    
    while(1) {
        if (DHT11_Read(&temperature, &humidity)) {
            DisplayData(temperature, humidity);
        }
        
        Delay_ms(2000); // 每两秒更新数据
    }
}
```

结论
通过上述步骤,我们成功地实现了使用STM32微控制器读取和显示DHT11温湿度传感器数据。
通过配置GPIO引脚、读取传感器数据和显示数据,我们能够实时获取温湿度信息并在LCD显示屏上显示。

请注意,以上代码是一个示例,实际项目中需要根据具体的STM32型号和开发环境进行适配。此外,也可以根据需求进行扩展,比如添加其他传感器或实现数据的远程传输。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

代码获取、问题探讨及文章转载可私信。

 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

获取更多嵌入式资料可点击链接进群领取,谢谢支持!

点击领取更多详细资料

你可能感兴趣的:(stm32,单片机,嵌入式硬件)