51单片机中断优先级讲解以及示例说明
51单片机中断优先级讲解以及示例说明
51单片机中断优先级讲解以及示例说明
- Proteus仿真演示

51单片机中断的优先级有两个:查询优先级和执行优先级
查询优先级
查询优先级是指当51单片机的多个中断源同时引起中断时,CPU逐个查询中断标志位的次序,高优先级的中断标志位将被优先查询到,但并不代表查询优先级高的中断一定可以打断正在执行中断处理的低优先级中断。查询优先级是由单片机硬件决定,不可更改。
- 单片机内部自然优先级顺序(由高到低)为:

1 | 外部中断0→定时器0中断→外部中断l→定时器1中断→串行口中断 |

- 如果使用C语言编程,中断查询次序号就是中断号,例如:
1 | void Int0\_Routine(void) interrupt 0 |
- 查询优先级说明:
- 当定时器中断0和外部中断1同时引起时(没有设置中断优先级控制寄存器),则会首先执行定时器中断0的请求;
- 当定时器中断0和外部中断1同时引起且外部中断1正在执行请求时(没有设置中断优先级控制寄存器),外部中断1不能被任何中断(包括定时器中断0)所打断。
执行优先级
执行优先级由中断优先级控制寄存器IP来控制。
中断优先级控制寄存器

- PT2:定时器中断2优先级控制位
- PS:串口中断优先级控制位
- PT1:定时器中断1优先级控制位
- PX1:外部中断1优先级控制位
- PT0:定时器中断0优先级控制位
- PX0:外部中断0优先级控制位
中断触发条件

如果只设置IP寄存器,执行优先级则只有两级:高优先级(IP中的相应位置1)和低优先级(IP中的相应位置0)。若寄存器IP没有设置(即寄存器IP所有位全为0),则只按照查询优先级进行。
中断的优先级总结:
- CPU同时接收到几个中断时,首先响应优先级最高的中断请求;
- 正在进行的中断过程不能被新的同级或低行优优先级的中断请求所中断;
- 正在进行的低行优优先级中断服务,能被高行优优先级中断请求中断;
当IP中的PX1位和PT0位置1,其余位置0时,中断的响应次序依次为:
1 | 定时器中断0 → 外部中断1 → 外部中断0 → 定时器中断1 → 串口中断 → 定时器中断2 |
中断嵌套
中断嵌套,是当一个中断正在执行的时候,如果事先设置了中断优先级寄存器IP,那么当一个更高优先级的中断到来的时候会发生中断嵌套,如果没有设置则不会发生任何嵌套;如果有同一个优先级的中断触发,它并不是在“不断的申请”,而是将它相应的中断标志位置即IE寄存器的某位置位,当CPU执行完当前中断之后,按照查询优先级重新去查询各个中断标志位,进入相应中断。
产生中断嵌套,关键字using的使用说明
没有设置IP时,单片机会按照查询优先级来排队进入不同中断服务。如果要想让某个中断优先响应, 则要设置IP,更改执行优先级,当设置了IP寄存器后,当低执行优先级中断正在执行期间,有高执行优先级的中断产生,则会嵌套调用进入高执行优先级的中断。如果是用C语言写的程序,并在中断服务时,
using寄存组,要注意:两个不同执行优先级的中断服务程序不要使用相同的using寄存器。
- 当产生中断嵌套时,C语言编程相当于手动去给cpu分配了寄存器进栈和出栈的寄存器组,用来保护和恢复现场。
- 如果是使用汇编编程,在写代码时就需要手动添加工作寄存器r1-r7。
51单片机中using使用在C语言编程中,用来在中断函数中指定工作寄存器区,工作寄存器共有4个区,分别代表R0~R7地址是:
1 | 第0工作区:00H~07H |
using n,那么n就是第几区,使用方法如下:
void exterint0() interrupt 0 using 1
这表示外部中断0使用第1工作区地址。
示例代码
这里演示的外部中断1的执行优先级最高,其次是外部中断0,最低优先级定时器0.
1 | #include"reg52.h" |
程序源码和仿真资源
本示例仿真基于
Proteus8.12平台。
1 | 链接:https://pan.baidu.com/s/1gWoBxcz-Lwev3Dnu6JCyLA |
| 竹石 清朝·郑板桥 |
|---|
| 咬定青山不放松,立根原在破岩中。 |
|---|
| 千磨万击还坚劲,任尔东西南北风。 |
|---|