本帖最后由 jinglixixi 于 2020-8-29 09:01 編輯
DHT22是一種單總線的數字式溫濕度傳感器,它共有3個引腳,只需占用一個GPIO口接口工作。 通過這條總線既靠它發出指令,也靠它接收數據。此外,為了進行信號的識別,還需相應的時序配合。有了前面的I2C接口的基礎,就可以探索一下DHT22的驅動及溫濕度檢測。
1. DHT22溫濕度檢測 DHT22與MCU的連接關系為: DAT——PC12 其余兩個引腳則接3.3V工作電源
定義GPIO口讀取電位及輸出高低電平的語句為: #define DHT22_D0_H HT_GPIOC->SRR = GPIO_PIN_12 #define DHT22_D0_L HT_GPIOC->RR = GPIO_PIN_12 #define DHT22_D0_R GPIO_ReadInBit(HT_GPIOC, GPIO_PIN_12)
設置GPIO為輸入、輸出的函數為: - void DHT22_IO_IN(void)
- {
- AFIO_GPxConfig(GPIO_PC, GPIO_PIN_12, 0);
- GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_DOWN);
- GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DIR_IN);
- GPIO_InputConfig(HT_GPIOC, GPIO_PIN_12, ENABLE);
- }
-
- void DHT22_IO_OUT(void)
- {
- GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_DISABLE);
- GPIO_DriveConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DV_8MA);
- GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DIR_OUT);
- GPIO_InputConfig(HT_GPIOC, GPIO_PIN_12, ENABLE);
- }
復制代碼
DHT22讀取數據的函數為: - u8 DHT22_Read_Data(u16 *temp,u16 *humi)
- {
- u8 buf[5];
- u8 i;
- DHT22_Rst();
- if(DHT22_Check()==0)
- {
- for(i=0;i<5;i++)
- {
- buf[i]=DHT22_Read_Byte();
- }
- if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
- {
- *humi=(buf[0]*256+buf[1]);
- *temp=(buf[2]*256+buf[3]);
- }
- } else return 1;
- return 0;
- }
復制代碼
實現圖1所示效果的主程序為: - int main(void)
- {
- u8 senflag;
- SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
- SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000000);
- SYSTICK_IntConfig(ENABLE);
-
- HT32F_DVB_OUT_Init();
- HT_GPIOD->RR = GPIO_PIN_0;
- Delayms(100);
- UxART_Configuration();
- senflag=DHT22_Init();
- if(senflag) gHelloString[3] = '1';
- else gHelloString[3] = '0';
- UxART_TxTest();
- while(1)
- {
- if(!senflag)
- {
- DHT11_Read_Data(&temperature,&humidity);
- gHelloString[2] = temperature/100+'0';
- gHelloString[3] = temperature%100/10+'0';
- gHelloString[5] = temperature%10+'0';
- gHelloString[10] = humidity/100+'0';
- gHelloString[11] = humidity%100/10+'0';
- gHelloString[13] = humidity%10+'0';
- }
- Delayus(2000000);
- }
- }
復制代碼
1.jpg (41.28 KB, 下載次數: 64)
下載附件
2020-8-29 08:56 上傳
圖1溫濕度值輸出顯示
2.LCD屏顯示溫濕度值 顯示溫濕度值得主程序為: - int main(void)
- {
- u8 senflag;
-
- SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
- SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000000);
- SYSTICK_IntConfig(ENABLE);
-
- HT32F_DVB_OUT_Init();
- HT_GPIOD->RR = GPIO_PIN_0;
-
- Delayms(100);
- LCD_Init();
- LCD_Config();
- LCD_BackColorSet(Black);
- LCD_TextColorSet(Yellow);
- senflag=DHT22_Init();
- if(senflag) LCD_StringLineDisplay8(Line0, " NO SEN!");
- else LCD_StringLineDisplay8(Line0, " SEN OK!");
- LCD_StringLineDisplay8(Line2, " Holtek");
- LCD_StringLineDisplay8(Line3, " HT32 Series F1654 ");
- LCD_StringLineDisplay8(Line4, " LCD DHT22 Example ");
- LCD_StringLineDisplay8(Line6, " T= . C");
- LCD_StringLineDisplay8(Line7, " H= . %");
- while(1)
- {
- if(!senflag)
- {
- DHT11_Read_Data(&temperature,&humidity);
- LCD_ShowNum(Line6,100,temperature/10,3);
- LCD_ShowNum(Line6,140,temperature%10,1);
- LCD_ShowNum(Line7,100,humidity/10,3);
- LCD_ShowNum(Line7,140,humidity%10,1);
- }
- Delayus(2000000);
- }
- }
復制代碼
下載后,其執行效果如圖2所示。
2.jpg (27.68 KB, 下載次數: 59)
下載附件
2020-8-29 08:56 上傳
圖2 溫濕度值顯示
|