中断
三、中断
(基本)中断优先级
外部中断0 > 定时器/计数器0 > 外部中断1 > 定时器/计数器1 > 串行口
假设程序正运行到定时器/计数器0中断中,如果产生了外部中断0,则程序会运行到外部中断0中。
如果产生了外部中断1,则仍会在定时器/计数器0中断中。
原理
-
书上解释:
当中断请求源(简称“中断源”)发出中断请求时,如果中断服务请求被允许的话,单片机暂时中止当前正在执行的主程序,转到中断服务程序处理中断服务请求,处理完中断服务请求后,再回到被终止的程序之处(断点),继续执行被中断的主程序。
-
我的理解:
进入中断时,会暂停原来的程序
在”中断总开关“打开的情况下,在需要中断的地方打开对应”中断开关“就会进入对应中断程序
这个过程中,不同的中断受到不同的寄存器控制
同时具有优先级的关系
中断开关

TCON寄存器

-
TF1:片内定时器/计数器T1的溢出中断请求标志位。
当启动T1计数后,定时器/计数器T1从初值开始加1计数,当计数溢出时,由硬件自动为TF1置“1“,向CPU申请中断。CPU响应TF1中断时,TF1标志位由硬件自动清零,TF1也可由软件清零。
-
TF0:片内定时器/计数器T0的溢出请求标志位,功能与TF1基本相同。
-
IE1:外部中断请求1的中断请求标志位
-
IE0:外部中断请求0的中断请求标志位
-
IT1:选择外部中断请求1为负跳变触发方式还是电平触发方式。
- IT = 0,为电平触发方式,加到引脚
![]()
- IT = 0,为电平触发方式,加到引脚
上的外部中断请求输入信号为低电平有效,并把IE1置“1”。转向中断服务程序时,则由硬件自动把IE1清零。
- IT = 1,为负跳变触发方式,加到
![]()
上的外部中断请求输入信号电平为从高到低的负跳变有效,并把IE1置“1”。转向中断服务程序时,则由硬件自动把IE1清零。
-
IT0:选择外部中断请求0为负跳变触发方式还是电平触发方式,与IT1类似。
-
TR1位 = 1,启动定时器/计数器的必要条件
TR1位 = 0,停止定时器/计数器计数。
-
TR0:与TR1类似。
SCON寄存器

-
TI:串行口发送中断请求标志位。当CPU将1字节的数据写入串行口的发送缓冲器SBUF时,就启动一帧串行口数据的发送,每发送完一帧串行数据后,硬件自动使RI中断请求标志位置“1”。CPU响应串行口发送中断时,并不能清除TI标志位,TI标志位必须在中断服务程序中用指令对其清零。
-
RI:串行口接受中中断请求标志位。在串行口接受完一个串行数据帧,硬件自动使RI中断请求标志位置“1”。CPU在响应串行口接收中断时,RI标志位并不清零,必须在中断服务程序中用指令对RI清0。
外部中断初始化
外部中断0
//外部中断0初始化
void exterInit()
{
EA = 1; //总中断允许
EX0 = 1; //外部中断0允许
IT0 = 1; //选中外部中断0为电平触发方式
}
外部中断1
//外部中断0初始化
void exterInit()
{
EA = 1; //总中断允许
EX1 = 1; //外部中断1允许
IT1 = 1; //选中外部中断1为电平触发方式
}
实践代码
功能:跑马灯从D0 --> D1 --> ... -->D7 -->D0 -->...,外部中断起延时函数的作用
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//变量定义
sbit K32 = P3^2; //外部中断0控制管脚
int i = 0; //循环变量
uchar array[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //跑马灯
//函数声明
void init();
void exter0();
//数码管从零亮到九,然后产生中断使跑马灯从D0亮到D7
void main()
{
init();
P1 = 0xFF;//跑马灯接在P2口
while(1)
{
for (i = 0; i < 8; i ++)
{
P1 = array[i];
K32 = 0;//进入外部中断
}
}
}
//初始化
void init()
{
EA = 1;
EX0 = 1;//打开外部中断0
IT0 = 0;//选中外部中断0为电平触发方式
}
//外部中断
void exter0() interrupt 0
{
uint x,y;
for (x =100; x>0; x--)
for (y = 170; y>0; y--);
K32 = 1;
}



浙公网安备 33010602011771号