程序如下:
这是DHT11的读取程序,显示程序在main文件中,用LCD1602显示,LCD1602的程序绝对是正确的,因为我别的程序也用了,现在的问题是温湿度十位数据正确,个位数据错误,能过校验
#include <reg52.h>
typedef unsigned char uchar;
sbit DATA = P1^6;
void Delay18ms() //@11.0592MHz
{
unsigned char i, j;
i = 33;
j = 66;
do
{
while (--j);
} while (--i);
}
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void DHT11Start()
{
DATA = 0;
Delay18ms();
DATA = 1;
Delay10us();
Delay10us();
Delay10us();
DATA = 1;
}
uchar GetByte()
{
uchar i,b=0;
for(i=0;i<8;i++)
{
while(!DATA);
Delay10us();
Delay10us();
Delay10us();
b <<= 1;
if(DATA == 1)b += 1;
while(DATA);
}
return b;
}
void DHT11GetData(uchar *dat)
{
uchar datacheck,RH,RL,TH,TL;
DHT11Start();
if(!DATA)
{
while(!DATA);
while(DATA);
RH = GetByte();
RL = GetByte();
TH = GetByte();
TL = GetByte();
datacheck = GetByte();
DATA = 1;
}
if(datacheck == (RH+RL+TH+TL))
{
dat[0] = (RH/10) +'0';
dat[1] = (RL%10) +'0';
dat[2] = (TH/10) +'0';
dat[3] = (TL%10) +'0';
}
else
{
dat[0] = '0';
dat[1] = '0';
dat[2] = '0';
dat[3] = '0';
}
}
|