麻烦帮我看下DHT11的程序。。结果始终不正确呢!主要是判断数据高低电平的延时我不会

2020-02-05 09:22发布

#ifndef                _DHT11_H_
#define                _DHT11_H_

#include"AT89X52.h"
#include"intrins.h"
#define                DHT11_Dq        P2_4

bit                DHT11_Read();
void        DHT11_Init();
bit                DHT11_Start();
void        Delay_Us(unsigned char        i);
void        Delay_Xms(unsigned int Time);
extern    unsigned char Temp[5];

void        UART_Init(void);                                  //串口


#endif

include"DHT11.h"

unsigned char Temp[5];
/*---------------------------------
|函数名称:毫秒级延时函数。
|说    明:晶振12Mhz
|延时时间:1.01Ms
-----------------------------------*/
void        Delay_Xms(unsigned int Time)
{
                unsigned         int i = 0;
                unsigned   char j = 0;
                for (i = Time;i > 0;i--)
                        {
                                        for (j = 123;j > 0;j--);
                        }
}

/**************************
MOV                R7,#0X01;                1
LCALL        DELAY;                        2
DELAY:        DJNZ R7,DELAY;        2
RET                                                2

延时时间 = 5+I*2;
**************************/
void        Delay_Us(unsigned char        i)
{
                while(--i);
}
/*---------------------------------
|函数名称:DHT11初始化函数
|说    明:等待1S,越过不稳定的因素       
|输    入:无
|输    出:无
-----------------------------------*/

void        DHT11_Init()
{
                DHT11_Dq = 1;
                Delay_Xms(1010);                   
}

/*---------------------------------
|函数名称:DHT11开始信号
|说    明:成功返回1,否则返回0
|输    入:无
|输    出:DHT_StarT
-----------------------------------*/
bit                DHT11_Start()
{
                bit          DHT_StarT = 0;
                DHT11_Dq = 1;
                DHT11_Dq = 0;
                Delay_Xms(20);                                 //拉低总线必须大于18Ms,这里用20Ms
                DHT11_Dq = 1;
                Delay_Us(17);                                 //主机拉高总线后延时20-40US
                DHT11_Dq = 1;
                while(!DHT11_Dq)
                        {
                                DHT_StarT = 1;
                        }
                while(DHT11_Dq)
                        {
                                break;
                        }
               
                return(DHT_StarT);
}
/*---------------------------------
|函数名称:DHT11读取数据
|说    明:成功返回1,否则返回0
|输    入:无
|输    出:Flag
-----------------------------------*/

bit                DHT11_Read()
{
                bit                        Flag                = 0;
                unsigned char i                 = 0;
                unsigned char j                        = 0;
                unsigned char n                 = 0;
                for (i = 0;i < 5;i++)
                        {
                                for(j = 0;j < 8;j++)
                                        {
                                                while(!DHT11_Dq);
                                                while(DHT11_Dq)
                                                        {
                                                                        n++;
                                                        }
                                                if (n > 40)
                                                        {
                                                                        Temp |= 0x80 >> j;
                                                        }
                                        }
                        }
                if (Temp[4] == (Temp[0] + Temp[1] + Temp[2] + Temp[3]))
                        {
                                        Flag = 1;
                        }

                return(Flag);
}

void        UART_Init(void)
{
                TMOD = 0X20;
                TH1  = 0xfd;
                TL1  = 0xfd;
                SCON = 0X50;
                TR1  = 1;
                ES   = 1;
                EA   = 1;
}


#include"AT89X52.H"
#include"DHT11.h"


sbit        LED = P0^7;
bit Flag1 = 0;

void        main(void)
{
                //Delay_Us(25);
                unsigned char T = 0;
                unsigned char i = 0;
                DHT11_Init();
                UART_Init();                                  //串口
                while(1)
                        {
                                /*        if (DHT11_Start())
                                                {       
                                                                if (DHT11_Read())
                                                                        {
                                                                                LED = 0;
                                                                        }
                                                }*/
                                if (DHT11_Start())
                                        {
                                                DHT11_Read();
                                        }
                                if (Flag1)
                                        {
                                                        for (i = 0;i < 5;i++)
                                                                {
                                                                        SBUF = Temp;
                                                                        while(!TI);
                                                                        TI         = 0;
                                                                        Delay_Xms(100);
                                                                }
                                                        Flag1 = 0;
                                        }
                                P0 = Temp[0];
                        }
}

void        dfds() interrupt 4
{
                RI    = 0;
                Flag1 = 1;       
}

完整的程序包点击此处下载 ourdev_620858IN1PN4.rar(文件大小:35K) (原文件名:DHT11.rar)

结果:

(原文件名:未命名.jpg)


在论坛看到一个DHT11的,但是用不了,不知道为什么。
我看DHT11的说明书,说数据输出的时候主要以高电平的时间长短来确定是高低电平。
说26-28US是低电平,程序里我就是这么想的:只要超过26-28US这个时间总线依然为高的话我就认定他为高电平。
但是这个26-28US我调不出来。麻烦大虾看下。谢谢

忘了说了12M晶体
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。