微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > DHT11驱动代码

DHT11驱动代码

时间:10-02 整理:3721RD 点击:
#ifndef _DHT11_H__                         //防止重载
#define _DHT11_H__
sbit  p33= P3^7;  //温度数据线,这里使用的是51单片机P37,根据个人情况修改
void Delay(U16 j) //100us延时
{      
        U8 i;
        for(;j>0;j--)
        {        
        for(i=0;i<27;i++);
        }
}
void  Delay_10us(void)        //进入函数3us
{
        U8 i;           //1us
        i--;           //1us
        i--;
        i--;
        i--;
        i--;
        i--;
}
       
void  COM(void)        //串行读一个字节数据
{
        U8 i;
        for(i=0;i<8;i++)       
        {
                U8FLAG=2;       
                while((!p33)&&U8FLAG++);//自加254次 默认执行下面程序 50us低电平结束判断
                Delay_10us();
                Delay_10us();
                Delay_10us();
                U8temp=0;          //判断数据位是0还是1         如果高电平高过预定0高电平值则数据位为 1
                if(p33)U8temp=1;
                U8FLAG=2;
                while((p33)&&U8FLAG++);           //等待0/1高电平信号结束
                //超时则跳出for循环                  
                // if(U8FLAG==1)break;                        //经历255us 在这里不会执行                    
                U8comdata<<=1;
                U8comdata|=U8temp;        
        }
}
void RH(void)
{
  //主机拉低18ms
   p33=0;
   Delay(180);
   p33=1;
//总线由上拉电阻拉高 主机延时20us
   Delay_10us();
   Delay_10us();
   Delay_10us();
   Delay_10us();
//主机设为输入 判断从机响应信号
   p33=1;
//判断从机是否有低电平响应信号 如不响应则不读数据,响应则向下运行          
   if(!p33) //p20==0往下执行          
   {
   U8FLAG=2;
//判断从机发出 80us 的低电平响应信号是否结束         
   while((!p33)&&U8FLAG++);  //强制低电平信号最长为254us
   U8FLAG=2;
  //判断从机发出 80us 的高电平,如发出则进入数据接收状态
   while((p33)&&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;
   p33=1;
//数据校验
   U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
    if(U8temp==U8checkdata_temp)
     {
             U8RH_data_H=U8RH_data_H_temp;
             U8RH_data_L=U8RH_data_L_temp;  //低八位为0
          U8T_data_H=U8T_data_H_temp;
             U8T_data_L=U8T_data_L_temp;    //低八位为0
             U8checkdata=U8checkdata_temp;
     }
   }
}
#endif

这个能用吗哥哥

             U8RH_data_H=U8RH_data_H_temp;
             U8RH_data_L=U8RH_data_L_temp;  //低八位为0
          U8T_data_H=U8T_data_H_temp;
             U8T_data_L=U8T_data_L_temp;    //低八位为0
             U8checkdata=U8checkdata_temp;
     }
   }
}
#endif

#ifndef _DHT11_H__                         //防止重载
#define _DHT11_H__
sbit  p33= P3^7;  //温度数据线,这里使用的是51单片机P37,根据个人情况修改
void Delay(U16 j) //100us延时
{      
        U8 i;
        for(;j>0;j--)
        {         
        for(i=0;i<27;i++);
        }
}
void  Delay_10us(void)        //进入函数3us
{
        U8 i;           //1us
        i--;           //1us
        i--;
        i--;
        i--;
        i--;
        i--;
}
        
void  COM(void)        //串行读一个字节数据
{
        U8 i;
        for(i=0;i<8;i++)        
        {
                U8FLAG=2;        
                while((!p33)&&U8FLAG++);//自加254次 默认执行下面程序 50us低电平结束判断
                Delay_10us();
                Delay_10us();
                Delay_10us();
                U8temp=0;          //判断数据位是0还是1         如果高电平高过预定0高电平值则数据位为 1
                if(p33)U8temp=1;
                U8FLAG=2;
                while((p33)&&U8FLAG++);           //等待0/1高电平信号结束
                //超时则跳出for循环                  
                // if(U8FLAG==1)break;                        //经历255us 在这里不会执行                    
                U8comdata<<=1;
                U8comdata|=U8temp;        
        }
}
void RH(void)
{
  //主机拉低18ms
   p33=0;
   Delay(180);
   p33=1;
//总线由上拉电阻拉高 主机延时20us
   Delay_10us();
   Delay_10us();
   Delay_10us();
   Delay_10us();
//主机设为输入 判断从机响应信号
   p33=1;
//判断从机是否有低电平响应信号 如不响应则不读数据,响应则向下运行         
   if(!p33) //p20==0往下执行         
   {
   U8FLAG=2;
//判断从机发出 80us 的低电平响应信号是否结束         
   while((!p33)&&U8FLAG++);  //强制低电平信号最长为254us
   U8FLAG=2;
  //判断从机发出 80us 的高电平,如发出则进入数据接收状态
   while((p33)&&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;
   p33=1;
//数据校验
   U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
    if(U8temp==U8checkdata_temp)
     {
             U8RH_data_H=U8RH_data_H_temp;
             U8RH_data_L=U8RH_data_L_temp;  //低八位为0
          U8T_data_H=U8T_data_H_temp;
             U8T_data_L=U8T_data_L_temp;    //低八位为0
             U8checkdata=U8checkdata_temp;
     }
   }
}

亲测可用

多谢分享

很好很好很好很好很好很好很好很好很好很好很好很好

赞赞赞  谢谢分享

谢谢小编,哈哈

小编这个怎么用啊

有的数据前面没有定义

好多数据得自己定义了

这个怎么用呢

0.0


...

单片机,学起来不容易啊!

这段代码只包含 :定义  延时 数据读取 校验数据 。不能直接使用,需要根据实际使用写main 主函数。才能工作。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top