0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

GReq_mcu168 来源:未知 作者:胡薇 2018-07-18 16:56 次阅读

在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。

中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。

(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 外部中断01 定时器02 外部中断13 定时器1中断4 串行口中断

这5个中断源的中断入口地址为:(在上一篇文章中讲到的ROM前43个存储单元就是他们,这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不是中断处理的程序,而是存放着中断处理程序的真正地址)

INT0:0003H 0

T0:000BH 1

INT1:0013H 2

T1: 001BH3

串口: 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.

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10859

    浏览量

    211692
  • 中断函数
    +关注

    关注

    0

    文章

    13

    浏览量

    5285

原文标题:单片机C语言函数之中断函数(中断服务程序)

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    AVR单片机C语言

    AVR单片机C语言库内容目录: .1. Character Type Functions - 字符类型函数2. Standard C In
    发表于 04-22 10:14 0次下载
    AVR<b class='flag-5'>单片机</b><b class='flag-5'>C</b><b class='flag-5'>语言</b>库

    51单片机C语言实例浅析

    目录 序 第一章 C语言 第一节 为何《实例浅析》选择 C语言作为 51 单片机开发
    发表于 03-14 12:29 962次下载

    STC单片机Keil中C语言函数定位的方法

    STC单片机Keil中C语言函数定位的方法:STC单片机Keil中C
    发表于 01-24 16:20 82次下载

    51单片机C语言延时函数怎么定义和使用

    C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。下面给出一个经典的延时函数C程序中可使用不同类型的变量来进行延时设计。经实验测
    发表于 11-16 17:06 8.5w次阅读

    52单片机 测试实验协议和C语言函数的详细资料免费下载

    本文档的主要内容详细介绍的是52单片机 测试实验协议和C语言函数的详细资料免费下载。
    发表于 09-26 17:40 13次下载
    52<b class='flag-5'>单片机</b> 测试实验协议和<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>函数</b>的详细资料免费下载

    单片机C语言中如何使用nop函数进行短延时的效果资料和程序说明

    单片机C语言中如何使用nop函数进行短延时的效果资料和程序说明 标准的C语言中没有空语句。但在
    发表于 03-05 11:01 10次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>C</b><b class='flag-5'>语言</b>中如何使用nop<b class='flag-5'>函数</b>进行短延时的效果资料和程序说明

    C51单片机中断函数的修饰方法

    C51中断函数必须通过该修饰符进行修饰。在C51程序设计中,当函数定义时用了interruptm修饰符,系统编译时把对应
    发表于 03-18 14:20 2700次阅读
    <b class='flag-5'>C</b>51<b class='flag-5'>单片机</b><b class='flag-5'>中断</b><b class='flag-5'>函数</b>的修饰方法

    如何在中断C函数中调用C++

    之前,我们在单片机程序开发时都会面对中断函数。众所周知的,这个中断函数肯定是要用C
    发表于 05-09 18:17 0次下载
    如何在<b class='flag-5'>中断</b><b class='flag-5'>C</b><b class='flag-5'>函数</b>中调用<b class='flag-5'>C</b>++

    单片机中断函数编写方法

    C51中断函数必须通过该修饰符进行修饰。在C51程序设计中,当函数定义时用了interrupt m修饰符,系统编译时把对应
    发表于 08-24 10:40 7938次阅读

    51单片机编程之中断函数using关键字的作用

    51单片机编程之中断函数using关键字的作用
    发表于 11-20 16:36 7次下载
    51<b class='flag-5'>单片机</b>编程<b class='flag-5'>之中断</b><b class='flag-5'>函数</b>using关键字的作用

    51单片机之中断

    51单片机之中断(interrupt)
    发表于 11-20 16:51 13次下载
    51<b class='flag-5'>单片机</b><b class='flag-5'>之中断</b>

    单片机 keil c语言字符比较函数的使用 使用strcmp();

    单片机 keil c语言字符比较函数的使用 使用strcmp();strcmp()的介绍、32单片机中的使用示例注意事项strcmp()的
    发表于 11-21 15:06 17次下载
    <b class='flag-5'>单片机</b> keil  <b class='flag-5'>c</b><b class='flag-5'>语言</b>字符比较<b class='flag-5'>函数</b>的使用 使用strcmp();

    STC单片机Keil中C语言函数定位的方法

    STC单片机Keil中C语言函数定位的方法
    发表于 08-29 10:07 2次下载

    单片机用按钮中断函数

    单片机用按钮中断函数  单片机中断是一种能够使单片机响应外部信号的机制,这种机制允许
    的头像 发表于 09-01 10:17 1529次阅读

    中断函数的基本概念

    单片机中断函数
    的头像 发表于 12-05 09:08 591次阅读
    <b class='flag-5'>中断</b><b class='flag-5'>函数</b>的基本概念