STC8G1A,用 T0 工作模式为“不可屏蔽中断的16位自动重载模式”,按说这个模式的中断间隔最稳定了。
代码如下:
TMOD = 0x03; // 设定 T0的工作模式
AUXR = 0;// 设定 T0 为12 分频
g_Cnt10ms = 0;
TL0 = 0;
TH0 = 0XDC;
TR0=1; //启动T0
ET0 = 1; //允许T0 的中断
EA = 1; //允许总中断
中断服务程序如下:
void TM0_Isr() interrupt 1
{
if (g_Cnt10ms <= 10000UL)
g_Cnt10ms++; //stop timing when it has been longer than 100s
}
主程序中,每当 g_Cnt10ms 超过 1000 就做一次动作,并将 g_Cnt10ms 清零。
反复尝试后发现:大部分动作都是 10s 做一次,但每隔4、5次,就会有一次只等了 7、8s,有时甚至会连续两次只等 7、8s。
如果改成:每当 g_Cnt10ms 超过 1500 就做一次动作。那么刚才说的 10s 就变成 15s,7、8s就变成12s左右。因此能断定确实是 T0 中断自身不稳定。
整个程序很简单,没有其它代码。
也怀疑过是引脚受干扰,导致 T0 把干扰当成了计数信号,额外多触发了中断。但是,TMOD 里已经设定了 T0 是定时器,不是计数器。
求启发,谢谢!
|