51单片机interrupt和using使用详解

发布者:phi31最新更新时间:2025-09-29 来源: bilibili关键字:51单片机  interrupt  using 手机看文章 扫描二维码
随时随地手机看文章

51单片机中的中断中出现了using 1,这是什么意思?我也是查了几天资料,终于弄明白了,给大家分享一下,using n是工作寄存器组切换开关,工作寄存器组与BANK是一个概念;


51的工作寄存器R0-R7共有4组,分别是BANK0、BANK1、BANK2、BANK3,在任何时刻,只有一个工作组生效!这4个组在RAM中的位置分别是[00H,07H]、[08H,0FH]、[10H,17H]、[18H,1FH],换句话说,RAM中的00H地址、08H地址、10H地址、18H地址,这四个地址的名字都叫R0,那么,在汇编中,我们经常看到类似MOV R0,#07这样的语句,这个#07到底别放到了RAM的哪个地址中去了呢?00H?08H?10H?18H?到底是这4个中的哪一个,取决于51的PSW寄存器的RS1和RS0两个位,若PSW.RS=2就意味着第二组工作寄存器生效,R0的地址就是10H。


51在上电后,PSW的RS两个位默认为0,也即51默认使用的工作寄存器组BANK 0,在默认状态下,对于普通的C语言函数,其传参、申请局部变量、导出函数的返回值等功能,keil将其翻译成汇编后,肯定要使用R0-R7;对于51的中断服务函数,虽然没有形参,也不用返回值,但是一般肯定有局部变量,这时就需要用到R0-R7了;试想,在执行普通函数时,默认工作寄存器组BANK 0 的R0-R7已经被使用了,在执行普通函数时,一旦发生中断,而中断函数也需要使用R0-R7,怎么办?


我们能想得到是,在执行中断服务函数前把R0-R7入栈,中断服务完成后再把R0-R7出栈恢复现场,这样工作量很大;


普通函数的执行过程中,正在使用BANK0的R0-R7,执行过程中,突然发生了中断,而中断函数也想使用R0-R7,在执行中断服务函数前,我们切换工作寄存器组,切换的具体方法就是直接修改PSW的RS两个比特位,而不必把BANK0入栈,本文开头的例子中using 2 就是说,在进入外部中断0的服务函数前,先入栈CPU寄存器,再把工作寄存器组由0切换成2,在退出中断服务后,先由BANK2切换回BANK0,并弹出CPU寄存器,由于BANK0和BANK2处在不同的RAM空间,互不干扰,切换回BANK0之后,就把那个普通函数的现场给恢复了。


关键字:51单片机  interrupt  using 引用地址:51单片机interrupt和using使用详解

上一篇:基于51单片机的电子密码锁设计与实现
下一篇:51单片机编程开发(四)之完转LED

推荐阅读最新更新时间:2026-04-02 12:50

C51中interruptusing的用法——单片机
void INT0()interrupt 0 using 1 {.... ..... } interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断; using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器; 51单片机内的寄存器是R0--R7(不是R0-R3) R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1、RS0位决定的。 using 0时设置 RS1=0,RS0 =0
[单片机]
C51中interruptusing的用法
void INT0()interrupt 0 using 1 {.... ..... } interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断; using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器; 51单片机内的寄存器是R0--R7(不是R0-R3) R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1、RS0位决定的。 using 0时设置 RS1=0,RS0 =0
[单片机]
interruptusing在C51中断中的使用
C51的中断函数的格式为:void FuncIr(void) interrupt x interrupt和using都是C51的关键字。C51中断过程通过使用interrupt关键字和中断号(0到3)来实现,中断号指明了中断程序的入口地址。有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到,编译器会把它们压栈,在中断程序结束时将他们出栈。C51支持所有5个8051标准中断(从0到4)和在8051系列(增强型)中多达27个的中断源。 using关键字用来指定中断服务程序使用的寄存器组。用法是:using后跟一个0到3的数,对应着 4组工作寄存器。一旦
[单片机]
STVD常见错误 找不到 stm8_interrupt_vector.c
#error cpstm8 stm8_interrupt_vector.c:0 can’t open stm8_interrupt_vector.c srccancan.c: Compiling srcappmain.c… cxstm8 +modsl +debug -pxp -no -pp -l -iinccommuni -iincqueue -iincpowermanage -iinclin -iinclib -iinckey -iincdrv -iincdef -iincdebug -iincconfig -iincclk -iinccan -iincapp -i C:Program FilesCOSMICCXSTM8
[单片机]
STM32 BUTTON方式(polling & interrupt)
基于stm32 F401 discovery版实现button polling & interrupt点亮LED /** ****************************************************************************** * @file Template/main.c * @author MCD Application Team * @version V1.0.0 * @date 11-September-2013 * @brief Main program body **************************
[单片机]
Interrupt(单片机中断)
所有的中断(外部中断,定时器中断……)运行的结果都是一样的:流水灯逐个点亮,当中断响应的时候,流水灯全部熄灭,当中断结束的时候,流水灯继续刚才的流动。 proteus原理图: 1.外部中断: 代码: #include reg52.h #include stdio.h #define uint unsigned int #define uchar unsigned char uchar temp; //声明一个全局变量 void delay(uint delay_time); void main() { EA=1; //开总中断 EX0=1; //开外部中断0 IT0=0; //设置有效方式
[单片机]
<font color='red'>Interrupt</font>(单片机中断)
s3c2410 __attribute__ ((interrupt ("IRQ")))
在中断里面,有这个函数,不太明白是怎么回事,于是网上找答案~原文是关于s3c44B0的,不过感觉都差不多吧~下面整理下~ ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采用中断比以往的查询方式占用更少的CPU时间,让系统提供更好性能。 查询S3C2410的手册,发现它有?(我不清楚有几种)种工作模式,每种工作模式是不一样的。其中最常用的,就是FIQ和IRQ模式。在使用中断之前,一定要初始化每种模式的栈指针SP,如果不初始化,肯定会出错。在CPU进行初始化时,就需要依次进入IRQ模式,初始化SP,接着再进入FIQ模式初始化
[单片机]
Keil C51对C语言的关键词扩展之十八:using
在8051系列单片机中,内部ram的前32个字节被分为4组,每组8个寄存器。每组的8个寄存器名字都为R0-R7。通过设置PSW寄存器的两个位,可以选择使用4组寄存器中的哪一组。 寄存器组在处理中断或者使用实时操作系统时非常有用,可以在进入中断或者切换任务时使用不同寄存器组,而不用把8个寄存器的内容保存到堆栈。在退出中断或返回原任务时,只需切换回原来的寄存器组即可。 指定一个函数使用的寄存器组: void rb_function (void) using 3 { . . . } using后跟数字0-3,不允许使用符号表达式指定代替该数字常量。只有定义函数时才可使用using关键词,在做函数原型声明时不允许使用usin
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved