stm32/App/DHT11/dht11.c

182 lines
4.3 KiB
C
Raw Permalink Normal View History

2021-10-25 14:03:59 +00:00
#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);
}