本帖最后由 jinglixixi 于 2020-6-7 18:55 编辑
DHT22是一种单总线的数字式温湿度传感器,它共有3个引脚,只需占用一个GPIO口接口工作。 DHT22与MCU的连接关系为: DAT——PB12 其余两个引脚则接3.3V工作电源 定义GPIO口读取电位及输出高低电平的语句为: #define DHT11_D0_H GPIO_SetPinLevel(GPIOB, GPIO_PIN12, GPIO_LEVEL_HIGH) // PB12 #define DHT11_D0_L GPIO_SetPinLevel(GPIOB, GPIO_PIN12, GPIO_LEVEL_LOW) #define DHT11_D0_R GPIO_GetPinLevel(GPIOB, GPIO_PIN12) 设置GPIO为输入、输出的函数为: void DHT11_IO_IN(void)
{
GPIO_SetDir(GPIOB, GPIO_PIN12, GPIO_IN);
}
void DHT11_IO_OUT(void)
{
GPIO_SetDir(GPIOB, GPIO_PIN12, GPIO_OUT);
}
DHT22的初始化函数为: u8 DHT11_Init(void)
{
GPIO_SetFunc(GPIOB, GPIO_PIN12, GPIO_FUN0);
DHT11_Rst();
return DHT11_Check();
}
DHT22读取数据的函数为: u8 DHT22_Read_Data(u8 *temp,u8 *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])/10;
*temp=(buf[2]*256+buf[3])/10;
}
}else return 1;
return 0;
}
实现图示效果的主程序为: int main(void)
{
u8 senflag;
InitDelay();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AC8701",16);
OLED_ShowString(0,2,"DHT22 TEST",16);
OLED_ShowString(0,4," C %RH",16);
senflag=DHT11_Init();
if(senflag) OLED_ShowString(64,0,"NO SEN!",16);
else OLED_ShowString(64,0,"SEN OK!",16);
while(1)
{
if(!senflag)
{
DHT11_Read_Data(&temperature,&humidity);
OLED_ShowNum(0,4,temperature,2,16);
OLED_ShowNum(32,4,humidity,2,16);
}
mdelay(500);
}
}
DHT22温湿度检测效果
|