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|=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口需要重新配置
}