3.3.1 硬件電路
硬件電路仍采用實驗開發(fā)板上的電路,如圖3.4所示。
工作原理
通過P0口、P2口外接的撥動開關(guān)設(shè)制運算的數(shù)據(jù),利用單片機的邏輯運算指令運算,并將結(jié)果送P1口發(fā)光二極管顯示。
3.3.2 程序設(shè)計
1. 邏輯“與”運算程序
ORG 0000H
MOV A,P0
ANL A,P2
MOV P1,A
SJMP $
END
2. 邏輯“或”運算程序
ORG 0000H
MOV A,P0
ORL A,P2
MOV P1,A
SJMP $
END
3. 邏輯“異或”運算程序
ORG 0000H
MOV A,P0
XRL A,P2
MOV P1,A
SJMP $
END
3.3.3 源程序的編輯、編譯、下載
打開“偉福”模擬仿真軟件進行程序的編輯、編譯。
打開“ISP下載軟件”將目標文件下載到ISP-4實驗開發(fā)板上的AT89S51單片機芯片,觀察程序運行結(jié)果。
3.3.4 相關(guān)知識
在上面的任務(wù)中,我們可以看到隨著P0、P2口的變化,發(fā)光二極管的輸出和相關(guān)邏輯運算的結(jié)果一致,那么,到底單片機是怎樣實現(xiàn)這種變化的呢?
1. 單片機是怎樣做邏輯運算的?
單片機CPU內(nèi)部集成的邏輯運算部件(主要有與運算器、或運算器、異或運算器等),可以完成與、或、異或運算等,單片機的邏輯運算指令經(jīng)過指令譯碼器譯碼后產(chǎn)生的控制信號控制邏輯運算部件工作產(chǎn)生運算結(jié)果。
2. MCS-51單片機有哪些邏輯運算指令?
邏輯運算和移位指令共有25條,有與、或、異或、求反、左右移位、清0等邏輯操作,有直接、寄存器和寄存器間址等尋址方式。這類指令一般不影響程序狀態(tài)字(PSW)標志。
(1) 循環(huán)移位指令(4條)
這4條指令的作用是將累加器中的內(nèi)容循環(huán)左或右移一位,后兩條指令是連同進位位CY一起移位。
RL A ;累加器A中的內(nèi)容左移一位。
RR A ;累加器A中的內(nèi)容右移一位。
RLC A ;累加器A中的內(nèi)容連同進位位CY左移一位。
RRC A ;累加器A中的內(nèi)容連同進位位CY右移一位。
(2) 累加器半字節(jié)交換指令(1條)
這條指令是將累加器中的內(nèi)容高低半字節(jié)互換,這在上一節(jié)中內(nèi)容已有介紹。
SWAP A ; 累加器中的內(nèi)容高低半字節(jié)互換
(3) 求反指令(1條)
這條指令將累加器中的內(nèi)容按位取反。
CPL A ; 累加器中的內(nèi)容按位取反
(4) 清零指令(1條)
這條指令將累加器中的內(nèi)容清0。
CLR A ; 0→(A),累加器中的內(nèi)容清0
(5) 邏輯與操作指令(6條)
這組指令的作用是將兩個單元中的內(nèi)容執(zhí)行邏輯與操作。如果直接地址是I/O地址,則為“讀—修改—寫”操作。
ANL A,data ;累加器A中的內(nèi)容和直接地址單元中的內(nèi)容執(zhí)行與邏輯操作。結(jié)果存在寄存器A中。
ANL data,#data ;直接地址單元中的內(nèi)容和立即數(shù)執(zhí)行與邏輯操作。結(jié)果存在直接地址單元中。
ANL A,#data ;累加器A的內(nèi)容和立即數(shù)執(zhí)行與邏輯操作。結(jié)果存在累加器A中。
ANL A,Rn ;累加器A的內(nèi)容和寄存器Rn中的內(nèi)容執(zhí)行與邏輯操作。結(jié)果存在累加器A中。
ANL data,A ;直接地址單元中的內(nèi)容和累加器A的內(nèi)容執(zhí)行與邏輯操作。結(jié)果存在直接地址單元中。
ANL A,@Ri ;累加器A的內(nèi)容和工作寄存器Ri指向的地址單元中的內(nèi)容執(zhí)行與邏輯操作。結(jié)果存在累加器A中。
如任務(wù)中的ANL A,P2 指令。
(6) 邏輯或操作指令(6條)
這組指令的作用是將兩個單元中的內(nèi)容執(zhí)行邏輯或操作。如果直接地址是I/O地址,則為“讀—修改—寫”操作。
ORL A,data ;累加器A中的內(nèi)容和直接地址單元中的內(nèi)容執(zhí)行邏輯或操作。結(jié)果存在寄存器A中。
ORL data,#data ;直接地址單元中的內(nèi)容和立即數(shù)執(zhí)行邏輯或操作。結(jié)果存在直接地址單元中。
ORL A,#data ;累加器A的內(nèi)容和立即數(shù)執(zhí)行邏輯或操作。結(jié)果存在累加器A中。
ORL A,Rn ;累加器A的內(nèi)容和寄存器Rn中的內(nèi)容執(zhí)行邏輯或操作。結(jié)果存在累加器A中。
ORL data,A ;直接地址單元中的內(nèi)容和累加器A的內(nèi)容執(zhí)行邏輯或操作。結(jié)果存在直接地址單元中。
ORL A,@Ri ;累加器A的內(nèi)容和工作寄存器Ri指向的地址單元中的內(nèi)容執(zhí)行邏輯或操作。結(jié)果存在累加器A中。
如任務(wù)中的 ORL A,P2 指令。
(7) 邏輯異或操作指令(6條)
這組指令的作用是將兩個單元中的內(nèi)容執(zhí)行邏輯異或操作。如果直接地址是I/O地址,則為“讀—修改—寫”操作。
XRL A,data ;累加器A中的內(nèi)容和直接地址單元中的內(nèi)容執(zhí)行邏輯異或操作。結(jié)果存在寄存器A中。
XRL data,#data ;直接地址單元中的內(nèi)容和立即數(shù)執(zhí)行邏輯異或操作。結(jié)果存在直接地址單元中。
XRL A,#data ;累加器A的內(nèi)容和立即數(shù)執(zhí)行邏輯異或操作。結(jié)果存在累加器A中。
XRL A,Rn ;累加器A的內(nèi)容和寄存器Rn中的內(nèi)容執(zhí)行邏輯異或操作。結(jié)果存在累加器A中。
XRL data,A ;直接地址單元中的內(nèi)容和累加器A的內(nèi)容執(zhí)行邏輯異或操作。結(jié)果存在直接地址單元中。
XRL A,@Ri ;累加器A的內(nèi)容和工作寄存器Ri指向的地址單元中的內(nèi)容執(zhí)行邏輯異或操作。結(jié)果存在累加器A中。
如任務(wù)中的 XRL A,P2 指令。
3. 邏輯運算指令應(yīng)用舉例
【例3.9】 16位數(shù)的算術(shù)左移。16位數(shù)在內(nèi)存中低8位存放在M1單元,高8位存放在M1+1單元。
解:所謂算術(shù)左移就是將操作數(shù)左移一位,并使最低位補充0,相當于完成 16位數(shù)的乘務(wù)員操作,故稱算術(shù)左移。參考程序如下:
CLR C ;進位CY清零
MOV R1,#M1 ;操作數(shù)地址M1送R1
MOV A,@ R1 ;低8位數(shù)送A
RLC A, ;低8位左移,最低位補0
MOV @ R1 ,A ;低8位左移后,回送M1存放
INC R1 ;指向16位高8位地址M1+1
MOV A,@ R1 ;低8位送A
RLC A, ;高8位帶低8位進位左移
MOV @ R1 ,A ;高8位左移后回送M1+1存放
若要對16位數(shù)進行循環(huán)移位,則應(yīng)首先設(shè)法把最高位(D15)的值置入CY,然后再參照以上程序編寫即可。利用以后介紹的位操作指令可以很容易地實現(xiàn)將某一位的值置入CY。
