在实际的单片机开发中,中断系统是连接硬件事件与软件响应的核心桥梁。无论是按键触发、定时器溢出,还是串口接收到数据,都需要通过中断机制来确保CPU能够及时响应,而无需持续轮询。对于学习单片机汇编语言的同学而言,中断系统既是课程的重点,也是期末考试的必考难点。它涉及中断源、中断向量、中断允许控制、中断优先级、现场保护与恢复等一系列紧密关联的概念,任何一个环节理解不到位,都可能导致程序运行异常。
本文将以典型的8051系列单片机为背景,深入讲解中断系统的完整工作机制。我们将从最基本的中断概念入手,逐步拆解中断响应的全过程,并结合具体的汇编代码示例,演示如何编写中断服务程序。更重要的是,我们将针对常见的考点和易错习题进行剖析,帮助你不仅理解原理,更能应对考试和实际编程中的问题。通过本文,你将掌握中断系统的配置流程、中断服务程序的编写规范,并学会排查中断不响应、中断嵌套混乱等典型问题。
1. 理解中断系统:从硬件事件到软件响应
中断的本质是一种硬件触发的机制,它允许CPU暂停当前正在执行的程序,转而去处理一个更紧急的事件,处理完毕后再返回原程序继续执行。这个过程类似于你在看书时,电话铃响了,你标记下当前的阅读位置(保护现场),去接电话(执行中断服务程序),接完电话后再回来从标记的位置继续看书(恢复现场)。
1.1 中断系统的核心组件
在8051单片机中,中断系统主要由以下几个部分构成:
中断源:能够产生中断请求信号的来源。8051通常有5个固定的中断源:
- INT0:外部中断0,由P3.2引脚引入。
- T0:定时器/计数器0溢出中断。
- INT1:外部中断1,由P3.3引脚引入。
- T1:定时器/计数器1溢出中断。
- TI/RI:串行口中断,包含发送完成(TI)和接收完成(RI)。
中断向量:每个中断源在程序存储器(ROM)中都有一个固定的入口地址,称为中断向量。当某个中断被响应时,CPU会自动跳转到对应的中断向量地址去执行程序。这是中断服务程序(ISR)的起点。
中断允许寄存器(IE):这是一个可编程的寄存器,用于控制整个中断系统的总开关以及每个中断源的独立开关。只有相应的中断允许位被置1,该中断请求才有可能被CPU响应。
中断优先级寄存器(IP):当多个中断同时请求时,IP寄存器用于设定它们的优先顺序。高优先级的中断可以打断正在执行的低优先级中断服务程序,实现中断嵌套。
定时器/计数器控制寄存器(TCON):其中的某些位用于标识外部中断的触发方式(电平触发/边沿触发)以及定时器溢出标志。
1.2 中断响应的完整流程
理解中断响应流程是应对考题的关键。整个过程可以分为以下几个阶段:
- 中断请求:中断源事件发生(如定时器溢出、外部引脚电平变化),相应的中断请求标志位(如TF0、IE0)被硬件自动置1。
- 中断判优:如果多个中断请求同时发生,硬件会根据IP寄存器的设置和固定的内部顺序(INT0 > T0 > INT1 > T1 > 串口)来决定优先响应哪一个。
- 中断响应:如果CPU处于开中断状态(EA=1)且该中断源被允许(如EX0=1),则在当前指令执行完毕后,CPU响应中断。硬件自动完成三件事:
- 将下一条指令的地址(即断点地址)压入堆栈保护。
- 清除正在响应的中断源请求标志位(对于边沿触发的外部中断和定时器中断,硬件会自动清除;对于串口中断和电平触发的外部中断,需要软件手动清除)。
- 根据中断源,将程序计数器(PC)跳转到对应的中断向量地址。
- 执行中断服务程序(ISR):程序员在中断向量地址处,通常放置一条跳转指令(如
LJMP),跳转到实际的中断处理代码段。在ISR中,首先要做的是保护现场(将PSW、ACC等可能被破坏的寄存器压栈),然后执行具体的处理逻辑,最后在返回前恢复现场。 - 中断返回:ISR执行到最后一条指令
RETI时,硬件自动将之前压栈的断点地址弹出到PC,CPU从而返回到主程序被中断的地方继续执行。RETI指令还会通知中断系统本次中断处理已结束。
2. 环境准备与核心寄存器详解
在动手编写代码前,必须清楚如何配置控制中断系统的各个寄存器。这些寄存器的每一位都对应着特定的控制功能。
2.1 中断允许寄存器(IE - Interrupt Enable)
IE寄存器地址为A8H,支持位寻址。它控制着中断的总开关和分开关。
| 位 | 符号 | 地址 | 功能说明 |
|---|---|---|---|
| 7 | EA | AFH | 总中断允许控制位。EA=1,CPU开放所有中断;EA=0,CPU屏蔽所有中断。 |
| 6 | - | AEH | 保留位。 |
| 5 | ET2 | ADH | 定时器2中断允许位(8052系列才有)。 |
| 4 | ES | ACH | 串行口中断允许位。ES=1,允许串口中断。 |
| 3 | ET1 | ABH | 定时器1中断允许位。ET1=1,允许T1中断。 |
| 2 | EX1 | AAH | 外部中断1允许位。EX1=1,允许INT1中断。 |
| 1 | ET0 | A9H | 定时器0中断允许位。ET0=1,允许T0中断。 |
| 0 | EX0 | A8H | 外部中断0允许位。EX0=1,允许INT0中断。 |
配置示例:若想允许外部中断0和定时器0中断,需要设置EA=1, EX0=1, ET0=1。
SETB EA ; 打开总中断开关 SETB EX0 ; 允许外部中断0 SETB ET0 ; 允许定时器0中断 ; 或者使用字节操作 MOV IE, #10000011B ; EA=1, EX0=1, ET0=12.2 中断优先级寄存器(IP - Interrupt Priority)
IP寄存器地址为B8H,支持位寻址。它用于设置5个基本中断源的优先级,默认为0(低优先级)。
| 位 | 符号 | 地址 | 功能说明 |
|---|---|---|---|
| 7 | - | BFH | 保留位。 |
| 6 | - | BEH | 保留位。 |
| 5 | PT2 | BDH | 定时器2优先级(8052)。 |
| 4 | PS | BCH | 串行口中断优先级。 |
| 3 | PT1 | BBH | 定时器1中断优先级。 |
| 2 | PX1 | BAH | 外部中断1优先级。 |
| 3 | PT0 | B9H | 定时器0中断优先级。 |
| 0 | PX0 | B8H | 外部中断0优先级。 |
规则:某位设为1,对应中断源为高优先级;设为0则为低优先级。当两个不同优先级的中断同时请求时,先响应高优先级。当两个相同优先级的中断同时请求时,按内部查询顺序(INT0 -> T0 -> INT1 -> T1 -> 串口)响应。高优先级中断可以打断正在执行的低优先级中断服务程序,反之则不能。
2.3 定时器/计数器控制寄存器(TCON)
TCON的低4位与外部中断相关,高4位与定时器相关。地址88H,支持位寻址。
| 位 | 符号 | 地址 | 功能说明 |
|---|---|---|---|
| 7 | TF1 | 8FH | 定时器1溢出标志。溢出时硬件置1,响应中断后硬件清0(或软件清0)。 |
| 6 | TR1 | 8EH | 定时器1运行控制位。软件置1启动,清0停止。 |
| 5 | TF0 | 8DH | 定时器0溢出标志。同TF1。 |
| 4 | TR0 | 8CH | 定时器0运行控制位。同TR1。 |
| 3 | IE1 | 8BH | 外部中断1请求标志。检测到INT1引脚有效信号时硬件置1,响应中断后硬件清0(边沿触发模式)。 |
| 2 | IT1 | 8AH | 外部中断1触发方式控制。IT1=1,边沿触发(下降沿有效);IT1=0,电平触发(低电平有效)。 |
| 1 | IE0 | 89H | 外部中断0请求标志。同IE1。 |
| 0 | IT0 | 88H | 外部中断0触发方式控制。同IT1。 |
注意:对于电平触发的外部中断,CPU在响应中断后不会自动清除IE0/IE1标志。因此,必须在中断服务程序中,通过撤销INT0/INT1引脚上的低电平信号来使硬件自动清0,否则会引发中断重复响应。
2.4 中断向量表
中断向量是固定的入口地址。编写程序时,必须将跳转到实际ISR的指令放在这些地址上。
| 中断源 | 中断向量地址(ROM) | 说明 |
|---|---|---|
| 外部中断0 (INT0) | 0003H | 通常放置LJMP INT0_ISR |
| 定时器0 (T0) | 000BH | 通常放置LJMP TIMER0_ISR |
| 外部中断1 (INT1) | 0013H | 通常放置LJMP INT1_ISR |
| 定时器1 (T1) | 001BH | 通常放置LJMP TIMER1_ISR |
| 串行口 (TI/RI) | 0023H | 通常放置LJMP UART_ISR |
3. 汇编语言中断编程实战
理解了寄存器,我们就可以开始编写一个完整的中断程序。我们将以实现一个功能为例:利用外部中断0(INT0,接按键)控制一个LED(接P1.0)的亮灭,同时利用定时器0中断实现约1秒的延时,用于LED闪烁的频率控制。
3.1 项目需求与硬件连接分析
- 功能:系统上电后,LED以1秒为周期闪烁。当按下连接在INT0(P3.2)引脚上的按键时,LED状态立即翻转(亮变灭或灭变亮),然后继续以新的状态闪烁。
- 硬件假设:
- 单片机:AT89C51/52或其他兼容8051内核的单片机。
- LED:阳极通过限流电阻接VCC,阴极接P1.0。P1.0输出0时LED亮,输出1时LED灭。
- 按键:一端接地,另一端接INT0(P3.2)引脚。单片机内部上拉电阻使引脚常态为高电平,按键按下时变为低电平。
- 晶振:假设为12MHz(一个机器周期为1μs)。
3.2 程序结构与初始化代码
首先,我们需要进行中断系统和定时器的初始化。
ORG 0000H ; 程序起始地址 LJMP MAIN ; 跳转到主程序 ORG 0003H ; 外部中断0向量地址 LJMP EXT0_ISR ; 跳转到外部中断0服务程序 ORG 000BH ; 定时器0中断向量地址 LJMP TIMER0_ISR ; 跳转到定时器0服务程序 ORG 0030H ; 主程序放在向量区之后 MAIN: MOV SP, #60H ; 设置堆栈指针,避开工作寄存器区和位寻址区 LCALL INIT ; 调用初始化子程序 LOOP: SJMP LOOP ; 主循环,等待中断发生 ; 初始化子程序 INIT: ; 1. 初始化LED状态(假设初始为灭) SETB P1.0 ; P1.0输出高电平,LED灭 ; 2. 设置外部中断0为边沿触发 SETB IT0 ; IT0=1,下降沿触发 ; 3. 配置定时器0为模式1(16位定时器) MOV TMOD, #01H ; TMOD=0000 0001B,T0模式1,T1模式0(未用) ; 4. 计算定时器初值(12MHz晶振,定时50ms) ; 机器周期 = 12 / 12MHz = 1μs ; 定时50ms需要计数次数 N = 50000 ; 初值 X = 65536 - 50000 = 15536 = 3CB0H MOV TH0, #3CH ; 高8位 MOV TL0, #0B0H; 低8位 ; 5. 启动定时器0 SETB TR0 ; TR0=1,启动T0 ; 6. 开启中断 SETB EX0 ; 允许外部中断0 SETB ET0 ; 允许定时器0中断 SETB EA ; 开启总中断 RET关键点解释:
ORG伪指令用于指定后续代码存放的起始地址。必须将跳转指令准确放在中断向量地址上。- 定时器初值计算是常考考点。模式1是16位计数器,最大计数值65536。初值 = 65536 - 所需计数值。
- 初始化顺序:先配置触发方式、定时器模式,再赋初值、启动定时器,最后打开中断允许位。这个顺序可以避免意外中断。
3.3 中断服务程序编写
中断服务程序需要完成现场保护、核心逻辑处理和现场恢复。
; 定时器0中断服务程序 - 用于产生1秒延时基准 TIMER0_ISR: PUSH ACC ; 保护现场,将ACC压栈 PUSH PSW ; 保护现场,将PSW压栈 ; 重装定时器初值,为下一次50ms定时做准备 MOV TH0, #3CH MOV TL0, #0B0H ; 软件计数器减1(假设R7作为50ms计数器) DJNZ R7, TIMER0_EXIT ; 如果R7不为0,跳转到退出 ; 如果R7为0,说明20个50ms到了(即1秒) MOV R7, #20 ; 重置软件计数器为20 CPL P1.0 ; 取反P1.0,LED状态翻转 TIMER0_EXIT: POP PSW ; 恢复现场,PSW出栈 POP ACC ; 恢复现场,ACC出栈 RETI ; 中断返回,必须用RETI ; 外部中断0服务程序 - 响应按键,立即翻转LED EXT0_ISR: PUSH ACC PUSH PSW ; 按键消抖(简单延时) LCALL DELAY_10MS ; 再次检测INT0引脚,确认是有效按键(防干扰) JB P3.2, EXT0_EXIT ; 如果P3.2已经是高电平,则认为是干扰,退出 ; 执行核心功能:翻转LED CPL P1.0 ; 等待按键释放(避免一次按下多次触发) WAIT_RELEASE: JNB P3.2, WAIT_RELEASE ; 如果P3.2还是低电平,循环等待 EXT0_EXIT: POP PSW POP ACC RETI ; 一个简单的10ms延时子程序,用于按键消抖 DELAY_10MS: MOV R6, #20 D1: MOV R5, #250 DJNZ R5, $ DJNZ R6, D1 RET关键点解释:
- 现场保护与恢复:中断可能发生在任何时刻,必须保护中断程序中会用到的所有寄存器(如ACC、PSW、B以及通用寄存器Rn)。通常使用
PUSH和POP指令成对操作。PSW保护了标志位和当前工作寄存器组。 - 定时器中断:在ISR中必须重装初值,否则下次定时会从0开始计数,导致定时不准。使用软件计数器(如R7)来实现更长的定时(如1秒)。
- 外部中断:
- 消抖:机械按键会产生抖动,需要在检测到中断后延时再判断,避免误触发。
- 防干扰与等待释放:
JB P3.2, EXT0_EXIT用于排除干扰脉冲。WAIT_RELEASE循环确保按键松开后才退出,防止一次按下产生多次中断。
- 中断返回:必须使用
RETI指令,它除了恢复PC,还会通知中断控制系统该中断已处理完毕,允许响应新的同级或低级中断。
4. 核心考点与典型习题剖析
掌握了基本编程后,我们针对考试中常见的题型和易错点进行深入分析。
4.1 考点一:中断响应条件与流程判断
常见题型:判断在某种特定条件下(如某条指令执行期间),某个中断请求是否会被响应?何时响应?
例题:假设CPU正在执行一条MOVX A, @DPTR指令(访问外部RAM,需2个机器周期),此时外部中断0(INT0)引脚上出现了一个有效的下降沿(IT0=1)。已知EA=1,EX0=1,且无其他中断请求。问INT0中断是否会被响应?何时响应?
分析与解答:
- 条件满足:EA和EX0都已打开,INT0请求有效,满足中断响应条件。
- 响应时机:CPU会在当前指令执行完毕后,去查询中断请求标志。
MOVX指令需要2个机器周期。因此,INT0的中断请求会在该MOVX指令的第二个机器周期结束时被采样到,并在该指令执行完毕后(即下一条指令开始前)进入中断响应周期。 - 答案:会被响应。响应发生在
MOVX A, @DPTR指令执行完毕之后。
关键记忆点:中断采样发生在每个指令的最后一个机器周期。响应发生在当前指令执行完,下一条指令开始前。长指令(如乘除、MOVX)执行期间发生中断,也需要等该指令执行完。
4.2 考点二:中断优先级与嵌套分析
常见题型:给定中断允许和优先级设置,分析多个中断同时或先后发生时的响应顺序。
例题:设置IE = 8FH (10001111B), IP = 06H (00000110B)。请分析:(1) 若INT0和T1中断同时请求,谁先被响应?(2) 若CPU正在执行T1的中断服务程序,此时INT0请求中断,会怎样?(3) 若CPU正在执行INT0的中断服务程序,此时T1请求中断,会怎样?
寄存器分析:
- IE = 10001111B:EA=1, ES=0, ET1=1, EX1=0, ET0=1, EX0=1。允许INT0、T0、T1中断。
- IP = 00000110B:PX1=0, PT0=1, PX0=0。T0为高优先级,INT0和T1为低优先级。
解答:
- 同时请求:INT0和T1同时请求,且均为低优先级。此时按内部查询顺序决定。查询顺序为:INT0 -> T0 -> INT1 -> T1 -> 串口。因此INT0先于T1被响应。
- T1执行中,INT0请求:T1为低优先级,INT0也为低优先级。同级或低级中断不能打断正在执行的中断服务程序。因此CPU不会响应INT0,直到T1的ISR执行完毕返回主程序后,才会响应INT0。
- INT0执行中,T1请求:同理,T1不能打断INT0。但这里有一个陷阱:T1的中断请求标志TF1在请求时已被置1。虽然本次不能打断,但当INT0执行完
RETI返回后,CPU会立即检测到仍有未处理的T1中断请求(因为TF1未被清除),并且此时INT0的ISR已结束,所以会紧接着响应T1中断,而不会先返回主程序。这种现象看起来像是“连续中断”。
4.3 考点三:中断标志位的清除
常见题型:分析中断服务程序中是否需要手动清除中断标志,以及不清除会导致什么问题。
例题:在电平触发的外部中断服务程序中,为什么通常需要等待外部信号恢复高电平?如果不这样做,可能发生什么?
分析与解答:
- 原因:对于电平触发方式(ITx=0),其中断请求标志IEx是由外部引脚(P3.2/P3.3)的低电平直接置位的。CPU响应中断后,硬件不会自动清除IEx标志。只要引脚上低电平持续存在,IEx就保持为1。
- 后果:如果ISR执行完毕返回后,引脚低电平仍然存在,CPU会立即再次检测到有效的中断请求,从而再次进入同一个ISR。这就导致了中断的重复响应,仿佛程序“卡死”在中断里。
- 解决方案:在电平触发的中断服务程序中,必须确保在返回前,外部引脚的低电平信号已消失(如等待按键释放)。通常通过循环检测引脚状态实现,如示例代码中的
WAIT_RELEASE部分。
对比记忆:
| 中断源 | 触发方式 | 请求标志 | 清除方式 |
|---|---|---|---|
| 外部中断0/1 | 边沿触发 | IE0/IE1 | CPU响应中断后,硬件自动清除。 |
| 外部中断0/1 | 电平触发 | IE0/IE1 | 硬件不会自动清除。需在ISR中确保外部信号恢复高电平。 |
| 定时器0/1 | 溢出 | TF0/TF1 | CPU响应中断后,硬件自动清除。也可软件查询清0。 |
| 串行口 | 发送/接收 | TI/RI | 硬件不会自动清除。必须在ISR中用软件指令清除(CLR TI 或 CLR RI)。 |
4.4 考点四:现场保护与恢复的细节
常见题型:给出一个有缺陷的中断服务程序,找出其中现场保护/恢复的错误。
例题:以下定时器中断服务程序片段有什么问题?
TIMER_ISR: MOV A, #55H ADD A, R0 MOV @R0, A RETI分析与解答: 该ISR没有进行任何现场保护。它直接使用了A累加器、R0寄存器以及R0指向的RAM单元。如果主程序或更高优先级中断也在使用这些资源,中断返回后,这些资源的值已被改变,导致主程序运行出错。
正确做法:在ISR入口处,将要用到的寄存器(如ACC, PSW, DPTR, B以及R0-R7)压栈保护;在ISR退出前,以相反顺序出栈恢复。
TIMER_ISR: PUSH ACC PUSH PSW PUSH 00H ; 假设R0是0组寄存器,其地址为00H ; ... 中断处理逻辑 ... POP 00H POP PSW POP ACC RETI注意:
PUSH和POP的操作对象是直接地址。对于工作寄存器R0-R7,需要根据当前使用的寄存器组,确定其对应的RAM地址(00H-07H对应第0组,08H-0FH对应第1组,以此类推)。
5. 常见问题排查与调试技巧
在实际编程和实验过程中,中断相关的问题往往比较隐蔽。下面列出常见的问题现象和排查思路。
5.1 中断完全不响应
现象:按键按下,LED无反应;定时时间到,程序无动作。
排查清单:
- 总中断开关是否打开?检查
EA位是否设置为1。这是最容易被忽略的一步。 - 特定中断允许位是否打开?检查
EX0、ET0等相应位是否设置为1。 - 中断触发方式设置是否正确?检查
IT0/IT1。如果是边沿触发,确保信号有下降沿;如果是电平触发,确保低电平持续时间足够长。 - 中断向量地址是否正确?检查ORG伪指令是否写错地址,以及跳转指令(
LJMP或AJMP)是否写对了中断服务程序的标号。 - 堆栈空间是否足够?中断响应和现场保护需要压栈,如果堆栈指针SP初始设置过小,可能导致堆栈溢出,覆盖程序数据,引发不可预知的错误。通常将SP初始化为60H或更高。
- 硬件连接是否正确?用万用表或逻辑分析仪检查中断引脚的电平变化是否符合预期。
5.2 中断只响应一次或响应异常
现象:按键第一次按下有效,后续无效;或者LED疯狂闪烁,不受控制。
排查清单:
- 中断标志是否被正确清除?这是最常见的原因。
- 对于串口中断:必须用
CLR TI或CLR RI在ISR中手动清除标志。 - 对于电平触发的外部中断:必须在ISR中等待外部信号恢复高电平,否则会不断重复进入中断。
- 对于边沿触发的外部中断和定时器中断:硬件会自动清除,一般无需软件干预。但如果中断被禁止(EA=0或EXx=0)时发生了中断请求,标志位会被置1并保持,直到中断被允许。这种情况需要在初始化时手动清除可能遗留的标志位(
CLR IE0等)。
- 对于串口中断:必须用
- 中断服务程序执行时间是否过长?如果ISR执行时间超过了中断事件的间隔,可能会丢失中断。例如,定时器50ms溢出一次,但ISR执行需要60ms,那么第二次溢出时CPU还在执行第一次的ISR,且由于同级中断不能嵌套,第二次中断请求可能被忽略。优化ISR代码,或将耗时操作移到主循环。
- 是否存在中断嵌套冲突?检查IP寄存器设置。如果高优先级中断的ISR执行时间很长,可能会“饿死”低优先级中断。
5.3 现场保护导致的数据错乱
现象:主程序中的变量值在中断发生后莫名其妙地改变。
排查清单:
- 是否保护了所有被修改的寄存器?仔细检查ISR,凡是用到的ACC、PSW、B、DPTR、Rn以及直接地址单元,如果主程序也可能使用,就必须保护。
- PUSH和POP是否成对且顺序相反?必须遵循“先进后出”原则。
- 是否错误地改变了工作寄存器组?PSW中的RS1和RS0位决定了当前使用哪组R0-R7。如果在ISR中改变了PSW且未妥善保护,返回主程序后,主程序使用的R0-R7就变成了另一组,导致数据错乱。一个常见的做法是,在ISR开始时通过设置PSW切换到一个专用于中断的寄存器组,这样就不需要保护R0-R7,但退出前要恢复原PSW。
6. 最佳实践与扩展方向
6.1 中断编程最佳实践
- 保持ISR短小精悍:中断服务程序应只处理最紧急、最核心的任务,如置标志位、读数据、清中断等。复杂的计算、延时、通信等操作应放到主循环中基于标志位来处理。
- 使用软件标志进行通信:ISR与主程序之间通过软件标志(位变量或字节变量)来传递信息。这是最安全、最清晰的异步通信方式。
- 注意重入问题:避免在ISR和主程序中共用非原子操作的全局变量。如果共用,应考虑使用关中断
CLR EA和开中断SETB EA来保护临界区,但关中断时间要尽可能短。 - 初始化时清除残留中断标志:在开启中断前,先清除TCON、SCON中可能残留的中断请求标志位,避免一开中断就误入中断。
- 合理规划堆栈空间:根据中断嵌套层数和现场保护的数据量,预留足够的堆栈空间(通常SP初始值设为60H或更高)。
6.2 扩展方向:中断与低功耗设计
在许多单片机应用中,低功耗是关键指标。中断是实现低功耗(休眠-唤醒)模式的基石。
- 休眠模式:通过执行特定指令(如8051的
ORL PCON, #01H进入Idle模式),CPU停止工作,但外设(定时器、串口、外部中断)仍可运行。 - 中断唤醒:当使能的中断事件发生时,CPU被唤醒,退出休眠模式,执行对应的ISR,之后继续执行进入休眠模式指令之后的代码。
- 编程模式:主程序完成初始化后,进入循环:处理任务 -> 进入休眠 -> (被中断唤醒)-> 处理中断 -> 返回循环。这样CPU只在有事件需要处理时才工作,极大降低了平均功耗。
掌握中断系统,不仅是应对考试,更是为后续学习更复杂的单片机应用(如实时操作系统RTOS的基础)打下坚实基础。建议在理解本文示例的基础上,尝试修改代码,实现中断嵌套、用中断方式扫描矩阵键盘、用中断方式实现串口数据收发等实验,从而真正融会贯通。