STM32驅動DHT11溫濕度感測器

2021-06-26 02:47:01 字數 3128 閱讀 4542

dht11 是一款溼溫度一體化的數字感測器。該感測器包括乙個電阻式測溼元件和乙個 ntc

測溫元件,並與乙個高效能 8 位微控制器相連線。通過微控制器等微處理器簡單的電路連線就能夠

實時的採集本地濕度和溫度。 dht11 與微控制器之間能採用簡單的單匯流排進行通訊,僅僅需要一

個 i/o 口。感測器內部濕度和溫度資料 40bit 的資料一次性傳給微控制器,資料採用校驗和方式

進行校驗,有效的保證資料傳輸的準確性。dht11 功耗很低,5v 電源電壓下,工作平均最大

電流 0.5ma。

dht11 的技術引數如下:

工作電壓範圍:3.3v -5.5v

工作電流  :平均 0.5ma

輸出:單匯流排數碼訊號

測量範圍:濕度 20~90%rh,溫度 0~50℃

精度  :濕度±5%,溫度±2℃

解析度  :濕度 1%,溫度 1℃

dht11有效匯流排包含三條,vcc gnd dat,看起來與ds18b20類似,但是簡單很多,不需要設定命令,只需要讀取資料報就可以了,

每次讀取資料一共讀取40個bit也就是五個位元組,高位在前msb

五個位元組分別是:  8bit

濕度整數資料

+8bit

濕度小數資料

+8bi

溫度整數資料

+8bit

溫度小數資料

+8bit校驗和

讀寫時序如下

首先主機傳送開始訊號,即:(最開始狀態依然是高電平)拉低資料線,保持 t1 (至少 18ms)時間,然後拉高資料線 t2(20~40us)時間,(此時需要轉換輸入輸出模式)然後讀取 dht11 的響應,正常的話, dht11 會拉低資料線,保持 t3 (40~50us)時間,作為響應訊號,然後 dht11 拉高資料線,保持 t4(40~50us)時間後,開始輸出資料

也就是說,每次需要復位,檢查響應,才能開始讀資料,資料的格式如下

由此我們可以看到,每個資料都是有乙個12-14us的起始位開始,是0還是1需要我們監測之後的高電平時間長度,基本上我們可以認為高電平持續時間大於35us的基本就是1了

(注意不能等待這個電平超過40us)因為一次0的時間就是40us,等待太長會可能丟掉下乙個資料的起始位(這裡我們可以用等待點評延時計數的模式來判定時間,當電平為0,等待他為1,每等待一次計數1us,最後看高電平持續時間)

驅動**如下所示

#ifndef __dht11_h

#define __dht11_h

#include "ioremap.h"

#include "delay.h"

#include "uart.h"

//io方向設定

#define dht11_io_in()

#define dht11_io_out()

io操作函式

#define dht11_dq_out pgout(11) //資料埠 pg11

#define dht11_dq_in pgin(11) //資料埠 pg11

u8 dht11init(void);//初始化dht11

u8 dht11readdata(u8 *temp,u8 *humi);//讀取溫濕度

u8 dht11readbyte(void);//讀出乙個位元組

u8 dht11readbit(void);//讀出乙個位

u8 dht11check(void);//檢測是否存在dht11

void dht11rst(void);//復位dht11

void dht11show(void);

#endif

#include "dht11.h"

//復位dht11

void dht11rst(void)

//等待dht11的回應

//返回1:未檢測到dht11的存在

//返回0:存在

u8 dht11check(void)

; if(retry>=100)return 1;

else retry=0;

while (!dht11_dq_in&&retry<100)//dht11拉低後會再次拉高40~80us

;if(retry>=100)return 1;

return 0;

}//從dht11讀取乙個位

//返回值:1/0

u8 dht11readbit(void)

retry=0;

while(!dht11_dq_in&&retry<100)//等待變高電平

delayus(40);//等待40us

if(dht11_dq_in)return 1;

else return 0;

}//從dht11讀取乙個位元組

//返回值:讀到的資料

u8 dht11readbyte(void)

return dat;

}//從dht11讀取一次資料

//temp:溫度值(範圍:0~50°)

//humi:濕度值(範圍:20%~90%)

//返回值:0,正常;1,讀取失敗

u8 dht11readdata(u8 *temp,u8 *humi)

if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])

}else return 1;

return 0;

}//初始化dht11的io口 dq 同時檢測dht11的存在

//返回1:不存在

//返回0:存在

u8 dht11init(void)

void dht11show(void)

else

}

STM32外設驅動篇 DHT11溫濕度感測器

已在stm32上進行過測試。本例使用pc0引腳連線dht11的data引腳。main函式中呼叫下面 中的dth11 test函式即可。資料定義 以下變數均為全域性變數 溫度高8位 u8t data h 溫度低8位 u8t data l 濕度高8位 u8rh data h 濕度低8位 u8rh dat...

DHT11溫濕度感測器

原理圖 資料傳輸 使用序列介面 單線雙向 data 用於微處理器與 dht11之間的通訊和同步,採用單匯流排資料格式,一次 通訊時間4ms左右,資料分小數部分和整數部分,具體格式在下面說明,當前小數 部分用於以後擴充套件,現讀出為零.操作流程如下 一次完整的資料傳輸為40bit,高位先出。資料格式 ...

DHT11溫濕度感測器

dht11數字溫濕度感測器是一款含有已校準數碼訊號輸出的溫濕度復合感測器。它應用專用的數字模組採集技術和溫濕度感測技術,確保產品具有極高的可靠性與長期的穩定性。感測器包括乙個電阻式感溼元件和乙個ntc測溫元件,並與乙個8位微控制器相連線。因此該產品具有抗干擾能力強 價效比高等優點。dht11使用1 ...