關於DHT11
DHT11是一款數字溫濕度傳感器,DHT11是一款含有已校準數字信號輸出的溫濕度複合傳感器。它應用專用的數字模塊採集技術和溫濕度傳感技術,確保產品具有可靠的穩定性,響應快,抗干擾能力強。傳感器包括一個高分子電阻式感濕元件和一個NTC測溫元件,並與一個高性能8位單片機相連接,通過單總線與微處理器通訊,只需要一根線。

相關參數
1、DHT11數據結構
DHT11數字濕溫度傳感器採用單總線數據格式。即,單個數據引腳端口完成輸入輸出雙向傳輸。其數據包由5Byte(40Bit)組成。數據分小數部分和整數部分,具體格式在下面說明。
一次完整的數據傳輸為40bit,高位先出。
數據格式:8bit濕度整數數據+8bit濕度小數數據+8bit溫度整數數據+8bit溫度小數數據+8bit校驗和
校驗和數據為前四個位元組相加。
傳感器數據輸出的是未編碼的二進制數據。數據(濕度、溫度、整數、小數)之間
應該分開處理。如果,某次從傳感器中讀取如下5Byte數據:

由以上數據格式可以得到溫濕度計算方法
humi (濕度)= byte4 . byte3=45.0 (%RH)
temp (溫度)= byte2 . byte1=28.0 ( ℃)
jiaoyan(校驗)= byte4+ byte3+ byte2+ byte1=73(=humi+temp)(校驗正確)
2、DHT11傳輸數據時序
主機發送開始信號後,延時等待 20us-40us 後讀取 DH11T 的回應信號,讀取總線為低電平,說明 DHT11 發送響應信號,DHT11 發送響應信號後,再把總線拉高,準備發送數據,每一 bit 數據都以低電平開始。

3、DHT11的數字「0」和數字「1」表示方法
DHT11的數字0和數字1表示方式和常見的不同,一般的數據表示0的是低電平,表示1的是高電平,DHT11不同,開始傳輸數據之後他數字0的表示方式是高電平26-28us,數字1的表示方式是高電平116-118us。


代碼篇
本次實驗定義的IO口是PB11,傳輸的數據是串口一
1、主機發送開始信號到DHT11即單片機拉低18ms之後再拉高20-40us
static void DHT11_Rst(void)
{
GPIO_SETOUT(); //配置成輸出模式
GPIO_ResetBits(DHT11_IO,DHT11_PIN); //拉低數據線
Delay_ms(20); //拉低至少18ms
GPIO_SetBits(DHT11_IO,DHT11_PIN); //拉高數據線
Delay_us(30); //主機拉高20~40us
GPIO_ResetBits(DHT11_IO,DHT11_PIN);
}
2、DHT11發送響應信號到主機(32單片機),DHT11的數據線會拉低40-50us的,在拉高40-50us,讓單片機的IO口檢測信號。
函數名:static u8 DHT11_Check(void)
參數說明:無
返回值:檢測到回應-->返回1,否則0
函數作用:檢測DHT11的響應信號
***********************************************/
static u8 DHT11_Check(void)
{
u8 retry=0;
GPIO_SETIN(); //設置為輸入模式
while (!GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//DHT11會拉低40~50us
{
retry++;
Delay_us(1);
}
if(retry >= 100) //超時未響應/未收到開始信號,退出檢測
return 0;
else
retry = 0;
while (GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//DHT11拉低後會再次拉高40~50us
{
retry++;
Delay_us(1);
}
if(retry>=100) //超時,DHT11工作出錯,退出檢測
return 0;
return 1; //設備正常響應,可以正常工作
}
3、DHT11開始傳輸數據給單片機,這有兩個傳輸數據的函數,一個是傳輸位元組的,在由傳輸位元組的函數來寫傳輸一個8位字符串的函數。
函數名:static u8 DHT11_Read_Bit(void)
參數說明:無
返回值:返回從DHT11上讀取的一個Bit數據
函數作用:從DHT11上讀取一個Bit數據
***********************************************/
static u8 DHT11_Read_Bit(void)
{
u8 retry = 0;
//DHT11的Bit開始信號為12-14us低電平
while(GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//等待變為低電平(等待Bit開始信號)
{
retry++;
Delay_us(1);
}
retry = 0;
while(!GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//等待變高電平(代表數據開始傳輸)
{
retry++;
Delay_us(1);
}
Delay_us(30);//等待30us
//0信號為26-28us,1信號則為116-118us,所以說超過30us去讀取引腳狀態就可以知道傳輸的值了
if(GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN)) return 1;
else return 0;
}
/***********************************************************************
函數名:static u8 DHT11_Read_Byte(void)
參數說明:無
返回值:返回從DHT11上讀取的一個byte數據
函數作用:從DHT11上讀取一個byte數據
************************************************************************/
static u8 DHT11_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
4、DHT11數據採集完畢之後通過主函數在串口顯示出來
函數名:int main(void)
參數說明:無
返回值:無
函數作用:主函數
***************************************************************************/
int main(void)
{
clock_init();
uart_init(115200); //初始化串口
printf("wecome to DHT11");
//初始化DHT11(有BUG,第一次上電總是失敗,按一下複位按鈕又能進了)
if(!DHT11_Init()){
printf("rn EEROR! THE DHT11 HAS NO RESPOND...");
//while(1);
}
printf("rn THE DHT11 HAS RESPOND");
Delay_ms(10); //這裡延時10ms主要是因為,剛剛接收到響應信息,要等DHT11發送完信息
while(1)
{
if(DHT11_Read_Data(&temp,&humi))
printf("rn temp:%d,humi:%d",temp,humi);
else
//printf("rn EEROR! THE DHT11 HAS NO RESPOND...");//由於是庫函數編程,不能準確把握函數的執行時間,
//所以會經常出現這條警告信息
Delay_ms(100);
}
}
接線和實驗結果


總結
DHT11是性價比比較高的一個溫濕度模塊,用串口來顯示溫濕度來說是比較直觀的,長期發佈此類文章,喜歡的點個關注吧。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/208314.html
微信掃一掃
支付寶掃一掃