大家都知道51單片機(jī)有的寄存器R0-R7共有四組,。最近1年來(lái),,我在與新手朋友交流時(shí)發(fā)現(xiàn),很多朋友對(duì)寄存器組的使用時(shí)經(jīng)常出現(xiàn)問(wèn)題,。雖然這并不是多難的問(wèn)題,,但如果出現(xiàn)錯(cuò)誤,也會(huì)造成很?chē)?yán)重的后果,。
首先介紹一下51的寄存器組:
通過(guò)設(shè)置PSW寄存器的第3位和第4位可以任意切換寄存器組,。在進(jìn)入中斷前,切換寄存器組,,可以方便的保護(hù)原寄存器組的數(shù)據(jù)不被中斷里的語(yǔ)句破壞,,很方便。
RS1 RS0 字節(jié)地址
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
常見(jiàn)錯(cuò)誤有三種:
1,、為中斷函數(shù)指定了第0組寄存器
C程序: void int0() interrupt 0 using 0
編譯后的匯編如下:
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
PUSH PSW
MOV PSW,#0x00
,。。,。,。。,。
因?yàn)閙ain()函數(shù)使用的就是第0組寄存器,,中斷程序會(huì)改變寄存器組的數(shù)據(jù)。主程序運(yùn)行時(shí),,隨時(shí)都有可能產(chǎn)生中斷,,等中斷返回主程序時(shí),寄存器R0-R7的值已經(jīng)被改變了,。這是非常嚴(yán)重的錯(cuò)誤,。而且故障時(shí)有時(shí)無(wú),錯(cuò)誤也是莫明其妙,。
2,、中斷優(yōu)先級(jí)不同,寄存器組號(hào)相同
C程序: void int0() interrupt 0 using 1 //低優(yōu)先級(jí)中斷
void T0() interrupt 1 using 1 //高優(yōu)先級(jí)中斷
因?yàn)楦邇?yōu)先級(jí)的中斷可以打斷正在執(zhí)行的低級(jí)中斷,,轉(zhuǎn)向持行高級(jí)中斷,。這就是所謂的中斷的中斷。與第1種錯(cuò)語(yǔ)一樣,,高級(jí)中斷的程序,,會(huì)改變低級(jí)中斷正在使用的寄存器。
3,、不寫(xiě)using ,。嚴(yán)格的說(shuō),這樣寫(xiě)不能算是錯(cuò)誤。但這是相當(dāng)不好的習(xí)慣,。
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 |