關(guān)于DHT11
DHT11是一款數(shù)字溫濕度傳感器,DHT11是一款含有已校準數(shù)字信號輸出的溫濕度復合傳感器。它應用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有可靠的穩(wěn)定性,響應快,抗干擾能力強。傳感器包括一個高分子電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接,通過單總線與微處理器通訊,只需要一根線。
相關(guān)參數(shù)
1、DHT11數(shù)據(jù)結(jié)構(gòu)
DHT11數(shù)字濕溫度傳感器采用單總線數(shù)據(jù)格式。即,單個數(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校驗和
校驗和數(shù)據(jù)為前四個字節(jié)相加。
傳感器數(shù)據(jù)輸出的是未編碼的二進制數(shù)據(jù)。數(shù)據(jù)(濕度、溫度、整數(shù)、小數(shù))之間
應該分開處理。如果,某次從傳感器中讀取如下5Byte數(shù)據(jù):
由以上數(shù)據(jù)格式可以得到溫濕度計算方法
humi (濕度)= byte4 . byte3=45.0 (%RH)
temp (溫度)= byte2 . byte1=28.0 ( ℃)
jiaoyan(校驗)= byte4+ byte3+ byte2+ byte1=73(=humi+temp)(校驗正確)
2、DHT11傳輸數(shù)據(jù)時序
主機發(fā)送開始信號后,延時等待 20us-40us 后讀取 DH11T 的回應信號,讀取總線為低電平,說明 DHT11 發(fā)送響應信號,DHT11 發(fā)送響應信號后,再把總線拉高,準備發(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。

代碼篇
本次實驗定義的IO口是PB11,傳輸?shù)臄?shù)據(jù)是串口一
1、主機發(fā)送開始信號到DHT11即單片機拉低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); //主機拉高20~40us
GPIO_ResetBits(DHT11_IO,DHT11_PIN);
}
2、DHT11發(fā)送響應信號到主機(32單片機),DHT11的數(shù)據(jù)線會拉低40-50us的,在拉高40-50us,讓單片機的IO口檢測信號。
函數(shù)名:static u8 DHT11_Check(void)
參數(shù)說明:無
返回值:檢測到回應-- >返回1,否則0
函數(shù)作用:檢測DHT11的響應信號
***********************************************/
static u8 DHT11_Check(void)
{
u8 retry=0;
GPIO_SETIN(); //設(shè)置為輸入模式
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; //設(shè)備正常響應,可以正常工作
}
3、DHT11開始傳輸數(shù)據(jù)給單片機,這有兩個傳輸數(shù)據(jù)的函數(shù),一個是傳輸字節(jié)的,在由傳輸字節(jié)的函數(shù)來寫傳輸一個8位字符串的函數(shù)。
函數(shù)名:static u8 DHT11_Read_Bit(void)
參數(shù)說明:無
返回值:返回從DHT11上讀取的一個Bit數(shù)據(jù)
函數(shù)作用:從DHT11上讀取一個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上讀取的一個byte數(shù)據(jù)
函數(shù)作用:從DHT11上讀取一個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,第一次上電總是失敗,按一下復位按鈕又能進了)
if(!DHT11_Init()){
printf("rn EEROR! THE DHT11 HAS NO RESPOND...");
//while(1);
}
printf("rn THE DHT11 HAS RESPOND");
Delay_ms(10); //這里延時10ms主要是因為,剛剛接收到響應信息,要等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ù)編程,不能準確把握函數(shù)的執(zhí)行時間,
//所以會經(jīng)常出現(xiàn)這條警告信息
Delay_ms(100);
}
}
接線和實驗結(jié)果


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