stm32项目DHT11模块代码
时间: 2024-01-05 21:02:34 浏览: 106
STM32 DHT11程序
以下是基于STM32的DHT11模块代码示例:
```
#include "stm32f10x.h"
#include "delay.h"
#define DHT11_GPIO GPIOB
#define DHT11_PIN GPIO_Pin_0
void DHT11_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
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_GPIO, &GPIO_InitStructure);
GPIO_SetBits(DHT11_GPIO, DHT11_PIN);
}
void DHT11_Start(void)
{
GPIO_ResetBits(DHT11_GPIO, DHT11_PIN);
delay_ms(18);
GPIO_SetBits(DHT11_GPIO, DHT11_PIN);
delay_us(20);
GPIO_ResetBits(DHT11_GPIO, DHT11_PIN);
}
u8 DHT11_Check(void)
{
u8 response = 0;
delay_us(40);
if (GPIO_ReadInputDataBit(DHT11_GPIO, DHT11_PIN) == RESET)
{
while (!GPIO_ReadInputDataBit(DHT11_GPIO, DHT11_PIN));
response = 1;
}
else
{
response = 0;
}
return response;
}
u8 DHT11_Read_Bit(void)
{
u8 response = 0;
while (GPIO_ReadInputDataBit(DHT11_GPIO, DHT11_PIN) == RESET);
delay_us(40);
if (GPIO_ReadInputDataBit(DHT11_GPIO, DHT11_PIN) == SET)
{
response = 1;
}
else
{
response = 0;
}
while (GPIO_ReadInputDataBit(DHT11_GPIO, DHT11_PIN) == SET);
return response;
}
u8 DHT11_Read_Byte(void)
{
u8 i = 0, res = 0;
for (i = 0; i < 8; i++)
{
res <<= 1;
res |= DHT11_Read_Bit();
}
return res;
}
void DHT11_Read_Data(u8* temp, u8* humi)
{
u8 buf[5];
u8 i;
DHT11_Start();
if (DHT11_Check() == 1)
{
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];
}
}
GPIO_SetBits(DHT11_GPIO, DHT11_PIN);
}
```
调用方式:
```
int main(void)
{
u8 temp, humi;
delay_init();
DHT11_Init();
while (1)
{
DHT11_Read_Data(&temp, &humi);
printf("Temperature: %d, Humidity: %d\r\n", temp, humi);
delay_ms(1000);
}
}
```
注意事项:
- 本代码中使用的是PB0口作为DHT11模块的数据接口,需要根据实际连接进行修改。
- 本代码中使用的是定时器延时库,需要自行添加。
- 本代码中使用的是USART串口输出,需要先初始化串口以及添加printf函数的支持。
阅读全文