STM32的DHT711代码
.c文件
#include "dht.h"
struct TEMPTURE
{
u8 current_tempture_status ;
u8 tempture_change_flag ;
}tempture;
struct HUMIDITY
{
u8 humidity_status;
u8 humidity_change_flag ;
}humidity;
void Get_TemptureAndHumidity()
{
int i=1000000;
unsigned char R_H,R_L,T_H,T_L,revise;
GPIO_InitTypeDef GPIO_InitTypeStruct;
RCC_APB2PeriphClockCmd(DHT_GPIO_CLK,ENABLE);
GPIO_InitTypeStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitTypeStruct.GPIO_Pin = DHT_GPIO_Pin;
GPIO_InitTypeStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT_GPIO_PORT, &GPIO_InitTypeStruct);
GPIO_SetBits(DHT_GPIO_PORT, DHT_GPIO_Pin);
delay_us(2);
GPIO_ResetBits(DHT_GPIO_PORT, DHT_GPIO_Pin);
delay_ms(20);
GPIO_SetBits(DHT_GPIO_PORT, DHT_GPIO_Pin);
GPIO_InitTypeStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(DHT_GPIO_PORT, &GPIO_InitTypeStruct);
while(GPIO_ReadInputDataBit(DHT_GPIO_PORT, DHT_GPIO_Pin)==1)
{
if((i--)==0)
{
return;
}
}
while(GPIO_ReadInputDataBit(DHT_GPIO_PORT, DHT_GPIO_Pin)==0)
{
if((i--)==0)
{
return;
}
}
while(GPIO_ReadInputDataBit(DHT_GPIO_PORT, DHT_GPIO_Pin)==1)
{
if((i--)==0)
{
return;
}
}
R_H = DHT_rec_byte();
R_L = DHT_rec_byte();
T_H = DHT_rec_byte();
T_L = DHT_rec_byte();
revise=DHT_rec_byte();
delay_us(25);
if((R_H+R_L+T_H+T_L)==revise)
{
tempture.current_tempture_status = T_H;
humidity.humidity_status = R_H;
}
}
u8 DHT_rec_byte()
{
unsigned char i,dat=0;
for(i=0;i<8;i++)
{
while(!GPIO_ReadInputDataBit(DHT_GPIO_PORT, DHT_GPIO_Pin));
delay_us(28);
dat<<=1;
if(GPIO_ReadInputDataBit(DHT_GPIO_PORT, DHT_GPIO_Pin)==1)
{
dat+=1;
}
while(GPIO_ReadInputDataBit(DHT_GPIO_PORT, DHT_GPIO_Pin));
}
return dat;
}
.h文件
#ifndef _DHT_H_
#define _DHT_H_
#include "stm32f10x.h"
#include "delay.h"
#include "bsp_uart.h"
#define DHT_GPIO_PORT GPIOD
#define DHT_GPIO_Pin GPIO_Pin_2
#define DHT_GPIO_CLK (RCC_APB2Periph_GPIOD)
void Get_TemptureAndHumidity(void);
u8 DHT_rec_byte(void);
#endif