1、第6章 中断系统,中断技术是计算机中一项很重要的技术。中断系统的功能主要是为了解决快速CPU与慢速的外设间的矛盾,它由硬件和软件组成。有了中断系统能使计算机的功能更强、效率更高、使用更加方便灵活。本节将介绍单片机的中断系统、处理过程及其应用。,6.1 中断系统概述,1. 中断中断是指计算机在执行某一程序的过程中, 由于计算机系统内、 外的某种原因, 而必须中止原程序的执行, 转去执行相应的处理程序, 待处理结束之后, 再回来继续执行被中止的原程序的过程。 采用中断技术后的计算机, 可以解决CPU与外设之间速度匹配的问题, 使计算机可以及时处理系统中许多随机的参数和信息, 同时, 它也提高了计算
2、机处理故障与应变的能力。,2. 中断源中断源是指在计算机系统中向CPU发出中断请求的来源, 中断可以人为设定, 也可以是为响应突发性随机事件而设置。通常有I/O设备、实时控制系统中的随机参数和信息故障源等。 通常,计算机的中断源有如下几种:,(1) 一般的输入/输出设备。如键盘、打印机等,它们通过接口电路向CPU发出中断请求。(2) 实时时钟及外界计数信号。如定时时间或计数次数一到,在中断允许时,由硬件则向CPU发出中断请求。(3) 故障源。当采样或运算结果溢出或系统掉电时,可通过报警、掉电等信号向CPU发出中断请求。 (4) 为调试程序而设置的中断源。调试程序时,为检查中间结果或寻找问题所在
3、,往往要求设置断点或进行单步工作(一次执行一条指令),这些人为设置的中断源的申请与响应均由中断系统来实现。,3. 中断优先级中断优先级越高, 则响应优先权就越高。当CPU正在执行中断服务程序时, 又有中断优先级更高的中断申请产生, 这时CPU就会暂停当前的中断服务转而处理高级中断申请, 待高级中断处理程序完毕再返回原中断程序断点处继续执行, 这一过程称为中断嵌套。,4. 中断响应的过程(1) 在每条指令结束后, 系统都自动检测中断请求信号, 如果有中断请求,且CPU处于开中断状态下, 则响应中断。 (2) 保护现场, 在保护现场前, 一般要关中断, 以防止现场被破坏。保护现场一般是用堆栈指令将
4、原程序中用到的寄存器推入堆栈。(3) 中断服务, 即为相应的中断源服务。 (4) 恢复现场, 用堆栈指令将保护在堆栈中的数据弹出来, 在恢复现场前要关中断, 以防止现场被破坏。在恢复现场后应及时开中断。 (5) 返回, 此时 CPU将推入到堆栈的断点地址弹回到程序计数器, 从而使CPU继续执行刚才被中断的程序。,5.中断的特点(1) 分时操作中断可以解决快速的CPU与慢速的外设之间的矛盾,使CPU和外设同时工作。CPU在启动外设工作后继续执行主程序,同时外设也在工作。每当外设做完一件事就发出中断申请,请求CPU中断它正在执行的程序,转去执行中断服务程序(一般情况是处理输入/输出数据),中断处理
5、完之后,CPU恢复执行 主程序,外设也继续工作。这样,CPU可启动多个外设同时工作,大大地提高了CPU的效率。,(2) 实时处理在实时控制中,现场的各种参数、信息均随时间和现场而变化。这些外界变量可根据要求随时向CPU发出中断申请,请求CPU及时处理中断请求。如中断条件满足,CPU马上就会响应,进行相应的处理,从而实现实时处理。(3) 故障处理针对难以预料的情况或故障,如掉电、存储出错、运算溢出等,可通过中断系统由故障源向CPU发出中断请求,再由CPU转到相应的故障处理程序进行处理。,6.2 MCS-51单片机的中断系统,MCS-5l系列单片机有5个中断源,52子系列单片机有6个中断源。中断源
6、分为2个中断优先级,即高优先级和低优先级,每个中断源的优先级都可以由软件来设定。图6-1 MCS-51中断系统内部结构示意图 MCS-51的中断系统组成见图6-l所示。它由4个与中断有关的特殊功能寄存器TCON、SCON(TCON、SCON的相关位作中断源的标志位)、中断允许控制寄存器IE、中断优先级管理(IP寄存器)和中断顺序查询逻辑电路等组成。,(1)中断源:MCS-51单片机有五个中断源。其中、为外部中断源,其中断请求信号分别由P3.2、P3.3引脚输入,可选择低电平有效或下降沿有效(分别由和设置)。内部中断源有T0、T1溢出中断。串行口发送/接收共用一个中断源。 (2)中断请求标志:有
7、五个中断请求标志。标志位分别为IE0、IE1、TF0、TF1、TI/RI。 其中: IE0、IE1分别为和的中断标志。当外部中断输入信号有效,并将TCON中的IE0或IE1标志位置1,可向CPU申请中断。 TF0和TF1为定时器/计数器T0和T1的溢出中断标志。当T0或T1计数器加1计数产生溢出时,则将TCON中的TF0或TF1置位,向CPU申请中断。 RI和TI串行口的接收和发送中断标志。当串行口接收或发送完一帧数据时,将TCON中的RI或TI置位“1”,向CPU申请中断。,(3)中断允许:两级串联式中断允许。EA=1,开CPU中断;开某个中断源中断时,还需将对应中断源的中断允许位(EX0、
8、ET0、EX1、ET1、ES)置位。中断允许控制位存放在特殊功能寄存器IE中。 (4)中断优先级:MCS-51单片机中断分二级,即高级和低级。对于每个中断源均可通过中断优先级控制寄存器中的相应位控制,当某中断源的优先控制位置为“1”时,该中断源设置为高级,否则为低级。对于同级中断源,由内部硬件查询逻辑来确定响应次序。,(5)中断源的入口地址。不同中断源均有不同的中断矢量,当某中断源的中断请求被CPU响应之后,CPU将通过硬件自动地把相应中断源的中断入口地址(又称中断矢量地址)装入PC中,即从此地址开始执行中断服务程序。因此,使用时一般在此地址单元中存放一条跳转指令,当CPU响应中断时,使单片机
9、自动执行相应入口地址的跳转指令,然后再通过该跳转指令跳至到用户安排的中断服务程序的入口处。MCS-51单片机各中断源的矢量地址是固定的。中断源的入口地址分别为: 外部中断0中断: 0003H 最高级 T0定时器0中断: 000BH 外部中断1中断: 0013H T1定时器l中断: 001BH 串行口输入/输出中断: 0023H 最低级 定时器2中断: 002BH 最低级(52系列单片机中),6.3 MCS-5l单片机中断控制,MCS-5l单片机中断控制部分由4个专用寄存器组成。它们的功能分述如下。 6.3.1中断请求标志寄存器5个中断源的中断请求标志位以及定时器/计数器的控制位,均设置在定时控
10、制寄存器TCON和串行口控制寄存器SCON中。,其中TCON用于控制定时器/计数器的启、停和外部中断源的触发方式以及存放定时器的溢出中断标志和外部中断源的中断请求标志。其地址为88H,各位的定义为:,TFl和TF0:分别为定时器1和定时器0的溢出标志。当定时器计满产生溢出时,由硬件自动置“l”,并可申请中断。进入中断服务程序后,由硬件自动清0。这两位也可作为程序查询的标志位,在查询方式下应由软件来清0。,TRl和TR0:为定时器l和定时器0的启停控制位。当由软件将TRi清0后,可停止定时器的工作。将该位置“l”后,可启动定时器工作。 IEl和IE0:为外部中断、的中断请求标志位。当外部中断源有
11、请求时,对应的中断标志位置“1”。当CPU响应该中断后由硬件自动将其复位(清0)。 ITl和IT0:为外部中断1和外部中断0的触发方式选择位。ITi设置为0时,相应的外部中断为低电平触发方式;设置为“l”时,相应的外部中断为边沿触发方式。,若ITi=0,外部中断设置为低电平触发方式时,CPU在每个机器周期的S5P2期间对引脚采样。若测得为低电平,则认为有中断申请,随即将IEi标志位置位;若测得为高电平,认为无中断申请或中断申请已撤除,随即清除IEi标志位。使用时应注意,施加在相应引脚上的低电平在中断返回前必须撤消,否则将再次申请中断造成出错。即施加在引脚上的低电平持续时间应大于一个机器周期,且
12、小于中断服务程序的执行时间。,若ITi=l,外部中断设置为边沿触发方式时,CPU在每个机器周期的S5P2期间采样引脚,若在连续两个机器周期采样到先高后低的电平变化,则将IEi标志位置“1”,此标志一直保持到CPU响应中断时,才由硬件自动清除。在边沿触发方式中,为了保证CPU在两个机器周期内能够检测到由高至低跳变的电平,输入的高电平和低电平的持续时间均要保持12个振荡周期(即一个机器周期的时间)。,串行口的中断请求标志由串行口控制寄存器SCON的D0和Dl位来设置与查寻。 RI(SCON.0):接收中断标志位; TI(SCON.1):发送中断标志位。 单片机在发送数据过程中,当CPU将一个数据写
13、入发送缓冲器SBUF时,会自动启动发送。每发送完一帧数据后,由硬件自动将TI位置位。但CPU响应中断时,并不能自动清除TI位,所以必须由软件清除(使用时应注意)。,在串行口允许接收时,当一帧数据接收完毕,由硬件自动将RI位置位。同样CPU响应中断时不能自动清除RI位,必须由软件清除。 TCON和SCON均可逐位进行操作。MCS-51单片机系统复位后,TCON和SCON中各位均清0,应用时要注意各位的初始状态。,6.3.2中断开放和屏蔽,MCS-51单片机中,设有一个专用寄存器IE(称为中断允许寄存器)。其作用是用来对各中断源进行开放或屏蔽的控制。其各位的定义如下:,EA(IE.7)为CPU中断
14、总允许位。EA=l,CPU开放中断;EA=0,CPU禁止一切中断。当EA=l时,仅使CPU对所有的中断开放,但每个中断源被允许还是被屏蔽是由各自的允许位确定。 ES(IE.6)为串行口中断允许位。ES=1,允许串行口接收和发送中断;ES=0禁止串行口中断。 ET1(IE.3)为定时器1中断允许位。ET1=1,允许T1中断,否则禁止中断。 EX1(IE.2)为外部中断l的中断允许位。EX1=1允许外部中断l中断,否则禁止中断。 ET0(IE.1)为定时器0的中断允许位。ET0=1允许T0中断,否则禁止中断。EX0(IE.0)为外部中断0的中断允许位。EX0=1允许外部中断0中断,否则禁止中断。
15、ET2(IE.5)为定时器2中断允许位,仅用于52子系列单片机。ET2=1允许定时器2中断,否则禁止中断。,系统复位后,IE各位均为0,即禁止所有中断。IE寄存器可以进行字节寻址也可以进行位寻址。,6.3.3.中断优先级设定,MCS-51单片机的中断分为2个优先级,每个中断源的优先级都可以通过中断优先级寄存器IP中的相应位来设定。IP各位的定义如下:,IP.7和IP.6保留位。 PT2(IP.5)为定时器2优先级设定位,仅适用于52子系列单片机。PT2=l时,设定为高优先级,否则为低优先级。 PS(IP.4)为串行口优先级设定位。PS=1时,串行口为高优先级,否则为低优先级。 PTl(IP.3
16、)为定时器1优先级设定位。PTl=1时,T1为高优先级,否则为低先级。 PXl(IP.2)为外部中断1优先级设定位。PXl=1时,外部中断1为高优先级,否则为低优先级。 PT0(IP.1)为定时器0优先级设定位。PT0=1时,T0为高优先级,否则为低优先级。 PX0(IP.0)为外部中断0优先级设定位。PX0=1时,外部中断0为高优先级,否则为低优先级。,当系统复位后,IP各位均为0,所有中断源设置为低优级中断。IP也是一个可进行字节寻址和位寻址的专用寄存器。,6.3.4.中断管理,1.受IP寄存器控制,CPU将各中断源的优先级分为高低2级,并遵循以下2条基本原则: (1)低优先级中断源可以被
17、高优先级中断源中断,反之不能。 (2)一种中断(不管是什么优先级)一旦得到响应,与它同级的中断不能再中断它。 为了实现这2条规则,中断系统内部包含了2个不可寻址的“优先级激活”触发器。其中一个指示某高优级的中断正在得到服务,所有后来的中断都被阻断。另一个触发器指示某低优先级的中断正在得到服务,所有同级的中断都被阻断,但不阻断高优先级的中断。,2.当CPU同时收到几个同一优先级的中断请求时,按自然优先级顺序确定应该响应哪个中断请求;其自然优先级由硬件形成,排列如下:中断源 同级自然优先级外部中断0 最高级定时器0中断外部中断1 定时器1中断 串行口中断 最低级 定时器2中断 最低级(52系列单片
18、机中),3.中断响应的阻断 在中断处理过程中,若发生下列情况,中断响应会受到阻断: (1)同级或高优先级的中断正在进行中; (2)现在的机器周期不是执行指令的最后一个机器周期,即正在执行的指令还没完成前不响应任何中断; (3)正在执行的是中断返回指令RETI或是访问专用寄存器IE或IP的指令。CPU在执行RETI或读写IE或IP之后,不会马上响应中断请求,至少要在执行其它一条指令之后才会响应。 若存在上述任一种情况,中断查询结果就被取消。,6.3.5中断处理过程,中断处理过程分为三个阶段,即中断响应、中断处理和中断返回。由于不同的计算机有不同的中断系统硬件结构,其中断响应的方式也有所不同,在此
19、仅说明MCS-51单片机的中断处理过程,其流程图见图6-2。其中中断响应与中断返回由CPU硬件自动完成,而中断处理是由软件完成。,1.中断响应 (1)中断响应条件 CPU响应中断的条件有: 有中断源发出中断请求; )中断总允许位EA=1,即CPU开中断; 申请中断的中断源的中断允许位为l,即没有被屏蔽。 以上条件满足,一般CPU会响应中断,但在中断受阻断情况下,本次的中断请求CPU不会响应。,(2)中断响应的过程 如果中断响应条件满足,而且不存在中断受阻,CPU将响应中断。在此情况下,CPU首先使被响应中断的“优先级激活”触发器置位,以阻断同级和低级的中断。然后,根据中断源的类别,在硬件的控制
20、下内部自动形成长调用指令(LCALL),此指令的作用是:,首先自动将断点压入堆栈,但不自动保存PSW的内容。然后将对应中断源的矢量入口地址装入程序计数器PC,使程序执行该中断矢量入口地址的跳转指令,进而转至中断服务程序对应的入口地址。 在使用时,通常在矢量入口地址单元中存放一条跳转指令,使程序转移到用户安排的中断服务程序入口处。,2中断处理 CPU 响应中断结束后即转到中断服务程序的入口地址。从执行中断服务程序的第一条指令开始到执行RETI返回指令为止,这个过程称为中断处理或称中断服务。由于不同的中断源服务的内容及要求各不相同,其处理过程也有所区别。中断处理流程图见图6-2。中断处理包括两部分
21、内容:一是保护现场,二是为中断源服务。用户在编写中断服务程序时应注意以下几点:,(1)各中断源的入口矢量地址之间,只相隔8个单元,一般中断服务程序是容纳不下的,因而最常用的方法是将中断服务程序放置在程序存储器的其它空间,而在中断入口矢量地址单元处存放一条无条件转移指令,转至该中断服务程序。,(2)若要在执行当前中断程序时禁止更高优先级中断,应采用软件来关闭CPU中断,或屏蔽更高级中断源的中断,在中断返回前再开放这些中断。 (3)现场通常用到PSW、工作寄存器和专用寄存器等。如果在中断服务程序中要用这些寄存器,则在中断服务前应将它们的内容保护起来称保护现场,同时在RETI指令前应恢复现场。,(4
22、)在保护现场和恢复现场时,为了不使现场信息受到破坏或造成混乱,一般情况下,应关CPU中断,使CPU暂不响应新的中断请求。因此在编写中断服务程序时,保护现场之前要关中断,在保护现场之后若允许高优先级中断源中断它,则应开中断。同样在恢复现场之前也应关中断,恢复之后再开中断。,3中断返回中断处理程序的最后一条指令是中断返回指令RETI。它的功能是将断点弹出送回PC中,使程序返回到原来被中断的断点处,恢复执行被中断的程序。 MCS-51的RETI指令除了弹出断点之外,它还通知中断系统已完成中断处理,并将“优先级激活”触发器清零(该触发器在响应中断时被置位),4中断请求的撤除CPU响应中断请求后即进入中
23、断服务程序,在中断返回前,应撤除该中断请求,否则,会重复引起中断而导致错误。MCS-51各中断源中断请求撤消的方法各不相同,分别为:(1)定时器中断请求的撤除对于定时器0或1溢出中断,CPU在响应中断后即由硬件自动清除其中断标志位TF0或TF1,无需采取其它措施。,(2)串行口中断请求的撤除对于串行口中断,CPU在响应中断后,硬件不能自动清除中断请求标志位TI、RI,必须在中断服务程序中用软件将其清除。(3)外部中断请求的撤除外部中断可分为边沿触发型和电平触发型。对于边沿触发的外部中断0或1,CPU在响应中断后由硬件自动清除其中断标志位IE0或IE1,无需采取其它措施。,对于电平触发的外部中断
24、,其中断请求撤除方法较复杂。因为对于电平触发外中断,CPU在响应中断后,硬件不会自动清除其中断请求标志位IE0或IE1,同时,也不能用软件将其清除,所以,在CPU响应中断后,应立即撤除或引脚上的低电平。否则,就会引起重复中断而导致错误。而CPU又不能控制或引脚的信号,因此,只有通过硬件再配合相应软件才能解决这个问题。图6-3可行方案之一。,外部中断请求信号不直接加或引脚上,而是加在D触发器的CLK端。由于D端接地,当外部中断请求的正脉冲信号出现在CLK端时,Q端输出为0,或为低,外部中断向单片机发出中断请求。利用P1口的P1.0作为应答线,当CPU响应中断后,可在中断服务程序中采用两条指令:A
25、NL P1,#0FEHORL P1,#01H,来撤除外部中断请求。第一条指令使P1.0为0,因P1.0与D触发器的异步置1端SD相连,Q端输出为1,从而撤除中断请求。第二条指令使P1.0变为1, Q继续受CLK控制,即新的外部中断请求信号又能向单片机申请中断。第二条指令是必不可少的,否则,将无法再次形成新的外部中断。,6.4外部中断扩充方法,MCS-51单片机有2个外部中断请求输入端和,在实际应用时,若外部中断源有2个以上,则需要扩充外部中断源。本节介绍三种扩充外部中断源的方法。,6.4.1利用定时器扩充外部中断源法,MCS-51单片机有2个定时器T0、T1,对外部有对应的计数输入引脚。如果将
26、定时器设置为计数方式,工作于模式2,计数初值设为满量程FFH,这样一旦外部信号在计数器引脚上产生一个负跳变,计数器将加l产生溢出中断,转去处理扩充的外部中断源的请求。该定时器的溢出中断标志及中断服务程序可作为扩充的外部中断源的标志和中断服务程序。,6.4.2中断和查询结合法,该方法是利用MCS-51的两条外部中断输入线,在每一条中断输入线上通过线“或”关系连接多个外部中断源,同时利用输入端口线作为各中断源的识别线。具体线路见图6-3。图6-3中所示的4个外部装置通过集电极开路的OC门构成线“或”关系,四个装置的中断请求输入均通过发给CPU。无论哪一个外部装置提出中断请求,都会使引脚上的电平变低
27、。究竟是哪个外部装置申请中断,可以通过程序查询P1.0P1.3的逻辑电平获知。这4个中断源的优先级,是利用软件查询方式实现,其中装置1为最高级,装置4为最低级。软件查询时由最高至最低的顺序查询。,图6-4 多外部中断连接方法,有关中断服务程序的片断如下:ORG 0003H LJMP INTRP0 ; INT0中断服务程序入口 ORG 0203H INTRP0: PUSH PSW ;预而中断服务程序是一个中断查询程序 PUSH Acc JB P1.0,DVl JB P1.l,DV2 JB P1.2,DV3 JB P1.3,DV4 EXIT:POP A POP PSW RETI DVl: ,装置l
28、的中断服务程序 AJMP EXIT DV2: 装置2的中断服务程序 AJMP EXIT DV3: 装置3的中断服务程序 AJMP EXIT DV4: 装置4的中断服务程序 AJMP EXIT,6.4.3矢量中断扩充法,所谓矢量可以理解成一个地址信息。它的低8位由申请中断的外设(中断源)提供,高8位可由CPU提供。CPU采用这种方法形成中断服务程序的入口地址。与上述第二种方法相比,此种方法CPU响应中断时间快,处理及时。 下面以为例说明在MCS-5l中,如何利用两个外部中断、输入端实现矢量中断。设为低电平有效方式。实现矢量中,图6-5中有8个中断源,均为低电平有效;74LS148为8-3优先编码
29、器。外部8个中断源的中断请求分别接入74LS148的输入端。74LS148对8个中断源的申请进行优先权的排队,经排队后产生相应的矢量代码A2A0送至MCS-51的P1.2Pl.0。其中优先权最高,优先权最低。当有多个中断同时发生时,编码器只对优先权最高的中断源作出反应,并输出其矢量代码。任意一个中断源有请求均可通过148的输出端加到引脚上,向CPU发出中断请求。74LS148的真值见表6-1。,8个中断源对应的中断矢量见表6-2。,当响应的中断请求后,CPU通过读P1口就可以得到74LS148输出的中断矢量。但是,怎样根据该矢量进行相应的转移则是一个关键问题。由于MCS-51的中断矢量地址是固
30、定的,为0013H。因而,无论外部的中哪一个发生中断,CPU响应后首先要转向中断入口处。所以,只能利用的中断服务程序,采用多分支转移来处理各中断请求,即的中断服务程序需要编制引导程序、散转表、处理程序等三种程序段。另一方面应在0013H地址处安放转移指令指向引导程序,如:,ORG 0013H: LJMP INTB1 1散转表ORG 1000H 地址 INTAB: ljmp INTR7; 1000Hljmp INTR6; 1003Hljmp INTR5; 1006Hljmp INTR4; 1009Hljmp INTR3; 100cHljmp INTR2; 100fHljmp INTR1; 101
31、2Hljmp INTR0; 1015H,2引导程序功能:读P1.0、P1.1、p1.2口的内容,并形成一个16位地址,然后根据16位地址执行转移表中相应的转移指令。编程有两种方法。 方法一:利用堆栈实现转移。其程序片段为:ORG 1020h INTB1: PUSH PSWPUSH BPUSH Acc ;保护A的内容MOV A,P1 ;读取中断矢量ANL A,#00000111b ;屏蔽高五位MOV B,#03h ;将中断矢量转换成转移表中对应的MUL A,B ;转移指令所处的地址的低8位。PUSH Acc ;转移指令所处的地址的低8位入栈MOV A,#10h PUSH Acc ;转移指令的地址
32、高8位入栈RET ;返回,自动地执行转移表中对应的跳转指令。,方法二:利用散转程序实现转移。其程序片段为:ORG 1020h INTB1: PUSH PSWPUSH BPUSH Acc ;保护A的内容MOV A,P1 ;读取中断矢量ANL A,#00000111b MOV B,#03h ;将中断矢量转换成转移表中对应的MUL A,B ; 转移指令所处的地址的低8位。MOV DPTR,#INTAB JMP A+DPTR ;转移去执行转移表中对应的跳转指令,3INTR7INTR0的中断服务程序 INTR7: pop Accpop Bpop PSWreti,INTR6:pop Accpop Bpop
33、 PSW reti,INTR5: pop Accpop Bpop PSW reti INTR0:pop Accpop Bpop PSW reti,6.5中断系统的应用举例,从软件角度看,使用中断时需要做两个方面的任务:(1)按人们的意志对中断源进行管理和控制。(2)编制中断服务程序。,中断源管理和控制(初始化程序)程序一般都包含在主程序中,根据需要通过几条指令来完成。中断服务程序是一种具有特定功能的独立程序段,根据中断源的具体要求进行服务的。有关中断服务程序的编写方法前面已介绍,这里不再叙述,仅介绍中断源管理和控制程序的编写。在编写中断管理与控制程序时应考虑以下项目:,(1)CPU开中断与关中
34、断; (2)某个中断源中断请求的允许或屏蔽; (3)各中断源优先级别的设定; (4)外部中断请求的触发方式。,例1:利用外部中断源和,实现中断以及中断嵌套,设为高优先级。 解:为了取得和中断信号,可以使用两个去抖动按键,分别接到P3.2和P3.3引脚上,以产生两个先高后低的边沿触发脉冲。按动两个中断按键,产生两个不同的中断。按动低优先级中断源键,紧接着按动高优先级中断源键,将产生中断嵌套,参考程序如下:,ORG 0000H AJMP MAIN ORG 0003H AJMP INT0 ORG 0013H AJMP INT1 ORG 0100H MAIN:MOV IE,#85H SET PX1 S
35、ETB IT0 SETB IT1 LOOP:MOV P1,#0FFH SJMP LOOP ORG 0200H,INT0:MOV R3,#10D1:MOV P1,#0FH LCALL DELAY DJNZ R3,D1 RETI 0RG 0300H INT1:MOV A,R3PUSH ACC MOV R3,#02H MOV P1,#0F0H D2:LCALL DELAY DJNZ R3,D2 POP ACC MOV R3,A RETI DELAY:MOV R5,#50 DELAY1:MOV R6,#100MOV R7,#100 DLY1:DJNZ R7,DLY1DJNZ R6,DLAY2DJNZ
36、R5,DELAY1 RET,例2:利用做一个计数器。当有脉冲时,A的内容加1。并且当A的内容大于或等于100时将P1.0置位。ORG 0000hLjmp MIN0ORG 0003hLjmp INTB0ORG 000bhretiORG 0013hretiORG 001bhretiORG 0023hretiORG 0030h,Min0: mov sp,#30h ;主程序Setb IT0Setb EX0CLR PX0 SETB EAMov a,#00Min1: NOP ljmp Min1Org 0100hINTB0: Push psw ;的中断服务程序Add A,#01Cjne a,#100,INT
37、B1Ljmp INTB2INTB1: jc INTB3INTB2: setb P1.0INTB3: POP PSWRETI,例3:试编写由Pl.0输出一个周期为2分钟的方波信号的程序。已知fosc=12MHz。 解:此例要求P1.0输出的方波信号的周期较长,用一个定时器无法实现。解决的办法可采用定时器加软件计数的方法或者采用两个定时器合用的方法来实现。这里仅介绍定时器加软件计数的方法。,具体方法为:将T1设置为定时器方式,定时时间为10ms,工作于模式1;再利用T1的中断服务程序作为软件计数器;共同实现一分钟的定时。整个程序由两部分组成,即由主程序和T1的中断服务程序。其中主程序包括初始化程序
38、和Pl.0输出操作程序,中断服务程序包括毫秒(ms)、秒(s)、分(min)的定时等。,编写T1的中断服务程序时,应首先将T1初始化,并安排好中断服务程序中所用到的内部RAM中地址单元。 T1的计数初值:X=216-1210100012=55536=D8FOH。 中断服务程序所用到的地址单元安排如下: 40H单元作ms的单元,计数值为1s10ms=100次; 4lH单元作s的计数单元,计数值为1min1s=60次; 29H单元的D7位(位地址为4FH)作1分计时到的标志位,即标志用4FH。 具体程序如下:,主程序: ORG 0000HAJMP 0030HORG 001BHAJMP 1100HO
39、RG 0030HMOV TMOD,#10H ;T1定时,模式1MOV TH1,#0D8H ;T1计数初值MOV TL1,#0F0HSETB EA ;CPU、T1开中断SETB ET1SETB TR1 ;启动T1MOV 40H,#100 ;毫秒计数初值MOV 41H,#60 ;秒计数初值CLR 4FHTT:JNB 4FH,TT ;等待1分钟到CLR 4FH ;清分标志值CPL Pl.0 ;输出变反AJMP TT ;反复循环,T1中断服务程序:(由001BH转来)ORG 1100HPUSH PSWMOV TH1,#0D8H ;TI重赋初值MOV TL1,#0F0HDJNZ 40H,TT1 ;1秒到否?MOV 40H,#100 ;1秒到,重赋秒的计数值DJNZ 41H,TT1 ;1分到否?MOV 4lH,#60 ;1分到了,重赋1分钟的计数值SETB 4FH ;置1分到标志位,告诉主程序。TTl:POP PSWRETI ;中断返回,