xqn2012 发表于 2014-4-14 16:57:28

DHT11显示一直为零

最近一直在调试DHT11,知道对时序要求比较高,延时函数都是用示波器测量的。 液晶是用的12864,就不贴程序了,一直显示的为0,求各位大虾帮忙解决一下。
MCU:atmega16内部晶振:1MHz

void delay_10us()   //10us
{
          NOP();
}

void delay_20us()
{
    NOP();   //10us
        NOP();   //12us
        NOP();
        NOP();
        NOP();
        NOP();
        NOP();
        NOP();
        NOP();
        NOP();   //20us
}

void delay_nus(uint i)
                           
{   
    while(--i);
}

void delay_ms(uint ms)
{
    uint i;
    while(ms--)
        {
           for(i=144;i>0;i--);
        }
}

/*******DHT11的引脚控制*************/
#define DHT_OUT    DDRA|= BIT(3)
#define DHT_IN   DDRA&=~BIT(3)
#define DHT_1   PORTA|= BIT(3)
#define DHT_0   PORTA&=~BIT(3)
#define DHT_R    (PORTA& BIT(3))

/******变量的定义*******/
uchar RH_data_H,TM_data_H,RH_data_L,TM_data_L,Check_Data,temp;
uchar data;               //数据缓冲数组

/*************************************************************
函数名称:Receive_Data
功能:接受数据
************************************************************/
void Receive_Data()
{
    uchar i,j,m;
    DHT_IN;
    for(i=0;i<5;i++)                  //五字节的数据
    {
      data=0x00;
               
      for(j=0;j<8;j++)
      {
             while(!DHT_R);      //等待高电平的到来,当高电平到来后便开始计时
             delay_nus(5);      //这边的50us是低电平时隙开始
                       //延时50us后看还是不是高电平,如果是高那么这位就为1,否则为0
             //delay_nus(5);
                       //上面延时了50us,此时引脚数据寄存器还是高电平的话,表明接受到的是1
                       if(DHT_R)      //否则为0
             {                           
               data|=BIT(7-j);   //由此可知,先读取的高位,此命令只是写入1的位,data = 0X00,所以没写的还是0
               while(DHT_R);       //如果是低电平则表示下一位的开始
             }   
         }
   }
}

/***********************************************
函数名称:Ask_Reply_Do
功能:主机发出信号,DHT11回复信号,并且处理接收到的数据
**************************************************/
void Ask_Reply_Do()
{
    //主机拉低18ms
    uchar i;
    DHT_OUT;      //DATA_OUT;
    DHT_0;      //PORT_CLR;
    delay_ms(50);
    DHT_1;       //PORT_SET
                   //总线由上拉电阻拉高 主机延时20us
    delay_nus(2);      
               
    DHT_IN;      //DATA_IN;
   // delay_10us();         //主机设为输入 判断从机响应信号
   
    if(!DHT_R)   // 判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行                        
    {
      //判断从机是否发出 80us 的低电平响应信号是否结束         
      while(!DHT_R);      //等待从机把电平拉高
      while(DHT_R);       //从机是否发出了高电平,是的话就跳出继续
             //判断从机是否发出80us的高电平,如发出则进入数据接收状态
                        
      Receive_Data();   
      DHT_OUT;
                DHT_1;       //PORT_SET;
             //数据校验
      temp=(data+data+data+data);
      if(data==temp)               
      {
            RH_data_H=data;      //只要整数部分
            RH_data_L=data;                                       
            TM_data_H=data;
            TM_data_L=data;
            Check_Data=data;
      }                        
    }      
}

ddcchh 发表于 2014-4-14 17:40:26

这种东西不准,做过你就知道了!

ddcchh 发表于 2014-4-14 17:41:48

特别是湿度,变化大没法实用,只能玩玩。

xqn2012 发表于 2014-4-14 23:28:10

ddcchh 发表于 2014-4-14 17:40
这种东西不准,做过你就知道了!

呵呵,就是想知道为什么我读的数据一直是零。

xqn2012 发表于 2014-4-14 23:28:54

ddcchh 发表于 2014-4-14 17:41
特别是湿度,变化大没法实用,只能玩玩。

就是做着玩的,就是想知道为什么我读的数据是零。

ddcchh 发表于 2014-4-14 23:36:54

下周末回家把我调好的程序贴出来,我是用4个LED显示的,弄了很长时间。

xqn2012 发表于 2014-4-14 23:44:09

ddcchh 发表于 2014-4-14 23:36
下周末回家把我调好的程序贴出来,我是用4个LED显示的,弄了很长时间。

好的,谢谢   我已经弄了四五天了

ddcchh 发表于 2014-4-15 00:00:01

不稀奇,光看Pdf文件也要一天,多想想有好处,很容易出来了,就不想搞了!
本来我想深入开发一下,但看了它的精度就不想弄了?我用的是广州奥松的传感DHT11有可能是dht11问题
我的贴子中有一个是内置单片机的,是dht11升级版,这个还内置了ds18b20.

eva015401 发表于 2014-4-15 08:10:41

看我以前发的毕业分享的帖子,里面有51的程序

xqn2012 发表于 2014-4-15 10:15:44

ddcchh 发表于 2014-4-15 00:00
不稀奇,光看Pdf文件也要一天,多想想有好处,很容易出来了,就不想搞了!
本来我想深入开发一下,但看了它 ...

好的,谢谢   做了玩的

xqn2012 发表于 2014-4-15 10:18:01

eva015401 发表于 2014-4-15 08:10
看我以前发的毕业分享的帖子,里面有51的程序

好的谢谢

ddcchh 发表于 2014-4-21 09:34:12

楼主要的程序,参考一下,本来想拍一张实物图,但做过的东西太多,不好找。


奮闘ing 发表于 2014-4-21 10:09:45

毕业设计做的是DHT21的,没有遇到这个情况!具体是什么原因呢?现在解决了没有?

xqn2012 发表于 2014-4-21 16:57:13

奮闘ing 发表于 2014-4-21 10:09
毕业设计做的是DHT21的,没有遇到这个情况!具体是什么原因呢?现在解决了没有? ...

还没有解决   程序贴在上面了,不知道什么原因

xqn2012 发表于 2014-4-21 17:03:21

ddcchh 发表于 2014-4-21 09:34
楼主要的程序,参考一下,本来想拍一张实物图,但做过的东西太多,不好找。




谢谢啦,用你的试试看

ddcchh 发表于 2014-4-21 17:16:15

这种是用串口发至PCR的,很方便。

ruan18278816371 发表于 2014-4-21 17:26:29

大多数是时序问题,如在晶振11.0592M和22.1148M的时序是不一的

2k_man 发表于 2014-4-21 17:27:22

{:tongue:}会烧坏的哦 ~

xqn2012 发表于 2014-4-26 09:33:33

2k_man 发表于 2014-4-21 17:27
会烧坏的哦 ~

会烧坏什么?

cshp138 发表于 2014-4-26 09:46:33

初始化时间比较长,有时要5分钟到10分钟才有数据,要是超过还没有数据那就是其它原因
页: [1]
查看完整版本: DHT11显示一直为零