基于stm32控制dht11温湿度传感器的程序
时间: 2023-09-11 19:04:57 浏览: 110
物联网项目实战开发之基于STM32的DHT11温湿度传感器测量程序代码
5星 · 资源好评率100%
下面是一个基于STM32控制DHT11温湿度传感器的程序:
```c
#include "stm32f10x.h"
#include "dht11.h"
GPIO_InitTypeDef GPIO_InitStructure;
void delay_us(uint32_t us)
{
TIM4->ARR = us;
TIM4->EGR = TIM_EGR_UG;
TIM4->SR &= ~TIM_SR_UIF;
TIM4->CR1 |= TIM_CR1_CEN;
while (!(TIM4->SR & TIM_SR_UIF));
TIM4->CR1 &= ~TIM_CR1_CEN;
}
void delay_ms(uint32_t ms)
{
while(ms--)
{
delay_us(1000);
}
}
void DHT11_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
uint8_t DHT11_Read_Byte(void)
{
uint8_t i=0,dat=0;
for(i=0;i<8;i++)
{
while(!(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)));
delay_us(30);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==RESET)
{
dat&= ~(1<<(7-i));
}
else
{
dat|= (1<<(7-i));
}
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0));
}
return dat;
}
void DHT11_Read_TempAndHumidity(float *temperature, float *humidity)
{
uint8_t buf[5],i;
DHT11_Init();
GPIO_SetBits(GPIOB,GPIO_Pin_0);
delay_ms(1000);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
delay_ms(18);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
delay_us(30);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0))
{
return;
}
while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0));
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0));
for(i=0;i<5;i++)
{
buf[i]=DHT11_Read_Byte();
}
if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4])
{
*humidity=(float)buf[0]+(float)buf[1]/10.0;
*temperature=(float)buf[2]+(float)buf[3]/10.0;
}
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
}
```
这个程序使用了STM32的定时器和GPIO模块来实现对DHT11温湿度传感器的读取。在使用之前需要先初始化GPIO模块,并通过定时器来实现微秒级别的延时。然后就可以通过DHT11_Read_TempAndHumidity函数来读取温湿度值,该函数会返回读取到的温湿度值。
阅读全文