僅作邏輯參考,代碼隨便敲的,難免遺漏個括號分號什么的.
#define Range 5 //采樣值范圍(因為每次采樣都有細小的波動)小于這個值則認為值無變化
u8 FlagSample = 0; //采樣標志.
u8 FlagChange = 0; //在采樣時間內(nèi)采樣值是否有變化標志
u16 Timer = 0; //計時變量
u16 First_Adc_Value = 0; //首次采樣值
u16 Value = 0; //其他采樣值
u16 Get_Adc_Value() //ADC采樣,返回值為采樣值
{
..........
}
main()
{
.....
.....
if(需要采樣)
{
FlagSample = 1;
First_Adc_Value = Get_Adc_Value(); //首次采樣
while(FlagSample == 1)
{
Value = Get_Adc_Value();
FlagChagnge = 0; //清值變化標志
if(Value == First_Adc_Value) //如果相等則繼續(xù)
{
continue;
}else if(First_Adc_Value > Value) //如果首次采樣大于期間采樣
{
if(First_Adc_Value - Value < Range) //如果兩者相差小于設(shè)定范圍
{
continue; //則認為二者相等,繼續(xù)循環(huán).
}else //否則(兩者相差大于5)則認為值有變化
{
FlagSample = 0; //關(guān)掉采樣標志
Timer = 0; //定時清0,方便下次使用
FlagChange = 1; //將有變化標志置1,表示有變化
break;
}
}else if(First_Adc_Value < Value) //如果首次采樣小于期間采樣
{
...我就不寫了...照著上面依次類推就好了....
}
}
if(FlagChange == 1)
{
輸出值變了
}else
{
輸出值沒變
}
}
}
void T0_ISR() interrupt 1 定時器中斷函數(shù),假設(shè)是1ms中斷
{
....
.....
if(FlagSample == 1)
{
Timer ++;
if(Timer >= 10000) // 10秒
{
Timer = 0;
FlagSample = 0;
}
}else
{
Timer = 0;
}
} |