单片机C语言函数之中断函数(中断服务程序)
在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。
中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。
(1)中断源:中断请求信号的来源。(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效,上面的那个横杠不知道怎么加上去))
(2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。期间涉及到CPU响应中断的条件,现场保护,现场恢复。
(3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。优先级是可以编程的,而优先权是固定的。
80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。
80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制
(1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1
(2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP
具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。
在这里我们讲下注意的事项
(1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。
(2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。
(3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。
(4)单片机复位后,TCON,SCON给位清零。
C51语言允许用户自己写中断服务子程序(中断函数)
首先来了解程序的格式:
void 函数名() interrupt m [using n]
{}
关键字 interrupt m [using n] 表示这是一个中断函数
m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。
n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3
中断号 中断源
0 外部中断0
1 定时器0
2 外部中断1
3 定时器1中断
4 串行口中断
这5个中断源的中断入口地址为:(在上一篇文章中讲到的ROM前43个存储单元就是他们,这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不是中断处理的程序,而是存放着中断处理程序的真正地址)
INT0:0003H 0
T0: 000BH 1
INT1:0013H 2
T1: 001BH 3
串口: 0023H 4
中断向量(中断入口地址)= 中断号x8 +3
前面m意思很清楚,不同的m值表示这个函数是针对不同的中断源,比如m为1是表示它是定时器0的中断函数,
如void time0() interrupt 1{}
那么后面的using n 又是什么意思呢?在正在执行一个特定任务时,有更紧急的事情需要CPU来处理,涉及到中断优先权。高优先权中断低优先权正在处理的程序,所以最好给每个优先程序分配不同的寄存器组。
CPU正在处理某个事件,突然另外一个事件需要处理,于是进入中断后,而你不想将现在执行的程序的各寄存器状态入栈,那么可以把这个中断程序放入另一个寄存器组,如切换到1组,然后退出中断时,再切回到0组(原来的程序在0组)。
为了更好的了解这里意思,你可以看看工作寄存器组的作用是什么。
下面的注意事项转自网络上其他朋友的文章(整理下,重复的去掉了,写的非常好):
(1)中断函数不能进行参数传递
(2)中断函数没有返回值
(3)在任何情况下都不能直接调用中断函数
(4)中断函数使用浮点运算要保存浮点寄存器的状态。
(5)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同,被调函数最好设置为可重入的。
(6)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。中断函数未加using n修饰符的,开始时还要将R0~R1入栈,结束时出栈。如中断函数加using n修饰符,则在开始将PSW入栈后还要修改PSW中的工作寄存器组选择位。
(7)C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。
(8)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其它程序调用。
(9)在设计中断时,要注意的是哪些功能应该放在中断程序中,哪些功能应该放在主程序中。一般来说中断服务程序应该做最少量的工作,这样做有很多好处。首先系统对中断的反应面更宽了,有些系统如果丢失中断或对中断反应太慢将产生十分严重的后果,这时有充足的时间等待中断是十分重要的。其次它可使中断服务程序的结构简单,不容易出错。中断程序中放入的东西越多,他们之间越容易起冲突。简化中断服务程序意味着软件中将有更多的代码段,但可把这些都放入主程序中。中断服务程序的设计对系统的成败有至关重要的作用,要仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的ISR.
「硬见小百科」单片机中断系统
单片机中断系统的概念
什么是中断,我们从一个生活中的例程引入。
你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书。这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。仔细研究一下生活中的中断,对于我们学习单片机的中断也很有好处。
第一、什么可经引起中断。生活中很多事件能引起中断:有人按了门铃了,电话铃响了,你的闹钟闹响了,你烧的水开了….等等诸如此类的事件,我们把能引起中断的称之为中断源。单片机中也有一些能引起中断的事件,8031中一共有5个:两个外部中断,两个计数/定时器中断,一个串行口中断。
第二、中断的嵌套与优先级处理。设想一下,我们正在看书,电话铃响了,同时又有人按了门铃,你该先做那样呢?如果你正是在等一个很重要的电话,你一般不会去理会门铃的,而反之,你正在等一个重要的客人,则可能就不会去理会电话了。如果不是这两者(即不等电话,也不是等人上门),你可能会按你常常的习惯去处理。总之这里存在一个优先级的问题,单片机中也是如此,也有优先级的问题。优先级的问题不仅仅发生在两个中断同时产生的情况,也发生在一个中断已产生,又有一个中断产生的情况,比如你正接电话,有人按门铃的情况,或你正开门与人交谈,又有电话响了情况。考虑一下我们会怎么办吧。
第三、中断的响应过程。当有事件产生,进入中断之前我们必须先记住现在看书的第几页了,或拿一个书签放在当前页的位置,然后去处理不一样的事情(因为处理完了,我们还要回来继续看书):电话铃响我们要到放电话的地方去,门铃响我们要到门那边去,也说是不一样的中断,我们要在不一样的地点处理,而这个地点常常还是固定的。计算机中也是采用的这种办法,五个中断源,每个中断产生后都到一个固定的地方去找处理这个中断的程序,当然在去之前首先要保存下面将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。具体地说,中断响应能分为以下几个步骤:1、保护断点,即保存下一将要执行的指令的地址,就是把这个地址送入堆栈。2、寻找中断入口,根据5个不一样的中断源所产生的中断,查找5个不一样的入口地址。以上工作是由计算机自动完成的,与编程者无关。在这5个入口地址处存放有中断处理程序(这是程序编写时放在那儿的,如果没把中断程序放在那儿,就错了,中断程序就不能被执行到)。3、执行中断处理程序。4、中断返回:执行完中断指令后,就从中断处返回到主程序,继续执行。
MCS-51单片机中断系统的结构
5个中断源的符号、名称及产生的条件如下。
INT0 :外部中断0,由P3.2端口线引入,低电平或下跳沿引起。
INT1 :外部中断1,由P3.3端口线引入,低电平或下跳沿引起。
T0 :定时器/计数器0中断,由T0计满回零引起。
T1 :定时器/计数器l中断,由T1计满回零引起。
TI/RI :串行I/O中断,串行端口完成一帧字符发送/接收后引起。
整个中断系统的结构框图见下图所示。
<51单片机中断系统结构>
如图所示,由与中断有关的特殊功能寄存器、中断入口、次序查询逻辑电路等组成,包括5个中断请求源,4个用于中断控制的寄存器IE、IP、ECON和SCON来控制中断类弄、中断的开、关和各种中断源的优先级确定。
中断请求源
(1)外部中断请求源 :
即外中断0和1,经由外部管脚引入的,在单片机上有两个管脚,名称为INT0、INT1,也就是P3.2、P3.3这两个管脚。在内部的TCON中有四位是与外中断有关的。
IT0:INT0触发方式控制位,可由软件进和置位和复位,IT0=0,INT0为低电平触发方式,IT0=1,INT0为负跳变触发方式。这两种方式的差异将在以后再谈。
IE0:INT0中断请求标志位。当有外部的中断请求时,这位就会置1(这由硬件来完成),在CPU响应中断后,由硬件将IE0清0。
IT1、IE1的用途和IT0、IE0相同。
(2)内部中断请求源TF0 :
定时器T0的溢出中断标记,当T0计数产生溢出时,由硬件置位TF0。当CPU响应中断后,再由硬件将TF0清0。
TF1:与TF0类似。
TI、RI:串行口发送、接收中断,在串行口中再讲解。
中断允许寄存器IE在MCS-51中断系统中,中断的允许或禁止是由片内可进行位寻址的8位中断允许寄存器IE来控制的。
中断系统的控制寄存器
中断系统有两个控制寄存器IE和IP,它们分别用来设定各个中断源的打开/关闭和中断优先级。此外,在TCON中另有4位用于选择引起外部中断的条件并作为标志位。
1.中断允许寄存器--IE
IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H-AFH。
IE用来打开或关断各中断源的中断请求,基本格式如下图1所示:
图1
EA:全局中断允许位。EA=0,关闭全部中断;EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。
×:无效位。
ES:串行I/O中断允许位。ES=1,打开串行I/O中断;ES=0,关闭串行I/O中断。
ETl:定时器/计数器1中断允许位。ETl=1,打开T1中断;ETl=O,关闭T1中断。
EXl:外部中断l中断允许位。EXl=1,打开INT1;EXl=0,关闭INT1。
ET0:定时器/计数器0中断允许位。ET0=1,打开T0中断;ET0=0,关闭TO中断。
EXO:外部中断0中断允许位。Ex0=1,打开INT0;EX0=0,关闭INT0.
2、中断优先寄存器--IP
IP在特殊功能寄存器中,字节地址为B8H,位地址(由低位到高位)分别是B8H一BFH,IP用来设定各个中断源属于两级中断中的哪一级,IP的基本格式如下图2所示:
图2
×:无效位。
PS:串行I/O中断优先级控制位。PS=1,高优先级;PS=0,低优先级。
PTl:定时器/计数器1中断优先级控制位。PTl=1,高优先级;PTl=0,低优先级。
Pxl:外部中断1中断优先级控制位。Pxl=1,高优先级;PXl=O,低优先级。
PT0:定时器/计数器o中断优先级控制位。PT0=1,高优先级;PTO=0,低优先级。
Px0:外部中断0中断优先级控制位。Px0=1,高优先级;Px0=0,伤优先级。
在MCS-51单片机系列中,高级中断能够打断低级中断以形成中断嵌套;同级中断之间,或低级对高级中断则不能形成中断嵌套。若几个同级中断同时向CPU请求中断响应,则CPU按如下顺序确定响应的先后顺序:
INT0一T0---INT1一T1一RI/T1.
以上所有信息仅作为学习交流使用,不作为任何学习和商业标准。若您对文中任何信息有异议,欢迎随时提出,谢谢!
关于云创硬见
云创硬见是国内最具特色的电子工程师社区,融合了行业资讯、社群互动、培训学习、活动交流、设计与制造分包等服务,以开放式硬件创新技术交流和培训服务为核心,连接了超过30万工程师和产业链上下游企业,聚焦电子行业的科技创新,聚合最值得关注的产业链资源, 致力于为百万工程师和创新创业型企业打造一站式公共设计与制造服务平台。
相关问答
单片机中断 初始化 程序 ?voidINT_init()//初始化{IT0=0;//外部中断0低电平触发IT1=1;//外部中断1低电平触发PX0=1;//外部中断0分配高优先级PX1=0;IE=0x85;//使能全局中断,外部...
c51 单片机中断 响应的四个步骤?单片机一旦响应中断请求,就由硬件完成以下功能:(1)根据响应的中断源的中断优先级,使相应的优先级状态触发器置1;(2)执行硬件中断服务子程序调用,并把...
51 单片机 的 中断 源 和 中断 入口?51单片机的中断源就是指能够打断当前顺序执行的功能模块,比如外部中断事件源,定时器中断事件源,通讯模块数据发送接收中断源等。中断入口是指打断当前顺序执行...
51 单片机中断 系统应用?单片机中断(Interrupt)是硬件驱动事件,它使得CPU暂停当前的主程序,转而去执行一个中断服务子程序。为了更形象地理解中断,下面以学生上自习时接电话为例阐述...
单片机中断程序 的编程实例?下面是一个简单的单片机中断程序的编程实例,以8051单片机为例:```assemblyORG0H;程序从地址0开始MOVA,#0FFH;将A寄存器初始化为0xFFMOVP1,...
单片机 填空求助1.MCS-51系列单片机为()位单片机.2.8051单片...[最佳回答]1.MCS-51系列单片机为(8)位单片机.2.8051单片机有两种复位方式,既上电复位和手动复位.复位后SP=(07H),PC=(0000H),PSW=(00H),P0=(F...
中断服务 函数的格式, 单片机 的知识点?首先可以肯定,中断服务函数可以写在其他文件中,并不一定要放在main.c中。中断服务函数如果有特定的关键字修饰,比如keilc51用interrupt,不仅可以放在任意文...
中断服务程序 入口地址的形成?要形成中断服务程序入口地址,您需要按照以下步骤操作:1.首先,确定您要中断的服务程序的入口点。这通常是一个函数或方法,用于启动服务程序并处理请求。2.在...
单片机 汇编语言程序中 中断程序 怎么用,在程序中如何识别出哪里是 中断服务程序 ,哪里是主 程序 ?一般在程序开头有中断子程序的入口处,在主程序里可以看到这些子程序的。标号名可以随便取,但入口地址是固定的。ORG00HAJMPMAINORG03H;外部中断0入口...
单片机 外部 中断 怎么使用?1、单片机有两个外部中断,两个定时器/计数器,两个外部中断分别是int0,int1。2、定时器/计数器分别是t0,t1,还有一个串口中断TI/RI,加起来有五个中断。3、...