什么是中断?
当CPU正在处理某件事的时候,突然有一个紧急的事情发生了,要求CPU暂停当前的工作,转而去处理这个紧急的事情,处理完之后,再回到原理被中断的地方,继续原来的工作,这样的过程就叫中断。比如你正在写代码,突然肚子痛,你只能暂停写代码,去上厕所,厕所上完之后,你又回来接着写代码。
什么是中断源?
导致你中断当前任务的事件就是中断源。比如你正在写代码,肚子痛是一个中断源,你女朋友打电话过来了也是一个中断源,厨房着火了也是一个中断源。
什么是中断优先级?
中断优先级,就是根据中断源的轻重缓急来排队,先处理优先级高的,也就是最紧急的事情。比如厨房着火和你女朋友的电话哪个更紧急?肯定是厨房着火吧,那就先去灭火了。不过中断的优先级你自己可以安排,你也可以先跟你女朋友打电话,电话打完了之后再来灭火,毕竟有的人更爱江山,有的人更爱美人。
什么是中断嵌套?
中断嵌套就是,你中断了手头的工作,去处理紧急事件A的时候,又出现了一个更紧急的事件B,那就要暂停事件A,去处理事件B,等事件B处理完之后,再去处理事件A,事件A处理完之后,在继续你手头的工作。比如你在写代码的时候,你女朋友电话来了,你就去接你女朋友的电话,接电话的时候,厨房着火了,你就暂停电话去灭火,或灭之后,再跟你女朋友电话,电话完之后,再接着写你的代码。
STC89C51单片机系统有8个中断源
8个中断源其实可以分成3类
外部中断源4个:INT0、INT1、INT2、INT3
定时器中断源3个:Timer0、Timer1、Timer2
串口中断1个:UART
STC89C51单片机系统中断源的优先级
STC89C51单片机中断查询序号,也就是中断号
void Int0_Routine(void) interrupt 0;
void Timer0_Rountine(void) interrupt 1;
void Int1_Rountine(void) interrupt 2;
void Timer1_Rountine(void) interrupt 3;
void UART_Rountine(void) interrupt 4;
void Timer2_Rountine(void) interrupt 5;
void Int2_Rountine(void) interrupt 6;
void Int3_Rountine(void) interrupt 7;
STC89C51RC单片机中断系统结构图
看这种大图,不要怕,顺着线条,从左到右,从上到下的看,还可以分类归纳这看,51单片机的控制其实就是寄存器的控制,配置好寄存器,单片机就能自动的控制了,那就先来认识下几个跟中断相关的寄存器。
跟中断相关的寄存器
51单片机是一种8位单片机,什么意思?就是它内部的寄存器都是8位的,每个寄存器有8个bit
1、中断使能寄存器(Interrupt Enable),简写IE
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
2、中断优先级寄存器(Interrupt Priority )简写IP
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
- | - | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
3、中断优先级寄存器(Interrupt Priority High)简写IPH
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
PX3H | PX2H | PT2 | PSH | PT1H | PX1H | PT0H | PX0H |
4、定时器/计数器控制寄存器(Timer/Counter Control)简写TCON
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
5、串口控制寄存器(Serial Control)简写SCON
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
SM0/FE | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
6、定时器/计数器2控制寄存器(Timer/Counter2 Control)简写T2CON
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
TF2 | EXF2 | RCLK | TCLK | EXEN2 | TR2 | C/T2 | CP/RL2 |
7、辅助中断控制寄存器(Auxiliary Interrupt Control)简写XICON
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
PX3 | EX3 | IE3 | IT3 | PX2 | EX2 | IE2 | IT2 |
别看中断寄存器有这么多个,感觉很复杂的样子,当然,能记住最好了,记不住也没关系会翻书查询就可以了。基本就那么几个步骤:
1、用不用中断?用的话就把中断使能打开,一个总开关,一个分开关;
2、用什么类型的中断?51单片机就那么3种中断,外部中断、定时器中断、串口中断;
3、中断的优先级?每个中断可以设置为4个优先级别分别为0、1、2、3,数字越大,优先级越高;
当然这个顺序是可以打乱的,你也可以先设置类型,再设置类型,最后设置使能,只要把这几部都做了就好。
外部中断0分析
从左到右看:
1、 设置中断类型,外部中断0,可以设置为低电平中断,下降沿中断;
TCON.0/IT0 =0解释:将TCON寄存器的第0位,这个第0位就是IT0,将IT0设置为0,就可以将外部中断0 (INT0)设置为低电平中断了,
TCON.0/IT0 =1解释:将TCON寄存器的第0位,这个第0位就是IT0,将IT0设置为1,就可以将外部中断0 (INT0)设置为下降沿中断了,
2、设置中断使能开关,分别打开子开关,总开关;
EX0对应的是外部中断0(INT0)的使能子开关,EA是所有中断的总开关,都设置为1,外部中断0(INT0)才能有效。这个EX0是中断使能寄存器IE的第0位,EA是中断使能寄存器IE的第7位
3、设置中断优先级,有4个级别:00、 01、 10、 11,
中断优先级对应的寄存器有两个IP和IPH,这个IPH是STC单片机特有的,本来传统的51单片机优先级只有IP这一个寄存器,只能分两级,STC单片机多加了一个IPH寄存器,就可以分4级了。比如现在要把INT0的优先级设置为2,也就是1,0,那就把IPH寄存器的第0位PX0H设置为1,把IP寄存器的第0位PX0设置为0;
外部中断0(INT0)C语言实现
将外部中断0(INT0)设置为下降沿触发,通过按键按下来产生下降沿
#include <STC89C5xRC.H>
void main()
{
IT0 = 1; //外部中断0(INT0)设置为下降沿触发
EX0 = 1; //外部中断0(INT0)开关使能
EA = 1; //中断总开关使能
//STC单片机的中断优先级需要设置IP和IPH寄存器,IP寄存器可以位操作,IPH只能寄存器操作
//优先级也可以不设置,默认的中断优先级就是0,因为复位之后IPH和IP寄存器默认值就是0
PX0 = 0;
IPH = 0x01;
while(1);
}
void ExInt0() interrupt 0
{
P00 = ~P00; //每次INT0下降沿中断,P0.0的电平翻转,放个LED就可以看到LED亮灭
}
对应的外部中断电路图
外部中断1、2、3的使用与外部中断0的使用是一样的。