中断程序详解(附例题)

Posted timerring

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中断程序详解(附例题)相关的知识,希望对你有一定的参考价值。

中断包含中断控制程序和中断服务程序两部分。

一、中断初始化程序

中断初始化程序实质上就是对TCON、SCON、IE和IP寄存器的管理和控制。

中断初始化程序一般不独立编写,而是包含在主程序中,中断初始化程序需完成以下操作:

  • 开中断;
  • 某一中断源中断请求的允许与禁止(屏蔽);
  • 确定各中断源的优先级别;
  • 若是外部中断请求,则要设定触发方式是电平触发还是边沿触发。

例题 1

假设规定外部中断0为电平触发方式,高优先级,试写出有关的初始化程序。

解:可用两种方法完成。

① 方法1,用位操作指令完成:

SETB   EA    ;开中断允许总控制位 

SETB EX0 ;外中断0开中断

SETB PX0 ;外中断0高优先级

CLR IT0 ;电平触发

② 方法2,用其它指令也可完成同样功能:

MOV   IE,#81H     ;同时置位EA和EX0 

ORL IP,#01H ;置位PX0

ANL TCON,#0FEH ;使IT0为0

二、中断服务程序

中断服务程序是一种为中断源的特定情况要求服务的独立程序段,以中断返回指令RETI结束。

中断服务程序的固定入口:

0003H、000BH、0013H、001BH、0023H

中断服务程序和子程序一样,在调用和返回时,也有一个保护断点和现场的问题。

在中断响应过程中,断点的保护主要由硬件电路自动实现

中断时,现场保护由中断服务程序来完成。因此在编写中断服务程序时必须考虑保护现场的问题。现场一般包括累加器A、工作寄存器R0~R7以及程序状态字PSW等。

在编写中断服务程序时还应注意以下三点:

  • 各中断源入口地址之间只相隔8个字节。
  • 在执行当前中断程序时,如何禁止更高优先级中断源的中断请求。
  • 在多级中断情况下,保护现场与中断嵌套的安排。

三、 应用举例

在设计中断服务程序时,是按中断源的要求,根据中断处理所要完成的任务来进行的。

保护现场和恢复现场一般采用 PUSH和POP指令来实现。PUSH和POP指令一般成对出现,以保证寄存器的内容不会改变。

例题2

设在主程序中用到了寄存器PSW、ACC、B、DPTR,而在执行中断服务程序时需要用到这些寄存器。

SERVICE:

PUSH PSW;保护程序状态字

PUSH ACC;保护累加器A

PUSH B; 保护寄存器B

PUSH DPL;保护数据指针低字节

PUSH DPH;保护数据指针高字节

┇ ;中断处理

POP DPH;恢复现场

POP DPL

POP B

POP ACC

POP PSW

RETI

例题3

图为多个故障显示电路,当系统无故障时,4个故障源输入端X1~X4全为低电平,显示灯全灭;当某部分出现故障,其对应的输入由低电平变为高电平,从而引起MCS-51单片机中断,中断服务程序的任务是判定故障源,并用对应的发光二极管LED1~LED4进行显示。

中断程序详解(附例题)_嵌入式

编程如下:

ORG 0000H     ;程序开始 

AJMP MAIN ;转主程序

ORG 0003H ;外部中断INT0入口地址

AJMP SERVICE ;转中断服务程序

MAIN: 0RL P1,#0FFH ;灯全灭,准备读入

SETB IT0 ;选择边沿方式

SETB EX0 ;允许INT0中断

SETB EA ;CPU开中断

SJMP $ ;等待中断



SERVICE:JNB P1.3,N1 ;若X1无故障转

CLR P1.4 ;若X1有故障,LED1亮

N1: JNB P1.2,N2 ;若X2无故障转

CLR P1.5 ;若X2有故障,LED2亮

N2: JNB P1.1,N3 ;若X3无故障转

CLR P1.6 ;若X3有故障,LED3亮

N3: JNB P1.0,N4 ;若X4无故障转

CLR P1.7 ;若X4有故障,LED4亮

N4: RETI

END

这个程序主要分为主程序和中断服务程序两部分。

主程序主要完成初始化的工作,中断服务程序主要检测故障源是否发生,如果某故障源发生,则将相应的指示灯点亮。在此主程序和中断服务程序中,没有存在使用寄存器之间的干涉问题。因此,在中断服务程序中不用保护现场和恢复现场。

例:单步运行控制

这是外中断的特殊应用,外中断0编程为高优先级电平触发方式。工作原理:主程序先对中断系统进行初始化,接着单片机进入中断服务程序(因为INT0总是低),在中断服务程序中等待INT0变高(按键短暂闭合),这是执行RETI返回

回主程序,由于INT0为低,接着又申请中断,这次的中断响应应在执行了这程序中的一条指令后才能进入中断服务程序。重复以上过程,便可实现单步执行用户程序。

CLR IT0

SETB PX0

SETB EX0

SETB EA

。。。。

。。。。;用户 。。。。;程序



HE0:JNB INT0,HE0

HE1:JB INT0,HE1 RETI


以上是关于中断程序详解(附例题)的主要内容,如果未能解决你的问题,请参考以下文章

请教一个关于51单片机外部中断的问题

Java 中break和continue结合标签标示符中断循环示例详解(附源码)

参赛博文|0-1背包问题(动态规划)附例题详解——java实现

中断向量是啥意思

机器学习强基计划4-3:详解朴素贝叶斯分类原理(附例题+Python实现)

c51单片机中断程序中的interrupt1,2,3是由啥决定的?