最近要使用DHT22做一个小项目,也这个论坛找了很多关于DHT22的帖子,可是就是不成功,求各位大神请教一下。
这是我的程序:
void DHT11IOsetOUT()
{
RCC->APB2ENR|=1<<2;
GPIOC->CRL&=0XF0FFFFFF;
GPIOC->CRL|=0X03000000;
// GPIOA->ODR|=0X01;
}
void DHT11IOsetIN ()
{
RCC->APB2ENR|=1<<2;
GPIOC->CRL&=0XF0FFFFFF;
GPIOC->CRL|=0X08000000;
// GPIOA->IDR|=0X01;
}
u8 get ()
{
u8 U8comdata=0;
u8 m;
for (m=0;m<8;m++)
{
flag=2;
DHT11IOsetIN ();
while ((!DIN)&&flag++);
delay_us (20);
U8temp=0;
if (DIN) U8temp=1;
flag=2;
while (DIN&&flag++);
if (flag==1) break;
U8comdata=U8comdata<<1;
U8comdata|=U8temp;
}
// DHT11IOsetOUT();
return U8comdata;
}
u8 Rdata (u8 *temp,u8 *wet)
{
u8 RH_datatemp_H,RH_datatemp_L,T_datatemp_H,T_datatemp_L,checkdata,checktemp;
u8 RH_data_H,RH_data_L,T_data_H,T_data_L;
DHT11IOsetOUT();
DOUT=0;
delay_ms (18);
DOUT=1;
delay_us (30);
DHT11IOsetIN ();
if (!(DIN))
{
flag=2;
while ((!DIN)&&flag++);
flag=2;
while (DIN&&flag++);
RH_datatemp_H=get ();;
RH_datatemp_L=get ();;
T_datatemp_H=get ();;
T_datatemp_L=get ();;
checkdata=get ();;
DHT11IOsetOUT();
DOUT=1;
checktemp=RH_datatemp_H+RH_datatemp_L+T_datatemp_H+T_datatemp_L;
if (checktemp==checkdata)
{
RH_data_H=RH_datatemp_H;
RH_data_L=RH_datatemp_L;
T_data_H=T_datatemp_H;
T_data_L=T_datatemp_L;
*temp=T_data_H;
*wet=RH_data_H;
return 1;
}
}
return 0;
}
while (1)
{
Rdata(&temperature,&wetness); //DHT11读取数据
POINT_COLOR=BLACK;
LCD_Show2Num (30,50,temperature,2,16,0);
LCD_Show2Num (30,70,wetness,2,16,0);
delay_ms(2000);
}
按照DHT22的时序来说,这个程序没有问题啊,可是为什么不行呢?求大神请教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>