關(guān)于DHT11
DHT11是一款數(shù)字溫濕度傳感器,DHT11是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有可靠的穩(wěn)定性,響應(yīng)快,抗干擾能力強(qiáng)。傳感器包括一個(gè)高分子電阻式感濕元件和一個(gè)NTC測溫元件,并與一個(gè)高性能8位單片機(jī)相連接,通過單總線與微處理器通訊,只需要一根線。
相關(guān)參數(shù)
1、DHT11數(shù)據(jù)結(jié)構(gòu)
DHT11數(shù)字濕溫度傳感器采用單總線數(shù)據(jù)格式。即,單個(gè)數(shù)據(jù)引腳端口完成輸入輸出雙向傳輸。其數(shù)據(jù)包由5Byte(40Bit)組成。數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說明。
一次完整的數(shù)據(jù)傳輸為40bit,高位先出。
數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bit溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗(yàn)和
校驗(yàn)和數(shù)據(jù)為前四個(gè)字節(jié)相加。
傳感器數(shù)據(jù)輸出的是未編碼的二進(jìn)制數(shù)據(jù)。數(shù)據(jù)(濕度、溫度、整數(shù)、小數(shù))之間
應(yīng)該分開處理。如果,某次從傳感器中讀取如下5Byte數(shù)據(jù):
由以上數(shù)據(jù)格式可以得到溫濕度計(jì)算方法
humi (濕度)= byte4 . byte3=45.0 (%RH)
temp (溫度)= byte2 . byte1=28.0 ( ℃)
jiaoyan(校驗(yàn))= byte4+ byte3+ byte2+ byte1=73(=humi+temp)(校驗(yàn)正確)
2、DHT11傳輸數(shù)據(jù)時(shí)序
主機(jī)發(fā)送開始信號后,延時(shí)等待 20us-40us 后讀取 DH11T 的回應(yīng)信號,讀取總線為低電平,說明 DHT11 發(fā)送響應(yīng)信號,DHT11 發(fā)送響應(yīng)信號后,再把總線拉高,準(zhǔn)備發(fā)送數(shù)據(jù),每一 bit 數(shù)據(jù)都以低電平開始。
3、DHT11的數(shù)字“0”和數(shù)字“1”表示方法
DHT11的數(shù)字0和數(shù)字1表示方式和常見的不同,一般的數(shù)據(jù)表示0的是低電平,表示1的是高電平,DHT11不同,開始傳輸數(shù)據(jù)之后他數(shù)字0的表示方式是高電平26-28us,數(shù)字1的表示方式是高電平116-118us。

代碼篇
本次實(shí)驗(yàn)定義的IO口是PB11,傳輸?shù)臄?shù)據(jù)是串口一
1、主機(jī)發(fā)送開始信號到DHT11即單片機(jī)拉低18ms之后再拉高20-40us
static void DHT11_Rst(void)
{
GPIO_SETOUT(); //配置成輸出模式
GPIO_ResetBits(DHT11_IO,DHT11_PIN); //拉低數(shù)據(jù)線
Delay_ms(20); //拉低至少18ms
GPIO_SetBits(DHT11_IO,DHT11_PIN); //拉高數(shù)據(jù)線
Delay_us(30); //主機(jī)拉高20~40us
GPIO_ResetBits(DHT11_IO,DHT11_PIN);
}
2、DHT11發(fā)送響應(yīng)信號到主機(jī)(32單片機(jī)),DHT11的數(shù)據(jù)線會(huì)拉低40-50us的,在拉高40-50us,讓單片機(jī)的IO口檢測信號。
函數(shù)名:static u8 DHT11_Check(void)
參數(shù)說明:無
返回值:檢測到回應(yīng)-- >返回1,否則0
函數(shù)作用:檢測DHT11的響應(yīng)信號
***********************************************/
static u8 DHT11_Check(void)
{
u8 retry=0;
GPIO_SETIN(); //設(shè)置為輸入模式
while (!GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry< 100)//DHT11會(huì)拉低40~50us
{
retry++;
Delay_us(1);
}
if(retry >= 100) //超時(shí)未響應(yīng)/未收到開始信號,退出檢測
return 0;
else
retry = 0;
while (GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry< 100)//DHT11拉低后會(huì)再次拉高40~50us
{
retry++;
Delay_us(1);
}
if(retry >=100) //超時(shí),DHT11工作出錯(cuò),退出檢測
return 0;
return 1; //設(shè)備正常響應(yīng),可以正常工作
}
3、DHT11開始傳輸數(shù)據(jù)給單片機(jī),這有兩個(gè)傳輸數(shù)據(jù)的函數(shù),一個(gè)是傳輸字節(jié)的,在由傳輸字節(jié)的函數(shù)來寫傳輸一個(gè)8位字符串的函數(shù)。
函數(shù)名:static u8 DHT11_Read_Bit(void)
參數(shù)說明:無
返回值:返回從DHT11上讀取的一個(gè)Bit數(shù)據(jù)
函數(shù)作用:從DHT11上讀取一個(gè)Bit數(shù)據(jù)
***********************************************/
static u8 DHT11_Read_Bit(void)
{
u8 retry = 0;
//DHT11的Bit開始信號為12-14us低電平
while(GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry< 100)//等待變?yōu)榈碗娖?等待Bit開始信號)
{
retry++;
Delay_us(1);
}
retry = 0;
while(!GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry< 100)//等待變高電平(代表數(shù)據(jù)開始傳輸)
{
retry++;
Delay_us(1);
}
Delay_us(30);//等待30us
//0信號為26-28us,1信號則為116-118us,所以說超過30us去讀取引腳狀態(tài)就可以知道傳輸?shù)闹盗?/span>
if(GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN)) return 1;
else return 0;
}
/***********************************************************************
函數(shù)名:static u8 DHT11_Read_Byte(void)
參數(shù)說明:無
返回值:返回從DHT11上讀取的一個(gè)byte數(shù)據(jù)
函數(shù)作用:從DHT11上讀取一個(gè)byte數(shù)據(jù)
************************************************************************/
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數(shù)據(jù)采集完畢之后通過主函數(shù)在串口顯示出來
函數(shù)名:int main(void)
參數(shù)說明:無
返回值:無
函數(shù)作用:主函數(shù)
***************************************************************************/
int main(void)
{
clock_init();
uart_init(115200); //初始化串口
printf("wecome to DHT11");
//初始化DHT11(有BUG,第一次上電總是失敗,按一下復(fù)位按鈕又能進(jìn)了)
if(!DHT11_Init()){
printf("rn EEROR! THE DHT11 HAS NO RESPOND...");
//while(1);
}
printf("rn THE DHT11 HAS RESPOND");
Delay_ms(10); //這里延時(shí)10ms主要是因?yàn)椋瑒倓偨邮盏巾憫?yīng)信息,要等DHT11發(fā)送完信息
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...");//由于是庫函數(shù)編程,不能準(zhǔn)確把握函數(shù)的執(zhí)行時(shí)間,
//所以會(huì)經(jīng)常出現(xiàn)這條警告信息
Delay_ms(100);
}
}
接線和實(shí)驗(yàn)結(jié)果


總結(jié)
DHT11是性價(jià)比較高的一個(gè)溫濕度模塊,用串口來顯示溫濕度來說比較直觀,長期發(fā)布此類文章,喜歡的點(diǎn)個(gè)關(guān)注吧。
-
傳感器
+關(guān)注
關(guān)注
2577文章
55150瀏覽量
792049 -
串口
+關(guān)注
關(guān)注
15文章
1622瀏覽量
82967 -
DHT11
+關(guān)注
關(guān)注
19文章
278瀏覽量
59756
發(fā)布評論請先 登錄
基于arduino的dht11溫濕度傳感器的使用
STM32F103試用體驗(yàn):LCD顯示與DHT11測量實(shí)驗(yàn)
DHT11溫濕度數(shù)據(jù)的采集
基于STM32開發(fā)板實(shí)現(xiàn)傳感數(shù)據(jù)采集-DHT11溫濕度采集
如何通過STM32采集DHT11的數(shù)據(jù)將溫濕度信息顯示帶LCD及虛擬串口上?
請問STM32F103C8T6如何通過DHT11獲取溫濕度數(shù)據(jù)?
STM32F103ZET6主控開發(fā)板的學(xué)習(xí)記錄
基于51單片機(jī)+DHT11溫濕度+LCD1602顯示
stm32獲取DHT11模塊溫濕度數(shù)據(jù)原理解析
STM32實(shí)例——基于STM32開發(fā)板實(shí)現(xiàn)傳感數(shù)據(jù)采集-DHT11溫濕度采集
MSP432 P401R 單片機(jī) 讀取DHT11 串口發(fā)送溫濕度 OLED顯示溫濕度 溫濕度檢測
使用STM32F103ZET6采集DHT11溫濕度串口顯示
使用STM32F103ZET6采集DHT11溫濕度串口顯示
評論