stm32f103采集dht11温湿度数据通过usart2在串口助手中显示
时间: 2024-03-11 22:46:59 浏览: 147
STM32温湿度传感器读取温湿度数据并显示到PC端串口助手
5星 · 资源好评率100%
好的,下面是stm32f103通过usart2采集dht11温湿度数据并发送到串口助手的完整代码示例:
```
#include "stm32f10x.h"
#include <stdio.h>
// 定义DHT11数据引脚
#define DHT11_DATA_PIN GPIO_Pin_0
#define DHT11_DATA_PORT GPIOA
// 定义USART2发送函数
void USART2_SendData(uint8_t data)
{
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); // 等待发送缓冲区为空
USART_SendData(USART2, data); // 发送数据
}
// 初始化USART2
void USART2_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE); // 使能USART2时钟和GPIOA时钟
// 配置PA2为USART2的Tx引脚
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置PA3为USART2的Rx引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART2初始化设置
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600; // 波特率设置为9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; // 无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 支持收发模式
USART_Init(USART2, &USART_InitStructure); // 初始化USART2
USART_Cmd(USART2, ENABLE); // 使能USART2
}
// 初始化DHT11
void DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
// 配置DHT11数据引脚为GPIO输出模式
GPIO_InitStructure.GPIO_Pin = DHT11_DATA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_DATA_PORT, &GPIO_InitStructure);
GPIO_SetBits(DHT11_DATA_PORT, DHT11_DATA_PIN); // 将DHT11数据引脚输出高电平
}
// 从DHT11读取数据
void DHT11_ReadData(uint8_t *temp, uint8_t *humi)
{
uint8_t buffer[5] = {0};
uint8_t i = 0, j = 0;
GPIO_ResetBits(DHT11_DATA_PORT, DHT11_DATA_PIN); // 发送起始信号
delay_ms(18);
GPIO_SetBits(DHT11_DATA_PORT, DHT11_DATA_PIN);
delay_us(30);
GPIO_ResetBits(DHT11_DATA_PORT, DHT11_DATA_PIN); // 接收响应信号
delay_us(40);
GPIO_SetBits(DHT11_DATA_PORT, DHT11_DATA_PIN);
delay_us(10);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 切换DHT11数据引脚为输入模式
GPIO_Init(DHT11_DATA_PORT, &GPIO_InitStructure);
while (GPIO_ReadInputDataBit(DHT11_DATA_PORT, DHT11_DATA_PIN) == SET); // 等待DHT11拉低数据引脚
while (GPIO_ReadInputDataBit(DHT11_DATA_PORT, DHT11_DATA_PIN) == RESET); // 跳过DHT11的低电平响应信号
while (GPIO_ReadInputDataBit(DHT11_DATA_PORT, DHT11_DATA_PIN) == SET); // 接收数据
for (j = 0; j < 5; j++)
{
for (i = 0; i < 8; i++)
{
while (GPIO_ReadInputDataBit(DHT11_DATA_PORT, DHT11_DATA_PIN) == RESET); // 跳过每个数据位的低电平
delay_us(40); // 等待数据位的高电平持续时间
if (GPIO_ReadInputDataBit(DHT11_DATA_PORT, DHT11_DATA_PIN) == SET) // 判断高电平持续时间,如果大于等于30us,则该数据位为1,否则为0
{
buffer[j] |= (1 << (7 - i)); // 将读取到的数据保存到缓冲区中
}
while (GPIO_ReadInputDataBit(DHT11_DATA_PORT, DHT11_DATA_PIN) == SET); // 等待数据位的高电平结束
}
}
*humi = buffer[0]; // 湿度值
*temp = buffer[2]; // 温度值
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 切换DHT11数据引脚为输出模式
GPIO_Init(DHT11_DATA_PORT, &GPIO_InitStructure);
GPIO_SetBits(DHT11_DATA_PORT, DHT11_DATA_PIN); // 将DHT11数据引脚输出高电平
}
int main(void)
{
USART2_Init(); // 初始化USART2
DHT11_Init(); // 初始化DHT11
uint8_t temp, humi;
char buffer[50];
while (1)
{
DHT11_ReadData(&temp, &humi); // 从DHT11读取温湿度数据
sprintf(buffer, "Temperature: %d℃, Humidity: %d%%\r\n", temp, humi); // 将温湿度数据格式化成字符串
for (uint8_t i = 0; i < strlen(buffer); i++)
{
USART2_SendData(buffer[i]); // 发送温湿度数据到串口助手
}
delay_ms(1000); // 延时1秒
}
}
```
使用以上代码,您就可以在stm32f103采集dht11温湿度数据并通过usart2发送到串口助手了。
阅读全文