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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13869|回復(fù): 3
收起左側(cè)

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

[復(fù)制鏈接]
ID:237239 發(fā)表于 2018-10-13 17:44 | 顯示全部樓層 |閱讀模式
發(fā)圖片很麻煩,在附件有完整的代碼,有需要下載來看吧~~

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

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

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

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


   50us開始,持續(xù)70us表示高電平1

50us開始,持續(xù)26~28代表發(fā)送低電平0



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

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

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

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

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

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

將輸出輸入模式另外整合成函數(shù),方便調(diào)用
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    發(fā)送起始信號
void DHT11_Start(void)
{
              DHT11_SEND_DATA=0;
              Delay_ms(18);
              DHT11_SEND_DATA=1;
}
5.3    檢測應(yīng)答信號
//返回值 0--無應(yīng)答  1--有應(yīng)答
u8 DHT11_Ack(void)
{
              if(DHT11_REV_DATA!=0)
              {
                            return 0;
              }
              while(DHT11_REV_DATA==0);//等待80us低電平應(yīng)答結(jié)束

              while(DHT11_REV_DATA==1);//等待80us高電平應(yīng)答結(jié)束

              return 1;
}
5.4    讀取一個字節(jié)數(shù)據(jù)
u8 DHT11_Read_Byte(void)
{
              u8 data=0;
              u8 i;
              //接受數(shù)據(jù),每個數(shù)據(jù)以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);//等待高電平應(yīng)答結(jié)束
                            }
              }
              return data;
}
5.5    最終函數(shù)
//讀取溫濕度

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;
              }

              //讀取數(shù)據(jù),分開讀40個字節(jié),調(diào)用5次讀取函數(shù)
              *RH_H=DHT11_Read_Byte( );
              *RH_L=DHT11_Read_Byte( );
              *Temp_H=DHT11_Read_Byte( );
              *Temp_L=DHT11_Read_Byte( );
              check=DHT11_Read_Byte( );            

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

              //校驗(yàn)數(shù)據(jù)
              if(check !=(*Temp_H+*Temp_L+*RH_H+*RH_L) )
              {
                            return -2;
              }

              return 0;

}


0.png

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


評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:18591 發(fā)表于 2019-1-20 20:07 | 顯示全部樓層
感謝分享~~~~~~~~~~~~~~~~~~~~~~~~
回復(fù)

使用道具 舉報

ID:445069 發(fā)表于 2019-2-20 15:53 | 顯示全部樓層
非常有用,學(xué)習(xí)了。深入了解DHT11內(nèi)部的原理,而不僅僅是使用DHT11。
回復(fù)

使用道具 舉報

無效樓層,該帖已經(jīng)被刪除
ID:699392 發(fā)表于 2021-5-20 03:05 | 顯示全部樓層
接收數(shù)據(jù)那,感覺時序圖不一樣
見有的資料是低電平10~14us后,讀出數(shù)據(jù)0
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 操久久| 国产91亚洲精品 | 国产一级电影在线观看 | 国产一区二区在线视频 | 国产精品久久久久久久久污网站 | 日韩中文一区二区三区 | 男人天堂99 | 午夜丰满寂寞少妇精品 | 亚洲精品久久久久久国产精华液 | 国产亚洲一级 | 亚洲精品天堂 | 亚洲国产成人久久综合一区,久久久国产99 | 亚洲一二三区精品 | 久久精品国产久精国产 | 欧美激情视频一区二区三区在线播放 | 精品在线观看入口 | 日韩欧美一区二区在线播放 | 国产免费麻豆视频 | 一a一片一级一片啪啪 | 91玖玖| 亚洲狠狠| 亚洲成人www | 91看片免费版 | 亚洲精品一区在线 | 99综合 | 成人福利在线 | 午夜影院污 | 羞羞在线视频 | 国产精品国产三级国产aⅴ原创 | 99久9| 亚洲欧美在线视频 | 免费啪啪 | 一区二区三区四区免费视频 | 羞羞视频在线观看 | 日韩精品一区二区三区在线播放 | 古装人性做爰av网站 | 人人精品 | 日本国产欧美 | 天天操欧美 | 日韩羞羞 | 国产成人99久久亚洲综合精品 |