这里是 单片微型计算机原理及接口技术 的第六章知识点
中断系统
中断概述
I/O数据传送方式
无条件传送方式
- 也称同步传送,所需的硬件和软件少。
- 外设在任何时刻已准备好。
- 用于对简单外设直接执行输入输出操作。
- 如,按键开关输入和LED的点亮和熄灭等控制。
条件传送方式
- 又称查询传送。
- 通过查询外设“准备好”后,再进行数据传送。
- 通用性好,硬件连线和查询程序简单。
- CPU花大量时间等待数据或外设准备就绪,工作效率很低。
中断方式
- CPU平时执行主程序,外设准备好后,才向CPU发中断请求。
- CPU中断主程序的执行,进入中断服务子程序。
- 中断服务完成后返回主程序断点处。
- CPU与外设可并行工作,可以提高单片机的工作效率。
DMA(Direct Memory Access) 传送方式
- 直接存储器存取方式,是硬件方式。
- 用于CPU与高速I/O设备交换数据,或与外设进行成组数据交换时。
- 由DMA控制器临时接管地址、数据和控制总线。
- 不受CPU干预,实现存储器与外设间的高速交换数据。
中断
计算机执行主程序过程中,由于临时重要事件,需要暂停当前程序的运行,转到中断服务程序去处理临时事件,处理完后又返回原程序的断点处继续运行。
中断的功能
- 解决快速CPU与慢速外部设备之间的矛盾,实现CPU与外设并行工作,提高CPU效率;
- 能对突发事件及时处理;
- 通过键盘发出中断请求,实现人机联系,可随时对计算机进行控制;
- 用于实时监测与控制,要求单片机能及时地响应中断请求源提出的服务请求,并作出快速响应;
中断源
——-引起中断的原因或者发出中断请求的设备。
分两类:内部中断源和外部中断源。
- 内部中断源在微处理器内部:计算溢出、定时时间到、程序调试中指令的单步运行、中断指令的执行等。
- 外部中断源来自外部设备:外设的I/O请求、设备故障、电源掉电等。
中断响应
———CPU接受中断请求
CPU在每条指令的最后一个时钟周期检测中断请求,若有,满足响应条件后,CPU响应。
中断向量
———中断服务程序入口地址
响应中断后,由中断源提供中断服务子程序地址信息。
计算机通常在内存预留一段区域,供中断向量或中断服务程序集中存放。
中断优先级
多个中断源同时提出中断请求,CPU响应优先级高的中断,挂起优先级低的中断。
中断嵌套
高优先级可以中断低优先级
低优先级不能中断高优先级。
同优先级不能中断。
中断的响应与处理过程
中断请求
是建立中断请求标志位的过程。
内部中断由单片机根据部件工作状态,自动置位相应中断标志位。
外部中断源,由单片机在每个机器周期的S5P2期间采样,满足触发条件时,置位中断标志位。
中断请求的触发形式:电平触发、上升沿触发和下降沿触发。
中断响应
中断源提出中断申请;
本中断位被允许;
无同级或更高优先级中断正在服务;
CPU总中断允许;
当前指令执行结束;
若正执行的指令是RETI或访问IE、IP指令,需再执行一条其他指令后才会响应。
中断处理
- 保护现场
- 中断服务
- 恢复现场
现场保护和现场恢复前关中断,是为防止高一级的中断进入,现场被破坏。
现场保护和现场恢复后开中断是为下一次的中断做好准备,允许中断嵌套。
中断返回
返回前,须先撤销中断请求,即将中断标志位清除,以免错误地再一次引起中断响应。
中断服务子程序的最后一条指令必须是RETI。从堆栈中弹出栈顶的的断点地址送PC,回到主程序断点处。
STC15单片机的中断系统结构
- 21个中断源
- 2个中断优先级
- 二级中断服务嵌套
- 中断允许寄存器IE、IE2和INT_CLKO控制中断允许。
- 中断优先级寄存器IP、IP2管理中断优先级。
- 同优先级中断同时提出中断请求时,由内部的查询逻辑确定响应次序。
21个中断源:
以下中断优先级固定为高级:
(1)INT0*—外部中断0:由INT0*(P3.2)引脚输入。
(2)INT1*—外部中断1:由INT1*(P3.3)引脚输入。
(3)定时器/计数器T0溢出中断
(4)定时器/计数器T1溢出中断
(5)串行口1中断
(6)A/D转换结束中断
(7)片内电源低压检测中断
(8)PCA/CPP中断:PCA计满溢出、PCA/PWM模块0或1发生匹配或捕获时,申请中断。
(9)串行口2中断
(10)SPI中断:
以下中断优先级固定为低级:
(11)INT2*—外部中断2:下降沿触发。
(12)INT3*—外部中断3:下降沿触发。
(13)定时器/计数器T2溢出中断
(14)INT4*—外部中断4:下降沿触发。
(15)串行口3中断
(16)串行口4中断
(17)定时器/计数器T3溢出中断
(18)定时器/计数器T4溢出中断
(19)比较器中断:比较器结果由高到低或由低到高时,申请中断。
(20)PWM中断:PWM计数器归零或PWM2~PWM7通道发生翻转,申请中断。
(21)PWM异常检测中断
中断请求标志寄存器
TCON
SCON
PCON
INT2、INT3、INT4和T2、T3、T4的中断请求标志对用户不可见。
TCON:字节地址为88H,可位寻址。
1)TF1—定时器/计数器T1的溢出中断请求标志位
2)TF0—定时器/计数器T0的溢出中断请求标志位
3)IE1—外部中断1的中断请求标志位
4)IE0—外部中断0的中断请求标志位
5)IT1—外部中断1的中断触发方式控制位
IT1=1,下降沿触发
IT1=0,为上升沿和下降沿触发
6)IT0—外部中断请求0的中断触发方式控制位
IT0=1,下降沿触发方式
IT0=0,为上升沿和下降沿触发
SCON:字节地址为98H,可位寻址。
1)TI—串行口发送中断请求标志 必须由软件清0
2)RI—串行口接收中断请求标志 必须由软件清0
PCON:字节地址为87H,不可位寻址
LVDF—片内电源低电压检测中断请求标志 需由软件清0
中断请求的撤销
所有的中断请求标志由硬件自动置位。
自动清除:
对于用户不可见的中断请求
IE1、IE0及TF1、TF0的中断请求
软件清除:
串行口的中断请求
LVDF标志
例如:
CLR TI ;清TI标志位
CLR RI ;清RI标志位
中断允许控制
IE:位地址是A8H,可位寻址
1)EA—中断允许总开关控制
2)ES—串行口1的中断允许
3)ET0、ET1—定时/计数器T0、T1的溢出中断允许
4)EX0、EX1—外部中断0、1中断允许
5)ELVD—片内电源低压检测中断允许
6)EADC—外部中断0中断允许
0:禁止中断
1:允许中断
IE2:字节地址AFH,不可位寻址
INT_CLK0:字节地址8FH,不可位寻址
7)ES2、ES3、ES4—串行口2、3、4的中断允许
8)ET2、ET3、ET4—定时/计数器T2、T3、T4的溢出中断允许
9)EX2、EX3、EX4—外部中断2、3、4中断允许
10)ESPI—SPI中断允许
- 单片机复位后,所有中断请求被禁止。
- 若允许某中断,除相应的允许位被置1外,还必须使EA位置1。
中断优先级的控制
外部中断2、3、4,串口3、4及定时器T2、T3、T4固定为低优先级.
其他具有2个中断优先级,可实现二级中断服务嵌套。
IP:字节地址为B8H,可位寻址
1)PPCA—PCA中断优先级
2)PLVD—电源低电压检测中断优先级
3)PADC—AD转换结束中断优先级
4)PS—串行口1中断优先级
5)PT1—定时器T1中断优先级控制位
6)PX1—外部中断1中断优先级控制位
7)PT0—定时器T0中断优先级控制位
8)PX0—外部中断0中断优先级控制位
0:低优先级
1:高优先级
IP2:字节地址为B5H,不可位寻址
9)PSPI—SPI的中断优先级
10)PS2—串行口2的中断优先级
- 系统复位后,所有中断源均为低优先级。
- 同时收到同优先级请求,优先级取决于查询顺序。
- 两个中断优先级,可实现两级中断嵌套。
两条基本规则:
(1)低优先级可被高优先级中断,高级不能被低级中断。
(2)不能被同级中断源中断。
例:若允许外部中断0和定时器T1中断,并使它们的中断请求为高优先级,外部中断0为下降沿触发。请编写相应的程序段。
(1)用位操作指令编写:
SETB EX0;允许外部中断0中断
SETB ET1;允许T1中断
SETB EA;中断总允许
SETB IT0;外部中断0为下降沿触发
SETB PX0;外部中断0为高优先级
SETB PT1;T1为高优先级
(2)用字节操作指令编写:
MOV IE,#89H
MOV IP,#09H
中断程序设计
中断响应
- 由硬件自动产生类似于长调用指令LCALL的操作
- 包括保护断点和将程序转向中断向量
首先将断点地址——程序计数器PC的内容压入堆栈保护
再将中断向量——中断服务程序入口地址装入PC
中断向量
- 各中断源的中断向量由硬件固定分配
相邻中断向量间只相隔8字节,一般难以安放一个完整的中断服务程序。
常在中断向量处放置一条无条件转移指令,使跳转到用户安排的中断服务程序起始地址处。
例如:
ORG 001BH ;系统安排的T1中断向量001BH
LJMP T1_ISR ;转向T1的中断服务程序T1_ISR
中断服务任务
中断服务任务包括:
1)置位中断允许控制位。
2)设置中断优先级控制位。
3)设置外部中断源的触发方式。
4)不能自动撤销的请求标志,用软件清除。
5)编写中断服务子程序。
- 前3条任务要求放在主程序的初始化程序段中
- 第4条任务放在中断服务子程序中
主程序结构
程序必须从地址0000H开始执行,在0000H地址处,用无条件转移指令,跳向主程序。
系统给每个中断服务程序只预留了8字节,在进入中断后,用无条件转移指令,跳转到实际的中断服务子程序入口地址处。
常用的主程序结构:
- 中断向量必须依次由小到大排列。
中断函数(C语言)1
2
3
4
5
6void INT0_ISR(void)interrupt 0{}
void Timer0_ISR(void)interrupt 1{}
void INT1_ISR(void)interrupt 2{}
void Timer1_ISR(void)interrupt 3{}
void UART_ISR(void) interrupt 4{}
void LVD_ISR(void)interrupt 6{}
1 | ORG 0000H |
中断服务子程序流程
1)程序开始必须保护中断现场,用PUSH将各寄存器入栈保护。
2)清除中断请求标志位。
3) 执行中断处理程序。
4) 恢复中断现场,用POP将各寄存器恢复。
5)用RETI返回主程序断点,中断结束。
- 现场保护和恢复前关中断,是为防止现场被破坏。
- 现场保护和恢复之后的开中断是为下一次的中断做准备,也为了允许中断嵌套。
例:编写某外部中断的服务程序。设现场保护只将PSW寄存器和累加器A的内容压入堆栈中保护。
1 | INT: CLR EA ;CPU关中断 |
几点说明:
1)堆栈的操作是先入后出。
2)外部中断的请求标志由硬件自动清除。
3)如不允许被其他中断打断,可将中间“SETB EA”和“CLR EA”指令去掉。
5)最后一条指令必须是RETI。
外部中断应用举例
例:P1.7连接LED灯,利用外部中断0改变P1.7,控制灯的亮灭。
中断服务子程序任务: P1.7翻转,灯亮灭切换 返回主程序 | 主程序任务: 允许INT0中断 设置INT0触发方式 中断总允许 设置INT0优先级 |
外部中断0采用下降沿触发方式。汇编语言参考程序如下:
1 | ORG 0000H ; reset |
例:按键连接INT1,用3个数码管显示按键的按压次数。
主程序流程:
中断服务子程序任务:
计数值加1
返回主程序
汇编参考程序:
说明:
- MCS-51只有P0~P3口,STC增加的P4、P5口要定义。
- STC的I/O口有4种工作模式,由PiM1和PiM0设置。
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89P4 0C0H ; 端口寄存器的地址
P5 0C8H
P3M1 0xB1 ; 设置端口模式寄存器的地址
P3M0 0xB2
P4M1 0xB3
P4M0 0xB4
P5M1 0xC9
P5M0 0xCA
;************* IO口定义 **************
HC595_SER BIT P4.0 ; 串行数据输入引脚
HC595_RCLK BIT P5.4 ; 锁存时钟
HC595_SRCLK BIT P4.3 ; 移位时钟
STACK_P 0D0H ; 堆栈开始地址
DIS_BLACK 10H ; 消隐的索引值
;************* 本地变量声明 ***********
LED8 30H ; 显示缓冲 30H ~ 37H
disp_index 38H ; 显示位索引
INT1_cnt 39H ; 测试用的计数变量
ORG 0000H ; reset
LJMP Main
ORG 0013H ; INT1 中断向量
LJMP INT1_ISR
ORG 0100H ; 主程序起始地址
Main: CLR A
MOV P3M1, A ;设置为准双向口
MOV P3M0, A
MOV P4M1, A
MOV P4M0, A
MOV P5M1, A
MOV P5M0, A
MOV SP, #STACK_P
MOV disp_index, #0
MOV R0, #LED8
MOV R2, #8
ClearLoop: MOV @R0, #DIS_BLACK ; 上电消隐
INC R0
DJNZ R2, ClearLoop
SETB EX1 ; INT1允许
SETB IT1 ; INT1 下降沿中断
SETB EA ; 允许总中断
SETB PX1 ; 高优先级
MOV INT1_cnt, #0
Main_loop: LCALL delay_ms
LCALL DisplayScan
LJMP Main_loop ; 循环等待中断
DispScan: MOV A, INT1_cnt
MOV B, #10
DIV AB
MOV LED8+0, A ;百位
MOV A, #10
XCH A, B
DIV AB
MOV LED8+1, A ;十位
MOV LED8+2, B ;个位
MOV R7, #3 ; 3个数码管
NEXT: MOV DPTR, #T_COM ; 位码表头
MOV A, disp_index ; 数码管号
MOVC A, @A+DPTR
CPL A ; 595级联时用的/Q7
LCALL Send_595 ; 输出位码
MOV DPTR, #T_Disp ; 7段码表头
MOV A, disp_index
ADD A, #LED8
MOV R0, A
MOV A, @R0 ; 待显示的数
MOVC A, @A+DPTR
LCALL Send_595 ; 输出段码
CLR HC595_RCLK ; 产生锁存时钟
SETB HC595_RCLK
INC disp_index ; 下一数码管
DJNZ R7, NEXT
MOV disp_index, #0 ; 8位结束回0
RET
; HC595串行移位输出一个字符
Send_595: MOV R2, #8
Send_Loop: RLC A
MOV HC595_SER, C
CLR HC595_SRCLK
SETB HC595_SRCLK ; 产生移位脉冲
DJNZ R2, Send_Loop
RET
INT1_ISR: INC INT1_cnt ; 中断服务程序
RETI
T_Disp: DB 3FH,06H,5BH,4FH,66H,6DH, 7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H;
; 0-F的7段码及消隐
T_COM: DB 01H,02H,04H,08H,10H,20H,40H,80H ; 位码
外部中断的扩展
1.利用外部中断加查询的方法扩展外部中断
4个外中断信号EINT0~EINT4为低电平有效,当有1个或以上为低电平时,经与门后输出低电平,产生下降沿信号,向CPU发出中断请求。
2.利用定时中断
当定时/计数器不用时,可用来扩展外部中断。将定时/计数器设置在计数状态,初始值设置为全“1”,这时的定时/计数器中断即为由计数脉冲输入引脚引发的外部中断。
3.PCA中断扩展外部中断
当PCA不用时,也可扩展为下降沿触发的外部中断。