




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第3章單片機(jī)匯編程序設(shè)計(jì)3.1MCS-51系列單片機(jī)匯編指令格式及標(biāo)識(shí)指令是使計(jì)算機(jī)完成基本操作的命令。一種計(jì)算機(jī)能夠執(zhí)行的全部指令的集合,稱為這種計(jì)算機(jī)的指令系統(tǒng)。單片機(jī)的指令系統(tǒng)與微型計(jì)算機(jī)的指令系統(tǒng)不同,MCS-51系列單片機(jī)指令系統(tǒng)共有:111條指令;42種指令助記符。49條1字節(jié)指令;45條2字節(jié)指令;17條3字節(jié)指令。64條為1機(jī)器周期指令;45條為2機(jī)器周期指令;2條為4機(jī)器周期指令(乘、除法)。這些指令在存儲(chǔ)空間和運(yùn)算速度上,效率都比較高。MCS-51系列單片機(jī)指令系統(tǒng)功能強(qiáng)、指令短、執(zhí)行快。從功能上可分成五大類:
1、數(shù)據(jù)傳送指令;
2、算術(shù)運(yùn)算指令;
3、邏輯操作指令;
4、控制轉(zhuǎn)移指令;
5、位操作指令。3.1.1指令格式[標(biāo)號(hào):]操作碼助記符[目的操作數(shù)][,源操作數(shù)][;注釋](1)操作碼助記符表明指令的功能,不同的指令有不同的指令助記符,它一般用說明其功能的英文單詞的縮寫形式表示。(2)操作數(shù)用于給指令的操作提供數(shù)據(jù)、數(shù)據(jù)的地址或指令的地址,操作數(shù)往往用相應(yīng)的尋址方式指明。MCS-51單片機(jī)指令系統(tǒng)的指令按操作數(shù)的多少可分為無操作數(shù)、單操作數(shù)、雙操作數(shù)和三操作數(shù)四種情況。(3)標(biāo)號(hào)是該指令的符號(hào)地址,后面須帶冒號(hào)。它主要為轉(zhuǎn)移指令提供轉(zhuǎn)移的目的地址。(4)注釋是對(duì)該指令的解釋,前面須帶分號(hào)。它們是編程者根據(jù)需要加上去的,用于對(duì)指令進(jìn)行說明,對(duì)于指令本身功能而言是可以不要的。(1)Ri和Rn:表示當(dāng)前工作寄存器區(qū)中的工作寄存器。i取0或1,表示R0或R1。n取0~7,表示R0~R7。(2)#data:表示包含在指令中的8位立即數(shù)。(3)#data16:表示包含在指令中的16位立即數(shù)。(4)rel:以補(bǔ)碼形式表示的8位相對(duì)偏移量,范圍為-128~+127,主要用在相對(duì)尋址的指令中。(5)addr16和addr11:分別表示16位直接地址和11位直接地址。(6)direct:表示直接尋址的地址。(7)bit:表示可位尋址的直接位地址。(8)(X):表示X單元中的內(nèi)容。(9)((X)):表示以X單元的內(nèi)容為地址的存儲(chǔ)器單元內(nèi)容,即(X)作地址,該地址單元的內(nèi)容用((X))表示。(10)/和→符號(hào):“/”表示對(duì)該位操作數(shù)取反,但不影響該位的原值?!啊北硎静僮髁鞒?,將箭尾一方的內(nèi)容送入箭頭所指一方的單元中去。3.1.2指令中用到的標(biāo)識(shí)符為便于后面的學(xué)習(xí),在這里先對(duì)指令中用到的一些符號(hào)的約定意義作以下說明:3.2MCS-51系列單片機(jī)尋址方式MCS-51單片機(jī)的尋址方式按操作數(shù)的類型,可分為:①數(shù)的尋址;②指令尋址。①數(shù)的尋址有:常數(shù)尋址(立即尋址);寄存器數(shù)尋址(寄存器尋址);存儲(chǔ)器數(shù)尋址: 直接尋址方式; 寄存器間接尋址方式; 變址尋址方式。位尋址。②指令的尋址有:絕對(duì)尋址;相對(duì)尋址。3.2.1常數(shù)尋址(立即尋址)操作數(shù)是常數(shù),使用時(shí)直接出現(xiàn)在指令中,緊跟在操作碼的后面,作為指令的一部分。與操作碼一起存放在程序存儲(chǔ)器中,可以立即得到并執(zhí)行,不需要經(jīng)過別的途徑去尋找。常數(shù)又稱為立即數(shù),故又稱為立即尋址。在匯編指令中,立即數(shù)前面以“#”符號(hào)作前綴。在程序中通常用于給寄存器或存儲(chǔ)器單元賦初值,例如: MOVA,#20H其功能是把立即數(shù)20H送給累加器A,其中源操作數(shù)20H就是立即數(shù)。指令執(zhí)行后累加器A中的內(nèi)容為20H。3.2.2寄存器數(shù)尋址(寄存器尋址)操作數(shù)在寄存器中,使用時(shí)在指令中直接提供寄存器的名稱,這種尋址方式稱為寄存器尋址。在MCS-51系統(tǒng)中,這種尋址方式針對(duì)的寄存器只能是R0~R78個(gè)通用寄存器和部分特殊功能寄存器(如累加器A、寄存器B、數(shù)據(jù)指針DPTR等)中的數(shù)據(jù),對(duì)于其它的特殊功能寄存器中的內(nèi)容的尋址方式不屬于它。在匯編指令中,寄存器尋址在指令中直接提供寄存器的名稱,如R0、R1、A、DPTR等。例如: MOVA,R0其功能是把R0寄存器中的數(shù)送給累加器A,在指令中,源操作數(shù)R0為寄存器尋址,傳送的對(duì)象為R0中的數(shù)據(jù)。如指令執(zhí)行前R0中的內(nèi)容為20H,則指令執(zhí)行后累加器A中的內(nèi)容為20H。3.2.3存儲(chǔ)器數(shù)尋址存儲(chǔ)器數(shù)尋址針對(duì)的數(shù)據(jù)是存放在存儲(chǔ)器單元中,對(duì)于存儲(chǔ)器單元的內(nèi)容通過提供存儲(chǔ)器單元地址使用。根據(jù)存儲(chǔ)器單元地址的提供方式,存儲(chǔ)器數(shù)的尋址方式有:
1、直接尋址;
2、寄存器間接尋址;
3、變址尋址。1.直接尋址直接尋址是指數(shù)據(jù)在存儲(chǔ)器單元中,在指令中直接提供存儲(chǔ)器單元的地址。在MCS-51系統(tǒng)中,這種尋址方式針對(duì)的是片內(nèi)數(shù)據(jù)存儲(chǔ)器和特殊功能寄存器。在匯編指令中,指令中直接以地址數(shù)的形式提供存儲(chǔ)器單元的地址。例如: MOVA,20H其功能是把片內(nèi)數(shù)據(jù)存儲(chǔ)器20H單元的內(nèi)容送給累加器A。如指令執(zhí)行前片內(nèi)數(shù)據(jù)存儲(chǔ)器20H單元的內(nèi)容為30H,則指令執(zhí)行后累加器A的內(nèi)容為30H。指令中20H是地址數(shù),它是片內(nèi)數(shù)據(jù)存儲(chǔ)單元的地址。在MCS-51中,數(shù)據(jù)前面不加“#”是存儲(chǔ)單元地址而不是常數(shù),常數(shù)前面要加符號(hào)“#”。對(duì)于特殊功能寄存器,在指令中使用時(shí)往往通過特殊功能寄存器的名稱使用,而特殊功能寄存器名稱實(shí)際上是特殊功能寄存器單元的符號(hào)地址,因此它們是直接尋址。例如: MOVA,P0其功能是把P0口的內(nèi)容送給累加器A。P0是特殊功能寄存器P0口的符號(hào)地址,該指令在翻譯成機(jī)器碼時(shí),P0就轉(zhuǎn)換成直接地址80H。2.寄存器間接尋址寄存器間接尋址是指數(shù)據(jù)存放在存儲(chǔ)單元中,而存儲(chǔ)單元地址存放在寄存器中,在指令中通過提供存放存儲(chǔ)單元地址的寄存器來使用對(duì)應(yīng)的存儲(chǔ)單元。形式為:@寄存器名。例如:MOVA,@R1該指令的功能是將以工作寄存器R1中的內(nèi)容為地址的片內(nèi)RAM單元的數(shù)據(jù)傳送到累加器A中去。指令的源操作數(shù)是寄存器間接尋址。80H20H20HA80HR1在MCS-51單片機(jī)中,寄存器間接尋址用到的寄存器只能是通用寄存器R0、R1和數(shù)據(jù)指針寄存器DPTR,它能訪問的數(shù)據(jù)是片內(nèi)數(shù)據(jù)存儲(chǔ)器和片外數(shù)據(jù)存儲(chǔ)器。其中,片內(nèi)數(shù)據(jù)存儲(chǔ)器只能用R0和R1作指針間接訪問;片外數(shù)據(jù)存儲(chǔ)器,低端的256字節(jié)單元,既可以用兩位十六進(jìn)制地址以R0或R1作指針間接訪問,也可用四位十六進(jìn)制地址以DPTR作指針間接訪問,而高端的字節(jié)單元?jiǎng)t只能以DPTR作指針間接訪問。對(duì)于片內(nèi)RAM和片外RAM的低端256字節(jié)都可以用R0和R1作指針訪問,它們之間用指令來區(qū)別。片內(nèi)RAM訪問用MOV指令,片外RAM訪問用MOVX指令。若R1中的內(nèi)容為80H,片內(nèi)RAM地址為80H的單元中的內(nèi)容為20H,則執(zhí)行該指令后,累加器A的內(nèi)容為20H。例如:MOVCA,@A+DPTR其功能是將數(shù)據(jù)指針寄存器DPTR的內(nèi)容和累加器A中的內(nèi)容相加作為程序存儲(chǔ)器的地址,從對(duì)應(yīng)的單元中取出內(nèi)容送累加器A中。指令中,源操作數(shù)的尋址方式為變址尋址,設(shè)指令執(zhí)行前數(shù)據(jù)指針寄存器DPTR的值為2000H,累加器A的值為05H,程序存儲(chǔ)器2005H單元的內(nèi)容為30H,則指令執(zhí)行后,累加器A中的內(nèi)容為30H。示意圖如左圖所示。2000H30H30HDPTRA2005H05HA+3.變址尋址變址尋址是指操作數(shù)的地址由基址寄存器的地址加上變址寄存器的地址得到。在MCS-51系統(tǒng)中,它是以數(shù)據(jù)指針寄存器DPTR或程序計(jì)數(shù)器PC為基址,累加器A為變址,兩者相加得存儲(chǔ)單元的地址,所訪問的存儲(chǔ)器為程序存儲(chǔ)器。3.2.4位尋址位尋址是指操作數(shù)是二進(jìn)制位的尋址方式。在MCS-51單片機(jī)中有一個(gè)獨(dú)立的位處理器,有多條位處理指令,能夠進(jìn)行各種位運(yùn)算。在MCS-51系統(tǒng)中,位處理的操作對(duì)象是各種可位尋址位。對(duì)于它們的訪問是通過提供相應(yīng)的位地址來處理。指令給出位地址。一位數(shù)據(jù)在存儲(chǔ)器位尋址區(qū)。
(1)內(nèi)部RAM低128單元中的位尋址區(qū):位地址為00H~07FH共128位(字節(jié)地址為20H~2FH);
(2)內(nèi)部RAM高128單元中的專用寄存器的可尋址位:SFR中11個(gè)有位地址寄存器中的83位。在MCS-51系統(tǒng)中,位地址的表示可以用以下幾種方式:1.直接使用位地址(00H~07FH+83位)。 例如:PSW的位6可表示為0D6H(位地址)。2.字節(jié)地址帶位號(hào)。 例如:PSW的位6可表示為0D0H.6;20H.3表示20H單元的3位。3.特殊功能寄存器名帶位號(hào)。 例如:PSW的位6可表示為PSW.6;P0.1表示P0口的1位。4.位符號(hào)地址。 例如:PSW的位6可表示為AC;TR0是定時(shí)/計(jì)數(shù)器T0的啟動(dòng)位。例:MOVC,40H ;CY?(位地址40H)設(shè)指令執(zhí)行前CY=1,位地址40H存儲(chǔ)器單元如圖,執(zhí)行指令后,CY=?29H0110001028H11010110位尋址區(qū)03.2.5指令尋址一、絕對(duì)尋址絕對(duì)尋址是在指令的操作數(shù)中直接提供目的位置的地址或地址的一部分。在MCS-51系統(tǒng)中:長轉(zhuǎn)移和長調(diào)用提供目的位置的16位地址;絕對(duì)轉(zhuǎn)移和絕對(duì)調(diào)用提供目的位置的16位地址的低11位。它們都為絕對(duì)尋址。二、相對(duì)尋址相對(duì)尋址是以當(dāng)前程序計(jì)數(shù)器PC值加上指令中給出的偏移量rel得到目的位置的地址。在MCS-51系統(tǒng)中,相對(duì)轉(zhuǎn)移指令的操作數(shù)屬于相對(duì)尋址。在使用相對(duì)尋址時(shí)要注意以下兩點(diǎn):(1)當(dāng)前PC值是指轉(zhuǎn)移指令執(zhí)行時(shí)的PC值,它等于轉(zhuǎn)移指令的地址加上轉(zhuǎn)移指令的字節(jié)數(shù)。實(shí)際上是轉(zhuǎn)移指令的下一條指令的地址。例如:若轉(zhuǎn)移指令的地址為2010H,轉(zhuǎn)移指令的長度為2字節(jié),則轉(zhuǎn)移指令執(zhí)行時(shí)的PC值為2012H。(2)偏移量rel是8位有符號(hào)數(shù),以補(bǔ)碼表示,它的取值范圍為-128~+127。當(dāng)為負(fù)值時(shí),向前轉(zhuǎn)移,當(dāng)為正數(shù)時(shí)向后轉(zhuǎn)移。相對(duì)尋址的目的地址為:目的地址=轉(zhuǎn)移指令的地址+轉(zhuǎn)移指令的字節(jié)數(shù)+rel=當(dāng)前PC+relPC--(前)+(后)3.3MCS-51系列單片機(jī)指令系統(tǒng)3.3.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令有29條,是指令系統(tǒng)中數(shù)量最多、使用也最頻繁的一類指令。這類指令可分為三組:普通傳送指令;數(shù)據(jù)交換指令;堆棧操作指令。一、普通傳送指令普通傳送指令以助記符MOV為基礎(chǔ)。分成片內(nèi)數(shù)據(jù)存儲(chǔ)器傳送指令、片外數(shù)據(jù)存儲(chǔ)器傳送指令和程序存儲(chǔ)器傳送指令。1.片內(nèi)數(shù)據(jù)存儲(chǔ)器傳送指令MOV指令格式:MOV目的操作數(shù),源操作數(shù)其中:源操作數(shù)可以為A、Rn、@Ri、direct、#data,目的操作數(shù)可以為A、Rn、@Ri、direct,組合起來總共16條。(1)以A為目的操作數(shù) MOVA,Rn ;A←Rn MOVA,direct ;A←(direct) MOVA,@Ri ;A←(Ri) MOVA,#data ;A←#data(2)以Rn為目的操作數(shù) MOVRn,A ;Rn←A MOVRn,direct ;Rn←(direct) MOVRn,#data ;Rn←#data(3)以直接地址direct為目的操作數(shù) MOVdirect,A ;(direct)←A MOVdirect,Rn ;(direct)←Rn MOVdirect,direct ;(direct)←(direct) MOVdirect,@Ri ;(direct)←(Ri) MOVdirect,#data ;(direct)←#data按目的操作數(shù)的尋址方式劃分為五組:(4)以間接地址@Ri為目的操作數(shù) MOV@Ri,A ;(Ri)←A MOV@Ri,direct ;(Ri)←(direct) MOV@Ri,#data ;(Ri)←#data(5)以DPTR為目的操作數(shù) MOVDPTR,#data16;DPTR←#data16注意:
源操作數(shù)和目的操作數(shù)中的Rn和@Ri不能相互配對(duì)。如不允許有“MOVRn,Rn”,“MOV@Ri,Rn”這樣的指令,在MOV指令中,不允許在一條指令中同時(shí)出現(xiàn)工作寄存器,無論它是寄存器尋址還是寄存器間接尋址。
例:MOVA,#30H MOV4FH,A MOVR0,#20H MOV@R0,4FH MOV21H,20H練習(xí)題:用兩種尋址方式實(shí)現(xiàn),將片內(nèi)RAM60H單元的數(shù)據(jù)傳送給累加器A。解:MOVA,#60H(×)MOVR0,#60H(√)MOVA,@R0;A=30H;(4FH)=30H;R0=20H;(20H)=30H;(21H)=30HMOVR0,60HMOVA,@R0
(×)
解:MOVA,60H
(√)
結(jié)果A=32H順序執(zhí)行下列指令序列,求每一步執(zhí)行結(jié)果。地址內(nèi)容…32H58H…60H32H說明:只有指令表中的指令才有對(duì)應(yīng)指令代碼,計(jì)算機(jī)才能執(zhí)行。編程時(shí),不能隨意創(chuàng)造發(fā)明指令。1、一條指令中不能同時(shí)出現(xiàn)兩個(gè)工作寄存器。
非法指令: MOVR1,R2
MOVR2,@R02、間址寄存器只能使用R0、R1。
非法指令:MOVA,@R23、SFR區(qū)只能直接尋址,不能用寄存器間接尋址。
非法指令:MOVR0,#80H
MOVA,@R04、指令表(P287):關(guān)注表中指令字節(jié)數(shù)和機(jī)器周期數(shù)2.片外數(shù)據(jù)存儲(chǔ)器傳送指令MOVX在MCS-51系統(tǒng)中只能通過累加器A與片外數(shù)據(jù)存儲(chǔ)器進(jìn)行數(shù)據(jù)傳送,訪問時(shí),只能通過@Ri和@DPTR以間接尋址方式進(jìn)行。MOVX指令共有四條:①DPTR作16位數(shù)據(jù)指針,尋址64KB片外RAM空間:
MOVXA,@DPTR
;A←(DPTR)
(讀)
MOVX@DPTR,A
;(DPTR)←A
(寫)②Ri作8位數(shù)據(jù)指針,尋址256B片外RAM空間(頁內(nèi)尋址):
MOVX A,@Ri
;A←(P2Ri)
(讀)
MOVX @Ri,A
;(P2Ri)←A
(寫)
其中前兩條指令通過DPTR間接尋址,可以對(duì)整個(gè)64KB片外數(shù)據(jù)存儲(chǔ)器訪問。后兩條指令通過@Ri間接尋址,只能對(duì)片外數(shù)據(jù)存儲(chǔ)器的低端的256字節(jié)訪問,訪問時(shí)將低8位地址放于Ri中。例:實(shí)現(xiàn)片外數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)傳送(2000H)→(2100H)。
MOVDPTR,#2000H MOVXA,@DPTR MOVDPTR,#2100H MOVX@DPTR,A
;DPTR=2000H ;A=X ;DPTR=2100H ;(2100H)=X習(xí)題:將片外RAM0000H單元的數(shù)據(jù)傳送到片內(nèi)RAM的60H單元。片外數(shù)據(jù)存儲(chǔ)器不能直接尋址。下列為非法指令:MOVXA,2000HMOVX2100H,2000H思考題:為什么對(duì)DPTR的數(shù)據(jù)傳送使用內(nèi)部傳送指令?3.程序存儲(chǔ)器傳送指令MOVC程序存儲(chǔ)器傳送指令只有兩條,一條用DPTR基址變址尋址。一條用PC基址變址尋址。這兩條指令通常用于訪問表格數(shù)據(jù),因此以稱為查表指令。①DPTR為基址寄存器:
MOVC A,@A+DPTR;A?(A+DPTR)(讀) 查表范圍為64KB程序存儲(chǔ)器任意空間,稱為遠(yuǎn)程查表指令。②PC為基址寄存器:
MOVC A,@A+PC ;A?(A+PC)(讀) 常數(shù)表只能在查表指令后256B范圍內(nèi),稱為近程查表指令。特點(diǎn):MOVCA,@A+DPTR指令可訪問整個(gè)ROM的64KB空間,表格可放在ROM的任何位置,與MOVC指令無必然的關(guān)系。MOVCA,@A+PC指令優(yōu)點(diǎn):不改變PC的狀態(tài),根據(jù)A的內(nèi)容取表格常數(shù)。缺點(diǎn):(1)表格只能存放在查表指令以下的256個(gè)單元內(nèi)。(2)當(dāng)表格首地址與本指令間有其它指令時(shí),須用調(diào)整偏移量,調(diào)整量為下一條指令的起始地址到表格首址之間的字節(jié)數(shù)。例如:查表指令MOVCA,@A+PC所在的地址為2000H,表格的起始單元地址為2035H,表格的第4個(gè)元素(位移量為03H)的內(nèi)容為45H,則查表指令的處理過程如下:MOVA,#03H;表格元素相對(duì)于表首的位移量送累加器AADDA,#34H;當(dāng)前程序計(jì)數(shù)器PC相對(duì)于表首的差值加到累加器A中MOVCA,@A+PC;查表,查得第4個(gè)元素內(nèi)容45H送累加器A
注意:查表指令的長度為1個(gè)字節(jié),當(dāng)前程序計(jì)數(shù)器PC的值應(yīng)為查表指令的地址加1。地址內(nèi)容2000HMOVC2001H………2035H表格2036H…2037H45HPC→【例3-1】寫出完成下列功能的程序段。(1)將R0的內(nèi)容送R6中程序?yàn)椋? MOVA,R0 MOVR6,A(2)將片內(nèi)RAM30H單元的內(nèi)容送片外60H單元中程序?yàn)椋? MOVA,30H MOVR0,#60H MOVX@R0,A(3)將片外RAM1000H單元的內(nèi)容送片內(nèi)20H單元中程序?yàn)椋? MOVDPTR,#1000H MOVXA,@DPTR MOV20H,A(4)將ROM2000H單元的內(nèi)容送片內(nèi)RAM的30H單元中程序?yàn)椋? MOVA,#0 MOVDPTR,#2000H MOVCA,@A+DPTR MOV30H,A二、數(shù)據(jù)交換指令普通傳送指令實(shí)現(xiàn)將源操作數(shù)的數(shù)據(jù)傳送到目的操作數(shù),指令執(zhí)行后源操作數(shù)不變,數(shù)據(jù)傳送是單向的。數(shù)據(jù)交換指令數(shù)據(jù)作雙向傳送,傳送后,前一個(gè)操作數(shù)原來的內(nèi)容傳送到后一個(gè)操作數(shù)中,后一個(gè)操作數(shù)原來的內(nèi)容傳送到前一個(gè)操作數(shù)中。數(shù)據(jù)交換指令要求第一個(gè)操作數(shù)須為累加器A,共有5條。 XCHA,Rn ;A←→Rn XCHA,direct ;A←→(direct) XCHA,@Ri ;A←→(Ri) XCHDA,@Ri ;A0~3←→(Ri)0~3 SWAPA ;A0~3←→A4~7【例3-2】若R0的內(nèi)容為30H,片內(nèi)RAM30H單元的內(nèi)容為23H,累加器A的內(nèi)容為45H,則執(zhí)行 XCHA,@R0指令后片內(nèi)RAM30H單元的內(nèi)容為45H,累加器A中的內(nèi)容為23H。若執(zhí)行SWAPA指令,則累加器A的內(nèi)容為54H。習(xí)題:將片內(nèi)RAM60H單元與61H單元的數(shù)據(jù)交換。例:設(shè)A=29H,執(zhí)行指令XCHA,2AH后,A=?,(2AH)=?38H29HXCH60H,61H;
←對(duì)嗎?不對(duì)?。?9H例:將片內(nèi)RAM2AH和2BH單元中的ASCII碼轉(zhuǎn)換成壓縮式BCD碼存入20H單元。58H習(xí)題:交換片內(nèi)RAM40H單元和41H單元的低半字節(jié)。A30H010100000101100050H58HMOVA,#0MOVR0,#2AHMOVR1,#2BHXCHDA,@R0SWAPAXCHDA,@R1XCHA,20H0011000005H0000000000H0000010120H@R1A0101100058H30H00110000@R0AA35H00110101@R138H00111000@R0三、堆棧操作指令堆棧是在片內(nèi)RAM中按“先進(jìn)后出,后進(jìn)先出”原則設(shè)置的專用存儲(chǔ)區(qū)。數(shù)據(jù)的進(jìn)棧和出棧由指針SP統(tǒng)一管理。在MCS-51系統(tǒng)中,堆棧操作指令有兩條: PUSHdirect ;SP←(SP+1),(SP)←(direct) POPdirect ;(direct)←(SP),(SP)←(SP-1)其中PUSH指令入棧,POP指令出棧。操作時(shí)以字節(jié)為單位。入棧時(shí)SP指針先加1,再入棧。出棧時(shí)內(nèi)容先出棧,SP指針再減1。用堆棧保存數(shù)據(jù)時(shí),先入棧的內(nèi)容后出棧;后入棧的內(nèi)容先出棧。
【例3-3】若入棧保存時(shí)入棧的順序?yàn)椋?PUSHA PUSHB 則出棧的順序?yàn)椋?POPB POPA例:設(shè)A=02H,B=56H,執(zhí)行下列指令后,SP=?,A=?,B=?。SBR: MOV SP,#30H;設(shè)棧底 PUSHA PUSHB MOVA,#00H MOV B,#01H … POP B POPASP→××××
×SP→B02H×××02H
×56HASP→B02H××56H02H
×56HASP→B00H××56H02H
×01HASP→B00H××56H02H
×56HASP→B02H××56H02H
×56HA02H56H30HB02H56HA入棧指令:PUSHdirect;SP←SP+1,(SP)←(direct)出棧指令:POPdirect;(direct)←(SP),SP←SP-1
“先加后壓”
“先彈后減”練習(xí):說明程序執(zhí)行過程中,SP的內(nèi)容及堆棧中內(nèi)容的改變過程。程序如下:MOVSP,#30HMOVA,#20HMOVB,#30HPUSHAPUSHB……POPAPOPB;SP=30H;A=20H;B=30H;SP=31H(31H)=20H;SP=32H(32H)=30H……;A=30HSP=31H;B=20HSP=30H習(xí)題:找出指令錯(cuò)誤并改正:1.MOVA,#1000H;A←1000H(A裝1個(gè)字節(jié)數(shù))2.MOVXA,1000H;A←(1000H)片外RAM(DPTR、Ri)3.MOVCA,1000H;A←(1000H)片外ROM(DPTR、PC)4.MOVX60H,A ;片外RAM(60H)←A(應(yīng)為MOV)5.MOVR0,60H;片內(nèi)RAM:(61H)←(60H) MOV61H,@R0(片內(nèi)RAM可直接尋址)
6.XCHR1,R2 ;R1?R2(必須有A參加)7.MOVXDPTR,#2000H;DPTR←2000H(應(yīng)為MOV)8.MOVX60H,@DPTR ;片內(nèi)RAM←片外RAM(必須有A參加)3.3.2算術(shù)運(yùn)算指令一.加法指令1.一般的加法指令A(yù)DDADDA,Rn ;A←A+RnADDA,direct ;A←A+(direct)ADDA,@Ri ;A←A+(Ri)ADDA,#data ;A←A+#data2.帶進(jìn)位加指令A(yù)DDCADDCA,Rn ;A←A+Rn+CADDCA,direct ;A←A+(direct)+CADDCA,@Ri ;A←A+(Ri)+CADDCA,#data ;A←A+#data+C3.加1指令I(lǐng)NCA ;A←A+1INCRn ;Rn←Rn+1INCdirect ;(direct)←(direct)+1INC@Ri ;(Ri)←(Ri)+1INCDPTR ;DPTR←DPTR+1其中,ADD和ADDC指令在執(zhí)行時(shí)要影響CY、AC、OV和P標(biāo)志位。而INC指令除了INCA要影響P標(biāo)志位外,對(duì)其它標(biāo)志位都沒有影響。在MCS-51單片機(jī)中,常用ADD和ADDC配合使用實(shí)現(xiàn)多字節(jié)加法運(yùn)算?!纠?-4】試把存放在R1R2和R3R4中的兩個(gè)16位數(shù)相加,結(jié)果存于R5R6中。處理時(shí),R2和R4用一般的加法指令A(yù)DD,結(jié)果放于R6中,R1和R3用帶進(jìn)位的加法指令A(yù)DDC,結(jié)果放于R5中,程序如下: MOV A,R2 ADD A,R4 MOV R6,A MOV A,R1 ADDCA,R3 MOV R5,AR1R2R3R4R5R6C+ADDADDCC二.減法指令1.帶借位減法指令SUBBSUBBA,Rn ;A←A-Rn-CSUBBA,direct ;A←A-(direct)-CSUBBA,@Ri ;A←A-(Ri)-CSUBBA,#data ;A←A-#data-
C2.減1指令DECDECA ;A←A-1DECRn ;Rn←Rn-1DECdirect ;direct←(direct)-1DEC@Ri ;(Ri)←(Ri)-1在MCS-51單片機(jī)中,只提供了一種帶借位的減法指令,沒有提供一般的減法指令,一般的減法操作可以通過先對(duì)CY標(biāo)志清零,然后再執(zhí)行帶借位的減法來實(shí)現(xiàn)。其中,SUBB指令在執(zhí)行時(shí)要影響CY、AC、OV和P標(biāo)志位。而DEC指令除了DECA要影響P標(biāo)志位外,對(duì)其它標(biāo)志位都沒有影響?!纠?-5】求R3←R2-R1。程序?yàn)椋?MOV A,R2 CLR C SUBBA,R1 MOV R3,A3.乘法指令MUL在MCS-51單片機(jī)中,乘法指令只有一條:
MULAB該指令執(zhí)行時(shí)將對(duì)存放于累加器A中的無符號(hào)被乘數(shù)和放于B寄存器中的無符號(hào)乘數(shù)相乘,積的高字節(jié)存于B寄存器中,低字節(jié)存于累加器A中。指令執(zhí)行后將影響CY和OV標(biāo)志,CY復(fù)位,對(duì)于OV:當(dāng)積大于255時(shí)(即B中不為0),OV為1;否則,OV為0。4.除法指令DIV在MCS-51單片機(jī)中,除法指令也只有一條:
DIVAB該指令執(zhí)行時(shí)將用存放在累加器A中的無符號(hào)被除數(shù)與存放在B寄存器中的無符號(hào)除數(shù)相除,除得的結(jié)果,商的存于累加器A中,余數(shù)存于B寄存器中。指令執(zhí)行后將影響CY和OV標(biāo)志,一般情況CY和OV都清0,只有當(dāng)B寄存器中的除數(shù)為0時(shí),CY和OV才被置1。5.十進(jìn)制調(diào)整指令在MCS-51單片機(jī)中,十進(jìn)制調(diào)整指令只有一條: DAA它只能用在ADD或ADDC指令后面,用來對(duì)兩個(gè)二位的壓縮的BCD碼數(shù)通過用ADD或ADDC指令相加后存于累加器A中的結(jié)果進(jìn)行調(diào)整,使得它得到正確的十進(jìn)制結(jié)果。通過該指令可實(shí)現(xiàn)兩位十進(jìn)制BCD碼數(shù)的加法運(yùn)算。它的調(diào)整過程為:(1)若累加器A的低四位為十六進(jìn)制的A~F或輔助進(jìn)位標(biāo)志AC為1,則累加器A中的內(nèi)容作加06H調(diào)整。(2)若累加器A的高四位為十六進(jìn)制的A~F或進(jìn)位標(biāo)志CY為1,則累加器A中的內(nèi)容作加60H調(diào)整。例如:求BCD碼48+69=?117 01001000B +01101001B 10110001B + 01100110B加6修正
1
00010111B①低4位向高4位進(jìn)位,表明低位和大于9,需加6修正;②高位由于獲得進(jìn)位而出現(xiàn)非法碼,因此也需要加6修正。修正后,結(jié)果為117,正確。
思考:BCD碼減法,如何修正?(求減數(shù)對(duì)9A的補(bǔ)碼)9A的原碼為11100110B=66H。【例3-6】在R3中有十進(jìn)制數(shù)67,在R2中有十進(jìn)制數(shù)85,用十進(jìn)制運(yùn)算,運(yùn)算的結(jié)果放于R5中。程序?yàn)椋篗OVA,R3 ;(R3)=67ADDA,R2 ;(R2)=85,(A)=0ECHDA A ;(A)=52HMOVR5,A ;(R5)=52H程序中DA指令對(duì)ADD指令運(yùn)算出來的放于累加器A中的結(jié)果進(jìn)行調(diào)整,調(diào)整后,累加器A中的內(nèi)容為52H,CY為1,則結(jié)果為152,最后放于R5中的內(nèi)容為52H(十進(jìn)制數(shù)52)。跳過或進(jìn)入6個(gè)無效編碼區(qū),結(jié)果就會(huì)出錯(cuò)。(R3)=67=01100111B(R2)=85=10000101B+(A)=11101100B=ECH52H=(A)1=(C)ECH=11101100B
01100110B+
1
01010010B3.3.3邏輯操作指令一.邏輯與指令A(yù)NLANLA,Rn ;A←ARnANLA,direct ;A←A
(direct)ANLA,@Ri ;A←A((Ri))ANLA,#data ;A←AdataANLdirect,A ;(direct)←(direct)AANLdirect,#data;(direct)←(direct)data二.邏輯或指令ORLORLA,Rn ;A←ARnORLA,direct ;A←A(direct)ORLA,@Ri ;A←A((Ri))ORLA,#data ;A←AdataORLdirect,A ;(direct)←(direct)AORLdirect,#data;(direct)←(direct)data三.邏輯異或指令XRLXRLA,Rn ;A←ARnXRLA,direct ;A←A
(direct)XRLA,@Ri ;A←A((Ri))XRLA,#data ;A←AdataXRLdirect,A ;(direct)←(direct)AXRLdirect,#data;(direct)←(direct)data
在使用中,邏輯與用于實(shí)現(xiàn)對(duì)指定位清0,其余位不變;邏輯或用于實(shí)現(xiàn)對(duì)指定位置1,其余位不變;邏輯異或用于實(shí)現(xiàn)指定位取反,其余位不變?!纠?-7】寫出完成下列功能的指令段。1.對(duì)累加器A中的1、3、5位清0,其余位不變 ANLA,#11010101B2.對(duì)累加器A中的2、4、6位置1,其余位不變 ORLA,#01010100B3.對(duì)累加器A中的0、1位取反,其余位不變 XRLA,#00000011B四.清零和求反指令1.清零指令:CLRA ;A←02.求反指令:CPLA ;A←ā在MCS-51系統(tǒng)中,只能對(duì)累加器A中的內(nèi)容進(jìn)行清零和求反,如要對(duì)其它的寄存器或存儲(chǔ)單元進(jìn)行清零和求反,則須放在累加器A進(jìn)行,運(yùn)算后再放回原位置?!纠?-8】寫出對(duì)R0寄存器內(nèi)容求反的程序段。程序?yàn)椋?MOVA,R0 CPLA MOVR0,A五.循環(huán)移位指令MCS-51系統(tǒng)有四條對(duì)累加器A的循環(huán)移位指令,前兩條只在累加器A中進(jìn)行循環(huán)移位,后兩條還要帶進(jìn)位標(biāo)志CY進(jìn)行循環(huán)移位。每一次移一位。分別如下:
1)8位循環(huán)指令:
RLA
;A循環(huán)左移一位 RRA
;A循環(huán)右移一位2)9位循環(huán)指令:
RLCA;帶CY循環(huán)左移一位 RRCA;帶CY循環(huán)右移一位AAACACCLR CMOV A,R5RLC AMOV R5,AMOV A,R6RLC AMOV R6,A01CYR6R5CY;CY=0,設(shè)R6=55H,R5=0AAH;R6=01010101B,R5=10101010B,CY=0;R6=01010101B,R5=01010100B,CY=1;R6=10101011B,R5=01010100B,CY=0思考題:如何將寄存器R6R5中的雙字節(jié)數(shù)X右移一位。用9位循環(huán)指令實(shí)現(xiàn)多字節(jié)移位:例:編程將寄存器R6R5中的雙字節(jié)數(shù)X左移一位?!纠?-9】若累加器A中的內(nèi)容為10001011B,CY=0,則執(zhí)行RLCA指令后累加器A中的內(nèi)容為00010110,CY=1。;R5=01010100B,CY=13.3.4控制轉(zhuǎn)移指令共有17條,包括:無條件轉(zhuǎn)移指令;條件轉(zhuǎn)移指令;子程序調(diào)用及返回指令。一、無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令是指當(dāng)執(zhí)行該指令后,程序?qū)o條件地轉(zhuǎn)移到指令指定的地方去。無條件轉(zhuǎn)移指令包括長轉(zhuǎn)移指令、絕對(duì)轉(zhuǎn)移指令、相對(duì)轉(zhuǎn)移指令和間接轉(zhuǎn)移指令。一、無條件轉(zhuǎn)移指令指令:LJMP,AJMP,SJMP,JMP——4條LJMPaddr16長跳轉(zhuǎn)指令
——可在64KB范圍內(nèi)跳轉(zhuǎn)AJMPaddr11絕對(duì)跳轉(zhuǎn)指令
——可在指令所在的2KB范圍內(nèi)跳轉(zhuǎn)SJMPrel相對(duì)跳轉(zhuǎn)指令
——可在當(dāng)前PC-128與+127范圍內(nèi)跳轉(zhuǎn)JMP@A+DPTR間接長跳轉(zhuǎn)指令
——可在以DPTR為基址+A為偏移量之和所指向的64KB程序范圍內(nèi)跳轉(zhuǎn)1.長轉(zhuǎn)移指令LJMP指令格式:LJMPaddr16
;PC←addr16指令后面帶目的位置的16位地址,執(zhí)行時(shí)直接將該16位地址送給程序指針PC,程序無條件地轉(zhuǎn)到16位目標(biāo)地址指明的位置去。指令中提供的是16位目標(biāo)地址,所以可以轉(zhuǎn)移到64KB程序存儲(chǔ)器的任意位置,故得名為“長轉(zhuǎn)移”。該指令不影響標(biāo)志位,使用方便。缺點(diǎn)是:執(zhí)行時(shí)間長,字節(jié)數(shù)多。2.絕對(duì)轉(zhuǎn)移指令指令格式:AJMPaddr11
;PC10~0←addr11
AJMP指令后帶的是目的位置的低11位直接地址,執(zhí)行時(shí),先將程序指針PC的值加2(該指令長度為2字節(jié)),然后把指令中的11位地址addr11送給程序指針PC的低11位,而程序指針的高5位不變,執(zhí)行后轉(zhuǎn)移到PC指針指向的新位置。由于11位地址addr11的范圍是00000000000~11111111111,即2KB范圍,而目的地址的高5位不變,所以程序轉(zhuǎn)移的位置只能是和當(dāng)前PC位置(AJMP指令地址加2)在同一2KB范圍內(nèi)。轉(zhuǎn)移可以向前也可以向后,指令執(zhí)行后不影響狀態(tài)標(biāo)志位?!纠?-10】若AJMP指令地址為3000H。AJMP后面帶的11位地址addr11為123H,則執(zhí)行指令A(yù)JMPaddr11后轉(zhuǎn)移的目的位置是多少?AJMP指令的PC值加2=3000H+2=3002H=0011000000000010B指令中的addr11=123H=00100100011B轉(zhuǎn)移的目的地址為0011000100100011B=3123H3.相對(duì)轉(zhuǎn)移指令指令格式:SJMPrel
;PC←PC+2+relSJMP指令后面的操作數(shù)rel是8位帶符號(hào)補(bǔ)碼數(shù),執(zhí)行時(shí),先將程序指針PC的值加2(該指令長度為2字節(jié)),然后再將程序指針PC的值與指令中的位移量rel相加得轉(zhuǎn)移的目的地址。即:轉(zhuǎn)移的目的地址=SJMP指令所在地址+2+rel因?yàn)?位補(bǔ)碼的取值范圍為-128~+127,所以該指令的轉(zhuǎn)移范圍是:相對(duì)PC當(dāng)前值向前128字節(jié),向后127字節(jié)。PC--(前)+(后)注意:在單片機(jī)程序設(shè)計(jì)中,通常用到一條SJMP指令:
SJMP$該指令的功能是在自己本身上循環(huán),進(jìn)入等待狀態(tài)。其中符號(hào)$表示轉(zhuǎn)移到本身,它的機(jī)器碼為80FEH。在程序設(shè)計(jì)中,程序的最后一條指令通常用它,使程序不再向后執(zhí)行以避免執(zhí)行后面的內(nèi)容而出錯(cuò)。例:求原地踏步指令的指令代碼:HERE:SJMPHERE(或SJMP$)相對(duì)偏移量=[2000H-(2000H+2)]補(bǔ)=FEH,rel=FEH求出指令代碼為:80FEH【例3-11】在2100H單元有SJMP指令,若rel=5AH(正數(shù)),則轉(zhuǎn)移目的地址為215CH(向后轉(zhuǎn));若rel=F0H(負(fù)數(shù)),則轉(zhuǎn)移目的地址為20F2H(向前轉(zhuǎn))。用匯編語言編程時(shí),指令中的相對(duì)地址rel往往用目的位置的標(biāo)號(hào)(符號(hào)地址)表示。機(jī)器匯編時(shí),能自動(dòng)算出相對(duì)地址值;但手工匯編時(shí),需自己計(jì)算相對(duì)地址值rel。rel的計(jì)算方法如下:rel=目的地址-(SJMP指令地址+2)如目的地址等于2013H,SJMP指令的地址為2000H,則相對(duì)地址rel為11H。問題思考:(1)由偏移量rel計(jì)算目的地址;(2)由目的地址計(jì)算偏移量rel。例:計(jì)算轉(zhuǎn)移指令的相對(duì)偏移量rel,并判斷是否超出轉(zhuǎn)移范圍?相對(duì)偏移量rel=2150H-(2130H+2)=001EH=+30D(未超出轉(zhuǎn)移范圍)rel=1EH求出指令機(jī)器碼:801EH 指令地址 源程序2130H SJMPNEXT …2150HNEXT:MOVA,R2例:計(jì)算轉(zhuǎn)移指令的目的地址。
(1)835AHSJMP35H解:rel=35H=00110101B為正數(shù),因此程序向后轉(zhuǎn)移。目的地址=(PC)+rel=(835AH+02H)+[35H]補(bǔ)=8391H
(2)835AHSJMP0E7H解:rel=0E7H=11100111B為負(fù)數(shù),因此程序向前轉(zhuǎn)移。目的地址=835AH+02H+[0E7H]補(bǔ)=835CH-19H=8343H習(xí)題:計(jì)算程序中轉(zhuǎn)移指令的相對(duì)偏移量rel,并判斷是否超出轉(zhuǎn)移范圍。
地址 源程序
2130H LOOP:…
…
21B0H SJMPLOOP
相對(duì)偏移量=[2130H–(21B0H+2)]補(bǔ)=(-130)補(bǔ)
rel已超出轉(zhuǎn)移范圍(-126D~+129D)。4.間接轉(zhuǎn)移指令指令格式:JMP@A+DPTR
;PC←A+DPTR它MCS-51系統(tǒng)中唯一一條間接轉(zhuǎn)移指令,轉(zhuǎn)移的目的地址是由數(shù)據(jù)指針DPTR的內(nèi)容與累加器A中的內(nèi)容相加得到,指令執(zhí)行后不會(huì)改變DPTR及A中原來的內(nèi)容。數(shù)據(jù)指針DPTR的內(nèi)容一般為基址,累加器A的內(nèi)容為相對(duì)偏移量,在64KB范圍內(nèi)無條件轉(zhuǎn)移。該指令的特點(diǎn)是轉(zhuǎn)移地址可以在程序運(yùn)行中加以改變。DPTR一般為確定值,根據(jù)累加器A的值來實(shí)現(xiàn)轉(zhuǎn)移到不同的分支。在使用時(shí)往往與一個(gè)轉(zhuǎn)移指令表一起來實(shí)現(xiàn)多分支轉(zhuǎn)移。【例3-12】下面的程序能根據(jù)累加器A的值0、2、4、6轉(zhuǎn)移到相應(yīng)的TAB0~TA6分支去執(zhí)行。 MOVDPTR,#TABLE;表首地址送DPTR JMP@A+DPTR ;根據(jù)A值轉(zhuǎn)移TABLE:AJMPTAB0;當(dāng)(A)=0時(shí)轉(zhuǎn)TAB0執(zhí)行 AJMPTAB2;當(dāng)(A)=2時(shí)轉(zhuǎn)TAB2執(zhí)行 AJMPTAB4;當(dāng)(A)=4時(shí)轉(zhuǎn)TAB4執(zhí)行 AJMPTAB6;當(dāng)(A)=6時(shí)轉(zhuǎn)TAB6執(zhí)行二、條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令是指當(dāng)條件滿足時(shí),程序轉(zhuǎn)移到指定位置,條件不滿足時(shí),程序?qū)⒗^續(xù)順次執(zhí)行。在MCS-51系統(tǒng)中,條件轉(zhuǎn)移指令有三種:累加器A判零條件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令、減1不為零轉(zhuǎn)移指令。1.累加器A判零條件轉(zhuǎn)移指令判0指令:JZrel;若A=0,則PC←PC+2+rel,否則,PC←PC+2判非0指令:JNZrel;若A0,則PC←PC+2+rel,否則,PC←PC+2【例3-13】把片外RAM的30H單元開始的數(shù)據(jù)塊傳送到片內(nèi)RAM的40H開始的位置,直到出現(xiàn)零為止。片內(nèi)、片外數(shù)據(jù)傳送以累加器A過渡。每次傳送一個(gè)字節(jié),通過循環(huán)處理,直到處理到傳送的內(nèi)容為0結(jié)束。程序如下: MOVR0,#30H MOVR1,#40HLOOP: MOVXA,@R0 MOV@R1,A INCR1 INCR0 JNZLOOP SJMP$2.比較轉(zhuǎn)移指令比較轉(zhuǎn)移指令用于對(duì)兩個(gè)數(shù)作比較,并根據(jù)比較情況進(jìn)行轉(zhuǎn)移,比較轉(zhuǎn)移指令有四條:CJNEA,#data,rel
;若A=data,則PC←PC+3,不轉(zhuǎn)移,繼續(xù)執(zhí)行
若A>data,則C=0,PC←PC+3+rel,轉(zhuǎn)移 若A<data,則C=1,PC←PC+3+rel,轉(zhuǎn)移CJNERn,#data,rel
;若(Rn)=data,則PC←PC+3,不轉(zhuǎn)移,繼續(xù)執(zhí)行 若(Rn)>data,則C=0,PC←PC+3+rel,轉(zhuǎn)移 若(Rn)<data,則C=1,PC←PC+3+rel,轉(zhuǎn)移CJNE@Ri,#data,rel
;若((Ri))=data,則PC←PC+3,不轉(zhuǎn)移,繼續(xù)執(zhí)行 若((Ri))>data,則C=0,PC←PC+3+rel,轉(zhuǎn)移 若((Ri))<data,則C=1,PC←PC+3+rel,轉(zhuǎn)移CJNEA,direct,rel
;若A=(direct),則PC←PC+3,不轉(zhuǎn)移,繼續(xù)執(zhí)行 若A>(direct),則C=0,PC←PC+3+rel,轉(zhuǎn)移 若A<(direct),則C=1,PC←PC+3+rel,轉(zhuǎn)移3.減1不為零轉(zhuǎn)移指令這種指令是先減1后判斷,若不為零則轉(zhuǎn)移。指令有兩條:DJNZRn,rel(2字節(jié)指令,2周期指令);先Rn中的內(nèi)容減1,再判斷Rn中的內(nèi)容是否等于零,若不為零,則轉(zhuǎn)移。DJNZdirect,rel(3字節(jié)指令,2周期指令);先(direct)中的內(nèi)容減1,再判斷(direct)中的內(nèi)容是否等于零,若不為零,則轉(zhuǎn)移。在MCS-51系統(tǒng)中,通常用DJNZ指令來構(gòu)造循環(huán)結(jié)構(gòu),實(shí)現(xiàn)重復(fù)處理。
初始化循環(huán)體控制變量的修改循環(huán)次數(shù)的控制循環(huán)結(jié)構(gòu)包括循環(huán)控制方法:計(jì)數(shù)控制;特征標(biāo)志控制。
例:利用DJNZ指令設(shè)計(jì)循環(huán)延時(shí)程序,已知fosc=12MHz。
1)
單循環(huán)延時(shí): DELAY: MOV R7,#10 ;1T DJNZ R7,$ ;2T △t=2×1μs×10+1×1μs=21μs
2)
雙重循環(huán)延時(shí): DELAY: MOV R7,#0AH ;1T DL: MOV R6,#64H ;1T DJNZ R6,$ ;2T DJNZ R7,DL ;2T △t=(2μs×100+2+1)×10+1=2031μsT=12/12MHz=1μs3)
三重循環(huán)延時(shí):DELAY:MOV R7,#10 DL2:MOV R6,#200DL1:MOV R5,#250 DJNZ R5,$ DJNZ R6,DL1 DJNZ R7,DL2
△t=(((2us×250+2+1)×200)+2+1)×10+1=1006031μs≈1秒NNNYYY
習(xí)題:當(dāng)循環(huán)計(jì)數(shù)器初值為0,循環(huán)次數(shù)有多少?
例:設(shè)單片機(jī)的晶振頻率為6MHz,編寫一段延時(shí)程序約100ms的子程序。 Delay:MOVR7,#64H ;設(shè)循環(huán)計(jì)數(shù)器初值(100次)LOOP:MOVR6,#0FAH;循環(huán)250次(250×4=1ms) DJNZR6,$ ;循環(huán)控制 DJNZR7,LOOP RET
T=12/6MHz=2μst=2μs+100×(2μs+1ms+2×2μs)+4μs=100.606ms
1T1T2T2T2T【例3-14】統(tǒng)計(jì)片內(nèi)RAM中30H單元開始的20個(gè)數(shù)據(jù)中0個(gè)數(shù),放于R7中。用R2作循環(huán)變量,最開始置初值為20;作R7作計(jì)數(shù)器,最開始置初值為0;用R0作指針訪問片內(nèi)RAM單元,最開始置初值為30H;用DJNZ指令對(duì)R2減1轉(zhuǎn)移進(jìn)行循環(huán)控制,在循環(huán)體中用指針R0依次取出片內(nèi)RAM中的數(shù)據(jù),判斷,如為0,則R7中的內(nèi)容加1。程序: MOVR0,#30H MOVR2,#20 MOVR7,#0LOOP: MOVA,@R0 CJNEA,#0,NEXT INCR7NEXT: INCR0 DJNZR2,LOOP三、子程序調(diào)用及返回指令這類指令有四條。兩條子程序調(diào)用指令,兩條返回指令。1.長調(diào)用指令指令格式:LCALLaddr16執(zhí)行過程: (PC)←(PC)+3 (SP)←(SP)+1 (SP)←(PC)7~0 (SP)←(SP)+1 (SP)←(PC)15~8 (PC)←addr16該指令執(zhí)行時(shí),先將當(dāng)前的PC(指令的PC加指令的字節(jié)數(shù)3)值壓入堆棧保存,入棧時(shí)先低字節(jié),后高字節(jié)。然后轉(zhuǎn)移到指令中addr16所指定的地方執(zhí)行。由于后面帶16位地址,因而可以轉(zhuǎn)移到程序存儲(chǔ)空間的任一位置(64KB)。2.絕對(duì)調(diào)用指令指令格式:ACALLaddr11執(zhí)行過程:(PC)←(PC)+2 (SP)←(SP)+1 (SP)←(PC)7~0 (SP)←(SP)+1 (SP)←(PC)15~8 (PC)10~0←addr11該指令執(zhí)行過程與LCALL指令類似,只是該指令與AJMP一樣只能實(shí)現(xiàn)2KB范圍內(nèi)轉(zhuǎn)移,執(zhí)行的最后是將指令中的addr11送給PC指針的低11位。對(duì)于LCALL和ACALL兩條子程序調(diào)用指令,在匯編程序中,指令后面通常帶轉(zhuǎn)移位置的標(biāo)號(hào),用LCALL指令調(diào)用,轉(zhuǎn)移位置可以是程序存儲(chǔ)空間的任一位置,用ACALL指令調(diào)用,轉(zhuǎn)移位置與ACALL指令的下一條指令必須在同一個(gè)2KB內(nèi),即它們的高5位地址相同。3.子程序返回指令指令格式:RET執(zhí)行過程: (PC)15~8←((SP)) (SP)←(SP)-1 (PC)7~0←((SP)) (SP)←(SP)-
1執(zhí)行時(shí)將子程序調(diào)用指令壓入堆棧的地址出棧,第一次出棧的內(nèi)容送PC的高8位,第二次出棧的內(nèi)容送PC的低8位。執(zhí)行完后,程序轉(zhuǎn)移到新的PC位置執(zhí)行指令。由于子程序調(diào)用指令執(zhí)行時(shí)壓入的內(nèi)容是調(diào)用指令的下一條指令的地址,因而RET指令執(zhí)行后,程序?qū)⒎祷氐秸{(diào)用指令的下一條指令執(zhí)行。該指令通常放于子程序的最后一條指令位置,用于實(shí)現(xiàn)返回到主程序。另外,在MCS-51程序設(shè)計(jì)中,也常用RET指令來實(shí)現(xiàn)程序轉(zhuǎn)移,處理時(shí)先將轉(zhuǎn)移位置的地址用兩條PUSH指令入棧,低字節(jié)在前,高字節(jié)在后,然后執(zhí)行RET指令,執(zhí)行后程序轉(zhuǎn)移到相應(yīng)的位置去執(zhí)行。4.中斷返回指令指令格式:RETI執(zhí)行過程: (PC)15~8←((SP)) (SP)←(SP)-1 (PC)7~0←((SP)) (SP)←(SP)-
1該指令的執(zhí)行過程與RET基本相同,只是RETI在執(zhí)行后,在轉(zhuǎn)移之前將先清除中斷的優(yōu)先級(jí)觸發(fā)器。該指令用于中斷服務(wù)子程序后面,作為中斷服務(wù)子程序的最后一條指令,它的功能是返回主程序中斷的斷點(diǎn)位置,繼續(xù)執(zhí)行斷點(diǎn)位置后面的指令。在MCS-51系統(tǒng)中,中斷都是硬件中斷,沒有軟件中斷調(diào)用指令,硬件中斷時(shí),由一條長轉(zhuǎn)移指令使程序轉(zhuǎn)移到中斷服務(wù)程序的入口位置,在轉(zhuǎn)移之前,由硬件將當(dāng)前的斷點(diǎn)地址壓入堆棧保存,以便于以后通過中斷返回指令返回到斷點(diǎn)位置后繼續(xù)執(zhí)行。例:設(shè)計(jì)節(jié)日燈,通過P1.0~P1.7控制8個(gè)發(fā)光二極管,先亮1燈,隔1秒閃爍10次,然后左移1位閃10次,如此循環(huán)。NY 分析:流程圖,程序如下: MAIN:MOVA,#01H LOOP1:MOVR2,#10 LOOP2:MOVP1,A ACALLDELAY MOV P1,#00H ACALLDELAY DJNZ R2,LOOP2 RL A AJMP LOOP1 DELAY:1秒延時(shí)子程序(略) RETMCS-51P1.0P1.1P1.6P1.7……;P1.0先亮3.3.5位操作指令在MCS-51系統(tǒng)中,有17條位處理指令,可以實(shí)現(xiàn)位傳送、位邏輯運(yùn)算、位控制轉(zhuǎn)移等操作。一.位傳送指令位傳送指令有兩條,用于實(shí)現(xiàn)位運(yùn)算器C與一般位之間的相互傳送。 MOVC,bit ;C←(bit) MOVbit,C ;(bit)←C指令在使用時(shí)必須有位運(yùn)算器C參與,不能直接實(shí)現(xiàn)兩位之間的傳送。如果進(jìn)行兩位之間的傳送,可以通過位運(yùn)算器C來傳送?!纠?-15】把片內(nèi)RAM中位尋址區(qū)的20H位的內(nèi)容傳送到30H位。程序:MOVC,20H MOV30H,C二.位邏輯操作指令位邏輯操作指令包括位清0、置1、取反、位與和位或,總共10位指令。1.位清0 CLRC ;C←0 CLRbit ;(bit)←02.位置1 SETBC ;C←1 SETBbit ;(bit)←13.位取反 CPLC ;C←/C CPLbit ;(bit)←(bit)4.位與 ANLC,bit ;C←C∧(bit) ANLC,/bit ;C←C∧(/bit)5.位或 ORLC,bit ;C←C∨(bit) ORLC,/bit ;C←C∨(/bit)利用位邏輯運(yùn)算指令可以實(shí)現(xiàn)各種各樣的邏輯功能?!纠?-16】利用位邏輯運(yùn)算指令編程實(shí)現(xiàn)下面硬件邏輯電路的功能。與或或與P1.0P1.1P1.2P1.3P1.4P1.5程序:MOVC,P1.0ANLC,P1.1CPLCORLC,/P1.2MOV0F0H,CMOVC,P1.3ORLC,P1.4ANLC,0F0HCPLCMOVP1.5,C三.位轉(zhuǎn)移指令位轉(zhuǎn)移指令有以C為條件的位轉(zhuǎn)移指令和以bit為條件的位轉(zhuǎn)移指令,共5條。1.以C條件的位轉(zhuǎn)移指令JCrel
;若C=1,則轉(zhuǎn)移,PC←PC+2+rel; 否則程序繼續(xù)執(zhí)行JNCrel
;若C=0,則轉(zhuǎn)移,PC←PC+2+rel; 否則程序繼續(xù)執(zhí)行2.以bit為條件的位轉(zhuǎn)移指令JBbit,rel ;若(bit)=1,則轉(zhuǎn)移,PC←PC+3+rel;否則程序繼續(xù)執(zhí)行JNBbit,rel ;若(bit)=0,則轉(zhuǎn)移,PC←PC+3+rel;否則程序繼續(xù)執(zhí)行JBCbit,rel ;若(bit)=1,則轉(zhuǎn)移,PC←PC+3+rel,且(bit)←0;否則程序繼續(xù)執(zhí)行利用位轉(zhuǎn)移指令可進(jìn)行各種測試。程序: MOVR2,#100 MOVR0,#30H MOVR5,#0 MOVR6,#0 MOVR7,#0LOOP:MOVXA,@R0 CJNEA,#0,NEXT1 INCR6 SJMPNEXT3NEXT1:CLRC SUBBA,#0 JNCNEXT2 INCR5 SJMPNEXT3NEXT2:INCR7NEXT3:INC R0 DJNZR2,LOOP SJMP$【例3-17】從片外RAM中30H單元開始有100個(gè)數(shù)據(jù),統(tǒng)計(jì)當(dāng)中正數(shù)、0和負(fù)數(shù)的個(gè)數(shù),分別放于R5、R6、R7中。設(shè)用R2作計(jì)數(shù)器,用DJNZ指令對(duì)R2減1轉(zhuǎn)移進(jìn)行循環(huán)控制,在循環(huán)體外設(shè)置R0指針,指向片外RAM30H單元,對(duì)R5、R6、R7清零,在循環(huán)體中用指針R0依次取出片外RAM中的100個(gè)數(shù)據(jù),判斷:如大于0,則R5中的內(nèi)容加1;如等于0,則R6中的內(nèi)容加1;如小于0,則R7中的內(nèi)容加1。四.空操作指令 NOP;PC←PC+1這是一條單字節(jié)指令。執(zhí)行時(shí),不作任何操作(即空操作),僅將程序計(jì)數(shù)器PC的內(nèi)容加1,使CPU指向下一條指令繼續(xù)執(zhí)行程序。它要占用一個(gè)機(jī)器周期,常用來產(chǎn)生時(shí)間延遲,構(gòu)造延時(shí)程序。1、可以按口尋址,進(jìn)行字節(jié)操作;如:MOVPm,A可以按口線尋址,進(jìn)行位操作。如:MOVPm.n,C2、沒有專門的輸入/輸出指令,均使用MOV傳送指令來完成:輸入:用MOV指令把各口線的引腳狀態(tài)讀入;輸出:用MOV指令把輸出數(shù)據(jù)寫入各口線電路的鎖存器。3、在進(jìn)行引腳數(shù)據(jù)輸入操作之前,必須先向電路中的鎖存器寫入“1”,使FET截止,以避免鎖存器為“0”狀態(tài)時(shí)對(duì)引腳讀入的干擾。訪問I/O口指令使用說明:
擴(kuò)展I/O口:MCS-51單片機(jī)將I/O看作外RAM的一個(gè)特殊單元,與片外RAM統(tǒng)一編址,提供16位尋址能力,尋址范圍也是64KB,但需要注意的是,為區(qū)別于外RAM地址,擴(kuò)展I/O口一般用高端地址。3.4MCS-51系列單片機(jī)匯編程序常用偽指令
偽指令是放在匯編語言源程序中用于指示匯編程序如何對(duì)源程序進(jìn)行匯編的指令,它不同于指令系統(tǒng)中的指令,指令系統(tǒng)中的指令在匯編程序匯編時(shí)能夠產(chǎn)生相應(yīng)的指令代碼,而偽指令在匯編程序匯編時(shí)不會(huì)產(chǎn)生代碼,只是對(duì)匯編過程進(jìn)行相應(yīng)的控制和說明。偽指令通常在匯編語言源程序中用于定義數(shù)據(jù)、分配存儲(chǔ)空間、控制程序的輸入輸出等。MCS-51匯編語言源程序相對(duì)于一般的微型計(jì)算機(jī)匯編語言源程序結(jié)構(gòu)簡單,偽指令數(shù)目少,常用的偽指令只有幾條。1.ORG偽指令格式:ORG地址(十六進(jìn)制表示)這條偽指令放于一段源程序或數(shù)據(jù)的前面,匯編時(shí)用于指明程序或數(shù)據(jù)從程序存儲(chǔ)空間什么位置開始存放。ORG偽指令后的地址是程序或數(shù)據(jù)的起始地址?!纠?-18】ORG1000HSTART:MOVA,#7FH···指明后面的程序從程序存儲(chǔ)器的1000H單元開始存放。2.DB偽指令格式:[標(biāo)號(hào):]DB項(xiàng)或項(xiàng)表DB偽指令用于定義字節(jié)數(shù)據(jù),可以定義一個(gè)字節(jié),也可定義多個(gè)字節(jié),字義多個(gè)字節(jié)時(shí),兩兩之間用逗號(hào)間隔,定義的多個(gè)字節(jié)在存儲(chǔ)器中是連續(xù)存放的。定義的字節(jié)可以是一般常數(shù),也可以為字符,還可以是字符串,字符和字符串以引號(hào)括起來,字符數(shù)據(jù)在存儲(chǔ)器中以ASCII碼形式存放。在定義時(shí)前面可以帶標(biāo)號(hào),定義的標(biāo)號(hào)在程序中是起始單元的地址。【例3-19】ORG3000H TAB1:DB12H,34H DB'5','A','abc'匯編后,各個(gè)數(shù)據(jù)在存儲(chǔ)單元中的存放情況如右:12H34H35H41H61H62H63H3000H3001H3002H3003H3004H3005H3006H3.DW偽指令格式:[標(biāo)號(hào):]DW項(xiàng)或項(xiàng)表這條指令與DB相似,但用于定義字?jǐn)?shù)據(jù)。項(xiàng)或項(xiàng)表指所定義的一個(gè)字在存儲(chǔ)器中占兩個(gè)字節(jié)。匯編時(shí),機(jī)器自動(dòng)按低字節(jié)在前,高字節(jié)在后,即低字節(jié)存放在低地址單元,高字節(jié)存放在高地址單元。【例3-20】ORG3000HTAB2:DW1234H,5678H匯編后,各個(gè)數(shù)據(jù)在存儲(chǔ)單元中的存放情況如右:34H12H78H56H3000H3001H3002H3003H4.DS偽指令格式:[標(biāo)號(hào):]DS數(shù)值表達(dá)式該偽指令用在存儲(chǔ)器中保留一定數(shù)量的字節(jié)單元。保留存貯空間主要為以后存放數(shù)據(jù)。保留的字節(jié)單元數(shù)由表達(dá)式的值決定?!纠?-21】ORG3000H TAB1:DB12H,34H
DS4H DB'5'匯編后,存儲(chǔ)單元中的分配情況如右:12H34H--------35H3000H3001H3002H3003H3004H3005H3006H5.EQU偽指令格式:符號(hào)EQU項(xiàng)該偽指令的功能是將指令中的項(xiàng)的值賦予EQU前面的符號(hào)。項(xiàng)可以是常數(shù)、地址標(biāo)號(hào)或表達(dá)式。以后可以通過使用該符號(hào)使用相應(yīng)的項(xiàng)。【例3-22】TAB1EQU1000H TAB2EQU2000H匯編后TAB1、TAB2分別等于1000H、2000H。程序后面使用1000H、2000H的地方就可以用符號(hào)TAB1、TAB2替換。
用EQU偽指令對(duì)某標(biāo)號(hào)賦值后,該符號(hào)的值在整個(gè)程序中不能再改變。6.bit偽指令格式:符號(hào)bit位地址bit該偽指令用于給位地址賦予符號(hào),經(jīng)賦值后可用該符號(hào)代替bit后面的位地址。【例3-23】PLGbitF0 AIbitP1.0定義后,在程序中位地址F0、P1.0就可以通過FLG和AI來使用。7.END偽指令格式:END該指令放于程序最后位置,用于指明匯編語言源程序的結(jié)束位置,當(dāng)匯編程序匯編到END偽指令時(shí),匯編結(jié)束。END后面的指令,匯編程序都不予處理。一個(gè)源程序只能有一個(gè)END命令,否則就有一部分指令不能被匯編。3.5MCS-51系列單片機(jī)匯編程序設(shè)計(jì)匯編語言程序的結(jié)構(gòu): 1、程序設(shè)計(jì)的基本步驟 一般步驟為: (1)分析題意,明確要求; (2)建立思路,確定算法; (3)編制框圖,繪出流程; (4)編寫程序,上機(jī)調(diào)試。 顯然,算法和流程是至關(guān)重要的。程序結(jié)構(gòu)有簡單順序、分支、循環(huán)和子程序等幾種基本形式。2、畫流程圖 畫流程圖是指用各種圖形、符號(hào)、指向線等來說明程序設(shè)計(jì)的過程。國際通用的圖形和符號(hào)說明如下:
橢圓框:起止框,在程序的開始和結(jié)束時(shí)使用。 矩形框:處理框,表示要進(jìn)行的各種操作。
菱形框:判斷框,表示條件判斷,以決定程序的流向。
指向線:流程線,表示程序執(zhí)行的流向。 圓圈:連接符,表示不同頁之間的流程連接。 各種幾何圖形符號(hào)如下圖所示。3.5.1運(yùn)算程序【例3-24】多字節(jié)無符號(hào)數(shù)加法。設(shè)從片內(nèi)RAM30H單元和40H單元有兩個(gè)16字節(jié)數(shù),把它們相加,結(jié)果放于30H單元開始的位置處(設(shè)結(jié)果不溢出)。處理過程:用R0作指針指向30H單元,用R1作指針指向40H單元,用R2為循環(huán)變量,初值為16,在循環(huán)體中用ADDC指令把R0指針指向的單元與R1指針指向的單元相加,加得的結(jié)果放回R0指向的單元,改變R0、R1指針指向下一個(gè)單元,循環(huán)16次,在第一次循環(huán)前應(yīng)先將
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度商業(yè)秘密合作轉(zhuǎn)讓合同協(xié)議
- 二零二五年度豬肉市場風(fēng)險(xiǎn)預(yù)警與應(yīng)對(duì)合同
- 二零二五年度社區(qū)服務(wù)兼職志愿者服務(wù)協(xié)議
- 二零二五年度成人外語培訓(xùn)機(jī)構(gòu)報(bào)名服務(wù)協(xié)議
- 二零二五年度手貨車車輛轉(zhuǎn)讓與汽車金融服務(wù)及市場推廣合同
- 2025年度游學(xué)旅游線路研發(fā)與推廣協(xié)議
- 2025年度珠寶首飾返傭金代理合同
- 2025年度混凝土班組勞務(wù)合作施工進(jìn)度合同
- 二零二五年度精裝修房屋買賣合同違約賠償標(biāo)準(zhǔn)
- 二零二五年度房產(chǎn)交易全程服務(wù)協(xié)議范本
- 尺寸鏈的計(jì)算表格
- 夏玉米套種辣椒技術(shù)
- 學(xué)術(shù)規(guī)范與寫作課件
- 絕緣電阻測試儀安全操作規(guī)程
- DB6101T 197-2022 藤蔓類尾菜堆肥技術(shù)規(guī)程
- 西藏房屋建筑工程竣工材料全套表格
- 量子力學(xué)英文課件格里菲斯Chapter4
- 鍋爐節(jié)能管理制度
- 2023年道路交通安全法實(shí)施條例
- 鹽城市殘疾人康復(fù)機(jī)構(gòu)認(rèn)定暫行辦法
- 護(hù)理不良事件管理、上報(bào)制度及流程
評(píng)論
0/150
提交評(píng)論