版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第2章51單片機的指令系統(tǒng)概述計算機通過執(zhí)行程序完成人們指定的任務,程序由一條一條指令構(gòu)成,能為CPU識別并執(zhí)行的指令的集合就是該CPU的指令系統(tǒng)。以助記符表示的指令是計算機的匯編語言,使用匯編語言編寫的程序稱為匯編語言程序。匯編指令與機器指令一一對應。MCS-51單片機匯編語言指令格式:
操作符目的操作數(shù),源操作數(shù)操作符指明該指令完成什么操作;操作數(shù)是指明該指令的操作對象。目的操作數(shù)是存放結(jié)果的。指令中操作數(shù)提供的方式稱為尋址方式。2.1尋址方式指令的操作對象是操作數(shù),而操作數(shù)可以是立即數(shù)或存放立即數(shù)的地址,尋址方式就是尋找立即數(shù)的地址。51單片機的指令系統(tǒng)有7種尋址方式。1、立即尋址指令中直接給出操作數(shù)的尋址方式。在51系列單片機的指令系統(tǒng)中,立即數(shù)用一個前面加“#“號的8位數(shù)(#data,如#30H)或16位數(shù)(#data16,如#2052H)表示。立即尋址中的數(shù),稱為立即數(shù)。 【例2-1】MOVA,#80H2、直接尋址操作數(shù)的地址直接出現(xiàn)在指令中。
【例2-2】MOVA,25h ;假設(25h)=55h
執(zhí)行完A=55h MOVP0,#45h注意:
在指令中,立即數(shù)以#開頭,地址直接給出;但是,在注釋時我們習慣上,立即數(shù)直接寫出,地址加括號。3、寄存器尋址操作數(shù)存放在寄存器中。
【例2-3】MOVA,R0 ;假設R0=3Ah
執(zhí)行完A=3Ah注意:movP0,#45h中的P0不是寄存器尋址,特殊功能寄存器不是真正的寄存器,只是符號地址,只有A,B,R0~R7,DPTR是真正的寄存器,初學者大致了解,不必深究。比如:movA,#12h ;寄存器尋址
mov0E0h,#12h ;直接尋址,E0h是A的地址
movACC,#12h ;直接尋址,ACC是的符號地址, 即E0h
第二條指令和第三條指令是相同指令4、寄存器間接尋址操作數(shù)存放在以寄存器內(nèi)容為地址的單元中。
【例2-4】MOV@R0,A ;假設R0=3Ah,A=55h
執(zhí)行完(3Ah)=55h
特別注意的是,間址寄存器只能用R0、R1或者DPTR。5、變址尋址變址尋址只用于訪問程序存儲器。它是以DPTR或PC作基址寄存器,以累加器A作變址寄存器,并以兩者內(nèi)容相加形成的16位地址作為操作數(shù)地址,以達到訪問操作數(shù)的目的。
MOVCA,@A+DPTR
MOVCA,@A+PC關于數(shù)據(jù)指針(DPTR):數(shù)據(jù)指針為16位寄存器,它是51單片機中唯一一個供用戶使用的16位寄存器,尋址范圍為64K。DPTR由兩個8位普通寄存器組成,分別為DPH(高8位)和DPL(低8位),一般用于片外RAM的尋址訪問。6、相對尋址以當前程序計數(shù)器PC的內(nèi)容為基值,加上指令給出的一字節(jié)補碼數(shù)(偏移量)形成新的PC值的尋址方式為相對尋址。相對尋址是為了解決程序轉(zhuǎn)移而專門設置的。
如:sjmp08h;PC=PC+8(當前PC=?),跳轉(zhuǎn)到PC+0A地址
;運行7、位尋址對片內(nèi)RAM中20H~2FH中的128個位地址及SFR中的可位尋址的位地址進行操作。
【例2-6】MOV32h,C
或
MOV26h.2,C2.2數(shù)據(jù)傳送和交換指令
2.2.1傳送類指令1.內(nèi)部RAM數(shù)據(jù)傳送指令:完成寄存器、累加器、RAM單元以及專用寄存器之間(包括立即數(shù))的相互數(shù)據(jù)傳送。 格式如下:
mov<目的操作數(shù)>,<源操作數(shù)>
將源操作數(shù)復制到目的操作數(shù)。⑴以A為目的操作數(shù) 【例2-7】
movA,Rn ;如movA,R7 movA,dir ;如movA,20h movA,@Ri ;如movA,@R0 movA,#data ;如movA,#55h注意:Rn中的n可以為0~7,Ri中的i可以為0~1⑵以Rn為目的操作數(shù) 【例2-8】
movRn,A ;如movR5,A movRn,dir ;如movR7,40h movRn,#data ;如movR2,#30h⑶以DPTR為目的操作數(shù) 【例2-9】
movDPTR,#data16 ;如movDPTR,#0A123h
與下面兩條指令效果相同 movDPL,#data8 ;如movDPL,#23h movDPH,#data8 ;如movDPH,#0A1h(4)以直接地址為目的操作數(shù) 【例2-10】
movdir,A ;如mov30h,A movdir,Rn ;如mov30h,R6 movdir,dir ;如mov20h,40h movdir,@Ri ;如mov20h,@R1 movdir,#data ;如mov50h,#23h(5)以間接地址為目的操作數(shù) 【例2-11】
mov@Ri,A ;如mov@R0,A
mov@Ri,dir ;如mov@R1,30h
mov@Ri,#data ;如mov@R0,#40h
dir@Ri
Rn#dataA2.外部RAM數(shù)據(jù)傳送指令
movxA,@Ri ;i=0或1
movxA,@DPTR
movx@Ri,A
movx@DPTR,A3.程序存儲器數(shù)據(jù)傳送指令
movcA,@A+DPTR
movcA,@A+PC
注意:數(shù)據(jù)傳送指令不影響程序狀態(tài)字PSW。
在C語言中,賦值運算符“=”例子要求:向端口P1寫55H匯編語言 org0000h
ljmpStart org0030h
Start:
movP1,#55h
sjmp$
endC語言#include<reg51.h>main()
{
P1=0x55;
while(1);
}查看反匯編例子已知內(nèi)部RAM中,(30h)=40h,(40h)=50h,(50h)=5Ah,試分析下段程序執(zhí)行后,A=
,R0=
,(30h)=
,(40h)=
,(50h)=
。 mov A,#50h mov R0,A mov @R0,30h 4.堆棧操作
堆棧是一種數(shù)據(jù)結(jié)構(gòu),所謂堆棧就是只允許在其一端進行數(shù)據(jù)插入和數(shù)據(jù)刪除操作的線性表。數(shù)據(jù)寫入堆棧稱為入棧。數(shù)據(jù)從堆棧中讀出稱為出棧。堆棧的最大特點就是“后進先出”,LIFO(Last-InFirst-Out)。⑴堆棧的功能堆棧主要是為子程序調(diào)用和中斷操作而設立的。其具體功能有兩個:保護斷點和保護現(xiàn)場。此外,堆棧也可用于數(shù)據(jù)的臨時存放。⑵堆棧的開辟堆棧只能開辟在芯片的內(nèi)部數(shù)據(jù)存儲器中,方法就是在程序初始化時,將堆棧指針(專用寄存器SP)指向棧底減1。⑶關于堆棧指針SPSP是專用寄存器的一員。系統(tǒng)復位后,SP的內(nèi)容為07h,在主程序初始化時需要更改,以將堆棧區(qū)開辟在內(nèi)部RAM30h~7Fh區(qū)域。SP的內(nèi)容就是堆棧棧頂?shù)拇鎯卧刂贰"榷褩5氖褂梅绞蕉褩5氖褂糜袃煞N方式:一種是自動方式,用于在調(diào)用子程序或中斷時保存斷點和程序返回時恢復斷點。另一種是指令方式。⑸堆棧操作指令:有進棧和出棧兩條。
pushdirect;sp←sp+1,(sp)←(direct)將內(nèi)部RAM低128單元或?qū)S眉拇嫫鲀?nèi)容送棧頂單元。
popdirect;(direct)←(sp),sp←sp-1
將棧頂單元內(nèi)容送內(nèi)部RAM低128單元或?qū)S眉拇嫫鳌?/p>
【教材第34頁末例子】××片內(nèi)RAM50H70h31h30hSP××片內(nèi)RAM50H70h50H××執(zhí)行前執(zhí)行前push70h指令后31hSP30h××片內(nèi)RAM50H60h31h30hSP××片內(nèi)RAM50H60h50H××執(zhí)行前執(zhí)行前pop60h指令后31hSP30h例子如圖為執(zhí)行push指令前的片內(nèi)RAM,問執(zhí)行指令push60h后SP=
,(50h)=
,(51h)=
,(60h)=
。SP60h56h51h34h50h12h4.數(shù)據(jù)交換指令:將源操作數(shù)和目的操作數(shù)(A)的整字節(jié)或半字節(jié)交換。⑴整字節(jié)交換指令,共三條指令: 【教材第35例子】
xchA,Rn ;A?Rn xchA,direct ;A?(direct) xchA,@Ri ;A?(Ri)⑵半字節(jié)交換指令,只一條指令:
xchdA,@Ri ;A3~0?(Ri)3~0⑶累加器高低半字節(jié)交換指令:
swapA ;A3~0?A7~42.3算術(shù)運算類指令1.加法指令
addA,Rn ;A←A+Rn addA,direct ;A←A+(direct) addA,@Ri ;A←A+(Ri) addA,#data ;A←A+data
注意,加法指令目的操作數(shù)必須是累加器A。加法指令對程序狀態(tài)字PSW的CY、AC和OV有影響。
2.帶進位加法指令
addcA,Rn ;A←A+Rn+CY addcA,direct ;A←A+(direct)+CY addcA,@Ri ;A←A+(Ri)+CY addcA,#data ;A←A+data+CY
在C語言中,加法運算符“+”例子計算兩個8位數(shù)12h+34h=36h,結(jié)果由P1端口輸出。匯編 程序格式略
movA,#12h
addA,#34h
movP1,AC
unsignedcharx;
x=0x12;
x=x+0x34;
P1=x;例子計算兩個16位數(shù)1082h+1094h=2116h,結(jié)果由P2、P0端口輸出。匯編
movA,#82h
addA,#94h
movP0,A
movA,#10h
addcA,#10h
movP2,AC
unsignedintx;
x=0x1082;
x=x+0x1094;
P0=x;
P2=x>>8;3.帶借位減法指令
subbA,Rn ;A←A-Rn-CY subbA,direct ;A←A-(direct)-CY subbA,@Ri ;A←A-(Ri)-CY subbA,#data ;A←A-data-CY
注意,減法指令目的操作數(shù)必須是累加器A。減法指令對程序狀態(tài)字PSW的CY、AC和OV有影響。⑴如果位7有借位,則進位標志CY置1,否則CY清0。⑵如果位3有借位,則進位標志AC置1,否則AC清0。
在C語言中,減法運算符“-”例子計算兩個8位數(shù)34h-12h=21h,結(jié)果由P1端口輸出。匯編
movA,#34h
clrC
subbA,#12h
movP1,AC
unsignedcharx;
x=0x34;
x=x-0x12;
P1=x;4.加1指令
incA ;A←A+1 incRn ;Rn←Rn+1 incdirect ;(direct)←(direct)+1 inc@Ri ;(Ri)←(Ri)+1 incDPTR ;DPTR←DPTR+1
加1指令不影響程序狀態(tài)字PSW的狀態(tài).5.減1指令
decA ;A←A-1 decRn ;Rn←Rn-1 decdirect ;(direct)←(direct)-1 dec@Ri ;(Ri)←(Ri)-1
減1指令不影響程序狀態(tài)字PSW的狀態(tài).注:decDPTR非法。
在C語言中,自增、自減運算符“++”、“--”例子已知內(nèi)部RAM中,(30h)=70h,(40h)=90h,(50h)=5Ah,試分析下段程序執(zhí)行后,A=
,R1=
,(30h)=
,(40h)=
,(50h)=
,C=
。 mov A,#30h
mov R1,A
mov A,40h
add A,@R1
mov 40h,A
dec A
mov 30h,A 6.乘法指令
mulAB ;BA←A*B
該指令將A與B中的兩個無符號數(shù)相乘,16位的積低位字節(jié)在A中,高位字節(jié)在B中。乘法指令影響PSW的狀態(tài),CY總被清0。如果乘積超過255,OV置1,否則清0。7.乘法指令
divAB ;A/B
該指令將A與B中的兩個無符號數(shù)相除,商存于A中,余數(shù)存于B中。除法指令影響PSW的狀態(tài),CY總被清0。如果除數(shù)為0,OV置1,否則清0。
在C語言中,乘除運算符“*”,“/”8.十進制調(diào)整指令⑴十進制調(diào)整問題在MCS-51中沒有專門的十進制數(shù)(BCD碼)的加法指令,只能采用add和addc對十進制數(shù)進行加法運算。但是有可能產(chǎn)生錯誤。⑵十進制調(diào)整指令的格式
daA
調(diào)整規(guī)則:若A低4位>9或AC=1,則A←A+06h;若A高4位>9或CY=1,則A←A+60h;若同時上述兩種情況,則A←A+66h;
6+3=98+7=158+9=17011010001000+0011+0111+10011001111110001√××2.3邏輯運算和移位類指令1.邏輯與運算指令
anlA,Rn ;A←A∧Rn anlA,direct ;A←A∧direct anlA,@Ri ;A←A∧(Ri) anlA,#data ;A←A∧data anldirect,A ;A←direct∧A anldirect,#data ;direct←direct∧data2.邏輯或運算指令
orlA,Rn ;A←A∨Rn orlA,direct ;A←A∨direct orlA,@Ri ;A←A∨(Ri) orlA,#data ;A←A∨data orldirect,A ;A←direct∨A orldirect,#data ;direct←direct∨data3.邏輯異或運算指令
xrlA,Rn ;A←A⊕Rn xrlA,direct ;A←A⊕direct xrlA,@Ri ;A←A⊕(Ri) xrlA,#data ;A←A⊕data xrldirect,A ;A←direct⊕A xrldirect,#data;direct←direct⊕data4.累加器清0和取反指令
clrA ;A←0 cplA ;A←A取反
在C語言中,位運算符“&”,“|”,“^”,“~”例子將一個8位數(shù)34h的高四位清0,結(jié)果由P1端口輸出。匯編
movA,#34h
anlA,#0Fh
movP1,AC
unsignedcharx;
x=0x34;
x=x&0x0F;
P1=x;例子已知內(nèi)部RAM中,(30h)=23h,(40h)=65h,(50h)=5Ah,試分析下段程序執(zhí)行后,A=
,R0=
,(30h)=
,(40h)=
,(50h)=
。 mov A,#50h
mov R0,A
mov A,40h
anl A,@R0
mov 30h,A
orl A,#0Fh
mov 40h,A
xrl A,#0F0h
mov 50h,A 5.移位指令⑴循環(huán)左移
rlA ;An+1←An,A0←A7
該指令具有將A乘2的功能。⑵循環(huán)右移
rrA ;An←An+1,A7←A0
該指令具有將A除2的功能。⑶帶進位位循環(huán)左移
rlcA ;An+1←An,CY←A7,A0←CY⑷帶進位位循環(huán)右移
rrcA ;An←An+1,A7←CY,CY←A0
注:邏輯指令除了rlc和rrc影響CY以外,其它的一律不影響PSW的狀態(tài)。
在C語言中,移位運算符“<<”,“>>”AAACYACY例子將一個8位數(shù)12h*4,結(jié)果由P1端口輸出。匯編
movA,#12h
rlA
rlA
movP1,AC
unsignedcharx;
x=0x12;
x=x<<2;
P1=x;例子已知內(nèi)部RAM中,(30h)=23h,(40h)=65h,(50h)=5Ah,試分析下段程序執(zhí)行后,(30h)=
,(40h)=
,(50h)=
。 mov A,30h
rl A
mov 30h,A
rl A
mov 40h,A
rl A
mov 50h,A 【教材例2-15】將21H單元的低三位和20H單元中的低五位合并為一個字送30H單元,要求(21H)的低三位放在高位上。
MOV 30H,20H ;(30H)=(20H)
ANL 30H,#1FH ;保留低五位
MOV A,21H ;A=(21H)
SWAPA ;高低四位交換
RL A ;低三位變到高三位位置
ANL A,#0E0H;保留高三位
ORL 30H,A ;和(30H)的低五位合并
SJMP$2.4控制轉(zhuǎn)移指令
2.4.1調(diào)用程序和返回類指令子程序是一種重要的程序結(jié)構(gòu)。在一個程序中經(jīng)常遇到反復多次執(zhí)行某程序段的情況,對次,可采用子程序結(jié)構(gòu),通過主程序調(diào)用而使用它。1、長調(diào)用指令
lcalladdrl16;addr16→PC0~15說明:(1)該指令功能是①保護斷點,即當前PC(本指令的下一條指令的首地址)壓入堆棧。②子程序的入口地址addr16送PC,轉(zhuǎn)子程序執(zhí)行。(2)本指令為64KB地址范圍內(nèi)的調(diào)子程序指令,子程序可在64KB地址空間的任一處。2、短調(diào)用(絕對調(diào)用) acalladdr11;addr11→PC0~10說明:(1)該指令的功能是①保護斷點,即當前PC壓入堆棧。②addrl11→PC0~10,而PC11~15保持原值不變。(2)本指令為2KB地址范圍的調(diào)子程序指令,子程序入口距當前PC不得超過2KB地址范圍。3、子程序返回指令 ret ;從調(diào)用子程序返回。功能:從棧頂彈出斷點到PC。 reti ;從中斷服務程序返回。功能:從棧頂彈出斷點到PC,并恢復中斷優(yōu)先級狀態(tài)觸發(fā)器。
關于中斷服務程序返回指令以后再說。
在C語言中,子程序在C語言中表現(xiàn)為函數(shù)例子: main() sub()
{ { … … sub(); } … }例子定義兩個子程序,由主程序調(diào)用,一個子程序向P2輸出55h,一個子程序向P0輸出AAh匯編
lcallSub1
lcallSub2
sjmp$Sub1:
movP2,#55h
retSub2:
movP0,#0AAh
ret C
Sub1()
{P2=0x55;
} Sub2()
{P0=0xAA;
} main()
{Sub1();
Sub2();
while(1);
}2.4.2轉(zhuǎn)移指令程序的順序執(zhí)行是由PC自動加1實現(xiàn)的。要改變程序的執(zhí)行順序,實現(xiàn)分支轉(zhuǎn)向,應通過強迫改變PC值的方法來實現(xiàn),這就是控制轉(zhuǎn)移類指令的基本功能。共有兩類指令:無條件轉(zhuǎn)移和有條件轉(zhuǎn)移。子程序調(diào)用也是通過改變PC實現(xiàn)的,只是子程序調(diào)用需要返回,轉(zhuǎn)移指令不需要返回。1.無條件轉(zhuǎn)移指令
MCS-51共有四條無條件轉(zhuǎn)移指令:(1)短轉(zhuǎn)移
ajmpaddr11;addr11→PC0~10說明:轉(zhuǎn)移范圍:本指令為2KB地址范圍內(nèi)的轉(zhuǎn)移指令。對轉(zhuǎn)移目的地址的要求與ACALL指令對子程序入口地址的要求相同。(2)長轉(zhuǎn)移 ljmpaddr16;addr16→PC0~15說明:本指令為64KB程序存儲空間的全范圍轉(zhuǎn)移指令。轉(zhuǎn)移地址可為16位地址中的任意值。(3)間接轉(zhuǎn)移
jmp@A+DPTR;A+DPTR→PC例A=02H,DPTR=2000H,指令JMP@A+DPTR執(zhí)行后,PC=2002H。也就是說,程序轉(zhuǎn)移到2002H地址單元去執(zhí)行(4)無條件相對轉(zhuǎn)移(短轉(zhuǎn)移)
sjmprel;PC+rel→PC, 即As+2+rel→PC說明:
As為源地址(本指令的首地址),該指令為2字節(jié)指令,執(zhí)行本指令時當前PC=As+2,
rel為轉(zhuǎn)移的偏移量,轉(zhuǎn)移可以向前轉(zhuǎn)(目的地址小于源地址),也可以向后轉(zhuǎn)(目的地址大于源地址),因此偏移量rel是1字節(jié)有符號數(shù),用補碼表示(-128~+127),所以指令轉(zhuǎn)移范圍在離源地址As的-126~+129字節(jié)之間。
在C語言中,“goto”例子無條件跳轉(zhuǎn)到標號為Label處匯編
ljmpLabel
ajmpLabel
sjmpLabel
C
gotoLabel;2.條件轉(zhuǎn)移指令組所謂條件轉(zhuǎn)移指令就是程序轉(zhuǎn)移是有條件的。規(guī)則是,執(zhí)行條件轉(zhuǎn)移指令時,如指令中規(guī)定的條件滿足,則進行程序轉(zhuǎn)移,否則程序順序執(zhí)行。注意,條件轉(zhuǎn)移指令所采用的尋址方式都是相對尋址方式,計算方法同sjmp指令。⑴累加器判零轉(zhuǎn)移指令
jzrel ;ifA=0jump,elsenext jnzrel ;ifA≠0jump,elsenext⑵減1條件轉(zhuǎn)移指令
djnzRn,rel ;Rn←Rn-1,ifRn!=0jump,elsenext djnzdirect,rel ;(direct)←(direct)-1,if(direct)!=0jump,elsenext⑶數(shù)值比較轉(zhuǎn)移指令
cjneA,#data,rel ;ifA!=datajump,elsenext cjneA,direct,rel ;ifA!=(direct)jump,elsenext cjneRn,#data,rel ;ifRn!=datajump,elsenext cjne@Ri,#data,rel ;if(Ri)!=datajump,elsenext
⑷以C狀態(tài)為條件的轉(zhuǎn)移指令 (教材第45頁)
jcrel ;ifC=1jump,elsenext jncrel ;ifC=0jump,elsenext⑸以位狀態(tài)為條件的轉(zhuǎn)移指令
jbbit,rel ;if(bit)=1jump,elsenext jnbbit,rel ;if(bit)=0jump,elsenext jbcbit,rel ;if(bit)=1jumpand(bit)←0,elsenext
在C語言中,無條件轉(zhuǎn)移“goto”有條件轉(zhuǎn)移
ifelse 分支一
switchcase 分支二
for() 循環(huán)一
while() 循環(huán)二
do while() 循環(huán)三分支程序例子實現(xiàn)下列計算:
并由P1端口輸出開始X=5?NYP1=0X>5?NYP1=1結(jié)束匯編
movA,#5
cjneA,#5,NotEqual
movP1,#0
sjmpExit
NotEqual:
clrC
subbA,#5
jncbigger
sjmpExit
bigger:
movP1,#1
Exit: C
unsignedcharx;
x=5;
if(x==5)P1=0;
elseif(x>5)P1=1;循環(huán)程序例子實現(xiàn)下列計算1+2+3+4+5+6+7+8+9+10,
并由P1端口輸出開始Sum=0,i=10Sum=Sum+ii減1YX=0?NP1=Sum結(jié)束循環(huán)程序例子匯編
clrA
movR0,#10
Loop:
addA,R0
djnzR0,Loop
movP1,A C
unsignedchari,sum;
i=10;
sum=0;
do
{
sum=sum+i;
i--;
}
while(i);
P1=sum;例子已知內(nèi)部RAM中,(30h)=23h,(40h)=65h,試分析下段程序執(zhí)行后,P1=
。 mov A,30h
clr C
subb A,40h
jc Label
mov P1,#55h
sjmp Exit
Label:
mov P1,#0AAh
Exit: 【例2-28】將A累加器的低四位取反四次、高四位不變。每變換一次,從P1輸出。方法1:加1計數(shù): MOVR0,#0 ;計數(shù)初值送0LL: XRLA,#0FH ;高4位不變,低四位取反
INCR0 ;次數(shù)加1 MOVP1,A ;從P1輸出
CJNER0,#04,LL ;不滿四次循環(huán)
RET方法2:減1計數(shù): MOVR0,#04H;計數(shù)初值送4LL: XRLA,#0FH MOVP1,A DJNZR0,LL;次數(shù)減1不等于0循環(huán)
RET2.4.3空操作指令
nop該指令經(jīng)取指,譯碼后不進行任何操作(空操作)而轉(zhuǎn)到下一條指令,常用于生產(chǎn)一個機器周期的延時。2.5
位操作指令所謂位處理,就是以位為單位進行的運算和操作。位操作的對象是內(nèi)部RAM位尋址區(qū)的128個可尋址位和專用寄存器的可尋址位。位累加器采用進位位CY。在程序中位地址的表達有多種方式:1)用直接位地址表示,如D4H。2)用“·”操作符號表示,如PSW.4,或D0H.43)用位名稱表示,如RS11.位清零、位置1
CLR C ;0→CY
CLR bit ;0→bit SETB C ;1→CY SETB bit ;1→bit3.位傳送
MOVC,bit ;bit→CY MOVbit,C ;CY→bit
在C語言中,賦值運算符“=”2.位與、位或、取反
ANLC,bit ;CY∧(bit)→CY
ANLC,/bit ;CY∧(/bit)→CY
ORLC,bit ;CY∨(bit)→CY
ORLC,/bit ;CY∨(/bit)→CY CPL C ;CY取反 CPL bit ;bit取反
在C語言中,位運算符“&”、“|”、“~”例子將P1端口的引腳0置1,引腳1清0,引腳2取反匯編
setbP1.0
clrP1.1
cplP1.2 C
sbitx=P1^0;
sbity=P1^1;
sbitz=P1^2; x=1;
y=0;
z=~z;MCS-51匯編語言程序設計
無論哪一種嵌入式系統(tǒng),都有兩種編程語言---匯編語言和高級語言(一般為C語言)。匯編語言產(chǎn)生的目標程序簡短,占用存儲空間小,執(zhí)行快,能充分發(fā)揮計算機的硬件功能。無論是高級語言還是匯編語言,源程序都要轉(zhuǎn)換成目標程序(機器語言)單片機才能執(zhí)行;高級語言編程快捷,但程序長,占用存儲空間大,執(zhí)行慢。
無論是高級語言還是匯編語言,源程序都要轉(zhuǎn)換成目標程序(機器語言),經(jīng)Keil編譯后的51目標程序為HEX文件格式。參考教材第3章單片機匯編語言概述單片機匯編語言就是單片機匯編指令的集合,其采用了助記符的形式來描述指令。優(yōu)點:程序代碼精煉,執(zhí)行速度快;每條指令的執(zhí)行時間確定,特別適合于對時序要求比較高的場合;占用內(nèi)存單元和CPU資源比較少;和硬件結(jié)構(gòu)和資源密切相關,對于理解單片機的運行和組成很有幫助。缺點:指令和具體的硬件密切相關,缺乏通用性;采用助記符描述的指令還是不夠清晰,代碼比較難懂;使用匯編語言編寫程序時,必須熟悉單片機的指令系統(tǒng)、尋址方式、寄存器的設置和使用方法,以及系統(tǒng)的硬件資源等。分散了開發(fā)人員用于程序結(jié)構(gòu)和功能上的精力;MCS-51匯編語言由四部分組成,格式如下:
[標號:]<操作碼>,[操作數(shù)][;注釋]
標號是指令的符號地址,有關標號的規(guī)定如下:①標號頭一個字符必須是字母;②不能使用本匯編語言已經(jīng)定義了的符號作為標號;③標號后邊必須跟以冒號(:);④同一個標號在一個程序中只能定義一次,不能重復定義。注釋用“;”開頭,對語句解釋說明。偽指令偽指令,顧名思義,并不是真正的單片機指令。偽指令僅為單片機匯編程序提供某種標記信息,但卻是程序中不可缺少的部分。偽指令與單片機指令的區(qū)別如下:偽指令不能命令CPU執(zhí)行某種操作,也沒有對應的機器代碼。單片機指令能使單片機的CPU執(zhí)行某種操作,并可以生成對應的機器代碼。起始偽指令ORG起始偽指令ORG用于標記一個匯編語言程序的開始。這里,16位地址便是匯編程序塊或數(shù)據(jù)塊存放的起始地址。如果省略ORG偽指令,則單片機程序代碼將默認從0000H單元開始存放。[標號:] ORG 16位地址使用格式結(jié)束偽指令END結(jié)束偽指令END用于標記一個匯編語言程序的結(jié)束。這里,標號和表達式都可以省略。在匯編語言程序執(zhí)行時,END之后所寫的任何指令都不予以處理。一個程序只能有一個END偽指令。[標號:] END [表達式]使用格式兩個最常用的偽指令
(1)ORG:匯編起始地址用來說明其后一段程序在存儲器中存放的起始地址。(2)END:匯編結(jié)束 org0000h
ljmpStart org0030h
Start:
movP1,#55h
;端口P1寫55h
sjmp$
end注:匯編語言很有用,但初學者不要深究等值偽指令EQU等值偽指令EQU相當于重命名的概念,其采用一個規(guī)定的字符名稱來代替一個數(shù)或特定的匯編符號。使用偽指令EQU時必須先賦值,后使用,而不能先使用后賦值。另外,給字符名稱所賦的值可以是8位數(shù),也可以是16位數(shù)。用EQU定義的字符名稱不能和匯編語言的關鍵字同名。字符名稱 EQU 數(shù)據(jù)或匯編符號或者字符名稱 = 數(shù)據(jù)或匯編符號使用格式地址賦值偽指令DATA地址賦值偽指令DATA是用指定的字符名稱來代替數(shù)據(jù)地址或代碼地址。DATA偽指令在程序中常用來定義數(shù)據(jù)地址。就功能上來說,偽指令DATA與EQU有些類似。區(qū)別如下:EQU偽指令必須先定義后使用,而DATA偽指令則無此限制;EQU偽指令可以把一個匯編符號賦給一個字符名稱,而DATA偽指令則不能;DATA偽指令可將一個表達式的值賦給一個字符變量,所定義的字符變量也可以出現(xiàn)在表達式中,而EQU定義的字符則不能這樣使用。字符名稱 DATA 表達式字節(jié)保存?zhèn)沃噶頓B字節(jié)保存?zhèn)沃噶頓B用于在單片機內(nèi)存中保存數(shù)據(jù)表,只能對程序存儲器進行操作。其中,8位字節(jié)數(shù)據(jù)表可以是一個或多個字節(jié)數(shù)據(jù)、字符串或表達式。在數(shù)據(jù)表中,各項數(shù)據(jù)用“,”分隔,一個數(shù)據(jù)項占一個存儲單元。所有的數(shù)據(jù)項是從標號指定的地址單元開始,將數(shù)據(jù)表中的字節(jié)數(shù)據(jù)按順序依次保存。數(shù)據(jù)項可以采用十進制、二進制或者十六進制表示。[標號:] DB 8位字節(jié)數(shù)據(jù)表字保存?zhèn)沃噶頓W字保存?zhèn)沃噶頓W用于在單片機內(nèi)存中保存雙字節(jié)數(shù)據(jù)表,只能對程序存儲器進行操作。其中,16位字數(shù)據(jù)表可以是一個或多個字節(jié)數(shù)據(jù)、字符串或表達式。在數(shù)據(jù)表中,各項數(shù)據(jù)用“,”分隔,一個數(shù)據(jù)項占一個存儲單元。所有的數(shù)據(jù)項是從標號指定的地址單元開始,將數(shù)據(jù)表中的字節(jié)數(shù)據(jù)按順序依次保存。16位數(shù)據(jù)要占用兩個單元的存儲器,高8位數(shù)據(jù)存入低地址字節(jié),低8位數(shù)據(jù)存入高地址字節(jié)。[標號:] ORG 16位地址空間預留偽指令DS空間預留偽指令DS用于在單片機內(nèi)存中劃分出一定的存儲空間用作備用區(qū)域,只能對程序存儲器進行操作。這里,表達式表示了從標號指定的地址單元開始,保留存儲單元的個數(shù)。[標號:] DS 表達式位變量偽指令BIT位變量偽指令BIT用于給位地址定義一個字符名稱。其中,位地址需要參考單片機中的定義,字符名稱就是位變量。字符名稱 BIT 位地址單片機匯編語言的程序結(jié)構(gòu)程序結(jié)構(gòu)就是程序指令的組織方式。單片機匯編語言程序大致可以分為5種程序結(jié)構(gòu):順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)查表結(jié)構(gòu)順序結(jié)構(gòu)順序結(jié)構(gòu)程序是按照指令的書寫順序來執(zhí)行的程序結(jié)構(gòu),相當于人們在作事情時,嚴格按照一個計劃表來執(zhí)行。順序結(jié)構(gòu)是一種無分支的直線型程序結(jié)構(gòu),一種最簡單、最基本的程序。在該程序中,單字節(jié)十六進制數(shù)據(jù)在0~255之間,存放在單片機RAM的32H中。首先將其除100后,商為百位數(shù),余數(shù)除以10,商為十位數(shù),余數(shù)為個位數(shù)。程序轉(zhuǎn)換后,百位數(shù)存放于R5中,十位和個位分別存放于R6的高位和低位字節(jié)中。順序結(jié)構(gòu)01 ORG 0200H ;匯編程序起始指令02 MOV A, 32H ;將單字節(jié)數(shù)據(jù)存入累加器A中03 MOV B, #100 ;分離出百位數(shù)04 DIV AB05 MOV R5, A ;百位數(shù)送入寄存器R506 XCH A, B ;余數(shù)存入累加器A中07 MOV B, #10 ;分離出十位和個位08 DIV AB09 SWAP A ;十位存入高字節(jié)10 ADD A, B ;低位存入低字節(jié)中11 MOV R6, A12 END ;匯編程序結(jié)束命令分支結(jié)構(gòu)分支結(jié)構(gòu)是一種判斷形式的程序結(jié)構(gòu),相當于人們在作事情時,根據(jù)判斷的結(jié)果來覺得后面做那件事。分支結(jié)構(gòu)的程序判斷條件的滿足與否,產(chǎn)生一個或多個程序分支,以實現(xiàn)不同的程序走向。分支結(jié)構(gòu)按照采用指令的不同而分為兩類:雙分支結(jié)構(gòu)。這類分支結(jié)構(gòu)主要采用有條件轉(zhuǎn)移指令JC、JB等,比較條件轉(zhuǎn)移指令CJNE等和累加器A判斷指令JZ等。當給定的條件成立時,執(zhí)行分支程序1,否則執(zhí)行分支程序2。多分支結(jié)構(gòu)。這類結(jié)構(gòu)主要采用散轉(zhuǎn)指令JMP,根據(jù)運算的結(jié)果指在多個分支中選擇一個執(zhí)行的程序結(jié)構(gòu)。分支結(jié)構(gòu)示例01 ORG 0200H ;匯編程序起始命令02 MOV A,R4 ;低字節(jié)送入累加器A03 CPL A ;取反04 ADD A,#01H ;加105 MOV 22H,A ;將結(jié)果送入地址22H06 JZ ZERO ;如果A的值為零則轉(zhuǎn)向ZERO07 MOV A,R3 ;高字節(jié)送入累加器A08 CPL A ;取反09 MOV 21H,A ;將結(jié)果送入地址21H10 SJMP FEND ;轉(zhuǎn)結(jié)束11 ZERO: MOV A,R3 ;高字節(jié)送入累加器A12 CPL A ;取反13 INC A ;加一14 MOV 21H,A ;將結(jié)果送入地址21H15 FEND:16 END ;程序結(jié)束循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)是一種重復執(zhí)行某段代碼的程序結(jié)構(gòu),相當于人們在作事情時,在一段時間內(nèi)進行重復性的工作。一個典型的循環(huán)程序由4部分組成,即循環(huán)初始化部分、循環(huán)處理部分、循環(huán)控制部分和循環(huán)結(jié)束部分。初始化部分:主要用于設置循環(huán)的次數(shù)、有關的工作單元清零、變量設置和地址指針設置等循環(huán)初始參數(shù)。循環(huán)處理部分:也稱為循環(huán)體,這是循環(huán)結(jié)構(gòu)的主要代碼段,在程序運行時將重復執(zhí)行。循環(huán)次數(shù)控制部分:主要用于控制循環(huán)的次數(shù),防止出現(xiàn)死循環(huán)。循環(huán)次數(shù)控制部分一般由兩個單元組成,修改控制變量和判斷循環(huán)結(jié)束。循環(huán)控制變量可以采用循環(huán)遞減計數(shù)法,即每循環(huán)一次,控制變量減1,并判斷是否為0,若不為0,則繼續(xù)執(zhí)行循環(huán)體程序,否則結(jié)束循環(huán)體的執(zhí)行;也可以采用條件控制,即判斷結(jié)束條件是否成立,如果不成立,則繼續(xù)執(zhí)行循環(huán)體,否則,結(jié)束循環(huán)。結(jié)束部分:當循環(huán)處理部分執(zhí)行完畢后,需要對計算結(jié)果進行處理和保存,已供后面的程序使用。循環(huán)轉(zhuǎn)移指令
在51系列單片機的指令系統(tǒng)中,提供了如下兩條循環(huán)轉(zhuǎn)移指令:DJNZRn,LOOP:這里采用工作寄存器Rn為控制寄存器。控制寄存器的計數(shù)方式一般都是減1計數(shù),即每循環(huán)一次,Rn自動減1計數(shù),同時判斷寄存器Rn是否為0,若不為0,繼續(xù)執(zhí)行循環(huán);若為0,則結(jié)束循環(huán)程序的執(zhí)行。DJNZDirect,LOOP:這里采用直接尋址單元Direct作為控制寄存器??刂萍拇嫫鞯挠嫈?shù)方式一般都是減1計數(shù),即每循環(huán)一次,Direct單元自動減1計數(shù),同時判斷Direct單元是否為0,若不為0,繼續(xù)執(zhí)行循環(huán);若為0,則結(jié)束循環(huán)程序的執(zhí)行。循環(huán)結(jié)構(gòu)示例在程序中,采用了比較和交換的方法來依次對比各個數(shù)據(jù)。數(shù)據(jù)塊的首地址為10H,先讀取第一個數(shù)據(jù)與第二個數(shù)據(jù),把第一個數(shù)據(jù)作為基準送入累加器A,進行比較。如果基準數(shù)大,則不作交換,再取下一個數(shù)進行比較;如果基準數(shù)小,則將數(shù)值大的取代原來的基準數(shù),即相當于做一次數(shù)據(jù)交換。然后,再以新的基準數(shù)與下一個數(shù)進行比較,直至全部比較完畢。這里的基準數(shù)始終保持為最大的數(shù)值,因此,全部比較完畢后,累加器A中的基準數(shù)即是數(shù)據(jù)塊中的最大值。最后將最大值保存在通用寄存器R2中。01 ORG 0200H02 MOV R0,#10H ;數(shù)據(jù)塊首地址送入R003 MOV A,@R0 ;取第一個數(shù)作為基準數(shù)送入累加器A04 MOV R1,#0AH ;比較次數(shù)10=0AH送入R105 LOOP1: INC R0 ;修改地址指針,使其指向下一個地址單元06 MOV 20H,@R0 ;將要比較的數(shù)暫存于20H單元07 CJNE A,20H,CHK ;兩個數(shù)進行比較08 CHK: JNC LOOP2 ;如果A大,則轉(zhuǎn)換09 MOV A,@R0 ;如果A小,則將較大的數(shù)送入A10 LOOP2: DJNZ R1,LOOP1 ;R1減1,如果其不為0,則繼續(xù)循環(huán)11 MOV R2,A ;比較完畢,存結(jié)果12 END子程序結(jié)構(gòu)子程序結(jié)構(gòu)是一種模塊化的程序設計思想,其將某些運算和操作設計成可被其他程序調(diào)用的子程序段,需要的時候直接調(diào)用這些程序段即可。一般來說,調(diào)用子程序的程序稱為主程序,調(diào)用子程序的過程稱為子程序調(diào)用。子程序執(zhí)行完后返回主程序的過程稱為子程序
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 感恩節(jié)講話稿集合15篇
- 師德標兵先進事跡材料集合15篇
- 年度考核個人述職報告15篇
- 抖音全課程培訓
- 房產(chǎn)基礎知識培訓
- 企業(yè)安全知識競賽
- 提升資金管理效率
- 2024年婦聯(lián)業(yè)務知識
- 幸福終點站觀后感10篇
- (高清版)DB21∕T 3298-2020 特種設備技術(shù)檔案管理規(guī)范
- 江蘇省蘇州市2024-2025學年高三上學期1月期末生物試題(有答案)
- 銷售與銷售目標管理制度
- 2025年第一次工地開工會議主要議程開工大吉模板
- 第16課抗日戰(zhàn)爭課件-人教版高中歷史必修一
- 對口升學語文模擬試卷(9)-江西省(解析版)
- 糖尿病高滲昏迷指南
- 壁壘加筑未來可期:2024年短保面包行業(yè)白皮書
- 環(huán)保局社會管理創(chuàng)新方案市環(huán)保局督察環(huán)保工作方案
- 2024至2030年中國水質(zhì)監(jiān)測系統(tǒng)行業(yè)市場調(diào)查分析及產(chǎn)業(yè)前景規(guī)劃報告
- 運動技能學習
- 單側(cè)雙通道內(nèi)鏡下腰椎間盤摘除術(shù)手術(shù)護理配合1
評論
0/150
提交評論