void DHT11_int(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //使能GPIOE时钟
DHT11_output() ;
}
void DHT11_input(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//PA0 通道0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//模拟输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;//不带上下拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
}
void DHT11_output(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_SetBits(GPIOE, GPIO_Pin_6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//PA0 通道0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//模拟输入
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;//不带上下拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
}
uint8_t DHT11_read_bitdat(void)
{
uint8_t i;
uint8_t dat;
for(i=0;i<8;i++)
{
dat<<=1;
while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_6))
while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_6)==0)
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_6))
{
delay_us(30);
}
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_6))
dat|=1;
}
return dat;
}
uint8_t DHT11_read(uint8_t *humi,uint8_t *temp)
{
int retry=0;
uint8_t i;
uint8_t buf[5];
GPIO_ResetBits(GPIOE, GPIO_Pin_6);
delay_ms(30);
GPIO_SetBits(GPIOE, GPIO_Pin_6);
delay_us(40);
DHT11_input();
while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_6))
{
delay_us(80);
retry++;
if(retry>10)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
return 1;
}
}
retry=0;
while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_6)==0)
{
delay_us(80);
retry++;
if(retry>10)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
return 1;
}
}
for(i=0;i<5;i++)
{
buf[ i]=DHT11_read_bitdat();
}
DHT11_output();
if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
{
*humi = buf[0];
*temp = buf[2];
return 0;
}
return 1;
}
|