产品概述

单片机 c语言 中断 单片机C语言函数之中断函数(中断服务程序)

小编 2025-07-09 产品概述 23 0

单片机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.

单片机的这些中断事件你都了解了么?STM32中断分析

STM32中断分析

中断一直是单片机中非常重要的一个内容,本此我们来分析一下STM32中的中断模块。希望本此的分享能够让大家对中断有一个比较清晰的认识。

 在单片机中,通知事件发生的中断信号一般来自于外部INT引脚的输入信号,或是来自定时器、串行I/F等内部的外围功能电路的信号。接收中断信号的是中断控制器。中断控制器根据产生的中断信号的优先级,按优先级顺序发送给CPU。当然,被设定为无效的设备所传送来的中断信号是不会传给CPU的,您也可以屏蔽或忽略它们。CPU根据从中断控制器接收到的指示,执行相应的程序(中断处理)。

中断就是程序在正常运行的过程中发生了不正常的事情,必需要暂停一下去处理这个不正常的事情,其次跑回来继续干正常的事情。它是M4内核的一种实时硬件查询机制。它的发生条件是未知的。我们把这种不正常的事情呢称作异常,异常事件会发生,而发生的时长不确定,一旦发生了异常事件的话立刻去执行。

///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程和毕业设计指导,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像白色字体加我也能领取哦,记得口令一哥///

正常运行的程序是主函数(main),代码是由CPU运行的。CPU在主函数里运行是正常的执行过程,当在这个过程中忽然发生了异常事件(中断),CPU必需暂停当前的工作(设下断点),其次跑去能处理这个异常事件的函数中做异常处理(中断效劳函数),处理完这个异常事件后(执行完中断效劳函数),CPU就会跑回刚刚的断点处,继续正常运行下去。

这个过程里面有个设下断点的过程,这个断点是以栈的方式存储的,如图所示:

同时,中断也是可以嵌套的,在发生中断事件的过程中,可以有优先级高于上一个异常事件的异常来打断上一个中断,过程可以如图所示:

下面想要分析的是主函数与中断效劳函数的关系,我们都知道主函数能够调用子函数,子函数也能够调用子函数,而子函数不能调用主函数。对于中断效劳函数来说,中断效劳函数与主函数不存在调用关系,它们是平级的。

对于中断效劳函数我们须要注意的是,中断效劳函数是有对应的名称的,我们最好自己去复制,不用自己手打,容易出错,假如错任何一个字母的话,就会成为一个普通的函数。同时,中断效劳函数自身都是没返回值没形参的,因此不能随意写成别的。

对于中断的优先级,中断的优先级和C语言的运算符的优先级一样,数字越小,优先级越高。在中断分为三种优先级:占先优先级,次级优先级也叫响应优先级,最后一个是自然优先级。由于自然优先级根本不参与判断优先级高低,因此我们省略自然你优先级即可。

假如此时有三个事件A、B、C,他们的优先级分别为,A:占先优先级1,次级优先级5,B:占先优先级2,次级优先级2,C: 占先优先级2,次级优先级3。那么假如事件A与事件B同时到来:先执行A;事件B与事件C同时到来:先执行B;事件C正在执行,事件B到来:事件B不能打断事件C的执行。事件C正在执行,事件A到来:事件B能够打断事件C的执行。所以总结就是,假如两个时长同时到来,先鄙偃较占先优先级,再比较次级优先级,按高低分先后;其次独有后面的事件占先优先级高才能够打断前面的事件,否则不行。

中断的优先级会依照ST公司的优先级分组表来确定事件的占先优先级和次级优先级,它是由ARM公司下的ARM架构取出来的局部优先级作为选取的分组的。

理论部分暂时分析这么多,相信大家对于STM32的中断内容有了一个初步的认识,希望大家能够自己利用更多空余事件多多了解其他的内容,丰富自己的知识储备

想要学习单片机的朋友 ,做毕业设计的同学,关注我们,口令一哥,与导师一起学习成长,共同进步,还有更多资料领取。

说了这么多,大家记得留意下方评论第一条(或者私信我)有干货~

-END-

*本文系网络转载,版权归原作者所有,如有侵权请联系删除

相关问答

51 单片机C语言 ,如何在一程序后使用 中断 运行另外一个程序?

中断是为了使时间更精确。使用中断一般要先设置使用哪个定时/计数器的模式几,之后再设置定时器的使能为,再打开总中断使能位,启动定时器。外部中断比定时器的...

请教高人C51 单片机C语言 中的 中断 优先级怎么设置?

C51中设置中断优先级,需要对中断寄存器IP进行配置。具体值需要根据用户需要的优先级顺序进行确定,具体的设置方法就是直接写如下C语言语句:IP=06H;//如...

单片机C语言 定时器怎么调用-ZOL问答

单片机中通过中断的方式来调用定时器。具体的调用方式可以参考通过如下程序:程序功能:利用定时器进行定时,实现每秒中led闪烁一次#includesbitled...

单片机中断 的含义?

中断就是指处理机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。...

简述89 c 51 单片机中断 多概念?

51单片机有5个中断,分别是外部中断0、定时器中断0、外部中断1、定时器中断1、串口中断。51单片机有5个中断,分别是外部中断0、定时器中断0、外部中断1、定时...

单片机 的外部 中断 仿真实验。在 单片机 P1口上接有8只LED。在外部 中断 0输入引脚(P3.2)接一只按钮开关K1?

中断处理函数感觉有些问题,for循环之前使用P1=0x0f;然后将for内的P1=0x0f;改为P1=~P1;同时for循环中应该需要调用延时函数Delay(10);这里的值看你自...

c 51 单片机中断 响应的四个步骤?

单片机一旦响应中断请求,就由硬件完成以下功能:(1)根据响应的中断源的中断优先级,使相应的优先级状态触发器置1;(2)执行硬件中断服务子程序调用,并把...

80 C 51 单片机 有哪些 中断 源?它们对应的 中断 入口地址分别是什么?

AT89S51共有5个中断向量:2个外中断(INT0和INT1),2个定时中断(Timer0和Timer1)和一个串行中断。中断入口地址如下:外部中断INT00003H定时器0...AT89S51...

c语言 中怎么编写一个定时器 中断 程序来实现定时功能?

首先,单片机的定时器和计数器不构成因果关系。但是,TMOD(工作方式寄存器)决定着单片机是定时还是计数的工作方式而我自己的理解是:定时功能:单片机设定...

80 c 51 单片机 有几个 中断 源,如何允许和禁止他们?

基本型51单片机有5个中断源,分别是两个外部中断INT0/INT1、串口通信中断和两个定时计数器中断T0/T1,通过对IE寄存器的位操作可以允许或禁止它们,IE的每个位对...

猜你喜欢