问题描述
我正在为 ATmega32 编写 DHT11 接口,但由于某种原因,在这部分的某个 while 循环中收到响应后,它保持读取逻辑高
if(dio_GetPinValue(DHT11_PORT,DHT11_PIN)==1)
{
SET_BIT(ReceivedData[Loc_u8ByteCount],Loc_u8ReceivedBitCount); /* then its logic HIGH */
/*wait until low again for next bit */
while(dio_GetPinValue(DHT11_PORT,DHT11_PIN)); //IT GET STUCK HERE
}
为什么会这样? dio 驱动程序和 LCD 库已检查并正常工作,因此没有问题 而且我还没有写校验和函数 我还检查了硬件并对 Arduino UNO DHT11 库进行了测试,它运行良好所以问题出在代码上。这是完整的代码
u8* pu8InitAndReceiveData(void)
{
/* 0-Decale Some variables*/
u8 ReceivedData[5]={0};
/* 1-Start THE DHT11 From Low-power-consumption Mode to Running Mode*/
/*Make the Pin OUTPUT to send start signal*/
dio_SetPinDirection(DHT11_PORT,DHT11_PIN,OUTPUT);
/*send high to make the DHT11 Ready to receive LOW (Start Signal starts with LOW)*/
dio_SetPinValue(DHT11_PORT,HIGH);
_delay_ms(10);
/*Send Start Signal*/
dio_SetPinValue(DHT11_PORT,LOW);
_delay_ms(18); // Waiting time
dio_SetPinValue(DHT11_PORT,HIGH); //after about 20-40 us the DHT11 Should response
_delay_us(35); //wait until the DHT11 detects the start signal and starts to responce
/* 2-receive response from DHT11 to make sure that it is converted into Running-mode */
/*Make the Pin INPUT to receive response signal*/
dio_SetPinDirection(DHT11_PORT,INPUT);
while(dio_GetPinValue(DHT11_PORT,DHT11_PIN)==1); //make sure DHT11 send LOW
while(dio_GetPinValue(DHT11_PORT,DHT11_PIN)==0); //DHT11 will send low for about 80us
while(dio_GetPinValue(DHT11_PORT,DHT11_PIN)==1); //then will send high for about 80us
/* 3-receive 40bit Data From the DHT11*/
for (u8 Loc_u8ByteCount=0; Loc_u8ByteCount<5; Loc_u8ByteCount++)
{
for (u8 Loc_u8ReceivedBitCount=7; Loc_u8ReceivedBitCount>=0; Loc_u8ReceivedBitCount--)
{
/*Each bit Starts with 50us LOW*/
while(dio_GetPinValue(DHT11_PORT,DHT11_PIN)==0);
/*if Zero bit: it will be high for 26-28us,else if One Bit: it will be high for 40us*/
_delay_us(40);
if(dio_GetPinValue(DHT11_PORT,DHT11_PIN)); //IT GET STUCK HERE
}
else
{
CLR_BIT(ReceivedData[Loc_u8ByteCount],Loc_u8ReceivedBitCount);
}
} //END Inner for
} //END Outer For
/* 4-Back To default for the next readings*/
/*Make the Pin OUTPUT*/
dio_SetPinDirection(DHT11_PORT,OUTPUT);
/*send high until the next Reading operation*/
dio_SetPinValue(DHT11_PORT,HIGH);
return ReceivedData;
} //END Func
void DHT11_GetValues(void)
{
u8 * pu8OinterToReceivedArray=0;
pu8OinterToReceivedArray = pu8InitAndReceiveData();
Integer_Humidty=pu8OinterToReceivedArray[0] ; /* store first eight bit as Integer humidity*/
Decimal_Humidty=pu8OinterToReceivedArray[1] ; /* store next eight bit as Decimal humidity */
Integer_Temp=pu8OinterToReceivedArray[2] ; /* store next eight bit in Integer Temperature*/
Decimal_Temp=pu8OinterToReceivedArray[3] ; /* store next eight bit in Decimal Temperature */
Check_Sum=pu8OinterToReceivedArray[4] ;/* store next eight bit in CheckSum */
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)