现在是100毫秒读取一次传感器的值,但是在读取期间,大量的延时操作会阻塞中断函数的Key_slow_down按键消抖计时操作
能设置中断优先级解决吗,或者是设置两个定时器、两个中断,在触发中断时会互相影响吗
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
if(++Key_slow_down==10) Key_slow_down=0;
if(++DHT11_slow_down==100) DHT11_slow_down=0;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
void DHT11_Start(void)
{
Delay_s(1);//传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令
DHT11_DataPin_Init(MCU_Output);//IO口输出模式
GPIO_SetBits(GPIOA,GPIO_Pin_10);
GPIO_ResetBits(GPIOA,GPIO_Pin_10);
Delay_ms(20);//拉低总线必须大于18毫秒,保证DHT11能检测到起始信号
GPIO_SetBits(GPIOA,GPIO_Pin_10);
Delay_us(30);//延时等待20-40us后,读取DHT11的响应信号
DHT11_DataPin_Init(MCU_Input);//IO口输入模式
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0)
{
DHT11_exist_Plag=1;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==1);
}
}
/****
*@brief DHT11温湿度测量
*@parameter 无
*@ReturnValue 无
*/
void DHT11_GetData(void)
{
int8_t i,j,Temp=0x00;
if(DHT11_exist_Plag==1)// 检测DHT11是否存在,若DHT11不存在,则不必进行下面步骤
{
for(j=0;j<5;j++)//一次完整的数据传输为40bit,高位先出
{
for(i=0;i<8;i++)
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0);
Delay_us(30);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==1)
{
Temp=Temp|(0x80>>i);// 从高位开始接收
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==1);
}
}
Hum_Tem_Data[j]=Temp;
Temp=0x00;
}
if(Hum_Tem_Data[0]+Hum_Tem_Data[1]+Hum_Tem_Data[2]+Hum_Tem_Data[3]!=Hum_Tem_Data[4])// 校验数据是否正确,若不正确则数组全部写1
{
Hum_Tem_Data[0]=0xff;
Hum_Tem_Data[1]=0xff;
Hum_Tem_Data[2]=0xff;
Hum_Tem_Data[3]=0xff;
}
}else
{
DHT11_Start();
}
}
|