基于stm32f103c8t6的DHT11温湿度显示代码
时间: 2023-08-23 13:05:38 浏览: 194
以下是基于STM32F103C8T6的DHT11温湿度显示代码示例:
```c
#include "stm32f10x.h"
#include "delay.h"
#define DHT11_PORT GPIOA
#define DHT11_PIN GPIO_Pin_0
void DHT11_Start(void);
uint8_t DHT11_Check(void);
uint8_t DHT11_Read_Bit(void);
uint8_t DHT11_Read_Byte(void);
int main(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = DHT11_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
delay_init();
while (1) {
DHT11_Start();
if (DHT11_Check()) {
uint8_t hum_int = DHT11_Read_Byte();
uint8_t hum_dec = DHT11_Read_Byte();
uint8_t temp_int = DHT11_Read_Byte();
uint8_t temp_dec = DHT11_Read_Byte();
uint8_t check_sum = DHT11_Read_Byte();
if (hum_int + hum_dec + temp_int + temp_dec == check_sum) {
// 温湿度数据有效,进行显示操作
// ...
}
}
}
}
void DHT11_Start(void) {
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
delay_ms(25); // 等待DHT11稳定
GPIO_ResetBits(DHT11_PORT, DHT11_PIN);
delay_ms(20); // 拉低信号线20ms
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
delay_us(30); // 拉高信号线30us
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
}
uint8_t DHT11_Check(void) {
uint8_t retry = 0;
while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET) {
retry ++;
delay_us(1);
if (retry > 100) return 0;
}
retry = 0;
while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == RESET) {
retry ++;
delay_us(1);
if (retry > 100) return 0;
}
retry = 0;
while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET) {
retry ++;
delay_us(1);
if (retry > 100) return 0;
}
return 1;
}
uint8_t DHT11_Read_Bit(void) {
uint8_t retry = 0;
while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == RESET) {
retry ++;
delay_us(1);
if (retry > 100) return 0;
}
delay_us(40);
if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET) {
return 1;
} else {
return 0;
}
}
uint8_t DHT11_Read_Byte(void) {
uint8_t i, data = 0;
for (i = 0; i < 8; i ++) {
data <<= 1;
data |= DHT11_Read_Bit();
}
return data;
}
```
该代码实现了如下功能:
1. 初始化DHT11引脚为输出模式,并拉低信号线20ms,然后再拉高信号线30us,发送启动信号。
2. 等待DHT11响应,并检查响应是否正确。
3. 如果响应正确,则读取4个字节的数据:湿度的整数部分、湿度的小数部分、温度的整数部分、温度的小数部分,以及校验和。
4. 对读取到的数据进行校验,如果校验和正确,则将温湿度数据进行显示。
需要注意的是,DHT11的数据传输时序非常严格,因此需要使用延时函数确保时序的准确性。同时,由于DHT11的响应时间和数据传输速率较慢,因此在读取数据时需要使用软件延时。
阅读全文