写一个stm32f103rct6使用dht11获取温湿度的代码
时间: 2023-09-07 10:04:43 浏览: 115
基于stm32f103zet6的温湿度检测 dht11
5星 · 资源好评率100%
### 回答1:
以下是使用STM32F103RCT6和DHT11模块获取温湿度数据的代码:
```c
#include "stm32f10x.h"
#include "delay.h" // 延时函数库
#define DHT11_PORT GPIOC
#define DHT11_PIN GPIO_Pin_13
void DHT11_Init(void);
void DHT11_Start(void);
uint8_t DHT11_Check_Response(void);
uint8_t DHT11_Read(void);
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure); // 配置DHT11引脚为输出模式
while (1)
{
DHT11_Start(); // 启动DHT11传输
if (DHT11_Check_Response()) // 检测DHT11响应
{
uint8_t rh_integral = DHT11_Read(); // 读取湿度整数部分
uint8_t rh_decimal = DHT11_Read(); // 读取湿度小数部分
uint8_t t_integral = DHT11_Read(); // 读取温度整数部分
uint8_t t_decimal = DHT11_Read(); // 读取温度小数部分
uint8_t check_sum = DHT11_Read(); // 读取校验和
if (check_sum == rh_integral + rh_decimal + t_integral + t_decimal) // 校验数据是否正确
{
// 输出温湿度数据到串口或LCD等
printf("Temperature: %d.%d C\n", t_integral, t_decimal);
printf("Humidity: %d.%d %%\n", rh_integral, rh_decimal);
}
else
{
printf("Data error!\n");
}
}
else
{
printf("No response from DHT11!\n");
}
delay_ms(2000); // 延时2秒后重新获取温湿度数据
}
}
void DHT11_Init(void)
{
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure); // 配置DHT11引脚为输出模式
GPIO_SetBits(DHT11_PORT, DHT11_PIN); // 拉高DHT11引脚
}
void DHT11_Start(void)
{
DHT11_Init();
GPIO_ResetBits(DHT11_PORT, DHT11_PIN); // 拉低DHT11引脚
delay_ms(20); // 持续20ms
GPIO_SetBits(DHT11_PORT, DHT11_PIN); // 拉高DHT11引脚
}
uint8_t DHT11_Check_Response(void)
{
uint8_t response = 0;
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure); // 配置DHT11引脚为输入上拉模式
if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == RESET) // 等待DHT11响应
{
delay_us(80); // 延时80us
if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET) // 检测DHT11响应结束
{
response = 1;
}
}
while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET)
{
} // 等待DHT11下次响应
return response;
}
uint8_t DHT11_Read(void)
{
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure); // 配置DHT11引脚为输入上拉模式
uint8_t data = 0;
for (int i = 7; i >= 0; i--)
{
while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == RESET)
{
} // 等待数据位的高电平
delay_us(30); // 延时30us,判断数据位是0还是1
if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET) // 如果高电平持续时间超过30us,则数据位为1
{
data |= (1 << i);
}
while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET)
{
} // 等待数据位的低电平
}
return data;
}
```
注意:以上代码仅供参考,实际应用中需要根据具体的硬件电路和编译环境进行适当修改。
### 回答2:
下面是一个使用STM32F103RCT6微控制器和DHT11传感器获取温湿度数据的简单代码示例:
```c
#include "stm32f10x.h"
#include "dht11.h"
// 定义GPIO引脚
#define DHT11_PORT GPIOA
#define DHT11_PIN GPIO_Pin_0
// 延时函数
void delay_us(uint32_t us)
{
uint32_t counter = 0;
us *= 9;
while (us--)
{
counter++;
}
}
// 主函数
int main(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// 使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置GPIO引脚为推挽输出
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);
// 初始化DHT11传感器
DHT11_Init(DHT11_PORT, DHT11_PIN);
while (1)
{
// 读取温湿度数据
DHT11_Result result = DHT11_ReadData();
// 检查读取状态
if (result == DHT11_OK)
{
// 打印温湿度数据
printf("Temperature: %d°C\n", DHT11_GetTemperature());
printf("Humidity: %d%%\n", DHT11_GetHumidity());
}
else
{
// 打印读取错误
printf("DHT11 Read Error!\n");
}
// 延时2秒
delay_us(2000000);
}
}
```
上述代码中,首先定义了使用的GPIO引脚,并通过RCC函数使能了GPIOA的时钟。然后,配置GPIO引脚为推挽输出,初始化DHT11传感器,并在主循环中读取温湿度数据。最后,通过printf函数打印出温湿度数据,并延时2秒。需要注意的是,该代码中用到了dht11.h头文件中的函数和结构体定义,需要根据实际情况进行定义和引入。
### 回答3:
#include <stdio.h>
#include "stm32f10x.h"
#include "dht11.h"
void DelayUs(uint32_t n)
{
uint32_t i, j;
for(i = 0; i < n; i++)
{
for(j = 0; j < 8; j++);
}
}
void DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
DelayUs(1000);
}
void DHT11_Start(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
DelayUs(18000);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
DelayUs(20);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
uint8_t DHT11_Check(void)
{
uint8_t check = 0, i;
for(i = 0; i < 8; i++)
{
while(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13));
DelayUs(40);
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
{
check &= ~(1 << (7 - i));
}
else
{
check |= (1 << (7 - i));
}
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13));
}
return check;
}
uint8_t DHT11_Read_Byte(void)
{
uint8_t i, data = 0;
for(i = 0; i < 8; i++)
{
while(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13));
DelayUs(40);
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
{
data &= ~(1 << (7 - i));
}
else
{
data |= (1 << (7 - i));
}
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13));
}
return data;
}
void DHT11_Read_Data(uint8_t *temp, uint8_t *humi)
{
uint8_t buf[5];
uint8_t i;
for(i = 0; i < 5; i++)
{
buf[i] = DHT11_Read_Byte();
}
if(buf[0] + buf[1] + buf[2] + buf[3] == buf[4])
{
*humi = buf[0];
*temp = buf[2];
}
else
{
*humi = 0;
*temp = 0;
}
}
int main(void)
{
uint8_t temp, humi;
DHT11_Init();
while(1)
{
DHT11_Start();
if(DHT11_Check())
{
DHT11_Read_Data(&temp, &humi);
printf("Temperature: %dC Humidity: %d%%\n", temp, humi);
}
else
{
printf("Error reading data!\n");
}
DelayUs(500000);
}
return 0;
}
阅读全文