基于52 dht11温湿度传感器问题,纠结很久 急求!

2019-07-15 12:04发布

用DTH11模块测试温湿度,弄了两天了,发现采集完数据,校验失败。不知问题出在程序还是硬件。模块数据口直接连了io 没有上拉电阻。 也用4.7K电阻试了下 ,也不行。急求大神帮帮忙。毕设年后要交实物啦。在线等。祝大家新年快乐!

程序如下
/*-----------------------------------------------
                                        dht11
-----------------------------------------------*/
      void Delay1(U16 j)
    {      U8 i;
            for(;j>0;j--)
          {         
                for(i=0;i<27;i++);

          }
    }
       void  Delay_10us(void)
      {
        U8 i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
       }
        
        void  COM(void)
      {

                U8 i;

       for(i=0;i<8;i++)           
            {
               
                       U8FLAG=2;        
                   while((!P2_0)&&U8FLAG++);
                        Delay_10us();
                    Delay_10us();
                        Delay_10us();
                          U8temp=0;
             if(P2_0)U8temp=1;
                    U8FLAG=2;
                 while((P2_0)&&U8FLAG++);
                   //超时则跳出for循环                  
                    if(U8FLAG==1)break;
                   //判断数据位是0还是1         
                     
                // 如果高电平高过预定0高电平值则数据位为 1
                    
                   U8comdata<<=1;
                      U8comdata|=U8temp;        //0
             }//rof
           
        }

        //--------------------------------
        //-----湿度读取子程序 ------------
        //--------------------------------
        //----以下变量均为全局变量--------
        //----温度高8位== U8T_data_H------
        //----温度低8位== U8T_data_L------
        //----湿度高8位== U8RH_data_H-----
        //----湿度低8位== U8RH_data_L-----
        //----校验 8位 == U8checkdata-----
        //----调用相关子程序如下----------
        //---- Delay();, Delay_10us();,COM();
        //--------------------------------

        void RH(void)
        {
          //主机拉低18ms
       P2_0=0;
           Delay1(180);
           P2_0=1;
         //总线由上拉电阻拉高 主机延时20us
           Delay_10us();
           Delay_10us();
           Delay_10us();
           Delay_10us();
         //主机设为输入 判断从机响应信号
           P2_0=1;
         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行         
           if(!P2_0)                 //T !         
           {
           U8FLAG=2;
         //判断从机是否发出 80us 的低电平响应信号是否结束         
           while((!P2_0)&&U8FLAG++);
           U8FLAG=2;
         //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
           while((P2_0)&&U8FLAG++);
         //数据接收状态                 
           COM();
           U8RH_data_H_temp=U8comdata;
           COM();
           U8RH_data_L_temp=U8comdata;
           COM();
           U8T_data_H_temp=U8comdata;
           COM();
           U8T_data_L_temp=U8comdata;
           COM();
           U8checkdata_temp=U8comdata;
           P2_0=1;           
         //数据校验
           U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
           if(U8temp==U8checkdata_temp)
           {
           while(1)           //用于测试数据校验是否正确
           {
                           OE = 0;
           }
                     U8RH_data_H=U8RH_data_H_temp;
                     U8RH_data_L=U8RH_data_L_temp;
                  U8T_data_H=U8T_data_H_temp;
                     U8T_data_L=U8T_data_L_temp;
                     U8checkdata=U8checkdata_temp;
           }

           }
        }

/*-----------------------------------------------
                      主程序
------------------------------------------------*/
main()
{
        Delay1(10000);        //延时1S(12M晶振)
        while(1)
        {
                           //调用温湿度读取子程序
           RH();
           //读取模块数据周期不易小于 2S
           Delay1(20000);         //???????????????????
        }

}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。