MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期[1]。无论是哪一种原因引起的误差,在精确定时的应用场合,必须考虑它们的影响,以确保精确的定时控制。根据定时中断的不同应用情况,应选择不同的精确定时编程方法。
文中以定时器T1工作在定时方式1为例,晶振频率为12MHz。
1 方法1
在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个定时周期的精确重装载值时,考虑了由停止计数(CLR TR1)到重新启动计数(SETB TR1)之间的7个机器周期时间。程序中#LOW(-1000+7)和#HIGH(-1000+7)是汇编符号,分别表示-1000+7=0FC1FH这个立即数的低位字节(1FH)和高位字节(0FCH)。
CLR EA ;禁止所有中断
CLR TR1 ;停止定时器T1
MOV A,#LOW(-1000+7) ;期望数的低位字节
ADD A,TL1 ;进行修正
MOV TL1,A ;重装载低位字节
MOV A,#HIGH(-1000+7) ;对高位字节处理
ADDC A,TH1
MOV TH1,A
SETB TR1 ;重启动定时器
SETB EA ;重开中断
此方法适用于各种原因造成的定时误差的情况,为通用方法。
2 方法2
假如定时周期为10ms,通常定时器重装载值为0D8F0H,中断子程序如下[2]:
ORL TL1,#0F0H
MOV TH1,#0D8H
这里用ORL TL1,#0F0H代替MOV TL1,#0F0H 可提高定时精度。此方法只适用于重装载值低位字节的低4位为零,且中断响应的延迟时间小于16个机器周期的情况。类似的定时器重装载值有0FFF0H,0FFE0H等。
3 方法3
假如定时周期为1ms,通常定时器重装载值为0FC18H,中断子程序如下:
MOV A,#LOW(-1000+4) ;期望数的低位字节
ADD A,TL1
MOV TL1,A
MOV A,#HIGH(-1000+4) ;对高位字节处理
ADDC A,TH1
MOV TH1,A
DEC TL1 ;恢复提前了的2个机器周期
这种方法中不停止定时器计数过程,若在执行指令ADDC A,TH1 或MOV TH1,A时,恰好产生TL1溢出向TH1进位的情况,则TH1的值就不对了,会产生更大的误差。为此,程序段开头为重装载值加4,若有溢出进位,则可提前发生,其中2个机器周期是考虑到为TL1重装载占用的时间。
此方法适用于系统中无其它更高优先级中断源的情况。若类似方法1,在程序段开
上一篇:开发51单片机操作系统时应注意哪些问题
下一篇:51单片机矩阵式键盘的编程方法
设计资源 培训 开发板 精华推荐
- STA333ML声音终端2通道无微高效数字音频系统典型应用
- 带有外部 PNP 饱和开关的 NCV33063A 电压反相转换器的典型应用
- LT1170IQ、-5.2/5A 负降压转换器的典型应用
- AT89S52最小系统V2.0
- 使用 Richtek Technology Corporation 的 RT8567A 的参考设计
- EV1HMC1120LP4、HMC1120LP4E 射频集成电路评估板
- 使用 ROHM Semiconductor 的 BD4738 的参考设计
- 小电视天气时钟
- 基于L7983PU33R的3.3V / 0.3A降压DC/DC转换器(VIN = 3.5 V至60 V)
- 温度万年历