許一洲
(西北民族大學 電氣工程學院,甘肅 蘭州730106)
80C51單片機指令系統共有111條指令,由操作碼和操作數兩部分構成[1]。這些指令包括數據傳送類指令、算術運算類指令、邏輯運算類指令、控制轉移類指令和位操作類指令[2]。其中,數據傳送類指令在單片機中使用頻繁,除了一般傳送指令外,還有4類特殊傳送指令。
一般傳送類指令都是采用MOV操作符,可以分為16位傳送和8位傳送。
16位傳送指令僅僅只有一條,功能是將源操作數data16送入目的操作數DPTR中,如:
MOV DPTR,#data16;
當源操作數data16為3456H時,執行以上操作后,(DPH)=34H,(DPL)=56H。這條指令一般用于給DPTR賦予ROM中的數據表的表頭地址,也可以是某一片外RAM緩沖區的首地址或者是擴展的片外接口地址。
8位傳送指令能夠將源字節的內容拷貝至目的字節,且源字節的內容不會變化,屬于字節傳送。目的字節可以是累加器A、寄存器Rn或Ri、片內RAM單元地址及SFR地址direct。源字節中除了上述4類以外,8位立即數#data也可以作為源字節。以目的字節為準,將8位傳送指令分成4類。
以累加器A為目的操作數的指令使用最頻繁,其指令可以構造成以下4種,如:
MOV A,Rn;
MOV A,direct;
MOV A,@Ri;
MOV A,#data;
累加器A作為目的字節,執行后源字節即可送入累加器A。
由于目的字節為工作寄存器,因此源字節不能采用工作寄存器及其間址方式尋址。它的指令有以下3種,如:
MOV Rn,A;
MOV Rn,direct;
MOV Rn,#data;
指令執行后,源字節即可送入到工作寄存器Rn中。
由于direct也可以作為源字節(這里用direct1表示),因此其構造有5種方式,如:
MOV direct,A;
MOV direct,Rn;
MOV direct,direct1;
MOV direct,@Ri;
MOV direct,#data;
執行指令后,源字節即可送入direct中。
由于目的字節采用寄存器間址,因此源字節不能采用寄存器及其間址尋址,如:
MOV @Ri,A;
MOV @Ri,direct;
MOV @Ri,data;
由于操作符不同,將其他不是MOV操作符指令稱為特殊傳送指令,如MOVC、MOVX、PUSH、POP、XCH、XCHD以及SWAP。可將這些特殊傳送指令分為ROM查表、外部RAM讀/寫、堆棧操作和交換指令4種。
ROM中通常存放兩類內容:一是單片機執行的程序代碼;二是固定不變的常數。因此,訪問ROM實際上指的是讀取ROM中的常數表的表項,簡稱查表,需經過累加器來完成。使用MOVC指令,可以由DPTR或PC內容為基址。
(1)以DPTR內容做基址時,如:
MOVC A,@A+DPTR;
需要注意,在執行指令時,需要使累加器A的內容與DPTR的內容16位無符號數相加,作為16位要訪問的ROM地址,最后將該地址單元的內容送到累加器A中。例如,(DPTR)=3000H、(A)=40H時,最終結果A為3040H。
(2)以PC內容為基址時,如:
MOVC A,@A+PC;
執行該指令的時候,要注意PC內容會自動加1,然后與累加器A的16位無符號數相加,作為訪問的16位ROM地址,最后送入累加器A。當上訴指令所在地址為1000H且(A)=30H時,執行后會將1031H單元內容送入累加器A。
單片機的片外RAM或接口會經常存放一些中間數據,在訪問片外RAM或接口操作時可以有讀和寫兩類,這時需要利用MOVX指令通過累加器來完成。
(1)做讀操作時,可以將DPTR、R0或R1作為間址尋址器讀片外RAM空間,如:
MOVX A,@DPTR;
MOVX A,@Ri;
若間址寄存器內容為3000H,(3000H)=30H,執行指令后(A)=30H。
(2)做寫操作時,同樣可將DPTR、R0或R1作為間址寄存器寫外部RAM。與讀操作的區別僅僅在于傳輸方向不同,如:
MOVX @DPTR,A
MOVX @Ri,A;
需要注意,片外擴展的I/O口也要通過MOVX進行數據輸入輸出。
堆棧是通過“后進先出”的原則在片內RAM中的一片存儲區,固定的一端稱為棧底,活動的一端稱為棧頂,利用指針SP指向棧頂位置。
PUSH指令會先將SP的內容加1,之后將直接地址操作數送入SP所指的單元,如:
PUSH direct;
若(SP)=07H,(40H)=88H, 執 行“PUSH 40H”指令后,(SP)=08H,(08H)=88H。
POP指令是先將SP所指向的單元送入指令中的直接地址單元,然后再將SP內容減1,如:
POP direct;
若(SP)=5FH,(5FH)=90H, 執 行“POP 70H”指令后,(70H)=90H,(SP)=5EH。
MOV類指令傳送只是將數據從源字節復制到目的字節的單向傳送。當需要兩字節或兩半字節的雙向交換時,需要利用數據交換指令,包括XCH、XCHD和SWAP。
(1)XCH作為字節交換指令,具有以下3種構造方式:
XCH A,Rn;
XCH A,direct;
XCH A,@Ri;
這3條指令均能實現操作數與累加器A內容的互換,如執行“XCH A,R0”,若(R0)=80H,(A)=20H,執行后(A)=80H,(R0)=20H。
(2)XCHD屬于半字節交換,功能是間址操作數的低半字節與累加器A的低半字節內容互換如:
XCHD A,@Ri;
若(R0)=30H,(30H)=67H,(A)=20H,執行“XCHD A,@R0”指令后,(A)=27H,(30H)=60H。
(3)SWAP同樣屬于半字節交換,與XCHD不同的是,它是將累加器的高低4位互換,如:
SWAP A;
若(A)=31H,執行以上指令后,(A)=03H。
現階段,單片機已被廣泛運用于生產和生活中的各個領域。要熟練掌握單片機,必須要熟悉單片機的操作指令。數據交換指令是單片機操作指令的一個重要組成部分,對其深入學習,有助于進一步使用和發展單片機技術。