用单片机stc89c52读取dht11温度湿度数据的代码
时间: 2023-03-26 08:02:20 浏览: 126
基于89c52单片机温湿度检测
以下是读取DHT11温度湿度数据的STC89C52单片机代码:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DHT11 = P1^; //DHT11数据线
uchar code DHT11_Table[40] = {}; //存放DHT11数据的数组
//延时函数
void Delay_us(uint us)
{
while(us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
//DHT11开始信号
void DHT11_Start()
{
DHT11 = 1;
Delay_us(30);
DHT11 = ;
Delay_us(18000);
DHT11 = 1;
Delay_us(30);
}
//DHT11响应信号
uchar DHT11_Response()
{
uchar i = ;
while(DHT11 && i < 200) //等待DHT11拉低数据线
{
Delay_us(1);
i++;
}
if(i >= 200)
return 1; //DHT11响应失败
else
i = ;
while(!DHT11 && i < 200) //等待DHT11拉高数据线
{
Delay_us(1);
i++;
}
if(i >= 200)
return 1; //DHT11响应失败
else
return ;
}
//读取DHT11数据
uchar DHT11_ReadData()
{
uchar i, j, k;
for(i = ; i < 5; i++) //读取5个字节的数据
{
for(j = ; j < 8; j++) //读取1个字节的8位数据
{
k = ;
while(!DHT11) //等待DHT11拉高数据线
{
Delay_us(1);
k++;
if(k > 100)
return 1; //DHT11数据读取失败
}
Delay_us(30);
if(DHT11) //如果数据线仍为高电平,则表示数据为1
DHT11_Table[i * 8 + j] = 1;
else //否则数据为
DHT11_Table[i * 8 + j] = ;
k = ;
while(DHT11) //等待DHT11拉低数据线
{
Delay_us(1);
k++;
if(k > 100)
return 1; //DHT11数据读取失败
}
}
}
return ;
}
//主函数
void main()
{
uchar humi_H, humi_L, temp_H, temp_L, check_sum;
while(1)
{
DHT11_Start(); //发送开始信号
if(DHT11_Response() == ) //等待DHT11响应信号
{
if(DHT11_ReadData() == ) //读取DHT11数据
{
humi_H = DHT11_Table[];
humi_L = DHT11_Table[1];
temp_H = DHT11_Table[2];
temp_L = DHT11_Table[3];
check_sum = DHT11_Table[4];
if(check_sum == humi_H + humi_L + temp_H + temp_L) //校验数据
{
//计算温度和湿度
uint humi = humi_H * 256 + humi_L;
uint temp = temp_H * 256 + temp_L;
printf("湿度:%d.%d%%,温度:%d.%d℃\n", humi / 10, humi % 10, temp / 10, temp % 10);
}
}
}
Delay_us(100000); //延时1秒
}
}
阅读全文