电子发烧友网 > 控制/MCU > 正文

C51单片机interrupt和using的使用

2018年12月05日 15:35 次阅读
8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务 C51单片机interrupt和using的使用 处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。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,在使用中需灵活取舍。 关于using: 您在文中说明“这一做法的缺点是所有调用中断的过程都必须使用指定的同一个寄存器组”是不是这个意思? 举个例子来说: 定义一个函数 void func(unsigned char i) { 。.. if(++i==0x12) { 。.. } 。.. } 有如下一个中断函数 void int_0(void) interrupt 0 using 1 { 。..。 } 在默认状态下,func使用寄存器组0(BANK0),那么当int_0调用func时是否存在当传递参数时会造成参数传递错误? 谢谢! 如果在中断服务函数 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 中,寄存器非常有用。 寄存器组使用的原则: 1、8051 的最低32 个字节分成 4 组 8 寄存器。分别为寄存器R0 到R7。寄存器组由PSW 的低两位选择。在 ISR 中,MCU 可以切换到一个不同的寄存器组。对寄存器组的访问不可位寻址,C51 编译器规定使用 using 或 禁止中断的函数(#pragma disable)均不能返回 bit 类型的值。 2、主程序(main函数)使用一组,如 bank 0;低中断优先级的所有中断均使用第二组,如 bank 1;高中断优先级的所有中断均使用再另外一组,如 bank 2。显然,同级别的中断使用同一组寄存器不会有问题,因为不会发生中断嵌套;而高优先级的中断则要使用与低优先级中断不同的一组,因为有可能出现在低优先 级中断中发生高优先级中断的情况。编译器会自动判断何时可使用绝对寄存器存取。 3、在 ISR 中调用其它函数,必须和中断使用相同的寄存器组。当没用 NOAREGS 命令做明确的声明,编译器将使用绝对寄存器寻址方式访问函数选定(即用 using 或 REGISTERBANK 指定)的寄存器组,当函数假定的和实际所选的寄存器组不同时,将产生不可预知的结果,从而可能出现参数传递错误,返回值可能会在错误的寄存器组中。 举一例子:当需要在中断内和中断外调用同一个函数,假定按照程序的流程控制,不会出现函数的递归调用现象,这样的调用会不会出现问题?若确定不会发生重入情况,则有以下两种情况: 1、如果 ISR 和主程序使用同一寄存器组(主程序缺省使用BANK 0,若 ISR 没有使用 using 为其指定寄存器区,则缺省也使用 BANK 0),则不需其他设置。 2、如果 ISR 和主程序使用不同的寄存器组(主程序缺省使用BANK 0,ISR 使用 using 指定了其他 BANK),则被调用函数必须放在: #pragma NOAREGS #pragma AREGS 控制参数对中,指定编译器不要对该函数使用绝对寄存器寻址方式;或者也可在 Options-》C51,选中“Don‘t use absolute register accesses”,使所有代码均不使用绝对寄存器寻址方式(这样,执行效率将稍有降低)。不论以上的哪一种情况,编译器均会给出重入警告,需手工更改 OVERLAY 参数,做重入说明。 3、还有一种办法:如果被调用函数的代码不是很长,还是将该函数复制一份,用不同的函数名代替,这种情况适合ROM有足够多余的空间。 因此,对using关键字的使用,如果没把握,宁可不用,交给编译系统自己去处理好了。 interrupt xx using y 跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1 4 串行中断 其它的根举相应得单片机有自己的含义,实际上c载编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址 using y 这个y是说这个中断函数使用的那个寄存器组就是51里面一般有4个 r0 -- r7寄存器,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会弹出来节省代码和时间 本文引用地址: http://www.21ic.com/app/mcu/201812/784327.htm 一般只有using 0,1,2,3 单 片机中断响应可以分为以下几个步骤:1、停止主程序运行。当前指令执行完后立即终止现行程序的运行。2、保护断点。把程序计数器PC 的当前值压入堆栈,保存终止的地址(即断点地址),以便从中断服务程序返回时能继续执行该程序,3、寻找中断入口。根据5 个不同的中断源所产生的中断,查找5 个不同的入口地址。4、执行中断处理程序。这就不讲了;5、中断返回。执行完中断处理程序后,就从中断处返回到主程序,继续往下执行。 以上工作是由计算机自动完成的,与编程者无关,在这5 个入口地址处存放有中断处理的程序(这是程序编写时放在那儿的,如果没把中断处理程序放在那儿可就错了,因为中断程序无法被执行到)。有点复杂是吗?没关系,继续往下看。 五 个中断源的自然优先级由高到低的排列顺序为外中断0→定时器0→外中断1→定时器1→串口中断。如果我们不对其进行设置,单片机就按照此顺序不断的循环检 查各个中断标志(就像我们生活中按照习惯处理事物一样),但有时我们需要人工设置高、低优先级,也就是说由编程者来设定哪些中断是高优先级、哪些中断是低 优先级(当然由于只有两级,所以必然只有一些中断处于优先级别,而其他的中断则处于同一级别,处于同一级别的中断顺序就由自然优先级来确定,这一点请大家 务必搞清楚了)。 既然可以设定人工优先级,那么它又是如何来设置的呢?其实很简单,我们只要把IP 寄存器的对应位置“1”就可以了,看下面的表: × × × PS PT1 PX1 PT0 PX0 串口 T1 INT1 T0 INT0 开机时,每个中断都处于低优先级,我们可以用指令来对优先级进行设置。例如:现在有如下要求,将T0、INT1 设为高优先级,其它为低优先级,求IP 的值。 IP 的首3 位没用,可任意取值,设为000,后面根据要求写:00000110,即IP=06H,看下面的表。 × × × PS PT1 PX1 PT0 PX0 0 0 0 0 0 1 1 0

技术专区

下载发烧友APP
打造属于您的人脉电子圈
关注电子发烧友微信
有趣有料的资讯及技术干货
关注发烧友课堂
锁定最新课程活动及技术直播
收藏 人收藏
分享:

评论

相关推荐

C51单片机的PID程序编写

//主程序=============================================...
发表于 2018-12-04 14:53 79次阅读
C51单片机的PID程序编写

STM32单片机的IAP向量问题解决方案

// 1:复制用户代码中的中断向量表到SRAM首地址 // 2: 开启SRAM的重映射功能,将...
发表于 2018-11-30 15:24 82次阅读
STM32单片机的IAP向量问题解决方案

C51单片机对1602lcd模块的驱动

说明:1.晶体:11.0592MHz 2.1602驱动:ks0066 *********...
发表于 2018-11-29 16:32 49次阅读
C51单片机对1602lcd模块的驱动

C51单片机对液晶片的驱动

Keil C51编写的192*64液晶片驱动程序,感谢很多网友提供了参考源程序, 本程序是在网...
发表于 2018-11-19 16:22 117次阅读
C51单片机对液晶片的驱动

C51单片机对五线四相八拍步进电机的控制设计

本试验板设有四个按键,其功能分别为“启动/停止”“正转/反转”“速度-”“速度+”。 定义P2...
发表于 2018-11-15 16:44 223次阅读
C51单片机对五线四相八拍步进电机的控制设计

C51单片机指针变量的定义及应用

[存储器类型1] 表示被定义为基于存储器的指针。无此选项时,被定义为一般指针。这两种指针的区别在于它...
发表于 2018-11-14 16:34 104次阅读
C51单片机指针变量的定义及应用

C51单片机通过I2C对EEPROM进行页读取的问题求助

发表于 2018-11-12 08:15 58次阅读
C51单片机通过I2C对EEPROM进行页读取的问题求助

基于C51单片机对液晶显示的实验设计

程序一:在液晶屏上显示一个1 //在液晶屏上显示一个字符 #include #de...
发表于 2018-11-08 16:37 134次阅读
基于C51单片机对液晶显示的实验设计

C51单片机在电机转速测量仿真系统中的设计

该单片机电机转速测量系统仿真仿真采用测频法“M法”测量电机转速。即在一定测量时间T内,测量脉冲发生器...
发表于 2018-11-05 15:31 147次阅读
C51单片机在电机转速测量仿真系统中的设计

C51单片机中定义一个全局变量会有怎样的影响

全局变量被定义在内存中的专门地址上,存储位置固定。对于频繁存取的重要变量但可以采用全局变量以减少代码...
发表于 2018-11-02 16:38 215次阅读
C51单片机中定义一个全局变量会有怎样的影响

单片机中的上下拉电阻有什么作用

上拉电阻就是将不确定的信号通过一个电阻拉到高电平,同时此电阻也起到一个限流作用,下拉就是下拉到低电平...
发表于 2018-11-02 16:22 203次阅读
单片机中的上下拉电阻有什么作用

C51单片机对DS18B20温度计的控制

18B20温度计,正负温度显示。最大99摄氏度。用万能板手工焊接。调试成功,正常显示。共阳数码管由三...
发表于 2018-11-02 15:40 174次阅读
C51单片机对DS18B20温度计的控制

基于C51中断过程及interrupt和usin...

8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位...
发表于 2018-10-30 16:22 110次阅读
基于C51中断过程及interrupt和usin...

如何采用C51单片机读写CAT24C32

#defineWriteDeviceAddress0x0A2//定义器件在I2C总线中的写地址(注意...
发表于 2018-10-30 16:06 111次阅读
如何采用C51单片机读写CAT24C32

立创商城基于GD32单片机的WIFI网络存储SD卡 袋装

发表于 2018-10-29 20:08 160次阅读
立创商城基于GD32单片机的WIFI网络存储SD卡 袋装

基于C51单片机中的通信协议分享

通信头-》巴克码-》地址字-》长度字-》命令字-》信息位-》校准字 1.通信头:占1~8个字节...
发表于 2018-10-29 16:08 144次阅读
基于C51单片机中的通信协议分享

51单片机串行口通讯proteus仿真

发表于 2018-10-26 18:46 234次阅读
51单片机串行口通讯proteus仿真

基于单片机2440test中断向量处理方案

这里不用中断(interrupt)而用异常(exception),毕竟中断只是异常的一种情况,呵呵 ...
发表于 2018-10-25 15:26 106次阅读
 基于单片机2440test中断向量处理方案

请问avr和c51单片机有什么区别?

发表于 2018-08-15 04:31 211次阅读
请问avr和c51单片机有什么区别?

云龙C51单片机教学视频

发表于 2018-07-19 03:49 212次阅读
云龙C51单片机教学视频

从Keil C51到DSP28335移植出现问题是为什么?如何解决?

发表于 2018-06-11 08:39 234次阅读
从Keil C51到DSP28335移植出现问题是为什么?如何解决?

用两个51单片机进行双机通信,甲机发送给乙机,乙机接收并用数码管显示,显示的数字和发送的数字不一致是为什么?

发表于 2018-06-07 18:22 782次阅读
用两个51单片机进行双机通信,甲机发送给乙机,乙机接收并用数码管显示,显示的数字和发送的数字不一致是为什么?

LCD12864仿真程序无法显示

发表于 2018-05-08 18:14 404次阅读
LCD12864仿真程序无法显示

基于单片机的电动车智能充电器怎么设计

发表于 2018-04-20 17:22 1093次阅读
基于单片机的电动车智能充电器怎么设计

请问像4054那样的充电ic,如何用单片机读取chrg端口充电状态

发表于 2018-04-03 15:57 1825次阅读
请问像4054那样的充电ic,如何用单片机读取chrg端口充电状态

51单片机汇编延时程序算法详解

MCS-51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机...
发表于 2018-03-12 09:48 1757次阅读
51单片机汇编延时程序算法详解

单片机C51存储器类型及存储模式

单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处...
发表于 2017-11-16 09:41 2061次阅读
单片机C51存储器类型及存储模式

三种C51单片机上电复位延时电路图

下面几种延时复位电路,都是利用在单片机RST引脚上外接一个RC支路的充电时间而形成的。
发表于 2014-09-11 10:59 5153次阅读
三种C51单片机上电复位延时电路图

用C51单片机设计远程红外安防监控管理系统

摘 要:介绍了基于移动GSM\GPRS 网络的远程红外监控管理系统的总体设计方案。本系统采用C805...
发表于 2012-10-10 10:56 5923次阅读
用C51单片机设计远程红外安防监控管理系统

C51单片机及C语言知识点必备秘籍

  电子发烧友网讯:应广大电子发烧友网读者要求,本电子书《C51单片机及C语言知识点必备秘籍》为《单...
发表于 2012-07-30 13:59 7369次阅读
C51单片机及C语言知识点必备秘籍

单片机C语言知识点全攻略(完结篇)

电子发烧友网讯:继《单片机学习知识点全攻略》得到广大读者好评,根据有网友提出美中不足的是所用单片机编...
发表于 2012-07-11 14:41 15637次阅读
单片机C语言知识点全攻略(完结篇)

一键多功能按键识别技术原理图

如图所示,开关 SP1 接在 P3.7/RD 管脚上,在 AT89S51 单片机的 P1 端口接有四...
发表于 2012-05-22 15:38 1933次阅读
一键多功能按键识别技术原理图

基于C51单片机的手动计数器设计电路图

利用 AT89S51 单片机来制作一个手动计数器,在 AT89S51 单片机的 P3.7 管脚接一个...
发表于 2012-05-22 15:03 2963次阅读
基于C51单片机的手动计数器设计电路图

基于C51单片机的计时器设计原理图

如下图所示,在 AT89S51 单片机的 P0 和 P2 端口分别接有两个共阴数码管 P0 口驱动显...
发表于 2012-05-22 13:57 2713次阅读
基于C51单片机的计时器设计原理图

基于C51单片机的按键识别原理图

每按下一次开关 SP1 ,计数值加 1 ,通过 AT89S51 单片机的 P1 端口的 P1.0 到...
发表于 2012-05-21 16:34 3126次阅读
基于C51单片机的按键识别原理图

基于C51单片机的I/O并行口直接驱动LED显示...

如图 13 所示,利用 AT89S51 单片机的 P0 端口的 P0.0 - P0.7 连接到一个共...
发表于 2012-05-21 16:08 1479次阅读
基于C51单片机的I/O并行口直接驱动LED显示...

基于C51单片机的报警产生器电路原理图

用 P1.0 输出 1KHz 和 500Hz 的音频信号驱动扬声器,作报警信号,要求 1KH z信号...
发表于 2012-05-21 16:04 1223次阅读
基于C51单片机的报警产生器电路原理图

基于C51单片机的多路开关状态显示电路原理图

如下图所示, AT89S51 单片机的 P1.0 - P1.3 接四个发光二极管 L1 - L4 ,...
发表于 2012-05-21 15:51 2310次阅读
基于C51单片机的多路开关状态显示电路原理图

C51单片机看门狗电路

采用89C51单片机和X25045组成的看门狗电路,可通过软件预置系统的监控时间。
发表于 2012-02-14 10:44 6677次阅读
C51单片机看门狗电路

C51单片机的中断号以及中断向量

本内容简单介绍了C51单片机的中断号以及中断向量,方便大家了解和学习
发表于 2012-02-02 15:25 2784次阅读
C51单片机的中断号以及中断向量

ARM中断向量两种设置方法

在32位ARM系统中,一般都是在中断向量表中放置一条分支指令或PC寄存器加载指令,实现程序跳转到中断...
发表于 2012-01-12 19:06 2664次阅读
ARM中断向量两种设置方法

C51单片机矩阵键盘扫描去抖程序

C51单片机矩阵键盘电子扫描去抖程序 这段有1个C51的项目,用的是新华龙的C51 F020单片机。...
发表于 2011-10-25 15:43 9801次阅读
C51单片机矩阵键盘扫描去抖程序

基于C51单片机的校园自助导览仪设计

本设计是基于校园的一种电子产品,将旅游景点的解说以MP3格式存储,通过无线形式实现智能控制。本文还对...
发表于 2011-07-07 10:29 1047次阅读
基于C51单片机的校园自助导览仪设计

Securing Electronic Tran...

Abstract: This article discusses the requirements ...
发表于 2009-05-08 11:40 404次阅读
Securing Electronic Tran...

Recording Power Cycling ...

Abstract: This application note describes how to u...
发表于 2009-04-21 09:38 419次阅读
Recording Power Cycling ...

Simple, Low-Cost, 4-Port...

Abstract: Application note 376 provides the hardwa...
发表于 2009-04-20 09:41 373次阅读
Simple, Low-Cost, 4-Port...

Using DS2148/348 as Repe...

Abstract: Application Note 387 describes the use o...
发表于 2009-04-20 09:40 290次阅读
Using DS2148/348 as Repe...

Using Analog Temperature...

Abstract: Analog temperature sensors are often use...
发表于 2009-04-18 10:47 306次阅读
Using Analog Temperature...

12-Bit Thermometer Using...

This application note explains how to implement a ...
发表于 2009-04-17 10:18 260次阅读
12-Bit Thermometer Using...