DHT11温湿度传感器数据读取程序及解析
DHT11温湿度传感器数据读取程序及解析
本篇博客提供了一段用于读取DHT11温湿度传感器数值的代码,并对其进行详细解析,方便开发者理解和使用。
#include 'dht11.h'
void delay_dht11(uint i)
{
while(i--);
}
void delay_ms_dht11(uint i)
{
while(i--)
delay_dht11(90);
}
void DHT11_Rst(void)
{
DHT11_DQ_OUT=0; // 拉低DQ
delay_ms_dht11(20); // 拉低至少18ms
DHT11_DQ_OUT=1; // DQ=1
delay_dht11(3); // 等待20~40us
}
uchar DHT11_Check(void)
{
uchar retry=0;
while(DHT11_DQ_OUT&&retry<100) //DHT11会拉低40~80us
{
retry++;
_nop_();
}
if(retry>=100)
return 1;
else
retry=0;
while(!DHT11_DQ_OUT&&retry<100) //DHT11拉低后会再次拉高40~80us
{
retry++;
_nop_();
}
if(retry>=100)
return 1;
return 0;
}
uchar DHT11_Init(void)
{
DHT11_Rst();
return DHT11_Check();
}
uchar DHT11_Read_Bit(void)
{
uchar retry=0;
while(DHT11_DQ_OUT&&retry<100) //等待变为低电平 12-14us 开始
{
retry++;
_nop_();
}
retry=0;
while((!DHT11_DQ_OUT)&&retry<100) //等待变为高电平 26-28us表示0,70us表示1
{
retry++;
_nop_();
}
delay_dht11(1);//等待40us
if(DHT11_DQ_OUT)
return 1;
else
return 0;
}
uchar DHT11_Read_Byte(void)
{
uchar i,dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
void Dht11_Get_Temp_Humi_Value(uint *temp,uint *humi)
{
uchar buf[5];
uchar i;
EA = 0;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++) //获取40位数据
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0];
*temp=buf[2];
}
}
EA = 1;
}
函数说明:
delay_dht11():这是一个简单的延时函数,用于控制时间间隔。delay_ms_dht11():这个延时函数基于delay_dht11(),用于延时指定的毫秒数。DHT11_Rst():该函数用于复位DHT11传感器,通过控制引脚的电平变化来完成。DHT11_Check():这个函数用于检测DHT11传感器的响应,判断传感器是否正常工作。DHT11_Init():该函数用于初始化DHT11传感器,包括复位和检测操作。DHT11_Read_Bit():该函数用于读取DHT11传感器发送的一位数据。DHT11_Read_Byte():该函数用于读取DHT11传感器发送的一个字节数据。Dht11_Get_Temp_Humi_Value(): 这是最终的读取函数,用于获取DHT11传感器的温度和湿度数值。
总结
这段代码通过控制DHT11传感器的引脚电平变化和延时操作,实现了对传感器数据的读取和解析。开发者可以根据自己的需要修改和使用这段代码。
原文地址: https://www.cveoy.top/t/topic/dfGW 著作权归作者所有。请勿转载和采集!