写一份stc89c52单片机读取dht11温湿度模块数据的程序
时间: 2023-03-14 18:20:46 浏览: 166
程序代码:#include <reg51.h>
#include <intrins.h>
#include <stdio.h>#define uint unsigned int
#define uchar unsigned char
sbit DHT11=P2^2;
uchar temp_h,temp_l,humi_h,humi_l,sum;
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}void DHT11_Start() // DHT11开始信号
{
DHT11=1;
delay_ms(20); // 拉高20ms
DHT11=0; // 拉低40us
delay_ms(40);
DHT11=1; // 拉高40us
delay_ms(40);
DHT11=1;
}uchar DHT11_Read_Bit() // 读取一位数据
{
uchar count=0;
while(!DHT11) // 等待变为高电平
{
count++;
if(count>100)return 0; // 超时退出
}
delay_ms(40); // 等待40us
count=0;
while(DHT11) // 等待变为低电平
{
count++;
if(count>100)return 1; // 超时退出
}
return 2;
}uchar DHT11_Read_Byte() // 读取一个字节
{
uchar i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}void DHT11_Read_Data() // 读取温湿度值
{
uchar buf[5];
DHT11_Start();
if(DHT11_Read_Bit()==2)
{
buf[0]=DHT11_Read_Byte();
buf[1]=DHT11_Read_Byte();
buf[2]=DHT11_Read_Byte();
buf[3]=DHT11_Read_Byte();
buf[4]=DHT11_Read_Byte();
if(buf[4]==(buf[0]+buf[1]+buf[2]+buf[3]))
{
humi_h=buf[0];
humi_l=buf[1];
temp_h=buf[2];
temp_l=buf[3];
}
}
}void main()
{
while(1)
{
DHT11_Read_Data();
printf("湿度:%d.%d%\n",humi_h,humi_l);
printf("温度:%d.%d℃\n",temp_h,temp_l);
delay_ms(3000);
}
}
阅读全文