182 lines
4.3 KiB
C
182 lines
4.3 KiB
C
|
#include "dht11.h"
|
||
|
|
||
|
|
||
|
//********************************************************************//
|
||
|
//! 函数名:DHT11_Init
|
||
|
//! 功能:初始化dht11
|
||
|
//! 输入:none
|
||
|
//! 输出:是否初始化成功;成功:0;失败:1
|
||
|
//********************************************************************//
|
||
|
u8 DHT11_Init()
|
||
|
{
|
||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
|
||
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
|
||
|
|
||
|
GPIO_InitStructure.GPIO_Pin=DHT11;
|
||
|
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
|
||
|
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
|
||
|
GPIO_Init(GPIO_DHT11,&GPIO_InitStructure);
|
||
|
//! 拉高
|
||
|
GPIO_SetBits(GPIO_DHT11,DHT11);
|
||
|
|
||
|
DHT11_Rst();
|
||
|
return DHT11_Check();
|
||
|
}
|
||
|
//********************************************************************//
|
||
|
//! 函数名:DHT11_Rst
|
||
|
//! 功能:复位dht11
|
||
|
//! 输入:none
|
||
|
//! 输出:none
|
||
|
//********************************************************************//
|
||
|
void DHT11_Rst()
|
||
|
{
|
||
|
//! 输出模式
|
||
|
DHT11_IO_OUT();
|
||
|
//! 拉低DQ
|
||
|
DHT11_DQ_OUT=0;
|
||
|
//! 拉低至少18ms
|
||
|
delay_ms(20);
|
||
|
//! 拉高DQ
|
||
|
DHT11_DQ_OUT=1;
|
||
|
//! 主机拉高20~40us
|
||
|
delay_us(30);
|
||
|
}
|
||
|
//********************************************************************//
|
||
|
//! 函数名:DHT11_Check
|
||
|
//! 功能:等待dht11响应
|
||
|
//! 输入:none
|
||
|
//! 输出:dht11是否响应;1:未检测到dht11; 0:检测到dht11
|
||
|
//********************************************************************//
|
||
|
u8 DHT11_Check()
|
||
|
{
|
||
|
u8 retry=0;
|
||
|
//! 输入模式
|
||
|
DHT11_IO_IN();
|
||
|
//! DHT11会拉低40~50us
|
||
|
while (DHT11_DQ_IN&&retry<100)
|
||
|
{
|
||
|
retry++;
|
||
|
delay_us(1);
|
||
|
};
|
||
|
if(retry>=100)return 1;
|
||
|
else retry=0;
|
||
|
//! DHT11会拉低后会再次拉高40~50us
|
||
|
while (!DHT11_DQ_IN&&retry<100)
|
||
|
{
|
||
|
retry++;
|
||
|
delay_us(1);
|
||
|
};
|
||
|
if(retry>=100)return 1;
|
||
|
return 0;
|
||
|
}
|
||
|
//********************************************************************//
|
||
|
//! 函数名:DHT11_Read_Bit
|
||
|
//! 功能:从dht11读取一bit数据
|
||
|
//! 输入:none
|
||
|
//! 输出:一bit数据:0; 1;
|
||
|
//********************************************************************//
|
||
|
u8 DHT11_Read_Bit(void)
|
||
|
{
|
||
|
u8 retry=0;
|
||
|
//! 等待变成低电平 12-14us 开始
|
||
|
while(DHT11_DQ_IN&&retry<100)
|
||
|
{
|
||
|
retry++;
|
||
|
delay_us(1);
|
||
|
}
|
||
|
retry=0;
|
||
|
//! 等待变成高电平 26-28us表示0,116-118us表示1
|
||
|
while(!DHT11_DQ_IN&&retry<100)
|
||
|
{
|
||
|
retry++;
|
||
|
delay_us(1);
|
||
|
}
|
||
|
//! 等待40us
|
||
|
delay_us(40);
|
||
|
if(DHT11_DQ_IN)
|
||
|
return 1;
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
//********************************************************************//
|
||
|
//! 函数名:DHT11_Read_Byte
|
||
|
//! 功能:从dht11读取一byte数据
|
||
|
//! 输入:none
|
||
|
//! 输出:一byte数据
|
||
|
//********************************************************************//
|
||
|
u8 DHT11_Read_Byte(void)
|
||
|
{
|
||
|
u8 i,dat;
|
||
|
dat=0;
|
||
|
for (i=0;i<8;i++)
|
||
|
{
|
||
|
dat<<=1;
|
||
|
dat|=DHT11_Read_Bit();
|
||
|
}
|
||
|
return dat;
|
||
|
}
|
||
|
//********************************************************************//
|
||
|
//! 函数名:DHT11_Read_Data
|
||
|
//! 功能:从dht11读取一次数据
|
||
|
//! 输入:temp:储存温度数据指针; humi:存储温度数据指针
|
||
|
//! 输出:是否读取成功;1:失败;0:成功
|
||
|
//********************************************************************//
|
||
|
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
|
||
|
{
|
||
|
u8 buf[5];
|
||
|
u8 i;
|
||
|
DHT11_Rst();
|
||
|
if(DHT11_Check()==0)
|
||
|
{
|
||
|
//! 读取5byte数据
|
||
|
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];
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
return 1;
|
||
|
return 0;
|
||
|
}
|
||
|
//********************************************************************//
|
||
|
//! 函数名:DHT11_IO_OUT
|
||
|
//! 功能:配置dht11为输出
|
||
|
//! 输入:none
|
||
|
//! 输出:none
|
||
|
//********************************************************************//
|
||
|
void DHT11_IO_OUT()
|
||
|
{
|
||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
GPIO_InitStructure.GPIO_Pin=DHT11;
|
||
|
//! 推挽输出
|
||
|
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
|
||
|
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
|
||
|
GPIO_Init(GPIO_DHT11,&GPIO_InitStructure);
|
||
|
}
|
||
|
//********************************************************************//
|
||
|
//! 函数名:DHT11_IO_IN
|
||
|
//! 功能:配置dht11为输入
|
||
|
//! 输入:none
|
||
|
//! 输出:none
|
||
|
//********************************************************************//
|
||
|
void DHT11_IO_IN()
|
||
|
{
|
||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
GPIO_InitStructure.GPIO_Pin=DHT11;
|
||
|
//! 上拉输入模式
|
||
|
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
|
||
|
GPIO_Init(GPIO_DHT11,&GPIO_InitStructure);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|