PIC单片机读DHT11温湿度传感器,时序应该没问题,但校验通不过,略过校验数值也不对,求大神给看看

#define dat RA3
#define dat_in TRISA3=1
#define dat_out TRISA3=0
uchar DHT11[5],RTflag=0;
uchar FLAG; //超时标志位
//uchar wendu[2],shidu[2];

uchar write_byte1() //读一个字节
{
uchar i,comdata,temp1;
//dat_in;
for(i=0;i<8;i++)
{
FLAG=2;
while((!dat)&&FLAG++);//判断数据位是0还是1
if(FLAG==1)break; //超时则跳出for循环
delay_10us();
delay_10us();
//delay_10us();
//delay_10us();
temp1=0;
if(dat)temp1=1; // 如果高电平高过预定0高电平值则数据位为 1
FLAG=2;
while((dat)&&FLAG++);//flag先与后加1 如果dat一直为1 uchar型变量 flag 溢出变为0 再自加1

if(FLAG==1)break; //超时则跳出for循环
comdata<<=1;//左移一位 高位在前 低位在后
comdata|=temp1;
}
return (comdata);
}
void getwsd() //读5个字节数据 两个字节为温度数据 两个字节为湿度数据 最后一个字节为校验
{
uchar i,temp; //
dat_out;
dat=0;
delay_ms(20);//主机拉低18ms
dat=1;
//总线由上拉电阻拉高 主机延时20us_40us
delay_10us();
delay_10us();
delay_10us();
//delay_10us();
//主机设为输入 判断从机响应信号
dat_in;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!dat) //T !
{
FLAG=2; //超时标志位

while((!dat)&&FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
FLAG=2;

while((dat)&&FLAG++); //判断从机拉高80us是否结束
for(i=0;i<5;i++)//数据接收状态
{
DHT11[i]=write_byte1();
}
dat=1; //释放数据总线 为下一次读取做好准备
temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]);
//if(temp==DHT11[4]) //数据校验
{
RTflag=1;
}
if(RTflag==1) //如果RTflag=1 说明读取到得数据正确
{
RTflag=0;
shidu[0]=DHT11[0]/10+0x30; //小时十位数据
shidu[1]=DHT11[0]%10+0x30; //小时个位数据
wendu[0]=DHT11[2]/10+0x30; //分钟十位数据
wendu[1]=DHT11[2]%10+0x30; //分钟个位数据
}
}

}

第1个回答  2014-10-13
应该没问题,说明你还不太确定。

还是用示波器看看波形对不对吧。本回答被提问者和网友采纳
第2个回答  2019-08-24
修改相关的延时长短(就是尝试,一直到可以),可以解决这个问题。
相似回答