所谓中断是指计算机在执行某段程序的过程中,由于计算机系统的某种原因,当出现CPU以外的一些情况,由于服务对象向CPU发出中断请求信号,要求CPU暂停当前的工作,去执行响应的突发状况,待处理完当前的事件,再次返回继续执行之前被中断的任务。
举例说明:当你正在做某件事情,突然电话响了(中断事件),大脑(CPU)迅速反应去接这个电话,完事之后,继续之前的工作。
二,51的中断结构
1. 5个中断源分别是:
①INT0:外部中断请求0(低电平或者是负跳变有效)引脚P3.2
②.INT1:外部中断请求1(低电平或者是负跳变有效)引脚P3.3
③.TF0:定时器/计数器T0 引脚P3.4
④TF1:定时器/计数器T0 引脚P3.5
⑤TI/YR:串行口发送中断请求 引脚P3.0/P3.1
2.中断请求标志寄存器
①定时器控制寄存器TCON
TCON:Timer控制寄存器,是管理定时器工作的SFR(其中低4位管理`外部中断)
IT0/IT1:外部中断请求的触发方式选择位:
=0:在INT0/INT1端申请中断的信号低电平有效;
=1:在INT0/INT1端申请中断的信号负跳变有效。
IE0/IE1:外部中断申请标志位:
=0:没有外部中断申请;
=1:有外部中断申请。
③外部中断(INT0、INT1)申请过程
在CPU已经开放了外部中断允许的前提下:
在INT0/INT1引脚输入一个负脉冲或低电平,
TCON寄存器中的IE0/IE1标志位自动变“1”,
检测到IE0/IE1变“1”后,将产生指令:
LCALL 0003H(/0013H)执行中断服务程序,
并将IE0/IE1标志位自动清“0”,以备下次申请。
④串行口控制寄存器SCON
中断请求标志:
5个中断源各有其中断请求标志,IE0,TF0,IE1,TF1以及RI/TI,在中断源满足中断请求的条件下,各标志自动置1,以向CPU请求中断。中断得到响应后,自动清除中断响应标志(串行I/0端口的中断标志要通过软件人工清除)。如果某一中断源提出中断请求后,而CPU不能够立即响应,只要该中断请求标志不被人为的清除,中断请求的状态就将一直保持,直到CPU响应了此中断为止。
3.中断控制
①中断允许寄存器
中断允许控制由SFR寄存器IE设置,分二级允许控制。以EA位作为总控,以各中断源的允许位作为分控。
IE字节地址A8H,位地址AFH~A8H,与中断允许有关的各位表示如下:
②中断优先级寄存器IP
由SFR寄存器IP设置,有2个优先级,相应位置“1”,为高优先级。相应位置“0”,为低优先级。
IP字节地址B8H,位地址BFH~B8H,与中断允许有关的各位表示如下:
中断优先级处理原则
4.中断请求的条件(触发中断的必要条件!!!!!!)
一个中断请求被响应,需满足以下条件:
(1)CPU开中断,EA=1。
(2)该中断源对应的中断请求标志为1。
(3)该中断源的中断允许位=1,即该中断没被屏蔽。
(4)无同级或更高级中断正在被服务。
中断处理过程:
包含:中断请求、中断响应、中断服务、中断返回四个阶段。
①中断请求:中断源将相应请求中断的标志位置“1”,表示发出请求,并由CPU查询。
②中断响应:在一条指令的最后一个机器周期按优先级顺序查询中断标志,为“1”并满足响应条件时响应。
响应操作: 断点压栈→撤除中断标志→关闭低同级中断允许→中断入口地址送PC。
实际上响应中断的主要操作是有硬件自动产生一条长调用指令LCALL。
③中断服务:根据入口地址转中断服务程序,包含保护现场、执行中断主体、恢复现场。
④中断返回:断点出栈→开放中断允许→返回原程序。
中断入口地址
中断服务函数的一般形式为:
函数类型 函数名(形式参数表) interrupt n using n
关键字interrupt后面的 n是中断号,对于51单片机,n
的取值为0 - 4,编译器从8×n 3处产生中断向量。AT89S51
单片机的中断源对应的中断号和中断向量见表
外中断1的中断服务函数如下:
void int1( ) interrupt 2 using 0
/*中断号n=2,选择0区工作寄存器区*/
中断调用与标准C的函数调用是不一样的,当中断事件
发生后,对应的中断函数被自动调用,中断函数既没有参
数,也没有返回值。中断函数会带来如下影响。
(1)编译器会为中断函数自动生成中断向量。
(2)退出中断函数时,所有保存在堆栈中的工作寄存器及特殊功能寄存器被恢复。
三,实践阶段
1.实现的效果
①利用单片机P3.2(INT0)、P3.3(INT1)引脚与开关K1、K2进行中断控制;
②如后图所示,通过P1.0~P1.7控制发光二极管,在主程序中实现:8个LED轮流亮,每亮1灯循环下移;在中断服务程序中实现:当外部中断0或1有效时,以0.5S间隔8灯从上至下依次亮起,再依次熄灭,循环3次,松开按键后,返回继续执行主程序部分。
2.原理图
3.程序设计
#include <reg51.h> #define uchar unsigned char #include<intrins.h> sbit K1=P3^2; sbit K2=P3^3; void delay() { uchar x,y,z; for(z=5; z>0; z--) /*延时函数,约0.5S*/ for(x=200; x>0; x--) for(y=250; y>0; y--); } void main() { uchar k=0Xfe;; EA=1; EX0=1; EX1=1; IT0=1; IT1=1; PX0=0; PX1=1; P1=0Xfe; /*给P1口赋初值*/ while(1) { P1=k; delay(); k=_crol_(k,1); delay(); } } void int0_isr (void) interrupt 0 using 1 { uchar i,j,temp ; if(K1==0) { temp=0xfe; for(i=0;i<8;i ) { P1=temp; /* temp左移后送P1口*/ delay( ); temp=temp<<1; /* temp左移一位*/ } temp=0x7f; /*赋右移初值给temp*/ for(j=0; j<8;j ) { P1=~temp; /* temp取反后送P1口 */ delay( ); temp=temp>>1; /* temp 中数据右移一位*/ } } } void int1_isr (void) interrupt 2 using 2 { uchar m; if(K2==0) { for(m=0;m<2;m ) { P1=0xff; delay(); P1=0x00; delay(); } } }
注意,大家感兴趣的话,可以用PROTUES软件仿真一下具体操作:1.安装好PROTUES和keil4 软件 需要私信回复“单片机”就可以了
2.在软件里画出仿真图 如下图 protues使用教程
3.在keil4/5建立工程 新建工程教程
重要设置
4.加载.hex文件到51中
①双击 51芯片 如下图
②点击 箭头所指的文件夹符号 找到生成的.hex文件
如果不知道路径 这样操作
③ 最后一步 点击protues左下角 最左面的仿真按钮(运行)
觉得不错的话,给个关注吧!记得转发收藏,让更多人看到!!!觉得不错的话,给个关注吧!记得转发收藏,让更多人看到!!!,