1. 程式人生 > >zigbee基礎應用(六)溫溼度感測器DHT11

zigbee基礎應用(六)溫溼度感測器DHT11

1.溫溼度感測器

1)介面說明


2)序列介面

DATA 用於微處理器與 DHT11之間的通訊和同步,採用單匯流排資料格式,一次
通訊時間4ms左右,資料分小數部分和整數部分,具體格式在下面說明,當前小數
部分用於以後擴充套件,現讀出為零.操作流程如下:
一次完整的資料傳輸為40bit,高位先出。
資料格式:8bit溼度整數資料+8bit溼度小數資料
+8bi溫度整數資料+8bit溫度小數資料
+8bit校驗和
資料傳送正確時校驗和資料等於“ 8bit 溼度整數資料 +8bit 溼度小數資料
+8bi 溫度整數資料 +8bit 溫度小數資料 ”所得結果的末8位。


流程:

(1)匯流排空閒狀態為高電平,主機把匯流排拉低等待DHT11檢測到起始訊號,主機把匯流排拉低必
須大於18毫秒,保證DHT11能檢測到起始訊號。

(2)DHT11接收到主機的開始訊號後,等待主機開始訊號結束,結束的時候切換到輸入模式且主機會拉高電平並延時20-40us,延時後DHT11傳送80us低電平響應訊號.

(3)接下來DHT11傳送低電平響應訊號,DHT11傳送響應訊號後,再把匯流排拉
高80us,準備傳送資料

(4)然後傳送資料的時候,每一bit資料都以50us低電平時隙開始,高電平的長短定
了資料位是0還是1,一般超過30us則為1,否則為0.

(5)當最後一bit資料傳送完畢後,DHT11拉低匯流排50us,隨後匯流排由上拉電阻拉高進入空閒狀態

3.程式碼實現

#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int  uint;

#define DATA_PIN P0_7

//溫溼度定義
uchar ucharFLAG,uchartemp;
uchar shidu_shi,shidu_ge,wendu_shi,wendu_ge=4;
uchar ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,ucharcheckdata;
uchar ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp;
uchar ucharcomdata;
//--------------------------------
//-----溼度讀取子程式 ------------
//--------------------------------
//----以下變數均為全域性變數--------
//----溫度高8位== U8T_data_H------
//----溫度低8位== U8T_data_L------
//----溼度高8位== U8RH_data_H-----
//----溼度低8位== U8RH_data_L-----
//----校驗 8位 == U8checkdata-----
//----呼叫相關子程式如下----------
//---- Delay();, Delay_10us();,COM(); 
//--------------------------------

//延時函式
void Delay_us() //1 us延時
{

    int i;
    for(i=0;i<9;i++)
    asm("nop"); 
}


void Delay_10us() //10 us延時
{
  int i;

  for(i=0;i<10;i++)
  Delay_us();   
}

void Delay_ms(uint Time)//n ms延時
{
    unsigned char i;
    while(Time--)
    {
        for(i=0;i<100;i++)
            Delay_10us();
    }
}


//溫溼度感測
void COM(void)    // 溫溼寫入
{     
    uchar i;         
    for(i=0;i<8;i++)    
    {
        ucharFLAG=2; 
        while((!DATA_PIN)&&ucharFLAG++);
        Delay_10us();
        Delay_10us();
        Delay_10us();
        uchartemp=0;
        if(DATA_PIN)uchartemp=1;//如果超過30us還沒置0,則資料為1,置0,則資料為0
        ucharFLAG=2;
        while((DATA_PIN)&&ucharFLAG++); //等待置0  
        if(ucharFLAG==1)break;    
        ucharcomdata<<=1;//ucharcomdata

左移一位賦值給ucharcomdata
        ucharcomdata|=uchartemp;//兩句合起來就是給最高位賦值
    }    
}


void DHT11(void)   //溫溼感測啟動
{
    DATA_PIN=0;//置低電平
    Delay_ms(19);  //>18MS
    DATA_PIN=1; //置高電平,開始訊號傳送結束
    P0DIR &= ~0x80; //重新配置IO口方向,輸入
    Delay_10us();
    Delay_10us();                        
    Delay_10us();
    Delay_10us();  //高電平,延時40us等待
    if(!DATA_PIN) //如果電平變低,則證明檢測到開始訊號
    {
        ucharFLAG=2; 
        while((!DATA_PIN)&&ucharFLAG++);//低電平,等待響應結束
        ucharFLAG=2;
        while((DATA_PIN)&&ucharFLAG++); //高電平,準備輸出
        COM();
        ucharRH_data_H_temp=ucharcomdata;//溼度高八位
        COM();
        ucharRH_data_L_temp=ucharcomdata;//溼度低八位
        COM();
        ucharT_data_H_temp=ucharcomdata;//溫度高八位
        COM();
        ucharT_data_L_temp=ucharcomdata;//溫度低八位
        COM();
        ucharcheckdata_temp=ucharcomdata;//校驗八位
        DATA_PIN=1; //置高,空閒狀態
        uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp);
        if(uchartemp==ucharcheckdata_temp)//校驗
        {
            ucharRH_data_H=ucharRH_data_H_temp;
            ucharRH_data_L=ucharRH_data_L_temp;
            ucharT_data_H=ucharT_data_H_temp;
            ucharT_data_L=ucharT_data_L_temp;
            ucharcheckdata=ucharcheckdata_temp;
        }
        wendu_shi=ucharT_data_H/10; 
        wendu_ge=ucharT_data_H%10;
        
        shidu_shi=ucharRH_data_H/10; 
        shidu_ge=ucharRH_data_H%10;        
    } 
    else //沒用成功讀取,返回0
    {
        wendu_shi=0; 
        wendu_ge=0;
        
        shidu_shi=0; 
        shidu_ge=0;  
    } 
    
    P0DIR |= 0x80; //IO口需要重新配置 
}