搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2011-3-8 11:54:34 | 显示全部楼层 |阅读模式
#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晶体

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-3-8 20:47:01 | 显示全部楼层
我直接照搬手册上的

出0入0汤圆

发表于 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;
unsigned  char 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;       
        }
}

出0入0汤圆

发表于 2011-3-9 00:37:11 | 显示全部楼层
在用DHT90.用论坛上程序成功.学习中

出0入0汤圆

发表于 2011-6-16 23:18:01 | 显示全部楼层
while(DHT11_Dq)
{
break;
}

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

出0入0汤圆

发表于 2012-5-17 15:38:56 | 显示全部楼层
我现在也遇到这个问题了啊

出0入0汤圆

发表于 2012-5-17 16:08:01 | 显示全部楼层
这数据的输出表明,芯片还没有转换好,你发出转换命令之后,把延时等长一些。我之前也遇到过这个问题,祝成功哦。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表