本帖最后由 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温湿度值输出显示
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 温湿度值显示
|