功能描述:程序运行正常时Radio Shield UNO 板子上的红灯(P06)会1s翻转一次,同时OLED和串口会打印温湿度数据 eg. T&H: 30, 86。
1、屏蔽宏:TIMER_DELAY、TIMER_REFINE,运行在阻塞延时模式(使用halMcuMicroWait()延时),
使用halMcuMicroWait(20); 延时20ms后,使用下下面的函数计时,主要是获取40bit数据;
static void vGetTemHuiData(void)
{
uint8 i =0;
uint8 Counter =1;
while(!HAL_DHT11_IO && Counter++);
while(HAL_DHT11_IO && Counter++);//响应信号
if(!HAL_DHT11_IO && Counter >1)//first bit
{
for(i = 0; i < HAL_DHT11_DATA_BITS; i++)
{
Counter=1;
while((!HAL_DHT11_IO) && (Counter++)); //低电平
Counter=1;
while((HAL_DHT11_IO) && Counter++); //高电平,可以分辨是1还是0
if(Counter>50) //50是根据下面的打印取的平均值
HalOneBusAddBit(1);
else
HalOneBusAddBit(0);
// buff = Counter;
if(u8RxBitIdx >= HAL_DHT11_DATA_BITS)
{
onebusState = ONEBUS_UNINIT;
u8RxBitIdx =0;
if(HalOneBus_Check()) //校验
{
HalLcdWriteStringValueValue("T&H", u8SensorValueBuff[2], 10, u8SensorValueBuff[0], 10, 3);
printf("T&H: %d, %d\n", u8SensorValueBuff[2], u8SensorValueBuff[0]);
}
// for(i = 0; i < HAL_DHT11_DATA_BITS; i++)
// {
//
// printf("%03d ", buff);//打印1和0对应的Counter值
// if(i%8 == 7)
// printf("\n");
// }
// printf("\n");
}
}
}
}
2、添加宏:TIMER_DELAY,运行在定时器延时模式,但是读取DHT11数据时是延时模式,使用定时器延时18毫秒后采用static void vGetTemHuiData(void)获取40bit数据;
3、添加宏:TIMER_DELAY、TIMER_REFINE,运行在定时器模式,使用中断+定时器计数读取DHT11数据,使用定时器延时18毫秒后用定时器+IO中断的方式获取40bit数据,在DHT11产生下降沿的时候(IO中断)打开定时器,那么在下一bit开始的时候就可以知道前一个bit的时间了。