24.1實驗內容
通過本實驗主要學習以下內容:
- DHT11操作原理
- 單總線GPIO模擬操作原理
24.2實驗原理
HT11是一款已校準數(shù)字信號輸出的溫濕度一體化數(shù)字傳感器。該產(chǎn)品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優(yōu)點信號,傳輸距離可達20米以上。
其具體參數(shù)如下:
- 工作電壓:3.3V-5.5V
- 工作電流:0.5mA
- 控制方式:單總線
- 輸出方式:數(shù)字量
- 濕度精度:±5%
- 溫度精度:±2℃
- 濕度量程:5%~95%
- 溫度量程:-20℃~+60℃
DHT11引腳定義和封裝如下圖所示
DHT11采用單總線的方式進行數(shù)據(jù)傳輸,下面對其通信時序以及傳輸數(shù)據(jù)構成進行介紹。
DHT11通信時序可分為:建立連接、數(shù)據(jù)接收兩部分。
建立連接部分時序如下圖所示,共包括:主機動作和從機響應兩部分。主機動作:DHT11溫濕度傳感器上電后,數(shù)據(jù)線處于空閑狀態(tài)(配置數(shù)據(jù)線空閑狀態(tài)為高電平)。主機發(fā)送建立連接動作,動作內容為:拉低數(shù)據(jù)線再拉高數(shù)據(jù)線(數(shù)據(jù)線拉低時間>18ms、拉高時間在20-40us之間)然后釋放總線。從機響應:從機接收到主句發(fā)送的建立連接動作后,先拉低數(shù)據(jù)線,再拉高數(shù)據(jù)線,表示連接建立成功(拉低數(shù)據(jù)線40-50us,拉高數(shù)據(jù)線40-50us)。
在連接成功建立后,從機發(fā)送數(shù)據(jù),主機進行數(shù)據(jù)的接收。數(shù)據(jù)接收:每一bit數(shù)據(jù)都以50us低電平開始,通過判斷低電平后的高電平時間來決定接收數(shù)據(jù)的種類。接收高電平時間為26us-28us表示0,接收高電平為70us表示1。當最后一bit數(shù)據(jù)傳送完畢后,從機拉低數(shù)據(jù)線50us,隨后從機釋放總線,總線進入空閑狀態(tài)(高電平)。
主機一次接收40bit數(shù)據(jù),共5字節(jié),每個字節(jié)的含義如下圖所示。從高到低依次為:濕度整數(shù)h(0)、濕度小數(shù)h(1)、溫度整數(shù)h(2)、溫度小數(shù)h(3)、校驗和h(4)。檢驗和等于前四字節(jié)數(shù)據(jù)之和。在一次數(shù)據(jù)接收完成后,驗證h(4)是否等于h(1)+h(2)+h(3)+h(4)。若等式成立則表示數(shù)據(jù)成功接收,然后進行數(shù)據(jù)更新,否則不進行數(shù)據(jù)更新。
DHT11數(shù)據(jù)格式舉例如下。
24.3硬件設計
DHT11硬件電路圖如下所示。DHT11為單信號線通信,因而僅使用了一個IO進行數(shù)據(jù)通信,且該IO使用了RC進行濾波并采用4.7K進行上拉,保證了數(shù)據(jù)通信的穩(wěn)定性,電源地通過100nf電容濾波。
24.4代碼解析
24.4.1DHT11初始化
DHT11初始化函數(shù)實現(xiàn)如下,主要包括DHT11數(shù)據(jù)通信引腳的初始化以及DHT11 reset和check操作。
C uint8_t dht11_init(void) { driver_gpio_general_init(&DHT11_DA); /* DHT11_DQ引腳模式設置,開漏輸出,上拉, 這樣就不用再設置IO方向了, 開漏輸出的時候(=1), 也可以讀取外部信號的高低電平 */ dht11_reset(); return dht11_check(); } |
在該函數(shù)中,將DHT11數(shù)據(jù)引腳配置為開漏模式,使用上可以不用切換引腳模式以及方向,使用比較方便。
dht11_reset()為復位DHT11操作函數(shù),其實現(xiàn)如下,如原理中介紹,首先拉低數(shù)據(jù)引腳20ms,之后拉高30us,實現(xiàn)對DHT11的復位操作。
C static void dht11_reset(void) { DHT11_DA_OUT(0); /* 拉低DQ */ delay_ms(20); /* 拉低至少18ms */ DHT11_DA_OUT(1); /* DQ=1 */ delay_us(30); /* 主機拉高10~35us */ } |
dht11_check()為check DHT11是否正常連接以及工作,其實現(xiàn)如下,其主要通過判斷DHT11是否能夠響應主機的復位請求操作來判斷DHT11是否連接以及工作正常,如果工作正常,該函數(shù)返回值為0,否則返回1.
C uint8_t dht11_check(void) { uint8_t retry = 0; uint8_t rval = 0; while (DHT11_DA_IN && retry < 100) ?/* DHT11會拉低83us */ { retry++; delay_us(1); } if (retry >= 100) { rval = 1; } else { retry = 0; while (!DHT11_DA_IN && retry < 100) /* DHT11拉低后會再次拉高87us */ { retry++; delay_us(1); } if (retry >= 100) rval = 1; } return rval; } |
24.4.2DHT11溫濕度讀取
DHT11溫濕度讀取函數(shù)如下,通過該函數(shù)將會連續(xù)讀取5個字節(jié)數(shù)據(jù),前兩個為濕度數(shù)據(jù),之后兩個為溫度數(shù)據(jù),最后一個數(shù)據(jù)為校驗和。讀取正確且校驗完成后相關濕度數(shù)據(jù)將會放在對應的形參指定的變量內,該函數(shù)將會返回0.
C uint8_t dht11_read_data(uint8_t *temp, uint8_t *humi) { uint8_t buf[5]; uint8_t i; dht11_reset(); if (dht11_check() == 0) { for (i = 0; i < 5; i++) ??? /* 讀取40位數(shù)據(jù) */ { buf[i] = dht11_read_byte(); } if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]) { *humi = buf[0]; *temp = buf[2]; } } else { return 1; } return 0; } |
24.4.3主函數(shù)
DHT11溫濕度檢測實驗主函數(shù)如下所示,首先對systick延遲函數(shù)進行初始化,之后對DHT11初始化,最后在主循環(huán)中沒間隔1s讀取一次溫濕度數(shù)據(jù)。
C int main(void) { uint8_t temperature; uint8_t humidity; delay_init(); while (dht11_init()) /* DHT11初始化 */ { } while (1) { dht11_read_data(&temperature, &humidity); /* 讀取溫濕度值 */ delay_ms(1000); } } |
24.5實驗結果
將DHT11溫濕度讀取實驗燒錄到紅楓派開發(fā)板中,并連接串口,運行程序會,將會每秒鐘打印一次溫濕度數(shù)據(jù)。向著DHT11吹口熱氣,將會觀察到打印的溫濕度數(shù)值都將會增加。
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關注聚沃科技官網(wǎng)
-
單片機
+關注
關注
6037文章
44558瀏覽量
635213 -
開發(fā)板
+關注
關注
25文章
5050瀏覽量
97456 -
溫度器
+關注
關注
0文章
3瀏覽量
8572 -
GD32
+關注
關注
7文章
403瀏覽量
24351 -
DH11
+關注
關注
0文章
3瀏覽量
2497
發(fā)布評論請先 登錄
相關推薦
評論