STM32DHT11读取温度湿度
时间: 2023-09-26 18:08:03 浏览: 151
首先需要连接STM32与DHT11传感器,DHT11的数据线连接到STM32的GPIO口。接下来可以使用STM32的库函数来读取DHT11传感器数据。
以下是一个基本的示例代码:
```c
#include "stm32f10x.h"
#define DHT11_PORT GPIOA
#define DHT11_PIN GPIO_Pin_0
void delay_us(uint32_t us)
{
SysTick->LOAD = 9 * us;
SysTick->CTRL = 0x01;
while (!(SysTick->CTRL & 0x10000));
SysTick->CTRL = 0x00;
}
void DHT11_start(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
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);
GPIO_ResetBits(DHT11_PORT, DHT11_PIN);
delay_us(18000);
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
delay_us(40);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}
uint8_t DHT11_read_bit(void)
{
uint8_t retry = 0;
while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == RESET)
{
retry++;
if (retry > 100)
return 0;
delay_us(1);
}
retry = 0;
while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET)
{
retry++;
if (retry > 100)
return 0;
delay_us(1);
}
if (retry > 50)
return 1;
else
return 0;
}
uint8_t DHT11_read_byte(void)
{
uint8_t i, j, byte = 0;
for (i = 0; i < 8; i++)
{
j = DHT11_read_bit();
byte <<= 1;
byte |= j;
}
return byte;
}
void DHT11_read_data(uint8_t *temp, uint8_t *humi)
{
uint8_t i;
uint8_t data[5];
DHT11_start();
if (DHT11_read_bit() == 0)
{
*humi = 100;
*temp = 100;
return;
}
for (i = 0; i < 5; i++)
data[i] = DHT11_read_byte();
if ((data[0] + data[1] + data[2] + data[3]) == data[4])
{
*humi = data[0];
*temp = data[2];
}
else
{
*humi = 0;
*temp = 0;
}
}
int main(void)
{
uint8_t temp, humi;
while (1)
{
DHT11_read_data(&temp, &humi);
printf("Temperature: %d°C, Humidity: %d%%\n", temp, humi);
delay_ms(2000);
}
}
```
此代码通过DHT11传感器读取温度和湿度,然后将其打印到串口终端上。需要注意的是,由于DHT11传感器的数据传输是比较慢的,因此需要适当的延时来等待数据传输完成。另外,由于本例是在STM32F103C8T6开发板上编写的,因此需要根据自己使用的STM32型号,调整GPIO口的配置。
阅读全文