dht11温湿度传感器STM32代码
时间: 2023-08-28 07:06:04 浏览: 120
下面是DHT11温湿度传感器的STM32代码:
```c
#include "dht11.h"
#include "delay.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#define DHT11_PORT GPIOB
#define DHT11_PIN GPIO_Pin_0
void DHT11_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
}
static void DHT11_IO_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}
static void DHT11_IO_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}
static uint8_t DHT11_Read_Byte(void)
{
uint8_t i, j, byte = 0;
for (i = 0; i < 8; i++)
{
while (!(DHT11_PORT->IDR & DHT11_PIN)); //等待高电平
delay_us(30); //延时30us
if (DHT11_PORT->IDR & DHT11_PIN) //如果仍为高电平
byte |= (1 << (7 - i)); //则将字节的相应位置为1
while (DHT11_PORT->IDR & DHT11_PIN); //等待低电平
}
return byte;
}
uint8_t DHT11_Read_Data(float *temp, float *humi)
{
uint8_t i, j, check_sum, data[5];
DHT11_IO_OUT();
GPIO_ResetBits(DHT11_PORT, DHT11_PIN); //拉低DHT11总线
delay_ms(20); //延时20ms
GPIO_SetBits(DHT11_PORT, DHT11_PIN); //拉高DHT11总线
delay_us(30); //延时30us
DHT11_IO_IN();
if (!(DHT11_PORT->IDR & DHT11_PIN)) //等待DHT11的响应信号
{
while (!(DHT11_PORT->IDR & DHT11_PIN)); //等待高电平
while (DHT11_PORT->IDR & DHT11_PIN); //等待低电平
for (i = 0; i < 5; i++)
data[i] = DHT11_Read_Byte(); //读取40位数据
check_sum = data[0] + data[1] + data[2] + data[3]; //计算校验和
if (check_sum == data[4]) //校验和正确
{
*humi = data[0] + data[1] / 10.0; //湿度
*temp = data[2] + data[3] / 10.0; //温度
return 1;
}
}
return 0;
}
```
代码中的`delay.h`是一个自己写的延时函数库,可以用其他延时函数库代替。`DHT11_Init`函数是初始化函数,需要在程序启动时调用一次。`DHT11_Read_Data`函数用于读取温湿度数据,传入两个指针参数,分别指向温度和湿度变量,在函数执行成功后,这两个变量会被赋值。函数返回值为1表示读取成功,为0表示读取失败。
阅读全文