發圖片很麻煩,在附件有完整的代碼,有需要下載來看吧~~
DHT11溫濕度傳感器 1 DHT11溫濕度傳感器:2 P8913常見接線圖單線雙線數據線DATA上拉后與微處理器的 I/O 端口相連。
1.典型應用電路中建議連接線長度短于 5m 時用 4.7K 上拉電阻,大于 5m 時根據實際情況降低上拉電阻的阻值。
2. 使用 3.3V 電壓供電時連接線盡量短,接線過長會導致傳感器供電不足,造成測量偏差。
3. 每次讀出的溫濕度數值是上一次測量的結果,欲獲取實時數據,需連續讀取 2 次,但不建議連續多次讀取傳感器,每次讀取傳感器間隔大于 2 秒即可獲得準確的數據。
4. 電源部分如有波動,會影響到溫度。如使用開關電源紋波過大,溫度會出現跳動。
3 驅動時序圖及工作參數DHT11 器件采用簡化的單總線通信。單總線即只有一根數據線,系統中的數據交換、控制均由單總線完成。設備(主機或從機)通過一個漏枀開路或三態端口連至該數據線,以允許設備在不發送數據時能夠釋放總線,而讓其它設備使用總線;單總線通常要求外接一個約 4.7kΩ 的上拉電阻,這樣,當總線閑置時,其狀態為高電平。由于它們是主從結極,只有主機呼叫從機時,從機才能應答,因此主機訪問器件都必須嚴格遵循單總線序列,如果出現序列混亂,器件將不響應主機。 ◎單總線傳送數據位定義
DATA 用于微處理器與 DHT11 之間的通訊和同步,采用單總線數據格式,一次傳送 40 位數據,高位先出。
數據格式:
8bit 濕度整數數據 + 8bit 濕度小數數據 + 8bit 溫度整數數據 + 8bit 溫度小數數據 + 8bit 校驗位。
注:其中濕度小數部分為 0。
◎校驗位數據定義
“8bit 濕度整數數據 + 8bit 濕度小數數據 + 8bit 溫度整數數據 + 8bit 溫度小數數據” 8bit 校驗位等于所得結果的末 8 位
示例一:接收到的 40 位數據為:
0011 0101 0000 0000 0001 1000 0000 0100 0101 0001
濕度高 8 位 濕度低 8 位 溫度高 8 位 溫度低 8 位 校驗位 計算:
0011 0101+0000 0000+0001 1000+0000 0100= 0101 0001
接收數據正確:
濕度: 0011 0101(整數)=35H=53%RH 0000 0000(小數)=00H=0.0%RH =>53%RH + 0.0%RH =
53.0%RH
溫度: 0001 1000(整數)=18H=24℃ 0000 0100(小數)=04H=0.4℃ =>24℃ + 0.4℃ = 24.4℃
◎特殊說明:
當溫度低于 0 ℃ 時溫度數據的低 8 位的最高位置為 1。
示例: -10.1 ℃ 表示為 0000 1010 1000 0001
溫度: 0000 1010(整數)=0AH=10℃, 0000 0001(小數)=01H=0.1℃ =>-(10℃+0.1℃)= -10.1℃
示例二:接收到的 40 位數據為:
0011 0101 0000 0000 0001 1000 0000 0100 0100 1001
濕度高 8 位 濕度低 8 位 溫度高 8 位 溫度低 8 位 校驗位
計算:
0011 0101+0000 0000+0001 1000+0000 0100= 0101 0001
0101 0001 不等于 0100 1001
本次接收的數據不正確,放棄,重新接收數據。
4 驅動思路 4.1 時序圖分析總線空閑狀態為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平響應信號。主機發送開始信號結束后,延時等待20-40us后, 讀取DHT11的響應信號。主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高。檢測到總線為低電平,說明DHT11發送響應信號,DHT11發送響應信號后,再把總線拉高80us,準備發送數據,每一bit數據都以50us低電平時隙開始,高電平的長短定了數據位是0還是1.格式見下面圖示,如果讀取響應信號為高電平,則DHT11沒有響應,請檢查線路是否連接正常。當最后一bit數據傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態。
 50us開始,持續70us表示高電平1
50us開始,持續26~28代表發送低電平0
4.2 發送一位數據:MCU: //總線空閑狀態為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。 推挽輸出模式: //發送起始信號,先拉低電平,延時至少18ms再拉高 DHT11_SEND_DATA=0; Delay_ms(18); DHT11_SEND_DATA=1;
//DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平響應信號。主機發送開始信號結束后,延時等待20-40us后, 讀取DHT11的響應信號。 Delay_us(20); //延時20us DHT11_Input( ); //切換IO口為輸入模式 u8 DHT11_Ack(void) {
if(DHT11_REV_DATA!=0) //如果沒有檢測到低電平的應答信號就返回0 { return 0; } while(DHT11_REV_DATA==0);//等待80us低電平應答結束
while(DHT11_REV_DATA==1);//等待80us高電平應答結束 //很有必要檢測高低電平,防止時序出錯
return 1; 檢測到高電平,說明信號不是應答信號,返回1 }
讀取從機發送過來的數據,以8位為單位接收 u8 DHT11_Read_Byte(void) { u8 data=0; u8 i; //接受數據,每個數據以50us低電平開始 for(i=0;i<8;i++) { data <<= 1; //左移一位,空位補0. while(!DHT11_REV_DATA); //當低電平結束,等待準備數據的時間過去,消除影響 Delay_us(40); //延時40us,卡時序,卡在低電平已經過,高電平還沒結束 if(DHT11_REV_DATA==1)//如果還是高電平說明從機確實發送了高電平 //就算是低電平了也不會影響時序。 { data |=1; //‘1’如果是高電平就將左移的一個空位 while(DHT11_REV_DATA);//等待高電平應答結束 } } return data; } 5 實戰代碼5.1 引腳初始化。void DHT11_Init(void) { RCC->APB2ENR |=0x01<<3; DHT11_Input( );// DHT11 的DATA 引腳處于輸入狀態,時刻檢測外部信號 Delay_ms(500);//DHT11 上電后要等待 1S 以越過不穩定狀態在此期間不能發送任何指令 Delay_ms(500); }
將輸出輸入模式另外整合成函數,方便調用 void DHT11_Output(void) { GPIOB->CRL &=~(0x0f<<12); GPIOB->CRL |=(0x03<<12); }
void DHT11_Input(void) { GPIOB->CRL &=~(0x0f<<12); GPIOB->CRL |=(0x04<<12); }
5.2 發送起始信號void DHT11_Start(void) { DHT11_SEND_DATA=0; Delay_ms(18); DHT11_SEND_DATA=1; } 5.3 檢測應答信號//返回值 0--無應答 1--有應答 u8 DHT11_Ack(void) { if(DHT11_REV_DATA!=0) { return 0; } while(DHT11_REV_DATA==0);//等待80us低電平應答結束
while(DHT11_REV_DATA==1);//等待80us高電平應答結束
return 1; } 5.4 讀取一個字節數據u8 DHT11_Read_Byte(void) { u8 data=0; u8 i; //接受數據,每個數據以50us低電平開始 for(i=0;i<8;i++) { data <<= 1; while(!DHT11_REV_DATA);//等待 Delay_us(40); if(DHT11_REV_DATA==1) { data |=1;//‘1’ while(DHT11_REV_DATA);//等待高電平應答結束 } } return data; } 5.5 最終函數//讀取溫濕度
u8 DHT11_Read_Data(u8 *Temp_H,u8* Temp_L,u8* RH_H,u8* RH_L) //注意這里是址傳遞 { u8 i; u8 check;
DHT11_Output( ); DHT11_Start( ); Delay_us(20); DHT11_Input( );//切換為輸入 if( DHT11_Ack( )==0 ) { return -1; }
//讀取數據,分開讀40個字節,調用5次讀取函數 *RH_H=DHT11_Read_Byte( ); *RH_L=DHT11_Read_Byte( ); *Temp_H=DHT11_Read_Byte( ); *Temp_L=DHT11_Read_Byte( ); check=DHT11_Read_Byte( );
//結束讀取 Delay_ms(50); DHT11_Output( );//切換為輸出 DHT11_SEND_DATA=1;//釋放總線
//校驗數據 if(check !=(*Temp_H+*Temp_L+*RH_H+*RH_L) ) { return -2; }
return 0;
}
0.png (44.82 KB, 下載次數: 96)
下載附件
2018-10-13 18:15 上傳
全部資料51hei下載地址:
02-驅動DHT11(STM32F103為例).zip
(932.55 KB, 下載次數: 99)
2018-10-13 17:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|