【单片机原理】第五章 中断处理 ,中断返回 ,具体的中断服务程序举例

一、什么是中断处理


• CPU响应中断后即转入中断服务程序的入口,执行中断服务程序。从中断服务程序的第一条指令开始到返回指令为止,这个过程称为中断处理或中断服务。

二、中断处理包括的内容


• 不同的中断源服务的内容及要求各不相同,其处理过程也就有所区别。一般情况,中断处理包括两部分内容:
• 1、保护现场:如在中断服务程序中要用到 PSW、工作寄存器和SFR等寄存器时,则在进入中断服务之前应将它们的内容保护起来,
• 2、为中断源服务:针对中断源的具体要求进行相应的处理。
• 3、恢复现场:执行RETI指令前应恢复现场。、

三、编写中断服务程序时的注意问题


①在中断矢量地址单元处放一条无条件转移指令,使中断服=务程序可灵活地安排在64KB  ROM的任何空间。
②在中断服务程序中,应注意用软件保护现场,以免中断返回后丢失原来寄存器、累加器中的信息。
③若要在执行当前中断程序时禁止更高优先级中断,可以先用软件关闭CPU中断或禁止某中断源中断,在中断返回前再开放中断。

§5.4.3 中断返回


• 在中断服务程序中,最后一条指令必须为中断返回指令RETI。
• CPU执行该指令时,一方面清除中断响应时所置位的“优先级生效”触发器,另一方面从当前栈顶弹出断点地址送入程序计数器PC,从而返回主程序。
• 注意在中断服务程序中,PUSH和POP指令必须成对使用,否则,不能正确返回断点。

§5.4.4 关于具体的中断服务程序


• CPU响应中断结束后即转至中断服务程序的入口。从中断服务程序的第一条指令开始到返回指令为止,这个过程称为中断处理或称中断服务。不同的中断源服务的内容及要求各不相同,其处理过程也就有所区别。一般情况下,中断处理包括两部分内容: 一是保护现场,二是为中断源服务。
• 在编程时经常用到PSW、工作寄存器、SFR寄存器等。如果在中断服务程序中要用这些寄存器,则在进入中断服务之前应将它们的内容保护起来,即保护现场;同时在中断结束,执行RETI指令之前应恢复现场。

• 中断服务是针对中断源的具体要求进行处理的。在编写中断服务程
序时应注意以下几点:
① 各中断源的入口矢量地址之间,只相隔8个单元,一般中断服务程序是容纳不下的,因而最常用的方法是在中断入口矢量地址单元处存放一条无条件转移指令,而转至存储器其他的任何空间去。
② 若要在执行当前中断程序时禁止更高优先级中断,则应用软件关闭CPU中断,或屏蔽更高级中断源的中断,在中断返回前再开放中断。
③ 在保护现场和恢复现场时,为了不使现场信息受到破坏或造成混乱,一般在此情况下,应关CPU中断,使CPU暂不响应新的中断请求。这样就要求在编写中断服务程序时,应注意在保护现场之前关中断,在保护现场之后若允许高优先级中断打断它,则应开中断。同样在恢复现场之前应关中断,恢复之后再开中断。具体的中断服务子程序流程如图5-11所示。

§5.5 中断程序举例


• 89C51/S51单片机有两个外部中断亲求请求输入端(INT0和INT1)。实际应用中,若外部中断源有两个以上,则需要扩展外部中断源。
§5.5.1 利用定时器扩展外部中断源
§5.5.2 中断加查询扩展外部中断源

1、主程序的起始地址


• 89C51/S51系列单片机复位后,(PC)=0000H
• 而0003H~002BH分别为各中断源的入口地址。
• 编程时应在0000H处写一条跳转指令(一般为长跳转指令),主程序是以跳转的目标地址作为起始地址开始编写,一般从003H开始,如 图5-12所示。

2、主程序的初始化内容


• 初始化:将用到的内部部件或扩展芯片进行初始工作
状态设定。
• 单片机复位后,特殊功能寄存器IE、IP内容均为00H,所以应对IE、IP进行初始化编程,以开放中断,允许某些中断源中断和设置中断优先级等。

§5.5.2 中断服务程序


• 当CPU接收到中断请求信号并予以响应后,CPU把当前的PC内容压入堆栈进行保护,然后转入响应的中断服务程序入口处执行。
1、中断服务程序的起始地址
2、中断服务程序编制中的注意事项

1、中断服务程序的起始地址

• 中断系统对五个中断源分别规定了各自的入口
地址,但这些入口地址相距很近(8个字节)。
• 如中断服务程序的指令代码少于8个字节,则可从规定的中断服务程序入口地址开始,直接编
写中断服务程序;
• 如中断服务程序的指令代码大于8个字节,则应采用与主程序相同的方法,在相应的入口处写
一条跳转指令,并以跳转指令的目标地址作为中断服务程序的起始地址进行编程。
• 以INT0为例,中断矢量地址为0003H,中断服务程序从0200H开始。如 图5-13所示。

2、中断服务程序编制中的注意事项

① 视需要确定是否保护现场。
② 及时清除那些不能被硬件自动清除的中断请求标志,以免产生错误的中断。
③ 中断服务程序中的压栈与弹栈指令必须成对使用,以确保中断服务程序的正确返回。
④ 主程序和中断服务程序之间的参数传递与主程序和子程序的参数传递方式相同。

§5.5.3 中断服务程序举例

例5-3 :


如 图5-14所示,将P1口的P1.4~P1.7作为输入位, P1.0~P1.3作为输出位。要求利用89C51/S51将开关所设的数据读入单片机内,并依次通过P1.0~P1.3输出,驱动发光二极管,以检查P1.4~P1.7输入的电平情况(若输入为高电平则相应的LED亮)。现要求采用中断边沿触发方式,每中断一次,完成一次读/写操作。

例5-3解:如图所示,采用外部中断0,中断申请从INT0输入,并采用了去抖动电路。当P1.0~P1.3的任何一位输出0时,相应的发光二极管就会发光。当开关K来回拔动一次时,将产生一个下降沿信号,通过INT0发出中断请求。中断服务程序的矢量地址为0003H。

源程序如下:
ORG     0000H
LJMP    MAIN;上电,转向主程序
ORG     0003H;外部中断0入口地址
LJMP    INSER;转向中断服务程序
ORG    0030H ;主程序
MAIN: SETB   EX0 ;允许外部中断0中断
SETB   IT0
;选择边沿触发方式
SETB   EA ;CPU开中断
HERE: SJMP   HERE ;等待中断
ORG    0200H ;中断服务程序
INSER:MOV   A,#0F0H
MOV   P1,A ;设P1.4~P1.7为输入
MOV   A,P3 ;取开关数
SWAP  A
;A的高、低四位互换
MOV   P1,A;输出驱动LED发光
RETI
;中断返回
END

例5-3解:如图所示,采用外部中断0,中断申请从INT0输入,并采用了去抖动电路。当P1.0~P1.3的任何一位输出0时,相应的发光二极管就会发光。当开关K来回拔动一次时,将产生一个下降沿信号,通过INT0发出中断请求。中断服务程序的矢量地址为0003H。

源程序如下:
ORG     0000H
LJMP    MAIN;上电,转向主程序
ORG     0003H;外部中断0入口地址
LJMP    INSER;转向中断服务程序
ORG    0030H ;主程序
MAIN: SETB   EX0 ;允许外部中断0中断
SETB   IT0
;选择边沿触发方式
SETB   EA ;CPU开中断
HERE: SJMP   HERE ;等待中断
ORG    0200H ;中断服务程序
INSER:MOV   A,#0F0H
MOV   P1,A ;设P1.4~P1.7为输入
MOV   A,P1 ;取开关数
SWAP  A
;A的高、低四位互换
MOV   P1,A;输出驱动LED发光
RETI
;中断返回
END

• 当外部中断源多于2个时,可采用硬件请求和软件查询相结合的办法,把多个中断源通过硬件经“或非”门引入到外部中断输入端INTx,同时又连到某个I/O口。这样,每个中断源都可能引起中断。
• 在中断服务程序中,读入I/O口的状态,通过查询就能区分是哪个中断源引起的中断。
• 若有多个中断源同时发出中断请求,则查询的次序就决定了同一优先级中断中的优先次序。

例5-4 利用中断显示系统故障:


• 如图5-15所示,此中断电路可实现系统的故障显示。当系统的各部分正常工作时,四个故障源的输入均为低电平,显示灯全不亮。当有某个部分出现故障时,则相应的输入线由低电平变为高电平,相应的发光二极管亮。

5-4解:

如图所示,当某一个故障信号输入线由低电平变为高点平时,会通过INT0线引起8031中断(边沿触发方式)。在中断服务程序中,应将各故障源的信号读入,并加以查询,以进行相应的发光显示。

源程序如下:
ORG     0000H
LJMP    MAIN;上电,转向主程序
ORG     0003H;外部中断0入口地址
LJMP    INSER;转向中断服务程序
MAIN: ANL    P1,#55H;
P1.0,P1.2,P1.4,P1.6为输入
P1.1,P1.3,P1.5,P1.7为输出
SETB   EX0 ;允许外部中断0中断
SETB   IT0 ;选择边沿触发方式
SETB   EA
;CPU开中断
HERE: SJMP   HERE ;等待中断
INSER:JNB   P1.0,L1;查询中断源,
( P1.0)=0,转L1
SETB   P1.1 ;是P1.0引起的
中断,使相应的二极管亮
L1:
JNB   P1.2,L2;继续查询
SETB   P1.3 ;
L2:
JNB   P1.4,L3
SETB   P1.5
L3:
JNB   P1.6,L4;
SETB   P1.7
L4:
RETI
END
§5.6 思考题与习题


1. 什么是中断和中断系统?其主要功能是什么?
2. 试编写一段对中断系统初始化的程序,使之允许INT0、
INT1、T0和串行口中断,且使T0中断为高优先级中
断。
3. 在单片机中,中断能实现哪些功能?
4. 89C51/S51共有哪些中断源?对其中断请求如何进行控制?
5. 什么是中断优先级?处理中断优先的原则是什么?
6. 说明外部中断请求的查询和响应过程。
第五章 中断系统
23:29
7. 89C51/S51在什么条件下可响应中断?
8. 简述89C51/S51单片机的中断响应过程。
9. 在89C51/S51 Flash ROM中,应如何安排程序区?
10. 试述中断的作用及中断的全过程。
11. 当正在执行某一中断源的中断服务程序时,如果有新的
中断请求出现,试问在什么情况下可响应新的中断请求?
在什么情况下不能响应新的中断请求?
12. 89C51/S51单片机外部中断源有几种触发中断请求的方
法?如何实现中断请求?

13. 89C51/S51单片机有5个中断源,但只能设置两个中断优先级,因此,在中断优先级安排上受
到一定的限制。试问以下几种中断优先顺序的安排(级别由高到低)是否可能?若可能,则应
如何设置中断源的中断级别?否则,请简述不可能的理由。
(1) 定时器0,定时器1,外中断0,外中断1,串行口中断。
(2) 串行口中断,外中断0,定时器0溢出中断,外中断1,定时器1溢出中断。
(3) 外中断0,定时器1溢出中断,外中断1,定时器0溢出中断,串行口中断。
(4) 外中断0,外中断1,串行口中断,定时器0溢出中断,定时器1溢出中断。
(5) 串行口中断,定时器0溢出中断,外中断0,外中断1,定时器1溢出中断。
(6) 外中断0,外中断1,定时器0溢出中断,串行口中断,定时器1溢出中断。
(7) 外中断0,定时器1溢出中断,定时器0溢出中断,外中断1,串行口中断。

14. 89C51/S51各中断源的中断标志是如何产生的?又是如何清0的?CPU响应
中断时,中断入口地址各是多少?
15. 中断响应时间是否为确定不变的?为什么?
16. 中断响应过程中,为什么通常要保护现场?如何保护?
17. 请叙述中断响应的CPU操作过程,为什么说中断操作是一个CPU的微查
询过程?
18. 在中断请求有效并开中断的状况下,能否保证立即响应中断?有什么条
件?


资料仅供学习使用

编者能力有限,如有错误欢迎留言交流

编者的其他专栏:

C语言

单片机原理

模式识别原理

数字电子技术

自动控制原理

模拟电子技术

数据结构

 概率论与数理统计

高等数学

关注编者了解更多

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值