一、概述
DHT11 數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長期穩(wěn)定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8 位單片機相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強、性價比極高等優(yōu)點。每個DHT11 傳感器都在極為精確的濕度校驗室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式儲存在OTP 內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達(dá)20 米以上,使其成為各類應(yīng)用甚至最為苛刻的應(yīng)用場合的最佳選則。
二、封裝及引腳
DHT11 數(shù)字溫濕度傳感器模塊為4 針PH2.0 封裝。

三、性能及連接
1、性能
1. 供電電壓:3-5.5V
2. 供電電流:最大2.5mA
3. 溫度范圍:0-50℃ 誤差±2℃
4. 濕度范圍:20-90%RH 誤差±5%RH
5. 響應(yīng)時間: 1/e(63%) 6-30s
6. 測量分辨率分別為 8bit(溫度)、8bit(濕度)
7. 采樣周期間隔不得低于1 秒鐘
8. 模塊尺寸:30x20mm
2、原理圖

3、經(jīng)典電路圖

4、實物連接

四、程序代碼
#include
#define DHTPIN8
#define DHTTYPE DHT11 //定義類型
DHT dht(DHTPIN,DHTTYPE);//進(jìn)行初始量設(shè)置
void setup(){
Serial.begin(9600);
dht.begin();//DHT開始工作
}
void loop(){
delay(2000);//兩次檢測之間要等幾秒鐘
float h=dht.readHumidity();//讀濕度
float t=dhtTemperature();//讀溫度
Serial.print("Humidity:");//濕度
Serial.print("h");
Serial.println("");
Serial.print("Temperature:");//溫度
Serial.print("t");
Serial.println("℃");//默認(rèn)為攝氏度
}
五、傳感器工作時序(編程依據(jù))
1、數(shù)據(jù)格式
DATA用于微處理器與DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時間4ms
左右,數(shù)據(jù)分小數(shù)和整數(shù)部分,具體格式在下面說明,當(dāng)前小數(shù)部分用于以后拓展,現(xiàn)讀出為零,操作流程如下:
【一次完整的數(shù)據(jù)傳輸為40bit,高位先出。
數(shù)據(jù)格式:
8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)(因為這里只能精確到整數(shù),所以小數(shù)意義不大。)+8bit溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗和。
數(shù)據(jù)傳送正確時,校驗和數(shù)據(jù)等于:
“8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bit溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)?!彼媒Y(jié)果的末8位。
】
2、控制時序
(1)DHT11完整時序圖:
用戶MCU發(fā)送第一次開始信號后,DHT11從低功耗模式轉(zhuǎn)換到高速模式,等待主機開始信號結(jié)束后,DHT11發(fā)送響應(yīng)信號,送出40bit的數(shù)據(jù),并觸發(fā)一次信號采集,用戶可選擇讀取部分?jǐn)?shù)據(jù),從模式下,DHT11接收到開始信號觸發(fā)一次溫濕度采集,如果沒有接收到主機發(fā)送開始信號,DHT11不會主動進(jìn)行溫濕度采集,采集數(shù)據(jù)后轉(zhuǎn)換到低速模式。

(2)DHT11采集數(shù)據(jù)
總線空閑狀態(tài)為高電平,單片機把總線拉低等待DHT11響應(yīng),單片機把總線拉低必須大于18ms,保證DHT11能檢測到起始信號。
當(dāng)DHT11接收到單片機的開始信號后,等待單片機開始信號結(jié)束,然后發(fā)送80us低電平響應(yīng)信號。
單片機發(fā)送開始信號結(jié)束后,延時等待20-40us后,切換為輸入狀態(tài),等待DHT11的80us低電平信號結(jié)束,然后判斷DHT11是否是否發(fā)出 80us 的高電平;如果是,即可開始采集數(shù)據(jù)。

(3)數(shù)字0和數(shù)字1的信號時序
總線為低電平,說明DHT11發(fā)送響應(yīng)信號,DHT11發(fā)送響應(yīng)信號后,再把總線拉高80us,準(zhǔn)備發(fā)送數(shù)據(jù),每一bit數(shù)據(jù)都以50us低電平時隙開始,高電平的長短定了數(shù)據(jù)位是0還是1,格式見下面圖示。
如果讀取響應(yīng)信號為高電平,則DHT11沒有響應(yīng),請檢查線路連接是否正常,當(dāng)最后一bit數(shù)據(jù)傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進(jìn)入空閑狀態(tài)。
數(shù)字0信號時序:

數(shù)字1的信號時序:

六、控制程序
1、單字節(jié)采集
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//超時則跳出for循環(huán)
if(U8FLAG==1)break;
//判斷數(shù)據(jù)位是0還是1
// 如果高電平高過預(yù)定0高電平值則數(shù)據(jù)位為 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}
}
2、完整一次數(shù)據(jù)采集
void RH(void)
{
//主機拉低18ms
P2_0=0;
Delay(180);
P2_0=1;
//總線由上拉電阻拉高 主機延時20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主機設(shè)為輸入 判斷從機響應(yīng)信號
P2_0=1;
//判斷從機是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運行
if(!P2_0) //T !
{
U8FLAG=2;
//判斷從機是否發(fā)出 80us 的低電平響應(yīng)信號是否結(jié)束
while((!P2_0)&&U8FLAG++);
U8FLAG=2;
//判斷從機是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
while((P2_0)&&U8FLAG++);
//數(shù)據(jù)接收狀態(tài)
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;
P2_0=1;
//數(shù)據(jù)校驗
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;
}
}/
}
3、獲取DHT11數(shù)據(jù)
void GetTemp1(void)
{
//------------------------
//調(diào)用溫濕度讀取子程序
RH();
//串口顯示程序
//--------------------------
Send_string("Humidity:");
str[0]=U8RH_data_H/10+0x30;
str[1]=U8RH_data_H%10+0x30;
str[2]='.';
str[3]=U8RH_data_L/10+0x30;
str[4]=U8RH_data_L%10+0x30;
str[5]='\0';
Send_string(str);
Send_string("%\r\n");
Send_string("Temperature:");
str[0]=U8T_data_H/10+0x30;
str[1]=U8T_data_H%10+0x30;
str[2]='.';
str[3]=U8T_data_L/10+0x30;
str[4]=U8T_data_L%10+0x30;
str[5]='\0';
Send_string(str);
Send_string("℃\r\n");
}