#include "DHT11.h"
#include "delay.h"
#define DHT11_Mode(x) (x)?GPIO_SetBits(GPIOB,GPIO_Pin_4):GPIO_ResetBits(GPIOB,GPIO_Pin_4)
#define DHT11_READ GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)
static GPIO_InitTypeDef GPIO_InitStructure;
//引脚 PB4
//输入模式
void DHT11_InputMode(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/* Configure PG6 and PG8 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//输出模式
void DHT11_OutputMode(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/* Configure PG6 and PG8 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
DHT11_Mode(1);
}
//开始信号
void DHT11_StartSignal(void)
{
//输出模式
DHT11_OutputMode();
//拉低
DHT11_Mode(0);
//延迟20ms
delay_ms(20);
//拉高
DHT11_Mode(1);
//延迟30us
delay_us(30);
}
//响应
//返回1 失败 返回0成功
uint8_t DHT11_Respnse(void)
{
uint8_t i = 0;
//输入模式
DHT11_InputMode();
//等待低电平出现
while(DHT11_READ == 1 && i<100)
{
delay_us(1);
i++;
}
if(i>=100)
return 1;
i=0;
//等待低电平延迟80us
while(DHT11_READ == 0 && i<100)
{
delay_us(1);
i++;
}
if(i>=100)
return 1;//表示没有响应
else
return 0;//表示响应了
}
//读取数据
uint32_t DHT_ReadBit(void)
{
//等待低电平出现 设置超时处理
uint8_t i = 0;
while(DHT11_READ == 1 && i<100)
{
delay_us(1);
i++;
}
//等待高电平出现
while(DHT11_READ == 0 && i<100)
{
delay_us(1);
i++;
}
delay_us(40);
if(DHT11_READ == 1)
return 1;
else
return 0;
}
//读取一个字节数据
uint8_t DHT11_ReadByte(void)
{
uint32_t i =0;
uint8_t data = 0;
for(i = 0 ;i < 8; ++i)
{
data <<= 1;
data |=DHT_ReadBit();
}
return data;
}
uint32_t DHT11_GetData(uint8_t *buf)
{
uint32_t i =0;
//发送开始数据
DHT11_StartSignal();
if(DHT11_Respnse() == 0)//响应
{
for(i = 0; i<5; ++i)
{
buf[i] = DHT11_ReadByte();
}
//对获取的数据进行校验
if( buf[0]+buf[1]+buf[2]+buf[3] == buf[4] ) //说明校验正确
{
return 0; //说明获取数据成功
}
else
return 1; //获取数据失败 因为校验失败
}
else
{
return 1; //获取数据失败 因为根本没响应
}
}