標(biāo)題: stm32驅(qū)動(dòng)DHT11溫濕度傳感器的一些問(wèn)題解決 [打印本頁(yè)]

作者: hrojgi    時(shí)間: 2017-11-2 16:30
標(biāo)題: stm32驅(qū)動(dòng)DHT11溫濕度傳感器的一些問(wèn)題解決
使用串行接口(單線雙向)

DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次
通訊時(shí)間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說(shuō)明,當(dāng)前小數(shù)
部分用于以后擴(kuò)展,現(xiàn)讀出為零.操作流程如下:
    一次完整的數(shù)據(jù)傳輸為40bit,高位先出。

    數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)
        +8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)
        +8bit校驗(yàn)和
數(shù)據(jù)傳送正確時(shí)校驗(yàn)和數(shù)據(jù)等于“ 8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)
+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)” 所得結(jié)果的末8位。

用戶MCU發(fā)送一次開(kāi)始信號(hào)后,DHT11從低功耗模式轉(zhuǎn)換到高速模式,等待主
機(jī)開(kāi)始信號(hào)結(jié)束后,DHT11發(fā)送響應(yīng)信號(hào),送出40bit的數(shù)據(jù),并觸發(fā)一次信號(hào)采集,
用戶可選擇讀取部分?jǐn)?shù)據(jù).從模式下,DHT11接收到開(kāi)始信號(hào)觸發(fā)一次溫濕度采集,
如果沒(méi)有接收到主機(jī)發(fā)送開(kāi)始信號(hào),DHT11不會(huì)主動(dòng)進(jìn)行溫濕度采集.采集數(shù)據(jù)后
轉(zhuǎn)換到低速模式。
通訊過(guò)程


總線空閑狀態(tài)為高電平,主機(jī)把總線拉低等待DHT11響應(yīng),主機(jī)把總線拉低必
須大于18毫秒,保證DHT11能檢測(cè)到起始信號(hào)。 DHT11接收到主機(jī)的開(kāi)始信號(hào)后,
等待主機(jī)開(kāi)始信號(hào)結(jié)束,然后發(fā)送80us低電平響應(yīng)信號(hào).主機(jī)發(fā)送開(kāi)始信號(hào)結(jié)束
后,延時(shí)等待20-40us后, 讀取DHT11的響應(yīng)信號(hào),主機(jī)發(fā)送開(kāi)始信號(hào)后,可以切換
到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高


總線為低電平,說(shuō)明DHT11發(fā)送響應(yīng)信號(hào),DHT11發(fā)送響應(yīng)信號(hào)后,再把總線拉
高80us,準(zhǔn)備發(fā)送數(shù)據(jù),每一bit數(shù)據(jù)都以50us低電平時(shí)隙開(kāi)始,高電平的長(zhǎng)短定
了數(shù)據(jù)位是0還是1.格式見(jiàn)下面圖示.如果讀取響應(yīng)信號(hào)為高電平,則DHT11沒(méi)有
響應(yīng),請(qǐng)檢查線路是否連接正常.當(dāng)最后一bit數(shù)據(jù)傳送完畢后, DHT11拉低總線
50us,隨后總線由上拉電阻拉高進(jìn)入空閑狀態(tài)。
數(shù)據(jù)0表示


數(shù)據(jù)1表示


波特率

9600
問(wèn)題

一個(gè)引腳輸入模式的變換?
使用兩個(gè)不同的函數(shù),一個(gè)函數(shù)將引腳設(shè)置為輸入模式,一個(gè)函數(shù)將引腳設(shè)置為輸出模式,注意不要忘了時(shí)鐘使能。
輸入和輸出初始化的時(shí)候不一樣,這是HAL庫(kù)不同于標(biāo)準(zhǔn)庫(kù)的一個(gè)地方
    輸入
          /*Configure GPIO pin : PC1 */
          GPIO_InitStruct.Pin = GPIO_PIN_1;
          GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
          GPIO_InitStruct.Pull = GPIO_PULLUP;            //上拉模式
          HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    輸出
          /*Configure GPIO pin : PC0 */
          GPIO_InitStruct.Pin = GPIO_PIN_0;
          GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;      //輸出要由推挽輸出
          GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
          HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
如何將讀取到的0和1變成八位二進(jìn)制數(shù)?
    主要步驟,左移和取和
        delay_us(30);
        temp = temp << 1;

    temp |=1;
另一個(gè)問(wèn)題
    讀到此時(shí)高低電平后,要等待相應(yīng)的時(shí)間,判斷是0還是1,
剩下的問(wèn)題就是輸出初始化了,只需要使用相應(yīng)的延時(shí)函數(shù),延時(shí)需要的時(shí)間即可。
最終結(jié)果
作者: sd123go    時(shí)間: 2020-5-17 05:56
補(bǔ)充一句:VDD電壓為3.5V-5.5V,用STM32的3.3V電源無(wú)法驅(qū)動(dòng)的,測(cè)試發(fā)現(xiàn)DST11




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1