中断原理

下面用一张图来说明这个问题:
中断嵌套


中断系统结构

说明: STC8A8K64S4A12单片机有22个中断源

  • 外部中断0(INT0) [0x0003]
  • 定时器0中断 [0x000B]
  • 外部中断1(INT1) [0x0013]
  • 定时器1中断 [0x001B]
  • 串口中断 [0x0023]
  • A/D转换中断 [0x002B]
  • 低电压检测(LVD)中断 [0x0033]
  • CCP/PWM/PCA中断 [0x003B]
  • 串口2中断 [0x0043]
  • SPI中断 [0x004B]
  • 外部中断2(~INT2)[0x0053]
  • 外部中断3(~INT3)[0x005B]
  • 定时器2中断 [0x0063]
  • 外部中断4(~INT4)[0x0083]
  • 串口3中断 [0x008B]
  • 串口4中断 [0x0093]
  • 定时器3中断 [0x009B]
  • 定时器4中断 [0x00A3]
  • 比较器中断 [0x00AB]
  • 增强型PWM中断 [0x00B3]
  • PWM异常检测中断 [0x00BB]
  • IIC总线中断 [0x00C3]

**注:**外部中断2、外部中断3、串口3中断、串口4中断、定时器2中断、定时器3中断、定时器4中断、比较器中断固定为最低优先级,其他中断都有4个可设置的中断优先级。


中断向量表

说明:8051CPU的程序存储空间内专门开辟了一块存储空间用于保存处理不同类型时间的程序代码的起始地址,也成为中断服务程序入口地址

**注:**各中断的中断入口地址见上面的中断类型后面的方括号里面。


中断寄存器组

中断使能寄存器组

中断使能寄存器(IE)

说明:

  • 作用: ①允许STC单片机响应所有中断源②允许每一个中断源产生的中断事件到达CPU
  • **SFR地址:**0xA8
  • 复位值: 0x00
    中断使能寄存器
    (说明:各位为1时允许产生中断,为0时禁止产生中断)
中断使能2寄存器(IE2)
  • 作用: 用于使能和禁止其他紧急事件
  • **SFR地址:**0xAF
  • 复位值: x000 0000B
    中断使能2寄存器
    (说明:各位为1时允许产生中断,为0时禁止产生中断)
外部中断与时钟输出控制(INT_CLKO)寄存器
  • 说明: 这是STC8新增加的寄存器
  • **SFR地址:**0x8F
  • 复位值: x000 x000B
    外部中断与时钟输出控制寄存器
    (说明:外部中断2、外部中断3、外部中断4只能通过下降沿触发中断,各位为1时允许产生中断,为0时禁止产生中断。)

中断请求寄存器

  • 说明: 定时器/计数器控制寄存器(TCON)
  • **SFR地址:**0x88
  • 复位值: 0x00
    定时器/计数器控制寄存器
    具体说明

代码实现中断功能的实现

汇编语言版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/*说明:
1.基于松果派增强型51单片机
2.此例程功能为测试外部中断的使用,通过外部中断0,外部中断1,也就是按键1,按键2
所连接的管脚,设置为下降沿触发中断模式。
*/

/*声明段*/
P5 DATA 0C8H ;定义P5端口SFR地址
My_Prog SEGMENT CODE ;定义代码段my_prog
RSEG My_Prog ;引用定义的代码段
LJMP Main ;跳转到main
ORG 0x0003 ;定位到地址0x0003,外部中断0入口地址
LJMP Led_Open ;跳转到外部中断0服务子程序
ORG 0x0013 ;定位到地址0x0013,外部中断1的入口地址
LJMP Led_Close ;跳转到外部中断1服务子程序
ORG 0x100 ;定义偏移地址0x100

/*主程序*/
Main:
USING 0 ;使用第0组R0~R7
SETB IT0 ;设置外部中断0为低电平触发
SETB IT1 ;设置外部中断1为低电平触发
SETB EX0 ;使能外部中断0
SETB EX1 ;使能外部中断1
SETB EA ;使能全局中断
CLR P5.5 ;P5.5管脚拉低,PNP管使能
/*初始8个LED状态为全灭*/
MOV A,#0FFH ;
MOV P1,A
Loop: LJMP Loop ;原地等待中断发生
/*外部中断0服务子程序*/
Led_Open:
MOV A,#00H ;
MOV P1,A
RETI
/*外部中断1服务子程序*/
Led_Close:
MOV A,#0FFH ;
MOV P1,A
RETI
END

C语言版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "reg51.h"

sfr P5=0xC8;
sbit PNP_T=P5^5;
#define Close 0xFF
#define Open 0x00
#define Led P1

void main()
{
IT0=1;
EX0=1;
IT1=1;
EX1=1;
EA=1;
PNP_T=0;
Led=Close;
while(1)
{
}
}

service_int0() interrupt 0
{
Led=Open;

}

service_int1() interrupt 2
{
Led=Close;
}

电路原理图:

电路图

实物运行效果如下:

附件下载:

Keil51汇编程序压缩包:

Keil51C语言程序压缩包:


中断优先级原理和中断嵌套的实现

不同的中断冲突时的执行原则

**说明:**总原则冲突的时候总是执行当前优先级最高的程序,优先级一样变先来后到,同时到来就具有低索引值的中断优先执行。

中断优先级寄存器

中断优先级寄存器IP
  • 作用: 用于设置部分中断源的优先级
  • **SFR地址:**0xB8
  • 复位值: 0000 0000B
    中断优先级寄存器IP
中断优先级寄存器IPH
  • 作用: 用于设置部分中断源的优先级
  • **SFR地址:**0xB7
  • 复位值: 0000 0000B
    中断优先级寄存器IPH

当中断优先级寄存器IP和中断优先级寄存器IPH对应的比特位进行组合时就能实现四级中断优先级

举个例子:
中断优先级寄存器组合配置

中断优先级寄存器IP2
  • 作用: 用于设置部分中断源的优先级
  • **SFR地址:**0xB5
  • 复位值: x000 0000B
    中断优先级寄存器IP2
中断优先级寄存器IP2H
  • 作用: 用于设置部分中断源的优先级
  • **SFR地址:**0xB6
  • 复位值: x000 0000B
    中断优先级寄存器IP2H

当中断优先级寄存器IP2和中断优先级寄存器IP2H对应的比特位进行组合时就能实现四级中断优先级

举个例子:
中断优先级寄存器组合配置