单片机寄存器组注意重复使用原数据可能被覆盖危险 作者: 时间:2016-11-24 来源:网络 加入技术交流群 扫码加入和技术大咖面对面交流海量资料库查询 收藏 大家都知道51单片机有的寄存器R0-R7共有四组。很多朋友对寄存器组的使用时经常出现问题。虽然这并不是多难的问题,但如果出现错误,也会造成很严重的后果。首先介绍一下51的寄存器组:通过设置PSW寄存器的第3位和第4位可以任意切换寄存器组。在进入中断前,切换寄存器组,可以方便的保护原寄存器组的数据不被中断里的语句破坏,很方便。RS1RS0字节地址000组寄存器00H~07H011组寄存器08H~0FH102组寄存器10H~17H113组寄存器18H~1FHRS1=PSW.4RS0=PSW.3常见错误有三种:1、为中断函数指定了第0组寄存器C程序:voidint0()interrupt0using0编译后的汇编如下:PUSHACCPUSHBPUSHDPHPUSHDPLPUSHPSWMOVPSW,#0x00。。。。。。因为main()函数使用的就是第0组寄存器,中断程序会改变寄存器组的数据。主程序运行时,随时都有可能产生中断,等中断返回主程序时,寄存器R0-R7的值已经被改变了。这是非常严重的错误。而且故障时有时无,错误也是莫明其妙。2、中断优先级不同,寄存器组号相同C程序:voidint0()interrupt0using1//低优先级中断voidT0()interrupt1using1//高优先级中断因为高优先级的中断可以打断正在执行的低级中断,转向持行高级中断。这就是所谓的中断的中断。与第1种错语一样,高级中断的程序,会改变低级中断正在使用的寄存器。3、不写using。严格的说,这样写不能算是错误。但这是相当不好的习惯。C程序:voidint0()interrupt0编译后的汇编如下:PUSHACCPUSHBPUSHDPHPUSHDPLPUSHPSWMOVPSW,#0x00PUSH0x00PUSH0x01PUSH0x02PUSH0x03