本帖最后由 cov0xt 于 2016-1-7 17:41 编辑
我已找到问题所在,对于草率做出的结论,表示惭愧……
只使用单片机定时器,并同时启用多个定时器,是不会相互干扰,并能够准确计时的!
请看如下代码:
//定时器初始化
void TimerInit()
{
//晶振=12MHz
//90C516RD+ 是12T的
//时钟周期=1/12
//机器周期=12 * 1/12 = 1us
//T0和T1都是16位定时器
TMOD=0x11;
//定时器0设置成50ms=50000us(用于走秒)
//(65536-50000)/256=60=0x3C
TH0=0x3C;
//(65536-50000)%256=176=0xB0
TL0=0xB0;
//定时器1设置成1ms=1000us(用于显示)
//(65536-1000)/256=252=0xFC
TH1=0xFC;
//(65536-1000)%256=24=0x18
TL1=0x18;
//T0设置为抢占优先级
PT0=1;
//T0和T1启动
TR0=1;
TR1=1;
//T0和T1允许启动
ET0=1;
ET1=1;
//中断总开关开启
EA=1;
//定时器0计数器清零
timer0Counter=0;
}
之前得出错误的结论,是因为没有设置抢占优先级。
单片机默认优先级,一个中断或定时器,不论优先级高低,都会先运行完一个,再运行另一个。
优先级的高低,只会影响准备进入中断或定时器的顺序。
单片机可以设置为抢占优先级模式,最关键的一句话就是PT0=1;
就是因为这几个字母,程序效果有了翻天覆地的变化!
抢占优先级模式就是,在其他中断或定时器正在运行的时候,另一个具有抢占优先级的中断或定时器可以打断它,提前运行。
PT0 表示 定时器0 的抢占优先级,所有中断/定时器的抢占优先级默认为0,设置成1,就可以打断别的中断了。
现在的走秒程序,人已经感觉不出来了误差了……
========
附加提示:
许多人以为,设置 IP(中断优先级控制寄存器),跟如下的默认优先级是一回事:
interrupt 0 -> INT 0
interrupt 1 -> Timer 0
interrupt 2 -> INT 1
interrupt 3 -> Timer 1
interrupt 4 -> UART
interrupt 5 -> Timer 2
interrupt 6 -> INT 2
interrupt 7 -> INT 3
其实不对,以上的默认优先级,你是改不了的。
设置IP,是附加另一套优先级规则,来改变最终的优先级顺序结果。
PX0 ~ PX3, PT0 ~ PT2 等,都只能设置0或1,表示是否抢占。默认值都是0。
在设置为0的时候,优先级还是按照默认优先级顺序来运行。
|