|
現(xiàn)在是100毫秒讀取一次傳感器的值,但是在讀取期間,大量的延時操作會阻塞中斷函數(shù)的Key_slow_down按鍵消抖計時操作
能設(shè)置中斷優(yōu)先級解決嗎,或者是設(shè)置兩個定時器、兩個中斷,在觸發(fā)中斷時會互相影響嗎
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 以越過不穩(wěn)定狀態(tài)在此期間無需發(fā)送任何指令
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的響應(yīng)信號
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不存在,則不必進(jìn)行下面步驟
{
for(j=0;j<5;j++)//一次完整的數(shù)據(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])// 校驗數(shù)據(jù)是否正確,若不正確則數(shù)組全部寫1
{
Hum_Tem_Data[0]=0xff;
Hum_Tem_Data[1]=0xff;
Hum_Tem_Data[2]=0xff;
Hum_Tem_Data[3]=0xff;
}
}else
{
DHT11_Start();
}
}
|
|