大家一起来学习单片机吧!一,什么是中断?

所谓中断是指计算机在执行某段程序的过程中,由于计算机系统的某种原因,当出现CPU以外的一些情况,由于服务对象向CPU发出中断请求信号,要求CPU暂停当前的工作,去执行响应的突发状况,待处理完当前的事件,再次返回继续执行之前被中断的任务。

举例说明:

当你正在做某件事情,突然电话响了(中断事件),大脑(CPU)迅速反应去接这个电话,完事之后,继续之前的工作。

二,51的中断结构

单片机中断简介(单片机第三课中断的学习)(1)

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)

2.中断请求标志寄存器

①定时器控制寄存器TCON

TCON:Timer控制寄存器,是管理定时器工作的SFR(其中低4位管理`外部中断)

单片机中断简介(单片机第三课中断的学习)(3)

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

单片机中断简介(单片机第三课中断的学习)(4)

中断请求标志:

5个中断源各有其中断请求标志,IE0,TF0,IE1,TF1以及RI/TI,在中断源满足中断请求的条件下,各标志自动置1,以向CPU请求中断。中断得到响应后,自动清除中断响应标志(串行I/0端口的中断标志要通过软件人工清除)。如果某一中断源提出中断请求后,而CPU不能够立即响应,只要该中断请求标志不被人为的清除,中断请求的状态就将一直保持,直到CPU响应了此中断为止。

3.中断控制

①中断允许寄存器

中断允许控制由SFR寄存器IE设置,分二级允许控制。以EA位作为总控,以各中断源的允许位作为分控。

IE字节地址A8H,位地址AFH~A8H,与中断允许有关的各位表示如下:

单片机中断简介(单片机第三课中断的学习)(5)

②中断优先级寄存器IP

由SFR寄存器IP设置,有2个优先级,相应位置“1”,为高优先级。相应位置“0”,为低优先级。

IP字节地址B8H,位地址BFH~B8H,与中断允许有关的各位表示如下:

单片机中断简介(单片机第三课中断的学习)(6)

中断优先级处理原则

单片机中断简介(单片机第三课中断的学习)(7)

4.中断请求的条件(触发中断的必要条件!!!!!!)

一个中断请求被响应,需满足以下条件:

(1)CPU开中断,EA=1。

(2)该中断源对应的中断请求标志为1。

(3)该中断源的中断允许位=1,即该中断没被屏蔽。

(4)无同级或更高级中断正在被服务。

中断处理过程:

包含:中断请求、中断响应、中断服务、中断返回四个阶段。

①中断请求:中断源将相应请求中断的标志位置“1”,表示发出请求,并由CPU查询。

②中断响应:在一条指令的最后一个机器周期按优先级顺序查询中断标志,为“1”并满足响应条件时响应。

响应操作: 断点压栈→撤除中断标志→关闭低同级中断允许→中断入口地址送PC。

实际上响应中断的主要操作是有硬件自动产生一条长调用指令LCALL。

③中断服务:根据入口地址转中断服务程序,包含保护现场、执行中断主体、恢复现场。

④中断返回:断点出栈→开放中断允许→返回原程序。

中断入口地址

单片机中断简介(单片机第三课中断的学习)(8)

中断服务函数的一般形式为:

函数类型 函数名(形式参数表) interrupt n using n

关键字interrupt后面的 n是中断号,对于51单片机,n

的取值为0 - 4,编译器从8×n 3处产生中断向量。AT89S51

单片机的中断源对应的中断号和中断向量见表

单片机中断简介(单片机第三课中断的学习)(9)

外中断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.原理图

单片机中断简介(单片机第三课中断的学习)(10)

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.安装好PROTUESkeil4 软件 需要私信回复“单片机”就可以了

2.在软件里画出仿真图 如下图 protues使用教程

单片机中断简介(单片机第三课中断的学习)(11)

3.在keil4/5建立工程 新建工程教程

重要设置

单片机中断简介(单片机第三课中断的学习)(12)

4.加载.hex文件到51中

①双击 51芯片 如下图

单片机中断简介(单片机第三课中断的学习)(13)

②点击 箭头所指的文件夹符号 找到生成的.hex文件

如果不知道路径 这样操作

单片机中断简介(单片机第三课中断的学习)(14)

单片机中断简介(单片机第三课中断的学习)(15)

③ 最后一步 点击protues左下角 最左面的仿真按钮(运行)

觉得不错的话,给个关注吧!记得转发收藏,让更多人看到!!!觉得不错的话,给个关注吧!记得转发收藏,让更多人看到!!!

,