如题,解决方法如下:
1.将原来的void DHT11_Rst(void)函数改为如下,防止delay_ms(20)发生任务调度,打断DHT11读写时序 ;
void DHT11_Rst(void)
{
int i;
DHT11_IO_OUT(); //SET OUTPUT
DHT11_DQ_OUT=0; //拉低DQ
// delay_ms(20); //拉低至少18ms 防止用实时系统发生任务调度影响DHT11读写时序
for(i=0;i<2000;i++)
delay_us(1);
DHT11_DQ_OUT=1; //DQ=1
delay_us(30); //主机拉高20~40us
}
2.在调用DHT11_Read_Data()函数的地方用临界段保护,防止其他中断打断DHT11读写时序;
// 温湿度任务
_DHT11 Temp_Humi;
static void dht11_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
while(1)
{
OS_CRITICAL_ENTER(); //进入临界区
DHT11_Read_Data(&Temp_Humi);
OS_CRITICAL_EXIT(); //退出临界区
OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_PERIODIC,&err);//延时100ms
}
}
3.亲测可用,不过数值误差比较大。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>