目录
一、中断的概念
中断是指当CPU正在处理某件事情时,外部发生的某一事件请求CPU迅速去处理。
二、8051单片机中断系统结构
(一)单片机中断系统结构
8051单片机的中断系统有5个中断请求源,有2优先级.,图2为单片机中断系统结构
1. 5个中断源
5个中断源,按照自然优先级从高到低依次为:
外部中断0 : INT0
定时/计数器0: TF0
外部中断1: INT1
定时/计数器1: TF1
串口中断: RI/TI
其中每个中断源都对应着一个固定的入口地址,也就是中断向量,分别为:
0 0x0003 INT0
1 0x000B TF0
2 0x0013 INT1
3 0x001B TF1
4 0x0023 RI/TI
其前面的数字为对应的中断号。
2.TCON
TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
(1)IT0 外部中断0中断触发方式选择位
IT0=0,为电平触发方式
IT1=1,为跳变触发方式
(2)IT0 外部中断0中断触发方式选择位
IE=1,表示外部中断0正向CPU进行申请中断。
(3)IT1 外部中断1中断触发方式选择位;IT1 外部中断1中断触发方式选择位
其功能与外部中断0类似。
(4)TF0 定时/计数器0溢出中断请求标志位
当定时/计数器0计数溢出时,TF0=1,向CPU发出申请中断。
(5)TR0 定时/计数器0启动位
当TR0=1时,启动定时/计数;当TR0=0时,禁止定时/计数。
(6)TF1 定时/计数器1溢出中断请求标志位
当定时/计数器1计数溢出时,TF1=1,向CPU发出申请中断。
(7)TR1 定时/计数器1启动位
当TR1=1时,启动定时/计数;当TR1=0时,禁止定时/计数。
3.SCON
SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
(1)TI 串行口的发送中断请求标志位。
CPU将一字节的数据写入发送缓冲器SBUF时,就启动一帧串行数据的发送,没发送完一帧串行数据后,硬件自动置TI位为1。
(2)RI 串行口的接受中断请求标志位
在串行口允许接收时,没接收完一帧串行数据,硬件自动置RI为1.
4.中断允许控制寄存器IE
EA | - | - | ES | ET1 | EX1 | ET0 | EX0 |
总开关 | - | - | 串口 | 定时/计数器1 | 外部中断1 | 定时/计数器0 | 外部中断0 |
禁止中断:0;允许中断:1 |
5.中断优先级控制寄存器IP
------ | ------ | ------ | PS | PT1 | PX1 | PT0 | PX0 |
------ | ------ | ------ | 串口 | 定时/计数器1 | 外部中断1 | 定时/计数器0 | 外部中断0 |
设为高优先级中断:1;设为低优先中断:0 |
三、中断服务函数的编写与运用
(一)、中断服务函数
一般包含两个中断的处理函数,分别是中断初始化函数和中断服务函数。对于中断服务函数的格式为:
void 函数名() interrupt 中断号
其 中断函数没有返回值,也不能带参数,而且中断服务函数名后要加上关键字interrupt,为了一普通函数区别开,表示这是一个中断服务函数,在关键字interrupt后面要加上中断号,说明是为那个中断服务的。
(二)例题讲解
在CT107D单片机综合训练平台上,利用单片机在中断系统实现以下功能:偶数LED灯依次点亮,再依次熄灭,如此反复,在此过程中若发生中断,在中断服务函数中点亮L8,并延时一段时间后熄灭。
#include "reg52.h"
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
sbit L8=P0^7;
void Init74HC138()
{
HC138_A=0;
HC138_B=0;
HC138_C=1;
}
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void LEDRuning()
{
P0=0x55;
Delay(6000);
Delay(6000);
P0=0xff;
Delay(6000);
Delay(6000);
}
//********外部中断的处理函数************
void InitINT0()
{
EX0=1;
IT0=1;
EA=1;
}
unsigned char stat=0;
void InterruptINT0() interrupt 0
{
stat=1;
}
void INT0stat()
{
if(stat==1)
{
L8=0;
Delay(6000);
Delay(6000);
Delay(6000);
Delay(6000);
Delay(6000);
Delay(6000);
L8=1;
}
stat=0;
}
//*************************************
void main()
{
Init74HC138();
InitINT0();
while(1)
{
LEDRuning();
INT0stat();
}
}
四、总结
单片机中断系统是一个非常重要的知识模块,要掌握单片机的开发与设计,必须熟悉掌握中断系统。