上一篇教程我们简单认识和学习了中断怎么使用,认识了单片机里面的几种中断源,学习了怎么配置中断的设置
这里简单的复习一下几种中断源
中断符号 | 中断名称 |
---|---|
IE0 | 外部中断0(INT0) |
ET0 | Timer0中断 |
IE1 | 外部中断1(INT1) |
ET1 | Timer1中断 |
ES | UART串口中断 |
ET2 | Timer2中断 |
阳光明媚的秋日,你坐在琴桌前轻抚古琴,这时候门外传来敲门声,你正要起身,身旁茶桌上的水壶里的水烧开了……
你起身,从炉上拿起烧水壶放在一旁,再来到门前打开了门……
提起水壶和开门是两个事件,当两个事件发生的时候总要有顺序的,先提起水壶再开门或者先开门后提起水壶所造成的结果是不同的。往往为了安全,我们会先提起水壶再去开门,这就是我们处理两个事件的顺序
在单片机中,倘若同一个时刻Timer0触发了中断,Timer1也触发了中断,这时候外部中断又触发了。单片机会先执行哪个中断操作呢?
是不是随意执行一个操作呢?
显然不是的,为了保证程序的有序执行,单片机根据“中断优先级”判断中断是否需要优先执行
优先级越高的中断,越优先执行
单片机的默认中断优先级
单片机里面,已经对中断的优先级进行设置,这是C51的所有中断优先级
中断优先级(数字越大越优先) | 中断符号 | 中断名称 |
---|---|---|
6 | IE0 | 外部中断0(INT0) |
5 | ET0 | Timer0中断 |
4 | IE1 | 外部中断1(INT1) |
3 | ET1 | Timer1中断 |
2 | ES | UART串口中断 |
1 | ET2 | Timer2中断 |
中断的嵌套
(1)低优先级的中断和高优先级的中断同时触发,单片机优先执行高优先级的中断
由于中断A的优先级大于中断B的优先级,所以单片机先处理完中断A的任务,再跳转处理中断B的任务,最后跳转回原来的位置,继续执行程序
(2)低优先级中断执行过程中高优先级中断触发中断,单片机跳转执行高优先级中断,再返回执行低优先级中断,执行结束后返回程序
中断A的优先级大于中断B的优先级,中断B触发,单片机跳转处理中断B的任务,执行到一半的时候,中断A触发,由于中断A的优先级更高,所以单片机先去处理中断A的任务,处理完再跳转回来处理中断B的任务
(3)高优先级的中断处理的过程中低优先级的中断触发,单片机优先处理完高优先级的中断的任务,再执行低优先级的中断的任务
中断A的优先级大于中断B的优先级,中断A触发,单片机先去执行中断A,执行的过程中中断B触发,由于中断B的优先级小于中断A的优先级,所以单片机在执行完中断A后才会执行中断B的任务
上面中断的执行过程就叫中断的嵌套
到此我们简单的复习一下
中断优先级(数字越大越优先) | 中断符号 | 中断名称 |
---|---|---|
6 | IE0 | 外部中断0(INT0) |
5 | ET0 | Timer0中断 |
4 | IE1 | 外部中断1(INT1) |
3 | ET1 | Timer1中断 |
2 | ES | UART串口中断 |
1 | ET2 | Timer2中断 |
下面用这个图示实践以下中断的嵌套
Timer0先触发,Timer0运行的过程中Timer1触发,由于Timer1的优先级不及Timer0,所以单片机执行完Timer0才处理Timer1,在Timer1的处理过程中遇上了外部中断INT0的触发,单片机先执行INT0的任务,再返回执行Timer1的任务,最后所有的任务都完成了以后,退回主程序
设置中断优先级
我们再看看单片机的默认优先级
中断优先级(数字越大越优先) | 中断符号 | 中断名称 |
---|---|---|
6 | IE0 | 外部中断0(INT0) |
5 | ET0 | Timer0中断 |
4 | IE1 | 外部中断1(INT1) |
3 | ET1 | Timer1中断 |
2 | ES | UART串口中断 |
1 | ET2 | Timer2中断 |
有的时候,如果使用默认的优先级,可能难以满足我们对程序的需求,事实上,我们可以手动设置单片机内中断的优先级。
手动设置单片机的优先级涉及到一个寄存器
IP寄存器,0xB8,可位寻址
位 | 符号 | 说明 |
---|---|---|
7 | - | - |
6 | - | - |
5 | PT2 | Timer2优先级设置 |
4 | PS | UART串口优先级设置 |
3 | PT1 | Timer1优先级设置 |
2 | PX1 | 外部中断INT1优先级设置 |
1 | PT0 | Timer0优先级设置 |
0 | PX0 | 外部中断INT0优先级设置 |
当我们给其中的一位写上1的时候就说明我们把这一位的中断优先级提前了
举个简单的例子,如果我们要做一个简单的秒表+时钟电子钟,秒表使用Timer0,时钟使用Timer1,为了让机器使用秒表的时候能让时钟正常走时,所以我们把Timer1的优先级提前,如下
PT1 = 1;
优先级的设置我们会在后面的项目中用到的,后面用到的时候我也会跟大家细细说明的哦
全部0条评论
快来发表一下你的评论吧 !