单片机C语言函数之中断函数

发布者:脑洞狂想最新更新时间:2018-12-01 来源: eefocus关键字:单片机  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.


关键字:单片机  C语言函数  中断函数 引用地址:单片机C语言函数之中断函数

上一篇:LINUX系统中断处理结构及中断函数的实现
下一篇:单片机A/D采样的原理

推荐阅读最新更新时间:2024-03-16 16:19

日立超低耗电单片机在高速中文FLEX漫游传呼机中的应用
本例使用日立超低耗电的8位单片机H8/3887于高速中文FLEX传呼机中。使用此单片机之好处在于其超低的耗电,高速运行耗电低于1毫安,睡眠模式耗电低于5微安。其超低耗电能有效延长传呼机之电池寿命。 使用的主要元件为日立单片机H8/3887,日立点阵LCD驱动器HD66410,此驱动器能驱动128行乘33的点阵,因此能显示2行×8个中文字或4行×16个英文字,而FLEX解码器则选用三星的KS8701(用那一家解码器都可以,因全部解码器都是兼容的),高频部分使用摩托罗拉的MC2800,在MC2800的高频板上使用了NPC的锁相环IC5466AV,中文字库方面使用了日立的HN27C4001 256KB的EPROM作为储存,
[工业控制]
单片机数据通信:模拟SPI数据传输
本文是以时钟芯片DS1302为例子来分析时序图并写出代码。DS1302是采用SPI三线接口与单片机进行同步通信。重点分析单字节读时序,单字节写时序,寄存器读时序,寄存器写时序,并完成4个函数。完整代码以及仿真图下载地址:http://pan.baidu.com/s/1ntM5Kgh 上图为寄存器读时序,为什么先贴出这个图呢,因为读寄存器包含了单字节的写以及单字节的读。从图上可以看出,读DS1302的寄存器是先写入一个地址,然后再去读一个字节。那么就可以根据这个图来完成单字节的读写时序分析以及代码的编写。 单字节写时序 图1可以告诉我们,在时钟的上升沿是写入数据,是从低位开始写入。还有一个需要注意的地方是写字节
[单片机]
<font color='red'>单片机</font>数据通信:模拟SPI数据传输
用最流行的架构创造更广泛完善的ARM生态系统
如果说MCU是所有嵌入式系统的心脏,是各种系统活动的发源地的话,那么ARM就可以被看作是MCU的心脏。自1991年成立以来,ARM公司成功打造了一条以知识产权为开端的半导体产业链。而8年来在中国的辛勤耕耘,ARM公司见证了中国半导体、电子行业的自主创新和飞速发展。 ARM在手机领域的业绩令人垂涎,在整体的MCU市场虽然只有10%的份额,但却以200%的惊人速度在大踏步的前进,而其在32位MCU市场的影响力也使得越来越多的MCU厂商都加入到了ARM的阵营中来。 近日,ARM中国区总裁谭军博士接受了EEWORLD的采访,就目前32位MCU的发展状况及在中国的发展趋势发表了意见和看法。 ARM公司中国区总裁
[EEWORLD独家]
用最流行的架构创造更广泛完善的ARM生态系统
瑞萨电子宣布完成适用于系统平台开发的安全微控制器系列
瑞萨电子一体化安全MCU:RH850/P1L-C 2016年12月15日,日本东京讯——全球领先的先进半导体解决方案供应商瑞萨电子株式会社(TSE:6723)今日宣布推出四款新型RH850/P1L-C系列微控制器(MCU)。RH850/P1L-C系列芯片设计用于底盘和安全系统,如ABS防抱死制动器,安全气囊系统以及紧凑型电机控制系统。RH850/P1L-C属于 RH850/P1x-C安全系列MCU的低端产品,可一站式满足先进驾驶辅助系统(ADAS)的要求。 随着人们不断努力实现车辆自动驾驶的梦想,驾驶辅助系统的复杂性和性能日益增加,因此,协调与其它车辆控制单元的控制变得至关重要。对底盘系统来说,与ADAS协调的需求促使来自
[汽车电子]
瑞萨电子宣布完成适用于系统平台开发的安全<font color='red'>微控制器</font>系列
更多样、更实惠、更易用,MSPM0 为 MCU 市场带来新活力
近几年来,MCU 的产品种类越来越丰富,在功耗、性能、成本、生态、供应链等领域有了更多选择。同时,工业和汽车市场,甚至消费市场数字化、智能化进程的加速,也给通用 MCU 带来新的爆发点。IC Insights 的数据显示,MCU 在 2021 年和 2022 年两年间出货量和平均售价持续增长,超过了 200 亿美元,其中工业和汽车市场增幅最大。 德州仪器的 32 位 Arm ® Cortex ® M0+ 通用 MCU MSPM0 正是在此大环境下推出。作为德州仪器首款 Arm ® Cortex ® M0+ 的通用 MCU,这款产品是否会给持续火热的 MCU 市场带来新活力呢? 德州仪器 MSP HSM
[嵌入式]
更多样、更实惠、更易用,MSPM0 为 <font color='red'>MCU</font> 市场带来新活力
单片机与ARM谁更实用
一般在8位单片机与ARM方面的嵌入式系统是有层次上的差别,ARM适用于系统复杂度较大的高级产品,如PDA、手机等应用。而8位单片机因架构简单,硬件资源相对较少,适用于一般的工业控制、消费性家电等等。 对于一个单片机方面的软件编程初学者,应以HOLTEK系列或8051等8位单片机来做入门练习。而初学者应当具备软件编程相关知识,单片机一般软件编程是以汇编语言为主,各家有各家的语法,但大都以RISC的单片机架构为主,其中 RISC (Reduced Instruction Set Computer) 代表单片机的所有指令。都是利用一些简单的指令组成的,简单的指令代表 单片机的线路可以尽量做到最佳化,而提高执行速率。 另外初学者要
[单片机]
<font color='red'>单片机</font>与ARM谁更实用
51单片机外部中断示例
void Usart_INT0_init() { TMOD = 0X21; TH1 = 0XFD; TL1 = 0XFD; SM0 = 0; SM1 = 1; REN = 1; TR1 = 1; //ES = 1;//串口中断影响外部中断0 这句话会让程序无法进入外部中断服务 TH0 = 0; TL0 = 0; ET0 = 0;//关闭定时器0 IT0 = 1;//外部中断下降沿触发*/ EX0 = 1;//打开外部中断 EA = 1; //ES = 1; } void Send_data(unsigned char dat) { SBUF = dat; while(!TI); TI =
[单片机]
一文详解80C51单片机的指令集
数据传送类指令 数据传送是单片机最基本的操作。数据传送的一般功能是将源操作数传送到指令所指定的目的操作数,指令执行后,源操作数不变。 数据传送类指令一般不影响标志位。数据传送类指令共29条,可以分为两大类。一是采用MOV操作符,称为一般传送指令,共16条;二是采用非MOV操作符,称为特殊传送指令,共13条。 一般传送指令的 汇编 指令格式为: MOV是传送指令的操作助记符。其功能是将源操作数传送到目的操作数,源操作数内容不变。 该类指令的助记符,操作数,功能,字节数及执行时长(机器周期数),按目的操组数归类如下。 1)内部8位数据传送指令 内部 RAM 区是数据传送最活跃的区域,8位内部数据传送指令共15条,用于 单片机
[单片机]
一文详解80C51<font color='red'>单片机</font>的指令集
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved