You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:53:37