找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3247|回復(fù): 1
收起左側(cè)

用于STC152K系列的DHT11溫濕度傳感器程序

[復(fù)制鏈接]
ID:105323 發(fā)表于 2016-2-23 16:57 | 顯示全部樓層 |閱讀模式
溫濕度傳感器DHT11(DHT21、DHT22同)接口采用單總線通信。和DS18B20這樣的器件相比,其通信過程比較簡單;但和采用IIC的器件相比,其通信定時的要求較高。雖然器件手冊給出了相關(guān)的例程,但由于定時要求高,所以不同MCU、不同時鐘頻率、甚至不同編譯都會對定時帶來影響。下面給出的是STC15F2K系列(主頻:11.0592MHz)的通信程序。是從手冊中的例程修改而來的。修改的主要內(nèi)容如下:
1. 修改了延時程序(Delay_5us函數(shù)),并調(diào)整了其定時的準(zhǔn)確性;
2. RH函數(shù)增加了返回值,以顯示操作是否成功;
3. 原例程判斷閾值標(biāo)稱為30us,現(xiàn)改為標(biāo)稱值40us,以保證與定時函數(shù)的配合。
RH的返回值定義如下:
0 - 正常操作;
1 - 超時;
2 - 校驗和錯。
注:如果主頻變化,則需修改延時函數(shù)Delay_5us( )。

如果需要拷貝使用,請從本行以下拷貝:

#define MAIN_Fosc  11059200UL //定義主時鐘
#define DHT_DATA  P42

#include  "STC15Fxxxx.H"
// ExternalGlobal,注:使用時,要將下列外部變量的定義拷貝到主程序文件中,注意拷貝時不帶"extern"關(guān)鍵字。
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;
//========================================================================
// 函數(shù)名稱: void  delay_5us(unsigned ms)
// 簡要說明: 5微秒延時函數(shù)。
// 輸入?yún)?shù): us_5,要延時的5微秒倍數(shù)。
// 返回值: 無
// 當(dāng)前版本: VER 0.1
// 版本:VER 0.1;
//      生成日期: 2016-02-08
//      說明:經(jīng)過測試,連同調(diào)用時間,程序的定時(正)誤差小于1%,用于
//            主頻為11.0592MHz的系統(tǒng)。
//========================================================================
void  Delay_5us()
{
  NOP21();
  NOP16();
}

//========================================================================
// 函數(shù)名稱: void  COM(void)
// 簡要說明: 從DHT系列單總線讀取一個字節(jié)。
// 輸入?yún)?shù): 無
// 返回值: 無
// 當(dāng)前版本: VER 0.1
// 版本:VER 0.1
//      生成日期: 2016-02-16
//      說明:來自AM2302的器件說明,針對STC單片機(jī)及本項目函數(shù)進(jìn)行了修改。
// 備注:讀取的字節(jié)放在全局變量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++);
   //高電平的延續(xù)時間超時,出錯。
    if(U8FLAG ==1)
   break;
    U8comdata<<= 1;
    U8comdata |=U8temp; //0
  }
}
//========================================================================
// 函數(shù)名稱: unsigned char  RH(void)
// 簡要說明: 從DHT系列傳感器讀取溫濕度數(shù)據(jù)。
// 輸入?yún)?shù): 無
// 返回值: 0 - 正常; 1 - 超時; 2 - 校驗和錯。
// 當(dāng)前版本: VER 0.1
// 版本:VER 0.1
//      生成日期: 2016-02-16
//      說明:來自AM2302的器件說明,針對STC單片機(jī)及本項目函數(shù)進(jìn)行了修改。
// 備注:讀取的數(shù)據(jù)放在下列四個全局變量中:
//      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;
}

回復(fù)

使用道具 舉報

ID:76227 發(fā)表于 2016-2-25 22:42 | 顯示全部樓層
謝謝 分享  要是能做個工程打包就更好了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表