一、中断的概念:
为了降低CPU的占有率,同时实现单片机对复杂情景的处理,引入了中断。
CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,为该外设服务(或者处理紧急事件),处理完毕后回到原断点继续执行原程序。该过程叫做中断。
二、什么是中断源
引起中断的原因和发出中断请求的来源
中断源可以是外设,紧急事件,定时器或者人为设置用于单步断点调试程序。
1.中断系统要解决的问题:
1.CPU在执行程序中,如何检测到随机发生的中断请求
2.是否允许中断
3.如何正确的进入中断
4.怎么排列优先级
5.中断完成后,怎么返回原断点处
2. 51单片机的中断源:
中断源 | 名称 | 引脚 | 入口地址 |
---|---|---|---|
INT0 | 外部中断0 | P3.2 | 0003h |
INT1 | 外部中断1 | P3.3 | 0013h |
T0 | 0号定时器中断 | P3.4 | 000bh |
T1 | 1号定时器中断 | P3.5 | 001bh |
TI/RI | 串行口中断 | P3.1 TXD | 0023h |
基础型51单片机有5个中断源,增强型52系列增加了一个定时计数器2,共有6个中断源。
根据上图可知51单片机中断部分流程:
1.检测对应中断源标志位
2.检测对应中断开关是否打开
3.检测总中断是否打开
4.查询是否有优先级更高或同优先级中断正在执行
5.有更高优先级或同级,等待执行完毕进行中断,无高优先级和同级,直接进行中断
中断控制相关寄存器
中断控制寄存器 IE—中断的允许和接收
EA | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
---|---|---|---|---|---|---|
中断控制位 | T2 | 串行口 | T1 | INT1 | T0 | INT0 |
中断控制主要由两方面:
A: 是否允许中断
B: 中断的优先级设置
三、如何使用外部中断:
1.开启总中断: EA
2.开启外部中断: EX0/1
3.设置中断触发方式: IT0/1(低电平或高电平触发)
4.编写中断服务程序:
void 函数名 (void) interrupt m using n
{
}
m范围为0~4,分别代表5个中断源,外部中断INT0就是0,T0就是1,INT1就是2,T1就是3,串行中断就是4
n的范围为0~3,分别表示4组工作寄存器,不写就用0. 不写也可以
#include "reg52.h"
#include <intrins.h>
sbit LED = P1^0;
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void init()
{
EA = 1; // 开启总中断
EX0 = 1; // 开启外部中断
IT0 = 1; // 低电平触发
}
void main()
{
init();
while(1){
}
}
void INTERR(void) interrupt 0 // 外部中断服务函数
{
LED = 0;
Delay500ms();
LED = 1;
Delay500ms();
}