51单片机中断编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第6章中断系统
在CPU与外设交换信息时,存在一个快速的CPU与慢速的外设间的矛盾。

为解决这个问题,采用了中断技术。

良好的中断系统能提高计算机实时处理的能力,实现CPU 与外设分时操作和自动处理故障,从而扩大了计算机的应用范围。

当CPU正在处理某项事务的时候,如果外界或内部发生了紧急事件,要求CPU暂停正在处理的工作转而去处理这个紧急事件,待处理完以后再回到原来被中断的地方,继续执行原来被中断了的程序,这样的过程称为中断。

向CPU提出中断请求的源称为中断源。

微型计算机一般允许有多个中断源。

当几个中断源同时向CPU发出中断请求时,CPU应优先响应最需紧急处理的中断请求。

为此,需要规定各个中断源的优先级,使CPU 在多个中断源同时发出中断请求时能找到优先级最高的中断源,响应它的中断请求。

在优先级高的中断请求处理完了以后。

再响应优先级低的中断请求。

当CPU正在处理一个优先级低的中断请求的时候,如果发生另一个优先级比它高的中断请求,CPU能暂停正在处理的中断源的处理程序,转去处理优先级高的中断.请求,待处理完以后,再回到原来正在处理的低级中断程序,这种高级中断源能中断低级中断源的中断处理称为中断嵌套。

MCS-51系列单片机允许有五个中断源,提供两个中断优先级(能实现二级中断嵌套)。

每一个中断源的优先级的高低都可以通过编程来设定。

中断源的中断请求是否能得到响应,受中断允许寄存器IE的控制;各个中断源的优先级可以由中断优先级寄存器IP 中的各位来确定;同一优先级中的各中断源同时请求中断时,由内部的查询逻辑来确定响应的次序。

这些内容都将在本节中讨论。

6 . 1 中断请求源和中断请求标志
1、中断请求源
MCS-51中断系统可用图6-1来表示。

五个中断源是:
INT来自P3.2引脚上的外部中断请求(外中断0)。

◆0
INT来自P3.3引脚上的外部中断请求(外中断1)。

◆1
◆T0 片内定时器/计数器0溢出(TF0)中断请求。

◆T1片内定时器/计数器1溢出(TF1)中断请求。

◆串行口片内串行口完成一帧发送或接收中断请求源TI或RI。

每一个中断源都对应有一个中断请求标志位,它们设置在特殊功能寄存器TCON和SCON中。

当这些中断源请求中断时,分别由TCON和SCON中的相应位来锁存。

INT0硬件查询INT1高级中断请求低级中断请求
图6-1 中断系统
2、中断标志
⑴ 定时器控制寄存器TCON
TCON 是定时器/计数器0和1(T 0,T 1)的控制寄存器,它同时也用来锁存T 0,T 1
的溢出中断请求源和外部中断请求源。

TCON 寄存器中与中断有关的位如下图所示。

其中:
① TF 1 定时器/计数器1(T 1)的溢出中断标志。

当T 1从初值开始加1计数到计数满,产生溢出时,由硬件使TF 1置“1”,直到CPU 响应中断时由硬件复位。

② TF 0 定时器/计数器0(T 0)的溢出中断标志。

其作用同TF 1。

③ IE 1 外中断1中断请求标志。

如果IT 1=1,则当外中断1引脚1INT 上的电平由1
变0时,IE1由硬件置位,外中断1请求中断。

在CPU 响应该中断时由硬件清0。

④ IT 1 外部中断1(1INT )触发方式控制位。

如果IT 1为1,则外中断1为负边沿触发
INT脚的输入电平,如果在一个周期中采样到方式(CPU在每个机器周期的S5P2采样1
高电平,在下个周期中采样到低电平,则硬件使IE1置1,向CPU请求中断);如果IT1
INT端的输入电平(低电为0,则外中断1为电平触发方式。

此时外部中断是通过检测1
INT的外部中断源必须保持低电平有效,直到平)来触发的。

采用电平触发时,输入到1
该中断被响应。

同时在中断返回前必须使电平变高,否则将会再次产生中断。

INT上的电平由1变0时,IE0
⑤IE0外中断0中断请求标志。

如果IT0置1,则当0
由硬件置位。

在CPU把控制转到中断服务程序时由硬件使IE0复位。

⑥IT0外部中断源0触发方式控制位。

其含义同IT1。

⑵、串行口控制寄存器SCON
串行口控制寄存器SCON中的低2位用作串行口中断标志,如下图所示。

其中:
RI 串行口接收中断标志。

在串行口方式0中,每当接收到第8位数据时,由硬件置位RI;在其他方式中,当接收到停止位的中间位置时置位RI。

注意,当CPU转入串行口中断服务程序入口时不复位RI,必须由用户用软件来使RI清0。

TI 串行口发送中断标志。

在方式0中,每当发送完8位数据时由硬件置位TI;在其他方式中于停止位开始时置位。

TI也必须由软件来复位。

6 . 2 中断控制
1、中断允许和禁止
在MCS-51中断系统中,中断允许或禁止是由片内的中断允许寄存器IE(IE为特殊功能寄存器)控制的,IE中的各位功能如下:
其中:
EA CPU中断允许标志。

EA=0,CPU禁止所有中断,即CPU屏蔽所有的中断请求;EA=1,CPU开放中断。

但每个中断源的中断请求是允许还是被禁止,还需由各自的允许
位确定(见D4~D0位说明)。

ES 串行口中断允许位。

ES=1,允许串行口中断;ES=0,禁止串行口中断。

ET1 定时器/计数器1(T1)的溢出中断允许位。

ET1=1,允许T1中断;ET1=0,禁止T1中断。

EX1 外部中断1中断允许位。

EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。

ET0 定时器/计数器0(T0)的溢出中断允许位。

ET0=1,允许T0中断;ET0=0,禁止T0中断。

EX0 外部中断0中断允许位。

EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。

中断允许寄存器中各相应位的状态,可根据要求用指令置位或清0,从而实现该中断源允许中断或禁止中断,复位时IE寄存器被清0。

2、中断优先级控制
MCS-51中断系统提供两个中断优先级,对于每一个中断请求源都可以编程为高优先级中断源或低优先级中断源,以便实现二级中断嵌套。

中断优先级是由片内的中断优先级寄存器IP(特殊功能寄存器)控制的。

IP寄存器中各位的功能说明如下:
其中:
PS 串行口中断优先级控制位。

PS=1,串行口定义为高优先级中断源;PS=0,串行口定义为低优先级中断源。

PT1 T1中断优先级控制位。

PT1=1,定时器/计数器1定义为高优先级中断源;PT1=0,定时器/计数器1定义为低优先级中断源。

PX1 外部中断1中断优先级控制位。

PX1=1,外中断1定义为高优先级中断源;PX1=0,外中断1定义为低优先级中断源。

PT0 定时器/计数器0(T0)中断优先级控制位,功能同PT1。

PX0 外部中断0中断优先级控制位。

功能同PX1。

中断优先级控制寄存器IP中的各个控制位都可由编程来置位或复位(用位操作指令或字节操作指令),单片机复位后IP中各位均为0,各个中断源均为低优先级中断源。

3 中断优先级结构
MCS-51中断系统具有两级优先级(由IP寄存器把各个中断源的优先级分为高优先级和低优先级),它们遵循下列两条基本规则:
(1)低优先级中断源可被高优先级中断源所中断,而高优先级中断源不能被任何中断源所中断;
(2)一种中断源(不管是高优先级或低优先级)一旦得到响应,与它同级的中断源
不能再中断它。

为了实现上述两条规则,中断系统内部包含两个不可寻址的优先级状态触发器。

其中一个用来指示某个高优先级的中断源正在得到服务,并阻止所有其它中断的响应;另一个触发器则指出某低优先级的中断源正得到服务,所有同级的中断都被阻止,但不阻止高优先级中断源。

当同时收到几个同一优先级的中断时,响应哪一个中断源取决于内部查询顺序。

其优先级排列如下:
中断源同级内的中断优先级
外部中断0 最高
定时器/计数器0溢出中断
外部中断1
定时器/计数器1溢出中断
串行口中断最低
6 . 3 中断响应
1、中断响应过程
CPU在每个机器周期的S5P2时刻采样中断标志,而在下一个机器周期对采样到的中断进行查询。

如果在前一个机器周期的S5P2有中断标志,则在查询周期内便会查询到并按优先级高低进行中断处理,中断系统将控制程序转入相应的中断服务程序。

下列三个条件中任何一个都能封锁CPU对中断的响应:
(1)CPU正在处理同级的或高一级的中断;
(2)现行的机器周期不是当前所执行指令的最后一个机器周期;
(3)当前正在执行的指令是返回(RETI)指令或是对IE或IP寄存器进行读/写的指令。

上述三个条件中,第二条是保证把当前指令执行完,第三条是保证如果在当前执行的是RETI指令或是对IE,IP进行访问的指令时,必须至少再执行完一条指令之后才会响应中断。

中断查询在每个机器周期中重复执行,所查询到的状态为前一个机器周期的S5P2时采样到的中断标志。

这里要注意的是:如果中断标志被置位,但因上述条件之一的原因而未被响应,或上述封锁条件已撤消,但中断标志位已不再存在(已不再是置位状态)时,被拖延的中断就不再被响应,CPU将丢弃中断查询的结果。

也就是说,CPU对中断标志置位后,如未及时响应而转入中断服务程序的中断标志不作记忆。

CPU响应中断时,先置相应的优先级激活触发器,封锁同级和低级的中断。

然后根据中断源的类别,在硬件的控制下,程序转向相应的向量入口单元,执行中断服务程序。

硬件调用中断服务程序时,把程序计数器PC的内容压入堆栈(但不能自动保存程序
状态字PSW 的内容),同时把被响应的中断服务程序的入口地址装入PC 中。

五个中断源服务程序的入口地址是:
中断源 入口地址
外部中断0 0003H
定时器0溢出 000BH
外部中断1 0013H
定时器1溢出 001BH
串行口中断 0023H
通常,在中断入口地址处安排一条跳转指令,以跳转到用户的服务程序入口。

中断服务程序的最后一条指令必须是中断返回指令RETI 。

CPU 执行完这条指令后,把响应中断时所置位的优先级激活触发器清0,然后从堆栈中弹出两个字节内容(断点地址)装入程序计数器PC 中,CPU 就从原来被中断处重新执行被中断的程序。

2、中断响应时间 外部中断0INT 和1INT 的电平在每个机器周期的S5P2时被采样并锁存到IE0和IE1中,这个置入到IE0和IE1的状态在下一个机器周期才被查询电路查询,如果产生了一个中断请求,而且满足响应的条件,CPU 响应中断,由硬件生成一条长调用指令转到相应的服务程序入口。

这条指令是双机器周期指令。

因此,从中断请求有效到执行中断服务程序的第一条指令的时间间隔至少需要三个完整的机器周期。

如果中断请求被前面所述的三个条件之一所封锁,将需要更长的响应时间。

若一个同级的或高优先级的中断已经在进行,则延长的等待时间显然取决于正在处理的中断服务程序的长度,如果正在执行的一条指令还没有进行到最后一个周期,则所延长的等待时间不会超过三个机器周期,这是因为MCS-51指令系统中最长的指令(MUL 和DIV)也只有四个机器周期;假若正在执行的是RETI 指令或者是访问IE 或IP 指令,则延长的等待时间不会超过五个机器周期(为完成正在执行的指令还需要一个周期,加上为完成下一条指令所需要的最长时间——四个周期,如MUL 和DIV 指令)。

因此,在系统中只有一个中断源的情况下,响应时间总是在三个机器周期到八个机器周期之间。

6 . 4外部中断触发方式
MCS-51的外部中断INTx (0INT 和1INT )可以用程序控制为电平触发或负边沿触发(通过编程对定时器/计数器控制寄存器TCON 中的IT0和IT1位进行清“0”或置“1”)。

若IT X (X=0,1)为0,则外部中断INTx 程控为电平触发,由INTx 引脚上所检测
到的低电平(必须保持到CPU 响应该中断时为止,并且还应在中断返回前变为高电平)触发。

若IT X =1,则外部中断INTx 由负边沿触发。

即在相继的两个机器周期中,前一个周期从INTx 引脚上检测到高电平,而在后一个周期检测到低电平,则置位TCON 寄存器中的中断请求标志IE X (IE0或IE1),由IE X 发出中断请求。

由于外部中断引脚在每个机器周期内被采样一次,所以中断引脚上的电平应至少保持12个振荡周期,以保证电平信号能被采样到。

对于负边沿触发方式的外部中断,要求输入的负脉冲宽度至少保持12个振荡周期(若晶振频率为6MHz ,则宽度为2μs ),以确保检测到引脚上的电平跳变,而使中断请求标志IE X 置位。

对于电平触发的外部中断源,要求在中断返回前撤销中断请求(使引脚上的电平变高)是为了避免在中断返回后又再次响应该中断而出错。

电平触发方式适用于外部中断输入为低电平,而且能在中断服务程序中撤销外部中断请求源的情况。

(1)电平触发即8051每执行完一个指令都将INTx 的信号读入IE X (INTx =0,IEX=1;INTx =1,IEX=0),因此IEX 的中断请求信号随着INTx 变化。

如果送入INTx 的中断请求信号,8051未能即时检查到,而INTx 的信号也产生变化,,IEX 的信号亦发生变化,这样就会漏掉INTx 的中断要求。

(2)负边沿触发即只要检测到送至INTx 上的信号由1变成0时,中断请求标志位IEX 就被设定为1,并且一直维持着1,直到此中断请求被接收为止,且必须用软件来清除IEX ,如JBC IE1,LOOP 。

6 . 5 多个外部中断源系统设计
MCS-51有两个外部中断源0INT 和1INT ,但在实际的应用系统中,外部中断请求源往往比较多,下面讨论两种多中断源系统的设计方法。

1、 定时器中断作为外部中断使用
把MCS-51的两个定时器/计数器(T0和T1)选择为计数器方式,每当P3.4(T0)或P3.5(T1)引脚上发生负跳变时,T0和T1的计数器加1。

利用这个特性,可以把P3.4和P3.5引脚作为外部中断请求输入线,而定时器的溢出中断作为外部中断请求标志。

应用举例如下:
设T0为方式2(自动装入常数)外部计数方式,时间常数为0FFH ,允许中断,并
CPU开放中断。

其初始化程序为:
MOV TMOD,#06H ;数00000110B送方式寄存器TMOD。

设T0为方式2,
计数器方式工作;
MOV TL0,#0FFH ;时间常数0FFH送T0的低8位TL0和高8位TH0寄存
器。

MOV TH0,#0FFH
SETB TR0,;置TR0为1,启动T0。

MOV IE,#82H ;置中断允许,即置中断允许寄存器IE中的EA位,ET0
位为1
:
当接在P3.4引脚上的外部中断请求输入线发生负跳变时,TL0加1溢出,TF0被置“1”向CPU发出中断请求。

同时TH0的内容自动送入TL0,使TL0恢复初始值0FFH。

这样,每当P3.4引脚上有一次负跳变时都置“1”于TF0,向CPU发中断请求,P3.4引脚就相当于边沿触发的外部中断请求源输入线。

同理,也可以把P3.5引脚作类似的处理。

2、中断和查询结合的方式
这种方法是把系统中多个外部中断源按它们的重要程度进行排队,把其中最高级别
INT脚),其余的中断源用的中断源接到MCS-51的一个外部中断源输入端(例如接到0
INT),并同时还接到一个I/O口,如线“或”的方法连接到另一个外部中断输入端(1
图6-2中接到P1口。

中断请求由硬件电路产生,而中断源的识别由程序查询来处理,查询顺序由中断源的优先级决定。

图6-3为五个外部中断源的连接电路,其中设备1~4经INT连接,
OC门与1
图6-2多个外部中断源系统设计
并连接到P1.0~P1.3,均采用电平触发方式。

设备0为最高级中断源,单独作为外部中断0的输入信号。

外部中断1的中断服务程序如下:
INTR:PUSH PSW ;程序状态字PSW内容压入堆栈保存
PUSH A ;累加器A内容压入堆栈保存
JNB P1.0,DVT1 ;P1.0引脚为0,转至设备1中断服务程序
JNB P1.1,DVT2 ;P1.1引脚为0,转至设备2中断服务程序
JNB P1.2,DVT3 ;P1.2引脚为0,转至设备3中断服务程序
JNB P1.3,DVT4 ;P1.3引脚为0,转至设备4中断服务程序
INTR1:POP A ;压入堆栈的内容送回到A
POP PSW ;恢复程序状态字PSW的内容
RETI ;中断返回
DVT1:;设备1中断服务程序入口
AJMP INTR1 ;跳转到INTR1所指示的指令
DVT2:;设备2中断服务程序入口
AJMP INTR1 ;跳转到INTR1
DVT3:;设备3中断服务程序入口
AJMP INTR1 ;跳转到INTR1
DVT4: ;设备4中断服务程序入口
AJMP INTR1 ;跳转到INTR1
6 . 6 MCS-51对中断请求的撤除
在中断请求被响应前,中断源发出的中断请求是由CPU 锁存在特殊功能寄存器TCON 和SCON 的相应中断标志位中的。

一旦某个中断请求得到响应,CPU 必须把它的相应中断标志位复位成“0”状态。

否则,MCS-51就会因为中断标志位未能得到及时撤除而重复响应同一中断请求,这是绝对不能容许的。

8031、8051和8751有5个中断源,但实际.分属于三种中断类型。

这三种类型是:外部中断、定时器溢出中断和串行口中断。

对于这三种中断类型的中断请求,其撤除方法是不相同的。

现对它们分述如下:
1、 定时器溢出中断请求的撤除
TF 0和TF 1是定时器溢出中断标志位(见TCON ),它们因定时器溢出中断源的中断请求的输入而置位,因定时器溢出中断得到响应而自动复位成“0”状态。

因此,定时器溢出中断源的中断请求是自动撤除的,用户根本不必专门为它们撤除。

2、 串行口中断请求的撤除
TI 和RI 是串行口中断的标志位(见SCON ),中断系统不能自动将它们撤除,这是因为MCS-51进入串行口中断服务程序后常需要对它们进行检测,以测定串行口发生了接收中断还是发送中断。

为防止CPU 再次响应这类中断,用户应在中断服务程序的适当位置处通过如下指令将它们撤除。

CLR TI ;撤除发送中断
CLR RI ;撤除接收中断
若采用字节型指令,则也可采用如下指令:
ANL SCON ,#0FCH ;撤除发送和接收中断
3、 外部中断请求的撤除
外部中断请求有二种触发方式;电平触发和负边沿触发。

对于这两种不同的中断触发方式,MCS-51撤除它们的中断请求的方法是不相同的。

在负边沿触发方式下,外部中断标志IE 0或IE 1,是依靠CPU 两次检测0INT 或1INT 上触发电平状态而置位的。

因此,芯片 设计者使CPU 在响应中断时自动复位IE 0或IE 1就可撤除0INT 或1INT 上的中断请求,因为外部中断源在得到CPU 的中断服务时是不可能再在0INT 或1INT 上产生负边沿而使中断标志位IE 0或IE 1置位的。

在电平触发方式下,外部中断标志IE 0或IE 1是依靠CPU 检测0INT 或1INT 上低电平而置位的。

尽管CPU 响应中断时相应中断标志IE 0或IE 1能自动复位成“0”状态,但若外部中断源不能及时撤除它在0INT 或1INT 上低电平,就会再次使已经变成“0”的中断标志IE 0或IE 1置位,这是绝对不能允许的。

因此,电平触发型外部请求的撤除必须使0INT 或1INT 上低电平随着其中断被CPU 响应而变成高电平。

一种可供采用的电平型外部中断的撤除电路如图6-4所示。

由图可见,当外部中断源产生中断请求时,Q 触发器复位成“0”状态,Q 端的低电平被送到0INT 端,该低电平被8031检测到后就使中断标志IE 0置“1”。

8031响应0INT 上中断请求便可转入0INT 中断服务程序执行,故我们可以在中断服务程序开头安排如下程序来撤除0INT 上低电平。

图6-3电平外部中断的撤除电路
INSVR :ANL P 1,#0FEH
ORL P 1,#01H
CLR IE 0
·


8031执行上述程序就可在P 1.0上产生一个宽度为二个机器周期的负脉冲。

在该负脉冲作用下,Q 触发器被置位成“1”状态,0INT 上电平也因此而变高,从而撤除了其上的中断请求。

6 .
7 MCS-51中断系统的初始化
MCS-51中断系统功能,是可以通过上述特殊功能寄存器统一管理的,中断系统初始化是指用户对这些特殊功能寄存器中的各控制位进行赋值。

1、中断系统初始化
中断系统初始化步骤如下:
⑴ 开相应中断源的中断;
⑵ 设定所用中断源的中断优先级;
⑶ 若为外部中断,则应规定低电平还是负边沿的中断触发方式。

例5.1请写出1INT 为低电平触发的中断系统初始化程序。

解:①采用位操作指令
SETB EA
SETB EX 1 ;开1INT 中断
SETB PX 1 ;令1INT 为高优先级
CLR IT 1 ;令1INT 为电平触发
②采用字节型指令
MOV IE ,#84H ;开1INT 中断
ORL IP ,#04H ;令为1INT 高优先级
ANL TCON ,#0FBH ;令为1INT 电平触发
显然,采用位操作指令进行中断系统初始化是比较简单的,因为用户不必记住各控制位寄存器中的确切位置,而各控制位名称是比较容易记忆的。

2、外部中断设定的步骤:
① ORG 03H (13H ) 0INT (1INT )外部中断的起始地址
② JMP EXT 中断时跳至中断子程序EXT
③ MOV IE ,#10000001BH 0INT 中断使能
MOV IE ,#10000100BH 1INT 中断使能
INT中断优先
④MOV IP,#00000001BH 0
INT中断优先
MOV IP,#00000100BH 1
INT为电平触发)
⑤MOV TCON,#00000000B(设定0
INT为负边沿触发)
MOV TCON,#00000001B(设定0
INT为电平触发)
MOV TCON,#00000000B(设定1
INT为负边沿触发)
MOV TCON,#00000100B(设定1
3、TIMER0或TIMER1的中断请求
当计数溢出时会设定TF X=1,而对8051提出中断请求。

TIMER0或TIMER1中断请求设定的步骤如下:
⑴定中断起始地址
ORG 0BH ;TIMER0
ORG 1BH ;TIMER1
⑵定工作方式
MOV TMOD ,#XXXXXXXXB
⑶设定计数值
MOV THX,#XXXX
MOV TLX,#XXXX
⑷设定中断使能
MOV IE,#1000X0X0
为了让学生理解中断的全过程,可在全软件仿真中调试如下程序,调试时打开硬件P1、P3口仿真图,置P3.2为低电平时,才能进入中断服务程序,
P1口指示灯移位程序,中断一次指示灯移动一位。

若不变低,程序就不向下执行。

ORG 0000H
AJMP MAIN
ORG 0003H
AJMP WINT
ORG 0100H
MAIN: MOV A,#01H
SETB IT0
SETB EX0
SETB EA
LOOP: AJMP LOOP
ORG 0200H
WINT : PUSH ACC
PUSH PSW
MOV P1,A
RL A
POP PSW
POP ACC
RETI
END
6 . 8 应用举例
例1、外部中断(0INT /1INT )
⑴ 功能说明
主程序将P1的8个LED 做左移右移,中断时(按0INT 时)使P1的8个LED 闪烁5次。

⑵ 硬件:见第二章图2-16只是在第12脚(0INT )接一个按键,按键两端一端接12脚,另一端接地。

⑶ 程序:
ORG 0000H ;起始地址
JMP START ;跳到主程序START
ORG 0003H ;0INT 中断子程序起始地址
JMP EXT0 ;中断子程序
START :MOV IE ,#10000001B ;0INT 中断使能
MOV IP ,#00000001B ;0INT 中断优先
MOV TCON ,#00000000B ;0INT 为电平触发
MOV SP ,#70H ;设定堆栈指针
LOOP : MOV A ,#0FFH ;左移初值
CLR C ;c=0
MOV R2,#08 ;设定左移8次
LOOP1:RLC A ;含C 左移一位
MOV P1,A ;输出至P1
ACALL DELAY ;延时0.2秒
DJNZ R2,LOOP1 ;左移8次?
MOV R2,#07 ;设定右移7次
LOOP2:RRC A ;含C 右移一位
MOV P1,A ;输出至P1
ACALL DELAY ;延时0.2秒
DJNZ R2,LOOP2 ;左移7次?
JMP LOOP ;重复
EXT0: PUSH ACC ;将累加器的值压入堆栈保存
PUSH PSW ;将PSW 的值压入堆栈保存
SETB RS0 ;设定工作寄存器组1
CLR RS1
MOV A ,#00 ;为使P1全亮
MOV R2,#10 ;闪烁5次(全亮,全减计10次)
LOOP3:MOV P1,A ;将A 输出至P1
ACALL DELAY ;延时0.2秒
CPL A ;将A 的值反相
DJNZ R2,LOOP3 ;闪烁5次(亮减10次)?
POP PSW ;从堆栈取回PSW 的值
POP ACC ;从堆栈取回A 的值
RETI ;返回主程序
DELAY : MOV R5,#20 ;0.2秒
D1: MOV R6,#20 ;10毫秒
D2: MOV R7,#248 ;0.5秒
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
例2、 两个中断(0INT ,1INT )同时使用
⑴ 相关知识
1)两个中断同时存在时,设置IP 寄存器(中断优先)有两种方法 :
① 同一层中断:IP=00000000B
先按键者先中断,后按键者后中断(按键见图2-16),不分高低中断优先。

② 高低优先中断:如本题1INT 为高优先,而0INT 为低优先。

IP=00000100B ,两个中断同时产生(或即使0INT 已产生中断),1INT 先中断(0INT 停止中断),执行中断子程序后,再产生0INT 中断(0INT 中断必须为负边沿触发)。

2)TCON 的设定不同,也会造成不同的结果。

说明如下:(以本题为例) ① TCON=00000000B ;0INT 、1INT 均为电平触发
(A )0INT ,1INT 同时产生中断,则跳至EXT1中断子程序执行后返回
主程序。

(B )0INT 中断期间,1INT 产生中断,则0INT 中断暂停,跳至EXT1
中断子程序执行后,再跳至EXT0中断子程序执行未完的程序,然
后返回主程序。

(C )1INT 中断期间,0INT 产生中断,对1INT 中断不影响,执行EXT1
中断后返回主程序。

② TCON=00000001B ;1INT 为电平触发,0INT 为负边沿触发
(A )0INT 、1INT 同时中断,则跳至EXT1中断子程序执行后,再跳至
EXT0中断子程序执行,然后返回主程序。

(B )0INT 中断期间,1INT 产生中断,则0INT 中断暂停,跳至EXT1
中断子程序执行后,然后再跳至EXT0中断子程序执行未完的程序,
返回主程序。

(C )1INT 中断期间,0INT 产生中断,对1INT 中断不影响,继续执行
EXT1中断子程序后,再跳至EXT0中断子程序执行后,返回主程序。

⑵ 功能说明
主程序:P1接8个LED ,使8个LED 闪烁。

INT0控制的中断要求:使P1口的8个LED 做一个灯的左移右移3次。

INT1控制的中断要求:使P1口的8个LED 做二个灯的左移右移3次。

⑶ 硬件:见第二章图2-16只是在第12脚(0INT )和第13(1INT )脚各接一个按键,
⑷ 程序:
ORG 0000H ;主程序起始地址
JMP START ;跳至主程序START
ORG 0003H ;0INT 中断子程序起始地址
JMP EXT0 ;跳至0INT 中断子程序EXT0
ORG 0013H ;1INT 中断子程序起始地址
JMP EXT1 ;跳至1INT 中断子程序EXT1
START : MOV IE ,#10000101B ;0INT 、1INT 中断使能
MOV IP ,#00000100B ;INT1中断优先
MOV TCON ,#00000000B ;0INT 、1INT 为电平触发
MOV SP ,#70H ;设定堆栈在(70H )
MOV A ,#00
MOV P1,A
MOV A ,#00 ;使P1闪烁
LOOP : MOV P1,A
ACALL DELAY ;延时0.2秒
CPL A ;将A 反相(使全亮)
JMP LOOP ;重复循环
EXT0: PUSH ACC ;将A 压入堆栈暂时保存
PUSH PSW ;将PSW 压入堆栈暂时保存
SETB RS0 ;设定工作寄存器组1 RS1=0 RS0=1
CLR RS1
MOV R3,#03 ;左右移3次
LOOP1:MOV A ,#0FFH ;左移初值
CLR C ;c=0
MOV R2,#08 ;设定左移8次
LOOP2:RLC A ;含C 左移一位
MOV P1,A ;输出至P1
ACALL DALAY ;延时0.2秒
DJNZ R2,LOOP2 ;左移8次?
MOV R2,#07 ;设定右移7次
LOOP3: RRC A ;含C 右移一位。

相关文档
最新文档