驅動dht11、dht22、ds18bb20等溫濕度模組時序是比較簡單的,關鍵在於控制好時序的延時時間
,hal庫的延時函式hal_delay是毫秒級別延時函式,所關鍵點就是實現微秒級別的延時函式。
微秒級別延時函式實現見我的另一篇部落格:
//io方向設定
#define dht11_io_in()
// pc10 in mode
#define dht11_io_out()
// pc10 out mode
io操作函式
#define dht11_dq_out pcout(10)
//資料埠 pc10
#define dht11_dq_in pcin(10)
//資料埠 pc10
u8 dht11_init
(void);
//初始化dht11
u8 dht11_read_data
(u8 *temp, u8 *humi)
;//讀取溫濕度
u8 dht11_read_byte
(void);
//讀出乙個位元組
u8 dht11_read_bit
(void);
//讀出乙個位
u8 dht11_check
(void);
//檢測是否存在dht11
void
dht11_rst
(void);
//復位dht11
u8 dht11_read_data_float
(float
*temp,
float
*humi)
;#endif
#include
"dht11.h"
//復位dht11
void
dht11_rst
(void
)//等待dht11的回應
//返回1:未檢測到dht11的存在
//返回0:存在
u8 dht11_check
(void);
if(retry>=
100)
return1;
else retry=0;
while
(!dht11_dq_in&&retry<
100)
//dht11拉低後會再次拉高40~80us;if
(retry>=
100)
return1;
return0;
}//從dht11讀取乙個位
//返回值:1/0
u8 dht11_read_bit
(void
) retry=0;
while
(!dht11_dq_in&&retry<
100)
//等待變高電平
delay_us(40
);//等待40us
if(dht11_dq_in)
return1;
else
return0;
}//從dht11讀取乙個位元組
//返回值:讀到的資料
u8 dht11_read_byte
(void
)return dat;
}//從dht11讀取一次資料
//temp:溫度值(範圍:0~50°)
//humi:濕度值(範圍:20%~90%)
//返回值:0,正常;1,讀取失敗
u8 dht11_read_data
(u8 *temp,u8 *humi)if(
(buf[0]
+buf[1]
+buf[2]
+buf[3]
)==buf[4]
)}else
return1;
return0;
}u8 dht11_read_data_float
(float
*temp,
float
*humi)if(
(buf[0]
+buf[1]
+buf[2]
+buf[3]
)==buf[4]
)}else
return1;
return0;
}//初始化dht11的io口 dq 同時檢測dht11的存在
//返回1:不存在
//返回0:存在
u8 dht11_init
(void
)
STM32 HAL庫學習筆記
1 系統時鐘 一般用stm32cube生成,使用者只需要會用stm32cube就行。2 gpio輸出void led gpio config void 3 gpio輸入void key gpio config void 4 外部中斷void exti key config void void ext...
STM32 HAL庫學習筆記
1 普通函式與 函式的區別 對普通函式的呼叫 呼叫程式發出對普通函式的呼叫後,程式執行立即轉向被呼叫函式執行,直到被呼叫函式執行完畢後,再返 用程式繼續執行。從發出呼叫的程式的角度看,這個過程為 呼叫 等待被呼叫函式執行完畢 繼續執行 對 函式呼叫 呼叫程式發出對 函式的呼叫後,不等函式執行完畢,立...
STM32 HAL庫 韌體庫 公升級
1 使用官方提供的新功能。2 上個版本有bug,下個版本bug解決了的情況是可能的。不過,上個版本沒bug,下個版本有bug的情況是有的 微小概率事件 開啟 stm32h7xx.h ctrl f搜尋 version 1 通過官網獲取最新hal庫 1 2keil官網經常會卡著顯示不了後續內容,這時可以...