单片机+DHT11读不出数据,写了一个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′;
- }
- }
复制代码
,DHT11 data是全局变量吗 在哪更新 不更新就会死在while里