大家都知道51单片机有的寄存器R0-R7共有四组。很多朋友对寄存器组的使用时经常出现问题。虽然这并不是多难的问题,但如果出现错误,也会造
我们都知道51单片机有的寄存器R0-R7共有四组。许多朋友对寄存器组的运用时经常呈现问题。尽管这并不是多难的问题,但假如呈现过错,也会形成很严峻的结果。
首要介绍一下51的寄存器组:
经过设置PSW寄存器的第3位和第4位能够恣意切换寄存器组。在进入中止前,切换寄存器组,能够便利的维护原寄存器组的数据不被中止里的句子损坏,很便利。
RS1RS0字节地址
000组寄存器00H~07H
011组寄存器08H~0FH
102组寄存器10H~17H
113组寄存器18H~1FH
RS1=PSW.4RS0=PSW.3
常见过错有三种:
1、为中止函数指定了第0组寄存器
C程序:voidint0()interrupt0using0
编译后的汇编如下:
PUSHACC
PUSHB
PUSHDPH
PUSHDPL
PUSHPSW
MOVPSW,#0x00
。。。。。。
由于main()函数运用的便是第0组寄存器,中止程序会改动寄存器组的数据。主程序运行时,随时都有或许发生中止,等中止回来主程序时,寄存器R0-R7的值现已被改动了。这是十分严峻的过错。并且毛病时有时无,过错也是莫明其妙。
2、中止优先级不同,寄存器组号相同
C程序:voidint0()interrupt0using1//低优先级中止
voidT0()interrupt1using1//高优先级中止
由于高优先级的中止能够打断正在履行的初级中止,转向持行高档中止。这便是所谓的中止的中止。与第1种错语相同,高档中止的程序,会改动初级中止正在运用的寄存器。
3、不写using。严厉的说,这样写不能算是过错。但这是适当欠好的习气。
C程序:voidint0()interrupt0
编译后的汇编如下:
PUSHACC
PUSHB
PUSHDPH
PUSHDPL
PUSHPSW
MOVPSW,#0x00
PUSH0x00
PUSH0x01
PUSH0x02
PUSH0x03
PUSH0x04
PUSH0x05
PUSH0x06
PUSH0x07
。。。。。。
没用using指定寄存器组,编译器就默许分配了第0组寄存器,然后又用8条句子把第0组的R0-R7保存到栈中,退出中止时还需要8个弹栈。这样“蠢笨”的写法,占用了程序空间32个字节、占有仓库8个字节。或许高档版别的编译器会改善吧,搞单片机的仍是规则些好。
经验总结:
1、写中止程序必定要用using句子指定寄存器组。第1、2、3组都能够,不能是0.
2、51单片机的中止有两个优先级。一个中止不会打断另一个相同优先级的中止。这样相同等级中止能够运用同一个组。比方:低优先级的中止函数都用using1,高优先级的中止都用using2。这样不会抵触。
下面是一个正常的比如:
C程序:voidint0()interrupt0using1
编译后的汇编如下:
PUSHACC
PUSHB
PUSHDPH
PUSHDPL
PUSHPSW
MOVPSW,#0x08
。。。。。。
便是这么简略。尽管这点事儿对老鸟不算什么问题,但新手朋友犯此过错的可不少。我遇到的就不下15个了。今日我写这个贴子,也是为一切新手提个醒。处处救火不如防患于未燃。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/260756.html