一.DHT11介紹
DHT11 數字溫濕度傳感器,如圖所示,是一款含有已校准數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC 測溫元件,並與一個高性能8 位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11 傳感器都在極為精確的濕度校驗室中進行校准。校准系數以程序的形式儲存在OTP 內存中,傳感器內部在檢測信號的處理過程中要調用這些校准系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20 米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。產品為4 針單排引腳封裝。連接方便,特殊封裝形式可根據用戶需求而提供。
二.編程分析
DHT11是通過單總線與單片機進行通信的,這樣做的好處就是占用資源少,編程實現簡單,發送數據的具體格式為 8bit 濕度整數數據+8bit 濕度小數數據+8bi 溫度整數數據+8bit 溫度小數數據+8bit校驗和。主機先要給DHT11發送一個啟動新號,等待DHT11做出響應,然后再進行檢測溫濕度的發送及傳輸,下面通過一張圖來了解一下DHT11的傳輸過程。
從圖上我們可以看出,主機要先把應答線拉低,因為空閑的時候是高狀態,然后再次拉高,等待DHT11的響應,也就是等待數據線被拉低,當DHT11准備輸出數據時,再把數據線拉低,輸出數據給單片機,單片機可以根據高電平時間的長短來判別輸出的數據是0還是1,最后在進行校驗位的檢查,從而成傳輸。
三.程序
下面給出DHT11讀數據的程序
uchar DhtReadByte(void)
{
bit bit_i;
uchar j;
uchar dat=0;
for(j=0;j<8;j++)
{
while(!TRH); // 等待低電平結束
Delay5us(); // 延時 Delay5us();
Delay5us(); Delay5us(); // 延時
Delay5us(); Delay5us();
if(TRH) // 檢測數據線是高電平還是低電平
{ bit_i=1; while(TRH); }
else { bit_i=0; }
dat<<=1; // 將該位移位保存到dat變量中
dat|=bit_i; }
return(dat); }
/************** 函數:void ReadTrh(void) --------------------------- 說明:將讀取到的溫濕度通過串口發送出去 參數: 返回值:讀取到的字節內容 ***********/
void ReadTrh(void)
{ uchar check; // 校驗字節
uchar TemHig,TemLow,HumiHig,HumiLow;
TRH=0; // 主機拉低18ms DelayMs(18);
TRH=1; // DATA總線由上拉電阻拉高 主機延時20us
Delay5us(); Delay5us(); Delay5us(); Delay5us(); // 主機設為輸入 判斷從機響應信號
while(!TRH); // 等待DHT 80us的低電平結束
while(TRH); // 等待DHT 80us的高電平結束
HumiHig = DhtReadByte(); // 濕度高8位
HumiLow = DhtReadByte(); // 濕度低8為,總為0
TemHig = DhtReadByte(); // 溫度高8位
TemLow = DhtReadByte(); // 溫度低8為,總為0
check = DhtReadByte(); // 8位校驗碼,其值等於讀出的四個字節相加之和的低8位 TRH=1; // 釋放總線
if(check==HumiHig + HumiLow + TemHig + TemLow) // 如果收到的數據無誤
{ Send(TemHig); Send(HumiHig); } }
四.總結
上述程序是從DHT11溫濕度傳感器讀出數並發送給串口值的程序,要學這一類傳感器的程序,大家要記得,學會看懂時序圖,會用就可以了,需要DHT11的pdf的小伙伴,請留下聯系方式或私聊我0.0