DHT11&51单片机
温湿度数据显示一直是100以上 绝望调试了一天无果
尝试直接下载网上的程序 烧录下来数据正确
于是把自己的程序一块块地分别替换到下载的程序里,一次次地烧录,最后发现自己的程序问题出在这:
网上的代码:
uchar DHT11_rec_byte() //接收一个字节
{
uchar i,k,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!Data); //等待50us低电平过去
k = 11;while (--k); //Delay30us
dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
我的代码:
unsigned char DHT11_ReceiveByte(void)
{
unsigned char i,k;
unsigned char Byte=0x00;
for(i=0;i<8;i++){
while(!Data); //等待响应信号结束
k = 11;while (--k); //Delay30us
if(Data){Byte|=(0x01<<i);} //就是这里!!!开始的时候怎么看都觉得功能实现是一样的
while(Data); //等待发送信号结束
}
return Byte;
}
我这个用或运算来实现0,1传递区分的思想没有问题,可是这特么是从低位到高位传,而DHT11是按先后顺序即对十六进制说从高位到低位传啊
如果把我的这句代码改为
Byte|=(0x80>>i);
就没有问题了……
惨痛教训 共勉