为何STC15读DHT11数据时为何读不到低电平?

2019-07-15 08:55发布

本人最近用STC15操作DHT11发现无反应,仿真后发现读取函数卡在等待低电平那里,不管如何修改程序还是无法读取数据,求各大神能帮忙看一下程序,指出错误,谢谢各位。(完整工程在附件里面)
#include "all.h"
sbit DB=P1^1;
void delay(u8 i)//25US
{
        u8 a;
        while(i--)
        {               
                for(a=0;a<21;a++);
        }
}
void Delay30us()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        _nop_();
        i = 80;
        while (--i);
}

void delay90us()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        _nop_();
        i = 1;
        j = 244;
        do
        {
                while (--j);
        } while (--i);
}

void delay18ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        i = 1;
        j = 194;
        k = 160;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void shutdown()
{
        P0=0x0f;
        P2=0xa0;
        P2=0x00;
       
        P0=0xff;
        P2=0xe0;
        P2=0x80;
        P2=0x00;
       
        P0=0x00;
        P2=0xc0;
        P2=0x00;

}

unsigned char dht11_rd(void)//dht11 Êý¾Ý¶ÁÈ¡
{
        u8 i,temp;
        u8 dat;
        for(i=0;i<8;i++)
        {
     while(!DB);
        Delay30us();
        temp = 0;
        if(DB == 1)
        {
            temp = 1;
        }
        while(DB);
        dat<<=1;
        dat = dat|temp;
    }
    return dat;
}
unsigned int dht11_rec(void)
{
        u16 TRH;
        u8 undata;
        u8 TH_data,TL_data,RH_data,RL_data,CK_data;
                DB=1;
                DB=0;
                delay18ms();
                DB=1;
                delay(1);//³õʼ»¯dht11
                while(DB==0);//µÈ´ýµÍµçƽ
                while(!DB);//µÈ´ý¸ßµçƽ
                delay90us();//ÑÓʱ
            if(!DB)
    {
        while(!DB);
        while(DB);
        RH_data = dht11_rd();
        RL_data = dht11_rd();
        TH_data = dht11_rd();
        TL_data = dht11_rd();
        CK_data = dht11_rd();
        undata = RH_data + RL_data + TH_data + TL_data;
    }
                DB=0;
                delay(2);
                DB=1;
        if(undata==CK_data)
        {
                TRH=RH_data;
                TRH<<=8;
                TRH=(TRH|(TH_data));
                return TRH;
        }
        else
               
                return 0;
}

DHT11.zip 下载积分: 积分 -1 分
43.25 KB, 下载次数: 2, 下载积分: 积分 -1 分
0条回答

一周热门 更多>