久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13380|回復: 3
打印 上一主題 下一主題
收起左側

剖析DHT11溫濕度傳感器的驅動時序(STM32F103單片機為例)

[復制鏈接]
跳轉到指定樓層
樓主
發圖片很麻煩,在附件有完整的代碼,有需要下載來看吧~~

DHT11溫濕度傳感器
1          DHT11溫濕度傳感器:
2          P8913常見接線圖
單線雙線數據線DATA上拉后與微處理器的 I/O 端口相連。
1.典型應用電路中建議連接線長度短于 5m 時用 4.7K 上拉電阻,大于 5m 時根據實際情況降低上拉電阻的阻值。
2. 使用 3.3V 電壓供電時連接線盡量短,接線過長會導致傳感器供電不足,造成測量偏差。
3. 每次讀出的溫濕度數值是上一次測量的結果,欲獲取實時數據,需連續讀取 2 次,但不建議連續多次讀取傳感器,每次讀取傳感器間隔大于 2 秒即可獲得準確的數據。
4. 電源部分如有波動,會影響到溫度。如使用開關電源紋波過大,溫度會出現跳動。

3          驅動時序圖及工作參數
DHT11 器件采用簡化的單總線通信。單總線即只有一根數據線,系統中的數據交換、控制均由單總線完成。設備(主機或從機)通過一個漏枀開路或三態端口連至該數據線,以允許設備在不發送數據時能夠釋放總線,而讓其它設備使用總線;單總線通常要求外接一個約 4.7kΩ 的上拉電阻,這樣,當總線閑置時,其狀態為高電平。由于它們是主從結極,只有主機呼叫從機時,從機才能應答,因此主機訪問器件都必須嚴格遵循單總線序列,如果出現序列混亂,器件將不響應主機。
◎單總線傳送數據位定義
DATA 用于微處理器與 DHT11 之間的通訊和同步,采用單總線數據格式,一次傳送 40 位數據,高位先出。
數據格式:
8bit 濕度整數數據 + 8bit 濕度小數數據 + 8bit 溫度整數數據 + 8bit 溫度小數數據 + 8bit 校驗位。
注:其中濕度小數部分為 0。
◎校驗位數據定義
“8bit 濕度整數數據 + 8bit 濕度小數數據 + 8bit 溫度整數數據 + 8bit 溫度小數數據” 8bit 校驗位等于所得結果的末 8 位  

示例一:接收到的 40 位數據為:
0011 0101   0000 0000    0001 1000  0000 0100     0101 0001
濕度高 8 位 濕度低 8 位   溫度高 8 位   溫度低 8 位     校驗位
計算:
0011 0101+0000 0000+0001 1000+0000 0100= 0101 0001
接收數據正確:
濕度: 0011 0101(整數)=35H=53%RH 0000 0000(小數)=00H=0.0%RH =>53%RH + 0.0%RH =
53.0%RH
溫度: 0001 1000(整數)=18H=24℃ 0000 0100(小數)=04H=0.4℃ =>24℃ + 0.4℃ = 24.4℃
◎特殊說明:
當溫度低于 0 ℃ 時溫度數據的低 8 位的最高位置為 1。
示例: -10.1 ℃ 表示為 0000 1010 1000 0001
溫度: 0000 1010(整數)=0AH=10℃, 0000 0001(小數)=01H=0.1℃ =>-(10℃+0.1℃)= -10.1℃
示例二:接收到的 40 位數據為:
0011 0101 0000 0000 0001 1000 0000 0100 0100 1001
濕度高 8 位 濕度低 8 位 溫度高 8 位 溫度低 8 位 校驗位
計算:
0011 0101+0000 0000+0001 1000+0000 0100= 0101 0001
0101 0001 不等于 0100 1001
本次接收的數據不正確,放棄,重新接收數據。

4          驅動思路4.1    時序圖分析總線空閑狀態為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平響應信號主機發送開始信號結束后,延時等待20-40us, 讀取DHT11的響應信號主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高。檢測到總線為低電平,說明DHT11發送響應信號,DHT11發送響應信號后,再把總線拉高80us,準備發送數據,每一bit數據都以50us低電平時隙開始,高電平的長短定了數據位是0還是1.格式見下面圖示如果讀取響應信號為高電平,DHT11沒有響應,請檢查線路是否連接正常當最后bit數據傳送完畢后,DHT11拉低總線50us隨后總線由上拉電阻拉高進入空閑狀態。


   50us開始,持續70us表示高電平1

50us開始,持續26~28代表發送低電平0



4.2    發送一位數據:
MCU:
//總線空閑狀態為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。
推挽輸出模式:
//發送起始信號,先拉低電平,延時至少18ms再拉高
DHT11_SEND_DATA=0;
Delay_ms(18);
DHT11_SEND_DATA=1;

//DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平響應信號。主機發送開始信號結束后,延時等待20-40us后, 讀取DHT11的響應信號。
              Delay_us(20);     //延時20us
DHT11_Input( );   //切換IO口為輸入模式
u8 DHT11_Ack(void)
{

              if(DHT11_REV_DATA!=0)  //如果沒有檢測到低電平的應答信號就返回0
              {
                            return 0;
              }
              while(DHT11_REV_DATA==0);//等待80us低電平應答結束

              while(DHT11_REV_DATA==1);//等待80us高電平應答結束
                        //很有必要檢測高低電平,防止時序出錯

              return 1;                       檢測到高電平,說明信號不是應答信號,返回1
}

讀取從機發送過來的數據,以8位為單位接收
u8 DHT11_Read_Byte(void)
{
              u8 data=0;
              u8 i;
              //接受數據,每個數據以50us低電平開始
              for(i=0;i<8;i++)
              {
                            data <<= 1;              //左移一位,空位補0.
                            while(!DHT11_REV_DATA);  //當低電平結束,等待準備數據的時間過去,消除影響
                            Delay_us(40); //延時40us,卡時序,卡在低電平已經過,高電平還沒結束
                            if(DHT11_REV_DATA==1)//如果還是高電平說明從機確實發送了高電平
                         //就算是低電平了也不會影響時序。
                            {
                                          data |=1;              //‘1’如果是高電平就將左移的一個空位
                                          while(DHT11_REV_DATA);//等待高電平應答結束
                            }
              }
              return data;
}
5          實戰代碼5.1    引腳初始化。
void DHT11_Init(void)
{
              RCC->APB2ENR |=0x01<<3;
              DHT11_Input( );// DHT11 的DATA 引腳處于輸入狀態,時刻檢測外部信號
              Delay_ms(500);//DHT11 上電后要等待 1S 以越過不穩定狀態在此期間不能發送任何指令
              Delay_ms(500);
}

將輸出輸入模式另外整合成函數,方便調用
void DHT11_Output(void)
{
              GPIOB->CRL &=~(0x0f<<12);
              GPIOB->CRL |=(0x03<<12);
}

void DHT11_Input(void)
{
              GPIOB->CRL &=~(0x0f<<12);
              GPIOB->CRL |=(0x04<<12);
}

5.2    發送起始信號
void DHT11_Start(void)
{
              DHT11_SEND_DATA=0;
              Delay_ms(18);
              DHT11_SEND_DATA=1;
}
5.3    檢測應答信號
//返回值 0--無應答  1--有應答
u8 DHT11_Ack(void)
{
              if(DHT11_REV_DATA!=0)
              {
                            return 0;
              }
              while(DHT11_REV_DATA==0);//等待80us低電平應答結束

              while(DHT11_REV_DATA==1);//等待80us高電平應答結束

              return 1;
}
5.4    讀取一個字節數據
u8 DHT11_Read_Byte(void)
{
              u8 data=0;
              u8 i;
              //接受數據,每個數據以50us低電平開始
              for(i=0;i<8;i++)
              {
                            data <<= 1;
                            while(!DHT11_REV_DATA);//等待
                            Delay_us(40);
                            if(DHT11_REV_DATA==1)
                            {
                                          data |=1;//‘1’
                                          while(DHT11_REV_DATA);//等待高電平應答結束
                            }
              }
              return data;
}
5.5    最終函數
//讀取溫濕度

u8 DHT11_Read_Data(u8 *Temp_H,u8* Temp_L,u8* RH_H,u8* RH_L)
//注意這里是址傳遞
{
              u8 i;
              u8 check;

              DHT11_Output( );
              DHT11_Start( );
              Delay_us(20);
              DHT11_Input( );//切換為輸入
              if( DHT11_Ack( )==0 )
              {
                            return -1;
              }

              //讀取數據,分開讀40個字節,調用5次讀取函數
              *RH_H=DHT11_Read_Byte( );
              *RH_L=DHT11_Read_Byte( );
              *Temp_H=DHT11_Read_Byte( );
              *Temp_L=DHT11_Read_Byte( );
              check=DHT11_Read_Byte( );            

              //結束讀取
              Delay_ms(50);
              DHT11_Output( );//切換為輸出
              DHT11_SEND_DATA=1;//釋放總線

              //校驗數據
              if(check !=(*Temp_H+*Temp_L+*RH_H+*RH_L) )
              {
                            return -2;
              }

              return 0;

}




全部資料51hei下載地址:
02-驅動DHT11(STM32F103為例).zip (932.55 KB, 下載次數: 99)


評分

參與人數 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:18591 發表于 2019-1-20 20:07 | 只看該作者
感謝分享~~~~~~~~~~~~~~~~~~~~~~~~
回復

使用道具 舉報

板凳
ID:445069 發表于 2019-2-20 15:53 | 只看該作者
非常有用,學習了。深入了解DHT11內部的原理,而不僅僅是使用DHT11。
回復

使用道具 舉報

地板
ID:699392 發表于 2021-5-20 03:05 | 只看該作者
接收數據那,感覺時序圖不一樣
見有的資料是低電平10~14us后,讀出數據0
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91久久夜色 | 91精品国产综合久久久久久丝袜 | 欧美一区二区三区在线播放 | 久久av一区二区三区 | 亚洲精品一区二区另类图片 | 久久蜜桃精品 | 亚洲精品成人av久久 | 亚洲精品一区二区在线观看 | 欧美在线视频一区二区 | 国产精品视频一区二区三区 | www.久久.com | 久久国产精品视频 | 久久久精品视频一区二区三区 | 久久99深爱久久99精品 | 国产成人免费 | 国产国产精品久久久久 | 国产精品永久免费观看 | 欧美精品一区二区在线观看 | 欧美日韩不卡在线 | 97人人澡人人爽91综合色 | 国产欧美一区二区久久性色99 | 国产成人综合亚洲欧美94在线 | 伊人伊人网 | 欧美日韩国产高清 | 日韩视频免费看 | 在线看亚洲 | 羞羞的视频在线观看 | 伊人精品一区二区三区 | 99伊人网| 久久中文一区二区 | 中文在线观看视频 | www.一区二区三区 | 爱草视频 | 成人在线一区二区三区 | 中文字幕高清免费日韩视频在线 | 精品一二区 | 国产精品久久一区二区三区 | 日韩视频在线观看一区二区 | 在线视频 中文字幕 | 一区二区三区 在线 | 亚洲视频www |