PIC12F675的TIMER1中断计时偏差:预期5秒实际6秒
问题分析与解决方案
你的问题出在中断函数里的计数判断逻辑上,咱们一步步拆解清楚:
首先,你的Timer1每次溢出是0.5秒,原本想通过累计10次溢出实现5秒计时,但代码里的判断条件if(count>10)导致计数多了两次,最终变成了6秒。
具体逻辑走一遍:
- 初始时
static unsigned char count=0 - 第1次中断:
count>10?0>10不成立,执行count++,count变成1 - 第2次中断:1>10不成立,count变成2
- ...
- 第11次中断:此时count是10,10>10还是不成立,执行
count++,count变成11 - 第12次中断:11>10成立,才会翻转LED并把count清零
这就导致一共触发了12次Timer1溢出,12×0.5秒=6秒,和你仿真的结果完全对应。
修正方法
把判断条件改成count == 10或者count >= 10就行,这样当累计到10次溢出时就触发LED翻转:
void interrupt int_tmr1(void) { if((PIE1&(1<<0))&&(PIR1&(1<<0))) //TMR1 OVERFLOW CONDITION { static unsigned char count=0; if(count == 10) { // 修改判断条件 GPIO^=(1<<0); //TOGGLE LED count=0; } else { count++; } PIR1&=~(1<<0); //CLEAR TMR1 INTERRUPT OVER FLOW FLAG } }
这样第10次中断时,count会从9变成10,满足count==10的条件,直接翻转LED并清零,刚好是10×0.5秒=5秒,符合你的预期。
内容的提问来源于stack exchange,提问作者Gehad Mohamed
相关产品推荐
相关产品推荐

