99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

程序員小哈
認證:優質創作者
作者動態
自動洗碗機綜合實例第二講 - 最小系統核心板PCB繪制
2024-07-18 09:21
自動洗碗機綜合實例第一講 - 最小系統核心板原理圖繪制
2024-07-16 09:40
線路板焊接的干貨都在這里呢
2024-07-14 12:08
基于單片機的智能風扇DIY總結
2024-07-13 14:42
基于HAL庫實現按鍵(外部中斷)翻轉一個LED
2024-06-30 14:02

DHT11及DHT21溫濕度傳感器時序圖解析(STM32)

DHT11和DHT21是學習單總線通信中常見的傳感器,在畢業設計中也常常用來測量環境的溫濕度數據。

下面對DHT11和DHT21進行簡單的對比:

DHT11:

測量范圍:20-90% RH 0-50℃

測濕精度:±5% RH

測溫精度:±2℃

分辨力:1

DHT11引腳說明(正面觀看,左邊的為1腳):

DHT21(AM2301):

測量范圍:0-99.9% RH -40~+80℃

測濕精度:±3% RH

測溫精度:±0.5℃

分辨力:0.1%RH/0.1℃

典型應用電路:

說明:

(1)、DHT11和DHT21供電范圍都是3V~5.5V,對于STM32單片機,我們VDD引腳接3.3V即可;

(2)、DHT11的手冊中說,SDA數據引腳接線長度短于20米時,用5K上拉電阻。大于20米時根據實際情況使用合適的上拉電阻;

(3)、DHT11上電后,需要等待1s以越過不穩定狀態,在此期間無需發現任何指令;本人嘗試上電即讀取,返回溫濕度值都為0,1S以后溫濕度值即可恢復正常;

(4)、電源引腳(VDD,GND)之間可增加一個100nF的電容,用以去耦濾波。

DHT11和DHT21的時序相同,下面以DHT11的時序圖為例進行分析:

注意:DHT11和DHT21的主線拉低的時間不同,DHT11主機(MCU)至少拉低18ms,DHT21主機(MCU)至少拉低500us,為了程序上兼容,我們一般將總線拉低25ms,這樣DHT11和DHT21的驅動程序就可以兼容了。

DHT11總線驅動過程:

1、MCU發送開始起始信號

總線空閑狀態為高電平,主機把總線拉低等待DHT11響應;

與MCU相連的SDA數據引腳置為輸出模式;

主機把總線拉低至少18毫秒,然后拉高20-40us等待DHT返回響應信號;

2、讀取DHT11響應

SDA數據引腳設為輸入模式;

DHT11檢測到起始信號后,會將總線拉低80us,然后拉高80us作為響應;

3、DHT11送出40bit數據

注意:

高位在前;

40bit數據(5字節數據)數據包:

DHT11

數據格式: 40bit數據=8位濕度整數+8位濕度小數+8位溫度整數+8位溫度小數+8位校驗

DHT21

數據格式: 40bit數據=16bit濕度數據+16bit溫度數據+8bit校驗和

例子:  接收40bit數據如下:       

         0000 0010  1000 1100    0000 0001  0101 1111    1110 1110

                   濕度數據                            溫度數據                    校驗和

             濕度高8位+濕度低8位+溫度高8位+溫度低8位=和的低8位=校驗和

             例如:0000 0010+1000 1100+0000 0001+0101 1111=1110 1110

             二進制的濕度數據 0000 0010  1000 1100 ==>轉為十進制:652,除以10即為濕度值;

             濕度=65.2%RH     

     

     二進制的溫度數據 0000 0001  0101 1111 ==>轉為十進制:351,除以10即為溫度值;

     溫度=35.1℃      

             當溫度低于0℃時溫度數據的最高位置1。

             例如:-10.1℃表示為1000 0000 0110 0101  

注意:DHT21溫濕度數據為16位,DHT11數據為8位,所以盡管兩者時序相同,卻不能用同樣的數據類型計算。

/**
  * @brief  讀取40bit數據
  * @param  none.
  * @retval 1 讀取成功,0讀取失敗.
  */
 
int DHT11_ReadData(void) 
{ 
    unsigned int cout = 1;
 
    unsigned int T_H, T_L, H_H, H_L, Check; 
 
    //設置IO為輸出模式 
    DHT_Set_Output();    
 
    //1、MCU發送開始起始信號 
    DHT_ResetBit();
 
    delay_ms(25);        //拉低至少18ms
 
    DHT_SetBit();        
 
    delay_us(20);        //拉高20~40us    
 
    //設置IO口為輸入模式
 
    DHT_Set_Input();    
 
    //2、讀取DHT11響應
 
    if(DHT_ReadBit() == Bit_RESET) 
    { 
        //等待80us的低電平 
        cout = 1;
 
        while(!DHT_ReadBit() && cout++);        
 
        //等待80us的高電平 
        cout = 1;
 
        while(DHT_ReadBit() && cout++);        
 
        //3、DHT11送出40bit數據 
        //讀取8bit的濕度整數數據 
        H_H = DH21_ReadByte();        
 
        //讀取8bit的濕度小數數據 
        H_L = DH21_ReadByte();        
 
        //讀取8bit的溫度整數數據 
        T_H = DH21_ReadByte();        
 
        //讀取8bit的溫度小數數據 
        T_L = DH21_ReadByte();        
 
        //讀取8位的校驗和 
        Check = DH21_ReadByte();        
 
        //校驗數據是否合法,合法的話將數據保存到全局結構體變量中備用 
        if(Check == (H_H + H_L + T_H + T_L)) 
        { 
            DHT11.Hum_H = H_H; 
            DHT11.Hum_L = H_L; 
            DHT11.Tem_H = T_H; 
            DHT11.Tem_L = T_L;    
 
            return 1; 
        } 
        else 
        { 
            return 0; 
        } 
    }
 
    return 0; 
}

    上面讀取40bit數據的函數中有一個讀取單字節(8bit)數據的函數DH21_ReadByte();這里涉及到1bit數據到底是0還是1的判斷規則。

數據'0'還是'1'判定規則:

位數據“0”的格式為:50 微秒的低電平和 26-28 微秒的高電平,

位數據“1”的格式為:50 微秒的低電平加 70微秒的高電平。

1、等待50us低電平結束

因為接收數據時,低電平的時間都是50us,該位數據到底是0還是1,取決于低電平后面的高電平的時間多少;

如果不考慮低電平的時間,我們可以簡化程序,可以先等待低電平過去;

2、數據拉高后,判斷30us后數據總線電平的高低

等待數據線拉高后,再延時30us,因為30us大于28us且小于70us,再檢測此時數據線是否為高,如果為高,則數據判定為1,否則為0。

?

位數據“0”判定圖

位數據“1”判定圖

該函數的具體實現如下:

/**
  * @brief  讀取8bit 數據
  * @param  none.
  * @retval none.
  */ 
int DH21_ReadByte(void) 
{ 
    int data=0; 
    char i; 
    char cout;   
 
    for(i=0; i<8; i++) 
    { 
        //1、等待50us低電平結束 
        cout=1;
 
        while(!DHT_ReadBit() && cout++);       
 
        //2、數據拉高后,判斷30us后數據總線電平的高低 
        //延時30us之后讀取IO口的狀態 
        delay_us(30);        
 
        //先把上次的數據移位,再保存本次的數據位。 
        data = data << 1;        
 
        if(DHT_ReadBit() == Bit_SET) 
        {     
            data |= 1; 
        }              
 
        //等待輸入的是低電平(高電平結束),進入下一位數據接收 
        cout=1;
         while(DHT_ReadBit() && cout++); 
    }
 
    return data; 
}

40bit數據處理,得到溫濕度數據:

/**
  * @brief  獲取溫度
  * @param  none.
  * @retval Temp, 溫度值
  */ 
int DHT11_GetTem(void)
{ 
    //return (DHT11.Tem_H << 8 | DHT11.Tem_L);    //DHT21
 
    return (DHT11.Tem_H*10 + DHT11.Tem_L);        //DHT11 
} 
 
 /**
  * @brief  獲取濕度
  * @param  none.
  * @retval Hum,濕度值
  */ 
int DHT11_GetHum(void) 
{ 
    //return (DHT11.Hum_H << 8 | DHT11.Hum_L);    //DHT21
 
    return (DHT11.Hum_H*10  + DHT11.Hum_L);       //DHT11 
}

注意:上面函數得到的數據為真實溫濕度值的放大10倍之后的值,使用時,需將函數的返回值除以10才為真實值;

歡迎關注  

程序員小哈帶你玩轉嵌入式,有問題留言區留言給我,相互討論,知無不言,相互學習,一起進步。
聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 4
收藏 3
關注 69
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 黄色观看大全 | 亚洲高清视频在线 | 日日噜噜噜夜夜爽爽狠狠片 | 男女性潮高清免费网站 | 色噜噜狠狠色综合网图区 | 丁香五月综合缴清中文 | 中文字幕888| 国产亚洲专区 | 三级免费久久无码 | 国产精品久久久久久久久免费樱桃 | 久久久久久久久18久久久 | 欧美日本日韩 | 天堂AV无码大芭蕉伊人AV孕妇 | 高清黄色一级片 | 我真的不是气运之子动漫免费观看 | 国产精品69久久久久孕妇欧美 | 内地一级毛片 | 国产精品一区二区含羞草 | 伊人久久成人 | 国产精品综合在线观看 | 久久国产精品久久久 | 麻豆精品视频在线播放 | 伊人精品视频在线观看 | 国产鲁鲁视频在线观看 | 少妇又爽又刺激视频 | 97九色| 成人在线观看不卡 | 成人在线观看一区二区三区 | 国产女同2互磨高潮在线观看 | 国99精品无码一区二区三区 | 国产欧美日韩在线观看一区二区 | 在线观看免费一区 | 亚洲一区av在线观看无码 | 97精品一区二区三区 | 国产一区二区0 | 韩国激情高潮无遮挡hd | 日日噜噜大屁股熟妇 | 性国产日韩欧美一区二区在线 | 狂野欧美激情性XXXX按摩 | 日本日韩中文字幕 | 色噜噜噜噜噜噜亚洲精品 |