一、什么是中断
中断指通过硬件来改变CPU的运行方向,简单来说就是外部设备给CPU中断信号,然后CPU暂停当前程序,去执行中断信号的程序,当程序执行完之后再回去执行先前的程序。
二、中断系统结构及中断有关寄存器
1.中断源有5个,分别为外部中断0请求INT0、外部中断1请求INT1、T0溢出中断请求TF0、T1溢出中断请求TF1和串口中断请求RI/TI
序号 | 中断源 | 说明 |
---|---|---|
1 | INT0 | 由P3.2引脚引入,IT0位决定低电平有效还是高电平有效 |
2 | INT1 | 由P3.3引脚引入,IT0位决定低电平有效还是高电平有效 |
3 | TF0 | 当T0产生溢出时,T0溢出中断标志位TF0置位,由硬件自动执行,请求中断处理 |
4 | TF1 | 当T0产生溢出时,T0溢出中断标志位TF0置位,由硬件自动执行,请求中断处理 |
5 | RI/TI | 当接受或发送完一个串行帧时,内部串行口中断请求标志位RI/TI置位,请求中断 |
2.与中断有关的寄存器4个:中断标志寄存器TCON和串行口控制寄存器SCON、中断允许控制寄存器IE和中断优先级控制寄存器IP
3.中断系统中断允许位的含义
51单片机的5个中断源都是可屏蔽中断,中断系统内部设有一个专用寄存器IE,用于控制CPU对各中断的开放或屏蔽
IE寄存器格式如下
EA | X | X | ES | ET1 | EX1 | ET0 | EX0 |
三、中断的优先级别
51单片机有两个中断优先级:高优先级和低优先级
中断源通过设置中断优先级寄存器IP确定高优先级或低优先级判断,同一优先级的采用自然优先级
中断优先级寄存器IP,用于锁存各中断优先级控制位,格式如下:
X | X | X | PS | PT1 | PX1 | PT0 | PX0 |
自然优先级由最高级到最低级排序如下:
外部中断0 定时器T0中断 外部中断1 定时器T1中断 串行口中断
四、中断响应过程
中断相应过程就是自动调用并执行中断函数的过程
定义形式如下:
void 函数名() interrupt n
中断源 | n | 入口地址 |
外部中断0 | 0 | 0x0003 |
定时/计数器0 | 1 | 0x000B |
外部中断0 | 2 | 0x0013 |
定时/计数器0 | 3 | 0x001B |
串行口 | 4 | 0x0023 |
void int_0() interrupt 0 //外部中断0,型号对应的为0
void timer_0() interrput 1 //定时/计数器0,型号对应的为1
void int_1() interrput 2 //外部中断1,型号对应的为2
void timer_1() interrupt 3 //定时/计数器1,型号对应的为3
下面以一个简单的程序来实现一下外部中断,这个程序主要是靠外部中断来控制流水灯的状态
先展示一下仿真:
仿真图比较简单
代码实现:
#include <reg51.h>
#include <intrins.h>
sbit btn1=P3^2;
sbit btn2=P3^3;
bit b=0;
int num=0;
int j=0xfe;
/*****************************/
void timer_0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)
{
num=0;
P1=j;
j= crol_(j,1);//向右1固定,向左1位
}
}
/********************************/
void int_0() interrupt 0 //停止流水灯
{
if(b==0)
{
TR0=0;
b=1;
}
else
{
b=0;
TR0=1;
}
}
/************************************/
void int_1() interrupt 2 //改变灯亮的位置
{
P1=j;
j= crol_(j,1);//向右1固定,向左1位
}
/*************************************/
void main()
{
TMOD=0x01;//使用T0计时器
TH0=(65536-50000)/256;//设置初值
TL0=(65536-50000)%256;
IP=0x05;//设置外部中断1/0为高优先级中断
EA=1;//开总中断
EX0=1;//开外部中断0
IT0=1;//设置外部中断0低电平触发
EX1=1;//开外部中断1
IT1=1;//设置外部中断1低电平触发
ET0=1;//开定时器T0中断
TR0=1;//启动定时器T0
while(1);
}
/**********************************/
希望可以帮到大家!