定时与中断系统

来源:互联网 发布:java 字符数组赋值 编辑:程序博客网 时间:2024/05/01 14:15

Q: 用单片机定时器/计数器设计一个秒表,由P1口连接的LED采用BCD码显示,发光二极管亮表示0,暗则表示1。计满60s后从头开始,依次循环。

 A:

定时器T0工作于定时方式1,产生1s的定时,程序类似于实训5步骤1),这里不

再重复。定时器T1工作在方式2,当1s时间到,由软件复位T1P3.5)脚,产生负跳变,再由定时器T1进行计数,计满60次(1分种)溢出,再重新开始计数。

按上述设计思路可知:

方式寄存器TMOD的控制字应为:61H

定时器T1的初值应为:256 - 60 = 196 = C4H

其源程序可设计如下:

    ORG       0000H

                            MOV      TMOD#61H            T0方式1定时,T1方式2计数

                            MOV      TH1#0C4H           T1置初值

                            MOV      TL1#0C4H

                            SETB      TR1                             ;启动T1

DISP          MOV      A#00H                   ;计数显示初始化

                    MOV      P1A

       CONT        ACALL   DELAY

CLR        P3.5                             T1引脚产生负跳变

                            NOP

NOP

SETB      P3.5                             T1引脚恢复高电平

                      INC        A                                 ;累加器加1

                            DA         A                                 ;将16进制数转换成BCD

MOV      P1A                          ;点亮发光二极管

                            JBC        TF1DISP                  ;查询T1计数溢出

SJMP      CONT                          60s不到继续计数

DELAY      MOV      R3#14H                 ;置50ms计数循环初值

                          MOV      TH0#3CH                 ;置定时器初值

                          MOV      TL0#0B0H                             

                          SETB      TR0                             ;启动T0

LP1            JBC        TF0LP2                ;查询计数溢出

                          SJMP      LP1                             ;未到50ms继续计数

LP2            MOV      TH0#3CH             ;重新置定时器初值

                          MOV      TL0#0B0H

                          DJNZ      R3LP1                      ;未到1s继续循环

                          RET                                           ;返回主程序

                          END

    通过本节叙述可知,定时器/计数器既可用作定时亦可用作计数,而且其应用方式非常灵活;同时还可看出,软件定时不同于定时器定时(也称硬件定时)。软件定时是对循环体内指令机器数进行计数,定时器定时是采用加法计数器直接对机器周期进行计数。二者工作机理不同,置初值方式也不同,相比之下定时器定时在方便程度和精确程度上都高于软件定时;此外,软件定时在定时期间一直占用CPU,而定时器定时如采用查询工作方式,一样占用CPU,如采用中断工作方式,则在其定时期间CPU可处理其它指令,从而可以充分发挥定时器/计数器的功能,大大提高CPU的效率。

中断是通过硬件来改变CPU的运行方向。计算机在执行程序的过程中,当出现CPU以外的某种情况,由服务对象向CPU发出中断请求信号,要求CPU暂时中断当前程序的执行而转去执行相应的处理程序,待处理程序执行完毕后,再继续执行原来被中断的程序。这种程序在执行过程中由于外界的原因而被中间打断的情况称为“中断”。

“中断”之后所执行的相应的处理程序通常称之为中断服务或中断处理子程序,原来正常运行的程序称为主程序。主程序被断开的位置(或地址)称为“断点”。引起中断的原因,或能发出中断申请的来源,称为“中断源”。中断源要求服务的请求称为“中断请求”(或中断申请)。

调用中断服务程序的过程类似于调用子程序,其区别在于调用子程序在程序中是事先安排好的;而何时调用中断服务程序事先却无法确定,因为“中断”的发生是由外部因素决定的,程序中无法事先安排调用指令,因此,调用中断服务程序的过程是由硬件自动完成的。

中断的特点

1)分时操作

中断可以解决快速的CPU与慢速的外设之间的矛盾,使CPU和外设同时工作。CPU在启动外设工作后继续执行主程序,同时外设也在工作,每当外设做完一件事就发出中断申请,请求CPU中断它正在执行的程序,转去执行中断服务程序(一般情况是处理输入输出数据),中断处理完之后,CPU恢复执行主程序,外设也继续工作。这样,CPU可启动多个外设同时工作,大大地提高了CPU的效率。

       2)实时处理

在实时控制中,现场的各种参数、信息均随时间和现场而变化。这些外界变量可根据要求随时向CPU发出中断申请,请求CPU及时处理,如中断条件满足,CPU马上就会响应进行相应的处理,从而实现实时处理。

3)故障处理

针对难以预料的情况或故障,如掉电、存储出错、运算溢出等,可通过中断系统由故障源向CPU发出中断请求,再由CPU转到相应的故障处理程序进行处理。

中断源

通常,计算机的中断源有如下几种:

1)一般的输入输出设备。如键盘、打印机等,它们通过接口电路向CPU发出中断请求。

2)实时时钟及外界计数信号。如定时时间或计数次数一到,则向CPU发出中断请求。

3)故障源。当采样或运算结果溢出或系统掉电时,可通过报警、掉电等信号向CPU发出中断请求。

4)为调试程序而设置的中断源。调试程序时,为检查中间结果或寻找问题所在,往往要求设置断点或进行单步工作(一次执行一条指令),这些人为设置的中断源的申请与响应均由中断系统来实现。 

中断系统的功能

1)实现中断响应和中断返回

CPU 收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急、更重要的工作,则在执行完当前指令后响应这一中断请求。CPU中断响应过程如下:首先,将断点处的PC值(即下一条应执行指令的地址)推入堆栈保留下来,这称为保护断点,由硬件自动执行。然后,将有关的寄存器内容和标志位状态推入堆栈保留下来,这称为保护现场,由用户自己编程完成。保护断点和现场后即可执行中断服务程序,执行完毕,CPU由中断服务程序返回主程序,中断返回过程如下:首先恢复原保留寄存器的内容和标志位的状态,这称为恢复现场,由用户编程完成。然后,再加返回指令RETIRETI指令的功能是恢复PC值,使CPU返回断点,这称为恢复断点。恢复现场和断点后,CPU将继续执行原主程序,中断响应过程到此为止.

2)实现优先权排队

通常,系统中有多个中断源,当有多个中断源同时发出中断请求时,要求计算机能确定哪个中断更紧迫,以便首先响应。为此,计算机给每个中断源规定了优先级别,称为优先权。这样,当多个中断源同时发出中断请求时,优先权高的中断能先被响应,只有优先权高的中断处理结束后才能响应优先权低的中断。计算机按中断源优先权高低逐次响应的过程称优先权排队,这个过程可通过硬件电路来实现,亦可通过软件查询来实现。

3)实现中断嵌套

CPU响应某一中断时,若有优先权高的中断源发出中断请求,则CPU能中断正在进行的中断服务程序,并保留这个程序的断点(类似于子程序嵌套),响应高级中断,高级中断处理结束以后,再继续进行被中断的中断服务程序,这个过程称为中断嵌套。如果发出新的中断请求的中断源的优先权级别与正在处理的中断源同级或更低时,CPU不会响应这个中断请求,直至正在处理的中断服务程序执行完以后才能去处理新的中断请求。

 

中断处理过程

中断处理过程可分为中断响应、中断处理和中断返回三个阶段。不同的计算机因其中断系统的硬件结构不同,因此,中断响应的方式也有所不同。这里,仅以8051单片机为例进行叙述。

1)中断响应

中断响应是CPU对中断源中断请求的响应,包括保护断点和将程序转向中断服务程序的入口地址(通常称矢量地址)。CPU并非任何时刻都响应中断请求,而是在中断响应条件满足之后才会响应。

1)中断响应条件    

CPU响应中断的条件有:

a.有中断源发出中断请求。

b.中断总允许位EA = 1

c.申请中断的中断源允许。

满足以上基本条件,CPU一般会响应中断,但若有下列任何一种情况存在,则中断响应会受到阻断。

aCPU正在响应同级或高优先级的中断。

b.当前指令未执行完。

c.正在执行RETI中断返回指令或访问专用寄存器IEIP的指令。

若存在上述任何一种情况,中断查询结果即被取消,CPU不响应中断请求而在下一机器周期继续查询,否则,CPU在下一机器周期响应中断。

CPU在每个机器周期的S5P2期间查询每个中断源,并设置相应的标志位,在下一机器周期S6期间按优先级顺序查询每个中断标志,如查询到某个中断标志为1,将在再下一个机器周期S1期间按优先级进行中断处理。

    2)中断响应过程

中断响应过程包括保护断点和将程序转向中断服务程序的入口地址。首先,中断系统通过硬件自动生成长调用指令(LACLL),该指令将自动把断点地址压入堆栈保护(不保护累加器A、状态寄存器PSW和其它寄存器的内容),然后,将对应的中断入口地址装入程序计数器PC(由硬件自动执行),使程序转向该中断入口地址,执行中断服务程序。MCS-51系列单片机各中断源的入口地址由硬件事先设定,分配如下:

中断源                    入口地址

      外部中断0                    0003H

定时器T0中断                000BH

外部中断1                    0013H

定时器T1中断                          001BH

串行口中断                               0023H

使用时,通常在这些中断入口地址处存放一条绝对跳转指令,使程序跳转到用户安排的中断服务程序的起始地址上去。

采用定时器T1中断,其中断入口地址为001BH,中断服务程序名为CONT,因此,指令形式为:

ORG       001BH                       T1中断入口

AJMP     CONT                   ;转向中断服务程序

2.中断处理

    中断处理就是执行中断服务程序。中断服务程序从中断入口地址开始执行,到返回指令“RETI”为止,一般包括两部分内容,一是保护现场,二是完成中断源请求的服务。

通常,主程序和中断服务程序都会用到累加器A、状态寄存器PSW及其它一些寄存器,当CPU进入中断服务程序用到上述寄存器时,会破坏原来存储在寄存器中的内容,一旦中断返回,将会导致主程序的混乱,因此,在进入中断服务程序后,一般要先保护现场,然后,执行中断处理程序,在中断返回之前再恢复现场。

编写中断服务程序时还需注意以下几点:

1)各中断源的中断入口地址之间只相隔8个字节,容纳不下普通的中断服务程序,因此,在中断入口地址单元通常存放一条无条件转移指令,可将中断服务程序转至存储器的其它任何空间。

2)若要在执行当前中断程序时禁止其它更高优先级中断,需先用软件关闭CPU中断,或用软件禁止相应高优先级的中断,在中断返回前再开放中断。

3)在保护和恢复现场时,为了不使现场数据遭到破坏或造成混乱,一般规定此时CPU不再响应新的中断请求。因此,在编写中断服务程序时,要注意在保护现场前关中断,在保护现场后若允许高优先级中断,则应开中断。同样,在恢复现场前也应先关中断,恢复之后再开中断。

中断服务程序不与主程序共用累加器和任何寄存器,所以,无须保护现场,在程序中也就没有保护和恢复现场的指令。

3.中断返回

中断返回是指中断服务完后,计算机返回原来断开的位置(即断点),继续执行原来的程序。中断返回由中断返回指令RETI来实现。该指令的功能是把断点地址从堆栈中弹出,送回到程序计数器PC,此外,还通知中断系统已完成中断处理,并同时清除优先级状态触发器。特别要注意不能用“RET”指令代替“RETI”指令。

4.中断请求的撤除

CPU响应中断请求后即进入中断服务程序,在中断返回前,应撤除该中断请求,否则,会重复引起中断而导致错误。MCS-51各中断源中断请求撤消的方法各不相同,分别为:

1)定时器中断请求的撤除

对于定时器01溢出中断,CPU在响应中断后即由硬件自动清除其中断标志位TF0TF1,无需采取其它措施。

2)串行口中断请求的撤除

对于串行口中断,CPU在响应中断后,硬件不能自动清除中断请求标志位TIRI,必须在中断服务程序中用软件将其清除。

3)外部中断请求的撤除

外部中断可分为边沿触发型和电平触发型。

对于边沿触发的外部中断01CPU在响应中断后由硬件自动清除其中断标志位IE0IE1,无需采取其它措施。

对于电平触发的外部中断,其中断请求撤除方法较复杂。因为对于电平触发外中断,CPU在响应中断后,硬件不会自动清除其中断请求标志位IE0IE1,同时,也不能用软件将其清除,所以,在CPU响应中断后,应立即撤除 引脚上的低电平。否则,就会引起重复中断而导致错误。而CPU又不能控制 引脚的信号,因此,只有通过硬件再配合相应软件才能解决这个问题。

5.中断响应时间

中断响应时间是指从中断请求标志位置位到CPU开始执行中断服务程序的第一条指令所持续的时间。CPU并非每时每刻对中断请求都予以响应,另外,不同的中断请求其响应时间也是不同的,因此,中断响应时间形成的过程较为复杂。以外部中断为例,CPU在每个机器周期的S5P2期间采样其输入引脚 端的电平,如果中断请求有效,则置位中断请求标志位IE0IE1,然后在下一个机器周期再对这些值进行查询,这就意味着中断请求信号的低电平至少应维持一个机器周期。这时,如果满足中断响应条件,则CPU响应中断请求,在下一个机器周期执行一条硬件长调用指令“LACLL”,使程序转入中断矢量入口。该调用指令执行时间是两个机器周期,因此,外部中断响应时间至少需要3个机器周期,这是最短的中断响应时间。

如果中断请求不能满足前面所述的三个条件而被阻断,则中断响应时间将延长。例如一个同级或更高级的中断正在进行,则附加的等待时间取决于正在进行的中断服务程序的长度。如果正在执行的一条指令还没有进行到最后一个机器周期,则附加的等待时间为1 ~ 3个机器周期(因为一条指令的最长执行时间为4个机器周期)。如果正在执行的指令是RETI指令或访问IEIE的指令,则附加的等待时间在5个机器周期之内(最多用一个机器周期完成当前指令,再加上最多4个机器周期完成下一条指令)。

若系统中只有一个中断源,则中断响应时间为3 ~ 8个机器周期。

 

Q: 将定时器T0扩展为外部中断源

A:

将定时器T0设定为方式2(自动恢复计数初值),TH0TF0的初值均设置为FFH,允许T0中断,CPU开放中断,源程序如下:

                            MOV      TMOD#06H                    

                            MOV      TH0#0FFH

                            MOV      TL0#0FFH

                                   SETB      TR0

                                   SETB      ET0

                                   SETB      EA

                                  

    当连接在T0P3.4)引脚的外部中断请求输入线发生负跳变时,TL01溢出,TF01,向CPU发出中断申请,同时,TH0的内容自动送至TL0使TL0恢复初值。这样,T0引脚每输入一个负跳变,TF0都会置1,向CPU请求中断,此时,T0脚相当于边沿触发的外部中断源输入线。

同样,也可将定时器T1扩展为外部中断源。