写了一个DHT11温度计,用lcd1602显示,lcd1602的程序肯定是没错的,用了许多次。DHT11的函数里面用了while语句,所以现在就好像是卡在读取程序的函数里面了,这个模块我之前用别人的程序测试过也是好用的,延时函数由STC-isp提供,应该也没错。
下面是我的单片机源码:
void DHT11Start() //发送开始信号
{
DHT11data = 1;
DHT11data = 0;
Delay20ms();
DHT11data = 1;
Delay30us();
}
uchar DHT11GetByte() //获得一组8bit数据
{
uchar byte = 0;
uint i;
for(i=0;i<8;i++)
{
while(!DHT11data);
Delay30us();
Delay30us();
byte <<= 1;
if(DHT11data == 1)
{ byte += 1; }
while(DHT11data);
}
return byte;
}
void DHT11GetData(uchar *dat) //获得所有数据
{
uchar check,datbuffer[4]={0,0,0,0};
uchar datcheck[4]={0,0,0,0}; //湿度十位,湿度个位,温度十位,温度个位
uint i,num;
DHT11Start();
if(DHT11data == 0)
{
while(DHT11data == 0);
Delay80us();
datbuffer[0] = DHT11GetByte();
datbuffer[1] = DHT11GetByte();
datbuffer[2] = DHT11GetByte();
datbuffer[3] = DHT11GetByte();
check = DHT11GetByte();
Delay30us();
num = datbuffer[0]+datbuffer[1]+datbuffer[2]+datbuffer[3];
if(check == num)
{
for(i=0;i<4;i++)
{
datcheck[i] = datbuffer[i];
}
}
dat[0] = (datcheck[0]/10)+'0';
dat[1] = (datcheck[1]%10)+'0';
dat[2] = (datcheck[2]/10)+'0';
dat[3] = (datcheck[3]%10)+'0';
// dat[0] = (datbuffer[0]/10)+'0';
// dat[1] = (datbuffer[1]%10)+'0';
// dat[2] = (datbuffer[2]/10)+'0';
// dat[3] = (datbuffer[3]%10)+'0';
}
}