仅作逻辑参考,代码随便敲的,难免遗漏个括号分号什么的.
#define Range 5 //采样值范围(因为每次采样都有细小的波动)小于这个值则认为值无变化
u8 FlagSample = 0; //采样标志.
u8 FlagChange = 0; //在采样时间内采样值是否有变化标志
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) //如果相等则继续
{
continue;
}else if(First_Adc_Value > Value) //如果首次采样大于期间采样
{
if(First_Adc_Value - Value < Range) //如果两者相差小于设定范围
{
continue; //则认为二者相等,继续循环.
}else //否则(两者相差大于5)则认为值有变化
{
FlagSample = 0; //关掉采样标志
Timer = 0; //定时清0,方便下次使用
FlagChange = 1; //将有变化标志置1,表示有变化
break;
}
}else if(First_Adc_Value < Value) //如果首次采样小于期间采样
{
...我就不写了...照着上面依次类推就好了....
}
}
if(FlagChange == 1)
{
输出值变了
}else
{
输出值没变
}
}
}
void T0_ISR() interrupt 1 定时器中断函数,假设是1ms中断
{
....
.....
if(FlagSample == 1)
{
Timer ++;
if(Timer >= 10000) // 10秒
{
Timer = 0;
FlagSample = 0;
}
}else
{
Timer = 0;
}
} |