A. 51單片機中程序指針PC和數據指針DPTR各自有什麼用途電路復位後,二者的值各是多 少
程序計數器PC(program Counter)
程序計數器在物理上是獨立的,它不屬於特殊內部數據存儲器塊中。PC是一個16位的計數器,
用於存放一條要執行的指令地址,定址范圍為64kB,PC有自動加1功能,即完成了一條指令的執行後,其內容自動加1。PC本身並沒有地址,因而不可定址,用戶無法對它進行讀寫,但是可以通過轉移、調用、返回等指令改變其內容,以控製程序按我們的要求去執行。
復位後為0000H(16位)
數據指針(DPTR)
數據指針為16位寄存器,編程時,既可以按16位寄存器來使用,也可以按兩個8位寄存器來使用,即高位位元組寄存器DPH和低位位元組DPL。
DPTR主要是用來保存16位地址,當對64kB外部數據存儲器定址時,可作為間址寄存器使用,此時,使用如下兩條指令:
MOVX A, @DPTR
MOVX @DPTR, A
在訪問程序存儲器時,DPTR可用來作基址寄存器,採用基址+變址定址方式訪問程序存儲器,這條指令常用於讀取程序存儲器內的表格數據。
MOVC A, @A+@DPTR
復位後為0000H(16位)
B. 51單片機 如何利用程序指針實現跳轉
方法1:
MOV
DPTR
,#LOCA
;取得JMP
@A+DPTR的地址(PC)
MOV
A,#4
;跳轉步長
LOCA:
JMP
@A+DPTR
(註:JMP
@A+DPTR是一條1位元組的指令,執行該條指令後PC=LOCA+1,如果想取該指令之後的PC,可以用方法2)
方法2:
MOV
DPTR
,#LOCA
;取執行JMP
@A+DPTR後的地址(PC)
MOV
A,#4
;跳轉步長
JMP
@A+DPTR
LOCA:
程序行1
程序行2
……
……
……
程序行N
方法3(程序跳轉表):
MOV
DPTR
,#LIST
;取程序跳轉表首地址
MOV
A,R0
;取跳轉偏移(跳轉偏移存在R0中)
JMP
@A+DPTR
程序行1
程序行2
……
……
……
程序行N
LIST:
SJMP
FUN1
SJMP
FUN2
SJMP
FUN3
……
FUN1:
……
FUN2:
……
FUN3:
……
C. 51單片機編程大循環後邊括弧里可以帶指針嗎
可以帶。
在51單片機的嵌入式C語言中,指針同樣是被支持的。所以在單片機上一樣可以使用指針操作,具體使用方法,與標准C語言並沒有不同。
不過需要注意的是,使用指針代表著間接定址,相對變數的直接定址,速度要稍慢一些。而單片機運算速度較慢,大量使用指針有可能會降低執行效率,影響效果。所以除非必要,還是少用指針。
D. 在匯編語言寫單片機的程序的時候,如何知道當前的PC指針是多少
當前PC指針的值,可以通過一定的方法來獲得,比如如果使用LCALL指令,那麼單片機執行過程是:保護現場,將當前PC壓入堆棧,當程序返回時,再彈出該保護的PC,由此,我們就可以獲得當前的PC,具體程序如下:
........
LCALL GETPC ;調用一個子程序以獲得當前PC值
...........
GETPC:
POP ACC ;取得PC高八位
POP B ;取得PC低八位
PUSH B ;恢復SP
PUSH ACC ;恢復SP
......
RET