本帖最后由 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的时候,优先级还是按照默认优先级顺序来运行。
|