迅维网

查看: 1027|回复: 0
打印 上一主题 下一主题

用于STC152K系列的DHT11温湿度传感器程序

[复制链接]
跳转到指定楼层
1#
发表于 2016-2-24 10:19:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: 山东青岛 来自 山东青岛

马上注册,获取阅读精华内容及下载权限

您需要 登录 才可以下载或查看,没有帐号?注册

x
温湿度传感器DHT11(DHT21、DHT22同)接口采用单总线通信。和DS18B20这样的器件相比,其通信过程比较简单;但和采用IIC的器件相比,其通信定时的要求较高。虽然器件手册给出了相关的例程,但由于定时要求高,所以不同MCU、不同时钟频率、甚至不同编译都会对定时带来影响。下面给出的是STC15F2K系列(主频:11.0592MHz)的通信程序。是从手册中的例程修改而来的。修改的主要内容如下:
1. 修改了延时程序(Delay_5us函数),并调整了其定时的准确性;
2. RH函数增加了返回值,以显示操作是否成功;
3. 原例程判断阈值标称为30us,现改为标称值40us,以保证与定时函数的配合。
RH的返回值定义如下:
0 - 正常操作;
1 - 超时;
2 - 校验和错。
注:如果主频变化,则需修改延时函数Delay_5us( )。

如果需要拷贝使用,请从本行以下拷贝:

#define MAIN_Fosc  11059200UL //定义主时钟
#define DHT_DATA  P42

#include  "STC15Fxxxx.H"
// ExternalGlobal,注:使用时,要将下列外部变量的定义拷贝到主程序文件中,注意拷贝时不带"extern"关键字。
extern unsigned char xdata U8T_data_H, U8T_data_L, U8RH_data_H,U8RH_data_L, U8checkdata;
//Global defined in this file.
unsigned char U8FLAG, k;
unsigned char U8count, U8temp;
unsigned char xdata U8T_data_H_temp, U8T_data_L_temp,U8RH_data_H_temp, U8RH_data_L_temp, U8checkdata_temp;
unsigned char U8comdata;
unsigned int U16temp1, U16temp2;
//========================================================================
// 函数名称: void  delay_5us(unsigned ms)
// 简要说明: 5微秒延时函数。
// 输入参数: us_5,要延时的5微秒倍数。
// 返回值: 无
// 当前版本: VER 0.1
// 版本:VER 0.1;
//      生成日期: 2016-02-08
//      说明:经过测试,连同调用时间,程序的定时(正)误差小于1%,用于
//            主频为11.0592MHz的系统。
//========================================================================
void  Delay_5us()
{
  NOP21();
  NOP16();
}

//========================================================================
// 函数名称: void  COM(void)
// 简要说明: 从DHT系列单总线读取一个字节。
// 输入参数: 无
// 返回值: 无
// 当前版本: VER 0.1
// 版本:VER 0.1
//      生成日期: 2016-02-16
//      说明:来自AM2302的器件说明,针对STC单片机及本项目函数进行了修改。
// 备注:读取的字节放在全局变量U8comdata中。
//========================================================================
void COM(void)
{
  unsigned char i;

U8comdata = 0;

  for(i = 0; i < 8; i++)
  {
    U8FLAG =2;
   while(!DHT_DATA && U8FLAG++);
  
   Delay_5us();
   Delay_5us();
   Delay_5us();
   Delay_5us();
   Delay_5us();
   Delay_5us();
   Delay_5us();
   Delay_5us();
  
    U8temp =0;
  
   if(DHT_DATA)   //若延时30us还是高电平,则表示该位为“1”。
   U8temp=1;
    U8FLAG =2;
   while(DHT_DATA && U8FLAG++);
   //高电平的延续时间超时,出错。
    if(U8FLAG ==1)
   break;
    U8comdata<<= 1;
    U8comdata |=U8temp; //0
  }
}
//========================================================================
// 函数名称: unsigned char  RH(void)
// 简要说明: 从DHT系列传感器读取温湿度数据。
// 输入参数: 无
// 返回值: 0 - 正常; 1 - 超时; 2 - 校验和错。
// 当前版本: VER 0.1
// 版本:VER 0.1
//      生成日期: 2016-02-16
//      说明:来自AM2302的器件说明,针对STC单片机及本项目函数进行了修改。
// 备注:读取的数据放在下列四个全局变量中:
//      U8T_data_H、U8T_data_L、U8RH_data_H、U8RH_data_L
//========================================================================
unsigned char RH(void)
{
unsigned char i, j = 0;
unsigned int U16FLAG;
//DHT22(AM2320)要求拉低至少800us,最大2ms,这里>1000us。
  DHT_DATA = 0;
  for (i = 0; i < 255; i++)
   Delay_5us();

//拉高
  DHT_DATA = 1;

  //等待20 - 40us,这里是30us
  Delay_5us();
  Delay_5us();
  Delay_5us();
  Delay_5us();
  Delay_5us();
  Delay_5us();
  //输入方式
  DHT_DATA = 1;

  U16FLAG = 0xc2;

  if(!DHT_DATA && U16FLAG++) //T !
  {
    U8FLAG =2;
   while(!DHT_DATA && U8FLAG++);
  
    if (U8FLAG== 1)
    {
     j = 1;
     return j;
    }
  
    U8FLAG =2;
   while(DHT_DATA && U8FLAG++);
    if(U8FLAG == 1)
    {
     j = 1;
     return j;
    }

    //Get bytesfrom DHT22.
    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;
    DHT_DATA =1;
   //Calculate check sum.
    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;
     U8T_data_H = U8T_data_H_temp;
     U8T_data_L = U8T_data_L_temp;
     U8checkdata = U8checkdata_temp;
    }
    else
    {
     j = 2;
    }//fi
  }//fi
  if (U16FLAG == 1)
  j = 1;
  return j;
}


您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图 AI维修
助手



芯片搜索

快速回复