目录
一、中断系统
1.1、概念
1.2、中断系统的功能与优点
1.3、89C52单片机中断系统的结构
二、中断允许控制
三、中断请求标志
3.1、TCON的中断标志
2.2、优先级问题
2.3、51单片机的中断优先级的三条原则
四、51单片机中断处理过程
4.1、中断响应条件
4.2、使用中断的注意事项
五、代码示例
5.1、k3按键点亮LED模块的第一个LED灯
5.2、k4点亮led
cpu在处理某一事件A时,发生了另外一事件B请求cpu迅速去处理(中断发生);
cup暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
待cup将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回);
这一过程称为中断。
引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。cup暂时中断原来的事务A,转去处理事件B。对事件B
处理完毕后,再回到原来被中断的地方(即:断点)称为中断返回,实现上述中断功能的部件称为中断系统。
89C52的中断系统有5个中断源,2个优先级,可实现二级中断嵌套。
二级中断嵌套:在一个中断里面还可以实现一个中断
TF0,TF1:T1溢出(外部)中断请求标志 TF0=1溢出 TF0不等于1 计数器、定时器正常工作
RI:接收完成标志 RI =1 一帧数据接受完成 向cpu发送中断请求
TI:发送完成标志 TI=1 一帧数据发送完成 向cpu发送中断请求
IE0、IE1:中断标志位
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
EX0(IE,0):外部中断0允许位; 置1允许外部中断 置0不允许外部中断
ET0(IE,1):定时/计数器T0中断允许位 置1允许定时器\计数器中断 置0 不允许打开中断
EX1(IE,2):外部中断1允许位; 置1允许外部中断 置0不允许外部中断
ET1(IE,3);定时\计数器T1中断允许位 置1允许定时器\计数器中断 置0 不允定时器\计数器中断
ES(IE,4);串行口中断允许位 置1允许串行口中断 置0不允许串行口中断
EA(IE,7);CPU中断允许位(总允许)位 ; 如果EA不置1,上述如EX1,ET1置1也效
ITO(TCON.0):外部中断0触发控制位。
IE0(TCON.1):外部中断0中断请求标志位。
IT1(TCON.2):外部中断1触发方式控制位。
IE1(TCON.3):外部中断1中断请求标志位。
TF0(TCON.5):定时/计数器T0溢出中断请求标志位。 置1溢出
TF1(TCON.7):定时/计数器T1溢出中断请求标志位。
同一优先级中的中断申请不止一个时,则有中断优先权排队问题,同一优先级的中断优先排队,由
中断系统的硬件确定的自然优先级形成,排列如下
CPU同时收到几个中断时,首先响应优先级别最高的中断请求。
正在进行的中断过程不能被新的同级或低优先级的中断请求所中断
正在进行的优先级中断服务,能被高优先级中断请求所中断
为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器,其中一个置1,表示正在响应高优先级的中断,他将阻断后来所有的中断请求:另外一个置1,表示正在响应低优先级中断,他将阻断后来所有的低优先级中断请求。
同时满足以上三条件,cpu才可能响应中断
#include
typedef unsigned int u16;
typedef unsigned char u8;
sbit k3=P3^2; // 定义按键k3
sbit led = P2^0; // 定义 P20口是led
/*
1,单片机-->LED&交通灯模块
P20-->D1
2,单片机-->独立按键模块
P32-->K3
*/
void delay(u16 i) // 延时函数
{
while(i--);
}
void IntoInit() // 外部中断函数
{
//设置 INT0
IT0=1;//跳变沿触发方式(下降沿)
EX0=1;//打开 INT0 的中断允许。
EA=1;//打开总中断
}
void main()
{
IntoInit(); // 设置外部中断
while(1);
}
void into() interrupt 0
{
delay(1000); // 延时消抖
if(k3==0)
{
led=~led;
}
}
#include // 此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; // 宏定义 数据类型的声明
typedef unsigned char u8;
sbit k4=P3^3; // 定义按键k4
sbit led = P2^0; // 定义 P20口是led
/*
1,单片机-->LED&交通灯模块
P20-->D1
2,单片机-->独立按键模块
P33-->K4
*/
void delay(u16 i) // 延时函数
{
while(i--);
}
void IntoInit() // 外部中断函数
{
//设置 INT0
IT1=1;//跳变沿触发方式(下降沿)
EX1=1;//打开 INT0 的中断允许。
EA=1;//打开总中断
}
void main()
{
IntoInit(); // 设置外部中断
while(1);
}
/*
中断0 外部知中断0 interrupt 0
中断道1 定时器1中断 interrupt 1
中断2 外部中断1 interrupt 2
中断3 定时器2中断 interrupt 3
中断4 串口中断 interrupt 4
*/
void into() interrupt 2 // interrupt 一个中断处理函数
{
delay(1000); // 延时消抖
if(k4==0)
{
led=~led;
}
}
中断0 外部知中断0 interrupt 0
中断1 定时器1中断 interrupt 1
中断2 外部中断1 interrupt 2
中断3 定时器2中断 interrupt 3
中断4 串口中断 interrupt 4