using 在C51中断中的使用问题

发布者:brian808090最新更新时间:2016-11-23 来源: eefocus关键字:using  C51  中断 手机看文章 扫描二维码
随时随地手机看文章

8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务 
处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。8051的中断向量表如下: 
中断源 中断向量 
--------------------------- 
上电复位 0000H 
外部中断0 0003H 
定时器0 溢出 000BH 
外部中断1 0013H 
定时器1 溢出 001BH 
串行口中断 0023H 
定时器2 溢出 002BH 

interrupt 和 using 都是 C51 的关键字。C51 中断过程通过使用 interrupt 关键字和中断号(0 到 31)来实现。中断号指明编译器中断程序的入口地址中断序号对应着 8051中断使能寄存器IE 中的使能位,对应关系如下: 
IE寄存器 C51中的 8051的 
的使能位 中断号 中断源 
-------------------------------- 
IE.0 0 外部中断0 
IE.1 1 定时器0 溢出 
IE.2 2 外部中断1 
IE.3 3 定时器1 溢出 
IE.4 4 串口中断 
IE.5 5 定时器2 溢出 

有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到,编译器会把它们压栈,在中断程序结束时将他们出栈。C51 支持所有 5 个 8051 标准中断从 0 到 4 和在 8051系列(增强型)中多达 27 个中断源。 
using 关键字用来指定中断服务程序使用的寄存器组。用法是:using 后跟一个0 到3 的数,对应着 4 组工作寄存器。一旦指定工作寄存器组,默认的工作寄存器组就不会被压栈,这将节省 32 个处理周期,因为入栈和出栈都需要 2 个处理周期。这一做法的缺点是所有调用中断的过程都必须使用指定的同一个寄存器组,否则参数传递会发生错误。因此对于using,在使用中需灵活取舍。 

举个例子来说: 
定义一个延时函数 
void delay(unsigned int n)  //n=10000,延时90.05毫秒, 默认寄存器组0

{

    while(n--);

}
有如下一个中断函数 
void int_0(void) interrupt 0 using 1 { //默认寄存器组1
    ...
   Delay(2000);
   ...


在默认状态下,delay()使用寄存器组0(BANK0),那么当int_0调用delay()时时会造成参数传递错误. 这里必需把delay()的寄存器组也设为1.

如果在中断服务函数 ISR (中断服务程序)中使用寄存器,那么必须处理好 using 的使用问题: 
1、中断服务函数使用 using 指定与主函数不同的寄存器组(主函数一般使用 Register bank 0)。 
2、中断优先级相同的ISR 可用 using 指定相同的寄存器组,但优先级不同的 ISR 必须使用不同的寄存器组,在 ISR 中被调用的函数也要使用 using 指定与中断函数相同的寄存器组。 
3、如果不用 using 指定,在 ISR的入口,C51 默认选择寄存器组0,这相当于中断服务程序的入口首先执行指令:
MOV PSW #0 
这点保证了,在没使用 using 指定的高优先级中断。可以中断使用不同的寄存器组的低优先级中断。 
4、使用 using 关键字给中断指定寄存器组,这样直接切换寄存器组而不必进行大量的 PUSH和 POP 操作,可以节省RAM空间,加速 MCU 执行时间。寄存器组的切换,总的来说比较容易出错,要对内存的使用情况有比较清晰的认识,其正确性要由你自己来保证。特别在程序中有直接地址访问的时候,一定要小心谨慎!至于“什么时候要用到寄存器组切换”,一种情况是:当你试图让两个(或以上)作业同时运行,而且它们的现场需要一些隔离的时候,就会用上了。在 ISR 或使用实时操作系统RTOS 中,寄存器非常有用。 


关键字:using  C51  中断 引用地址:using 在C51中断中的使用问题

上一篇:c51串口发送数据程序
下一篇:51单片机模拟秒表

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

c51单片机中断详解--适合初学者
工程图 第一题 **每次亮一个灯的流水灯,定义P1为led1。 外部中断0允许中断:EX0=1;下降沿触发:IT0=1;总开关:EA=1; 中断要执行的是P0引脚的4个二极管闪六次。 其实这里还有个想说的是,IE在中断请求的时候,会置位为1,然后CPU同意并执行中断程序后,IE自动清零。为什么说这个,这个可以在以后的一些情况,作为中断条件。 第二题 每次亮一个灯的流水灯和第一题的一样; 中断0下降沿触发也和第二题一样; 中断0程序是:P1引脚每次亮两个二极管的流水灯 讨论一下:每次亮两个二极管,如果低电平亮,那就要11111100B→11110011B。 个人觉得在中断中使用while造成的后果是很致命的,
[单片机]
<font color='red'>c51</font>单片机<font color='red'>中断</font>详解--适合初学者
STM32F407ZGT6学习之外部中断
工程代码:https://pan.baidu.com/s/1Qlfg1_br0tN6yy0fcDwCjg,密码:fhh2 (一)、概述 STM32外部中断通过检测外部的触发事件(上升沿触发、下降沿触发或边沿触发),触发中断事件实现低延迟的中断处理。 1、外部中断框架图 由下图可以看出,外部中断的边沿检测器连接输入信号,当“软件中断寄存器”和“中断屏蔽寄存器”打开的时候,当有事件触发时,事件会被送到NVIC中断控制器中触发中断事件。 2、外部中断特性 2.1、中断优先级 中断包含 16 个可编程优先级(使用了 4 位中断优先级),数字越小的优先级等级越高。通过NVIC_PriorityGroupConfig
[单片机]
STM32F407ZGT6学习之外部<font color='red'>中断</font>
一文详解80C51单片机的中断系统
中断系统是计算机或者单片机的主要功能部件。 有了中断系统,便可以使微处理器具备对外部的异步事件进行处理的能力。 当微处理器的CPU正在执行程序的过程中,如果外部硬件或者内部组件有紧急的请求(如通信,断点,发生重大故障等),中断系统就可以将当前的程序暂停,优先处理这些中断请求。 这种处理方式,对整个系统的稳定性,健壮性至关重要,同时也能大大提高处理器的效率,使得系统的应用更加灵活多变。 中断的概念 中断是指单片机在执行程序的过程中,当出现异常情况或特殊请求时,单片机停止当前程序的运行,转向对这些异常情况或特殊请求进行处理,当处理结束后再返回原程序的间断处,继续执行原程序,这一现象称为中断。 中断是单片机实时处理内部或外部事件的一
[单片机]
一文详解80C51单片机的<font color='red'>中断</font>系统
STM32F103对于固件库V3.5.0打开和关闭总中断
#define CLI() __set_PRIMASK(1) //关闭总中断 #define SEI() __set_PRIMASK(0) //打开总中断 __set_PRIMASK()在V3.5.0库中的core_cm3.h中,定义如下 static __INLINE void __set_PRIMASK(uint32_t priMask) { register uint32_t __regPriMask __ASM( primask ); __regPriMask = (priMask); }
[单片机]
STM8S UART串口使用中断收发数据
原来调过STM8L的串口,逻辑简单,中断清晰,换成STM8S105K4后,虽然也是用STD库,除去函数名、宏名等语言层面的差异以外,中断处理方面也有些不一样的地方,特此记之。 和此篇【STM8L USART串口使用】结构相同,也是中断异步模式,但为调用方便起见,在调用层面改为同步。 (STM8S105K的MCU下,RX为PD6,RX为PD5。) 使用方面,感觉主要困扰就是中断名、使用场合和时机不明确、不清晰,这一点不如STM8L的定义清晰。 举例而言,开关中断用UART2_IT_RXNE_OR,清中断则用UART2_IT_RXNE。不能开关时用UART2_IT_RXNE,也不能清中断时用UART2_IT_RXNE_OR,否则S
[单片机]
keil C51存储区域类型是什么
keil C51存储区域分为程序存储区和数据存储区2大类型。 一.程序存储区(Pragram Area): 欲将声明的数据存放在程序存储区域,可以使用关键字“code”说明。 例 unsigned char code i=10;则表示 i为无符号字符型数据存放区域为程序存储区。 二.数据存储区(Data Memory): 数据存储区域分为内部数据存储区、外部数据存储区域和特殊功能寄存器寻址区。 1.内部数据存储区域(Internal Data Memory):可以使关键字 data、iadta、bdata 做相应说明。 data:直接寻址区,声明的数据存储范围为内部RAM低128字节 0X00~0X7F
[单片机]
AVR单片机GCC编程:外部中断基本操作
#include avr/io.h #include avr/interrupt.h #include avr/signal.h int main(void) { MCUCR |= (1 ISC11); //INT1 下降沿触发 MCUCR |= ((1 ISC00) | (1 ISC01)); //INT0 上升沿触发 GICR |= ((1 INT1) | (1 INT0)); //INT0, INT1 使能 sei(); //全局中断使能SREG.I //中断发生时, 通用中断标志寄存器GIFR中相应INTF0,INTF1置位,时入中断服务程序后自动清零,也可以人为清零. } SIGNAL(SIG_INTERR
[单片机]
单片机中断子程序注意事项
跟我之前一样,对中断,定时器了解的不够透彻,被老师训了之后查资料搞实验后终于搞清楚了,下面说说我的看法:千万不要在中断函数中做多余的事!!!只能做最基本的操作,比如置标志位,让一个数加一等,与延时有关的操作千万不要做!你10ms进一次中断,在里面又扫描按键,又显示液晶,这里面花的时间远远地超过10ms,它肯定死在中断里出不来啊,因为你不关闭中断的话它一直10ms进去,最好在中断里设置几个标志位,进中断就让标志位置1,然后出中断,在主循环里判断标志位,如果标志位置1了,就清零标志位,然后做其他的动作。好好想一想,思路一定要清晰! 如果中断子程序进去就关闭中断使能位,就可以有延时等操作了,不用再担心频繁中断,导致死循环在中断子程序
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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