一、前言
? ? ? ? 在我們進行嵌入式開發時,驅動開發也是十分重要的一步,在很多時候,我們的都需要自己來編寫硬件的底層驅動,實現硬件與芯片的通信,常見的協議有SPI,IIC,以及單總線的一些通信方式,今天我們就來開發DHT11驅動。
二、DHT11
? ? ? ? 在開發一款驅動前,我們需要知道他是干什么的,DHT11數字溫濕度傳感器,是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數 字模塊采集技術和溫濕度傳感技術,確保產品具有枀高的可靠性與卓越的長期穩定性。傳感器包括一 個電容式感濕元件和一個NTC 測溫元件。
? ? ? ? 常用于,暖通空調、除濕器、農業、冷鏈倉儲、測試及檢測設備、消費品、汽車、自動控制、數據記錄器、氣 象站、家電、濕度調節器、醫療、其他相關濕度檢測控制。
? ? ? ? 因其成本低、長期穩定、相對濕度和溫度測量、品質卓越、超快響應、抗干擾能力強、超長的信號傳輸距 離、數字信號輸出、精確校準,而廣泛適用。
? ? ? ? 他有四個引腳,1腳為電源引腳,2腳為串行數據引腳(單總線),3腳為懸空NC,4腳為GND接地。以下是他的原理圖。
????????在實際運用中,常將2腳與主控芯片相連接,我們這里以stm32F103C8T6為例,以下是它的電路連接圖。
?????????
?我們選擇的是PA3腳,來作為我們的通信引腳,因此我們在編寫程序時,也要選擇我們的PA3腳,接下來我們就要進行驅動開發。
三、DHT11底層驅動開發
? ? ? ? 在開發任何一款驅動時,他們的數據手冊,就是我們的開發依據,所有的時序以及通信方式,校驗方式,我們都要依據他們的數據手冊,開發DHT11也不例外,我們先在網上搜索DHT11數據手冊,下載下來。
????????如果找不到,也可以用我下面這個:
百度網盤: https://pan.baidu.com/s/1MGWL-QDO7CBo2ZFKPBY-vQ?pwd=styz
提取碼: styz?
????????接著我們就可以開始我們的驅動編寫了,我們打開CUBEMX,來創建一個工程文件。
????????
接著我們創建兩個文件夾,一個為DHT11.c一個為DHT11.h
????????我們引入頭文件后我們開始解讀我們的數據手冊。
????????我們可以看到他有兩個狀態,當主機輸出,以及主機輸入狀態,顯然我們需要初始化我們的PA3引腳為兩個狀態。因此我們要創建兩個函數,來封裝這兩個狀態。
? ? ? ? 這樣我們在改變模式的時候就可以直接調用函數就可以了。我們接著看數據手冊。
????????我們可以看到,在開始接受數據之前我們需要輸出低信號18ms,以代表起始信號,所以我們也需要在程序里編寫。
? ? ? ? ?我們在看上面的時序圖,我們需要拉低電平,也就是輸出低電平,為了方便后續的編寫,我們可以直接定義一個函數。
? ? ? ? ? ? ? ?
????????這樣我們就可以直接調用函數,然后按照起始信號的時序來編寫就行。
????????這樣我們就可以開始接受從機給我們發送命令了 ,我們繼續看數據手冊。
????????
????????我們可以看到,這里的延時,變為了微秒級的延時,因此我們還需要自己寫一個函數來實現微秒延遲。
????????這樣一個簡單的us延時就完成了。我們繼續看數據手冊,我們可以發現,當我們的DHT11開始輸出低電平時則代表它響應了我們主機的信號。我們就可以用函數先判斷引腳是否為低電平。
? ? ? ? 這樣我們直接判斷信號為高還是低,如果為低我們就直接改為輸入模式,因為這時的DHT11為輸出。因此我們還需要寫輸入邏輯。也就是發送數據的時序。
????????
? ? ? ? 接下來我們就可以開始存數據了。我們為了便于使用,我們可以創建一個結構體變量。
? ? ? ? 根據數據手冊,我們按照順序創建結構體。
????????
接著我們就可以使用他了,我們繼續編寫我們的讀時序。
????????
這樣就完成了我們的讀時序編寫,最后我們只需要再寫一個函數初始化我們的硬件。
?????????這樣我們的驅動就編寫完成了,我們最后只需要在我們的DHT11.h中聲明我們的函數就可以在外部調用我們的函數了。
????????
????????這樣我們可以讀取數據了。