大家都知道51单片机有的寄存器R0-R7共有四组。最近1年来,我在与新手朋友交流时发现,很多朋友对寄存器组的使用时经常出现问题。虽然这并不是多难的问题,但如果出现错误,也会造成很严重的后果。
首先介绍一下51的寄存器组:
通过设置PSW寄存器的第3位和第4位可以任意切换寄存器组。在进入中断前,切换寄存器组,可以方便的保护原寄存器组的数据不被中断里的语句破坏,很方便。
RS1 RS0 字节地址
0 0 0组寄存器 00H~07H
0 1 1组寄存器 08H~0FH
1 0 2组寄存器 10H~17H
1 1 3组寄存器 18H~1FH
RS1=PSW.4 RS0=PSW.3
常见错误有三种:
1、为中断函数指定了第0组寄存器
C程序: void int0() interrupt 0 using 0
编译后的汇编如下:
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
PUSH PSW
MOV PSW,#0x00
。。。。。。
因为main()函数使用的就是第0组寄存器,中断程序会改变寄存器组的数据。主程序运行时,随时都有可能产生中断,等中断返回主程序时,寄存器R0-R7的值已经被改变了。这是非常严重的错误。而且故障时有时无,错误也是莫明其妙。
2、中断优先级不同,寄存器组号相同
C程序: void int0() interrupt 0 using 1 //低优先级中断
void T0() interrupt 1 using 1 //高优先级中断
因为高优先级的中断可以打断正在执行的低级中断,转向持行高级中断。这就是所谓的中断的中断。与第1种错语一样,高级中断的程序,会改变低级中断正在使用的寄存器。
|