51单片机中断寄存器组选择

大家都知道51 单片机 有的寄存器R0-R7共有四组。
        首先介绍一下51的寄存器组:
        通过 设置 PSW寄存器的第3位和第4位可以任意切换寄存器组。在进入中断前,切换寄存器组,可以方便的保护原寄存器组的 数据 不被中断里的语句破 坏, 很方便。
RS1  RS0                          字节地址
          0组寄存器    00H~07H
          1组寄存器    08H~0FH
          2组寄存器    10H~17H
          3组寄存器    18H~1FH
  RS1=PSW.4  RS0=PSW.3

常见错误有三种:
1、为中断 函数 指定了第0组寄存器 
        C 程序 :  void  int0()  interrupt  using  0
        编译 后的汇编如下:
        PUSH    ACC 
        PUSH    B
        PUSH    DPH
        PUSH    DPL
        PUSH    PSW
        MOV      PSW,#0x00   
        。。。。。。
        因为main()函数使用的就是第0组寄存器,中断程序会改变寄存器组的数据。主程序运行时,随时都有可能产生中断,等中断返回主程序时,寄存器R0-R7的值已经被改变了。这是非常严重的错误。而且故障时有时无,错误也是莫明其妙。
2、中断优先级不同,寄存器组号相同
        C程序:  void  int0()    interrupt      using      //低优先级中断
                          void  T0()    interrupt      using      //高优先级中断 
        因为高优先级的中断可以打断正在执行的低级中断,转向持行高级中断。这就是所谓的中断的中断。与第1种错语一样,高级中断的程序,会改变低级中断正在使用的寄存器。
3、不写using  。严格的说,这样写不能算是错误。但这是相当不好的习惯。
        C程序:  void  int0()    interrupt    0
        编译后的汇编如下:
        PUSH    ACC 
        PUSH    B
        PUSH    DPH
        PUSH    DPL
        PUSH    PSW
        MOV      PSW,#0x00   
        PUSH    0x00
        PUSH    0x01
        PUSH    0x02
        PUSH    0x03
        PUSH    0x04
        PUSH    0x05
        PUSH    0x06
        PUSH    0x07
        。。。。。。
        没用using指定寄存器组,编译器就默认分配了第0组寄存器,然后又用8条语句把第0组的R0-R7保存到栈中,退出中断时还需要8个弹栈。这样“笨拙”的写法,占用了程序空间32个字节、占有堆栈8个字节。也许高级版本的编译器会改进吧,搞单片机的还是规矩些好。
       
经验总结:
        1、写中断程序一定要用using语句指定寄存器组。第1、2、3组都可以,不能是0.
        2、51单片机的中断有两个优先级。一个中断不会打断另一个相同优先级的中断。这样相同级别中断可以使用同一个组。比如:低优先级的中断函数都用  using  1,高优先级的中断都用  using  。这样不会冲突。
        下面是一个正常的例子:
        C程序:  void  int0()  interrupt  using  1
        编译后的汇编如下:
        PUSH    ACC 
        PUSH    B
        PUSH    DPH
        PUSH    DPL
        PUSH    PSW
        MOV      PSW,#0x08   
                。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值