stm32f103c8t6温湿度计dht11
时间: 2023-11-14 20:04:20 浏览: 128
以下是基于STM32F103C8T6实现DHT11温湿度采集的步骤和代码:
1. 确定引脚连接:将DHT11的VCC引脚连接到STM32的5V电源引脚,将DHT11的GND引脚连接到STM32的GND引脚,将DHT11的DATA引脚连接到STM32的GPIO引脚。
2. 配置GPIO引脚:将DATA引脚连接到STM32的GPIO引脚后,需要在代码中配置该引脚为输入模式。
```c
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
3. 发送起始信号:DHT11在开始采集数据前需要接收到主机发送的起始信号,起始信号为低电平持续18ms以上,然后主机发送一个高电平持续20-40us的信号。
```c
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(20);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
```
4. 接收数据:DHT11在接收到主机发送的起始信号后,会开始发送40位数据,其中前16位为湿度值,后16位为温度值,最后8位为校验和。每一位数据的发送都是通过50us的低电平和高电平来表示的,低电平持续26-28us表示0,低电平持续70us表示1。
```c
uint8_t data[5];
for (int i = 0; i < 5; i++) {
uint8_t byte = 0;
for (int j = 0; j < 8; j++) {
while (!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)); // 等待低电平结束
HAL_Delay(30); // 判断高电平持续时间,长则为1,短则为0
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)) {
byte |= (1 << (7 - j));
}
while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)); // 等待高电平结束
}
data[i] = byte;
}
```
5. 校验数据:DHT11发送完40位数据后,会发送一个校验和,校验和为前面40位数据的和,如果校验和与实际计算的和不相等,则数据传输错误。
```c
if (data[4] != (data[0] + data[1] + data[2] + data[3])) {
// 数据传输错误
}
```
完整的代码如下:
```c
#include "main.h"
#include "dht11.h"
void DHT11_ReadData(DHT11_Data_TypeDef *DHT11_Data) {
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(20);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
uint8_t data[5];
for (int i = 0; i < 5; i++) {
uint8_t byte = 0;
for (int j = 0; j < 8; j++) {
while (!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)); // 等待低电平结束
HAL_Delay(30); // 判断高电平持续时间,长则为1,短则为0
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)) {
byte |= (1 << (7 - j));
}
while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)); // 等待高电平结束
}
data[i] = byte;
}
if (data[4] != (data[0] + data[1] + data[2] + data[3])) {
// 数据传输错误
}
DHT11_Data->Humidity = data[0];
DHT11_Data->Temperature = data[2];
}
--相关问题--:
阅读全文