hepday 发表于 2011-3-8 11:54:34

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

#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;

void        UART_Init(void);                                //串口


#endif

include"DHT11.h"

unsigned char Temp;
/*---------------------------------
|函数名称:毫秒级延时函数。
|说    明:晶振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 == (Temp + Temp + Temp + Temp))
                        {
                                        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;
                        }
}

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

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

结果:
http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_620860N7H7YI.jpg
(原文件名:未命名.jpg)


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

忘了说了12M晶体

renpeng009 发表于 2011-3-8 20:47:01

我直接照搬手册上的

qq779089973 发表于 2011-3-8 21:55:37

sbit dhtport=P1^0;
unsigned char dflag;
unsigned dtemp;
unsigned comdata;
unsigned char rh_data_h;
unsigned char rh_data_l;
unsigned char t_data_h;
unsigned char t_data_l;
unsignedchar checkdata;

void delay_1ms(void)               //1ms延时函数
{
   unsigned char x,y;
   x=3;
   while(x--)
   {
       y=40;
       while(y--);
   }
}

void delay_nms(unsigned int n)       //N ms延时函数
{
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
}

void delay_10us()
{
                _nop_();_nop_();_nop_();_nop_();_nop_();
                _nop_();_nop_();_nop_();_nop_();_nop_();
}

void com()
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                dflag=2;
                while((!dhtport)&&dflag++);
                delay_10us();
                delay_10us();
                dtemp=0;
                if(dhtport)
                        dtemp=1;
                dflag=2;
                while((dhtport)&&dflag++);
                if(dflag==1)
                        break;
                comdata<<=1;
                comdata|=dtemp;
        }
}

void rh(void)
{
        dhtport=0;
        delay_nms(18);
        dhtport=1;
        delay_10us();
        delay_10us();
        delay_10us();
        delay_10us();
        dhtport=1;
        _nop_();
        if(!dhtport)
        {
                dflag=2;
                while((!dhtport)&&dflag++);
                dflag=2;
                while((dhtport)&&dflag++);
                com();
                rh_data_h=comdata;
                com();
                rh_data_l=comdata;
                com();
                t_data_h=comdata;
                com();
                t_data_l=comdata;
                com();
                checkdata=comdata;
                dhtport=1;       
        }
}

danceman_uk 发表于 2011-3-9 00:37:11

在用DHT90.用论坛上程序成功.学习中

donglaile 发表于 2011-6-16 23:18:01

while(DHT11_Dq)
{
break;
}

中的break不要吧,要不DHT11_Dq怎么等待被拉低

331086846 发表于 2012-5-17 15:38:56

我现在也遇到这个问题了啊

nazily215 发表于 2012-5-17 16:08:01

这数据的输出表明,芯片还没有转换好,你发出转换命令之后,把延时等长一些。我之前也遇到过这个问题,祝成功哦。
页: [1]
查看完整版本: 麻烦帮我看下DHT11的程序。。结果始终不正确呢!主要是判断数据高低电平的延时我不会