版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目二指令系統(tǒng)
學(xué)習(xí)目標(biāo)
知識(shí)目標(biāo):掌握匯編語(yǔ)言的尋址方式、基本指令格式、熟悉常用指令功能;程序流程圖的繪制方法;常用程序的編寫方法和技巧。掌握C語(yǔ)言的編寫方法和技巧。
技能目標(biāo):能根據(jù)要求編寫常用程序。2.1概述一、指令指令是指揮計(jì)算機(jī)工作的命令,一種計(jì)算機(jī)所能執(zhí)行的指令集合稱之為計(jì)算機(jī)指令系統(tǒng)。
MCS-51單片機(jī)主要有兩種指令形式:機(jī)器語(yǔ)言指令匯編語(yǔ)言指令。
1.機(jī)器指令用二進(jìn)制代碼表示的指令稱為機(jī)器語(yǔ)言指令,也稱機(jī)器碼。例如:“累加器A加1”指令用二進(jìn)制數(shù)表示時(shí),是“00000100”,在程序存儲(chǔ)器中占用一個(gè)字節(jié)單元。
2.匯編語(yǔ)言指令
用容易記憶的縮寫符號(hào)表示機(jī)器語(yǔ)言指令就是匯編語(yǔ)言指令。例如,“A加B”用英語(yǔ)寫出來(lái)是“AddBtoA”,縮寫成“ADDA,B”。這個(gè)“ADDA,B”就是匯編語(yǔ)言指令。MCS-51單片機(jī)的開發(fā)商約定:“ADDA,B”與25F0H對(duì)應(yīng)。我們將“ADD”縮寫符號(hào)稱為“助記符”。編寫機(jī)器語(yǔ)言程序?qū)嵸|(zhì)上就是用匯編語(yǔ)言編寫程序。兩種語(yǔ)言指令對(duì)照:匯編語(yǔ)言指令機(jī)器語(yǔ)言指令MOVA,#0AH74H0AHADDA,#14H24H14H2.28051匯編語(yǔ)言指令指令組成:操作碼助記符操作數(shù)括號(hào)內(nèi)的部分是可選項(xiàng)。每個(gè)字段之間要用分隔符分隔,可以用作分隔符的符號(hào)有空格、冒號(hào)、逗號(hào)、分號(hào)等。
指令格式:[標(biāo)號(hào):]操作碼[目的操作數(shù)][,源操作數(shù)];[注釋]LOOP:MOVA,3AH;(A)←(3AH)1.標(biāo)號(hào)標(biāo)號(hào)是語(yǔ)句地址的標(biāo)志符號(hào),代表該語(yǔ)句指令代碼第一個(gè)字節(jié)的地址。
(1)標(biāo)號(hào)由1~8個(gè)ASCII字符組成,且第一個(gè)字符必須是字母,其余字符可以是字母、數(shù)字或其他特定字符。
(2)不能使用該匯編語(yǔ)言已經(jīng)定義了的符號(hào)作為標(biāo)號(hào)。如指令助記符、寄存器符號(hào)名稱等。
(3)標(biāo)號(hào)后必須跟冒號(hào)。
2.操作碼
操作碼用于規(guī)定語(yǔ)句執(zhí)行的操作。它是匯編語(yǔ)句中唯一不能空缺的部分,也是語(yǔ)句的核心,它用指令助記符表示。3.操作數(shù)
操作數(shù)用于給指令的操作提供數(shù)據(jù)或地址。在一條匯編語(yǔ)句中操作數(shù)可能是空缺的,也可能包括一項(xiàng),還可能包括兩項(xiàng)或三項(xiàng)。當(dāng)有多個(gè)操作數(shù)時(shí),各操作數(shù)間以逗號(hào)分隔。
(1)工作寄存器名。
(2)特殊功能寄存器名。
(3)標(biāo)號(hào)名。
(4)常數(shù)。
(5)符號(hào)“$”,表示程序計(jì)數(shù)器PC的當(dāng)前值。
(6)表達(dá)式。4.注釋注釋不屬于匯編語(yǔ)句的功能部分,它只是對(duì)語(yǔ)句的說(shuō)明。注釋字段可以增加程序的可讀性,有助于編程人員的閱讀和維護(hù)。注釋字段必須以分號(hào)“;”開頭,長(zhǎng)度不限可以換行接著書寫,但換行時(shí)應(yīng)注意在開頭使用分號(hào)“;”。
指令的描述中經(jīng)常用到一些特殊符號(hào)
Rn工作寄存器R0~R7,即n=0~7。Ri寄存器R0、R1,即i=0、1。direct8位內(nèi)部RAM單元的地址#data:指令中的8位常數(shù)。#data16指令中的16位常數(shù)。addr16:16位的目的地址addr1111位的目的地址rel8位帶符號(hào)的偏移量字節(jié)bit:內(nèi)部數(shù)據(jù)RAM或SFR的可直接尋址位。/位操作數(shù)的前綴,表示對(duì)該位取反。(X)X中的內(nèi)容。((X))由X尋址的單元中的內(nèi)容?!硎緮?shù)據(jù)的傳送方向。<=>表示數(shù)據(jù)交換。MCS-51單片機(jī)指令系統(tǒng)的分類
按指令所占存儲(chǔ)器字節(jié)數(shù)分(1)
單字節(jié)指令(49條)(2)
雙字節(jié)指令(46條)(3)
三字節(jié)指令(16條)
按指令功能分:
(1)
數(shù)據(jù)傳送指令(29條)(2)
算術(shù)運(yùn)算指令(24條)(3)
邏輯運(yùn)算指令(24條)(4)
控制轉(zhuǎn)移類指令(17條)(5)
位操作指令(17條)按指令執(zhí)行周期數(shù)分:(1)
單周期指令(64條)(2)
雙周期指令(45條)(3)
四周期指令(2條)一、尋址方式我的信在她那!找信去!②①注:找信是尋找信的“地址”!尋址方式,就是指如何找到存放被操作數(shù)據(jù)的位置(地址)的方法。1.寄存器尋址寄存器尋址是指令中指定寄存器的內(nèi)容作為操作數(shù)的尋址方式。寄存器目的地R0~R7ABDPTRMOVA,R12.直接尋址直接尋址是指令直接給出操作數(shù)所在單元的地址的尋址方式。指令中操作數(shù)部分給出直接地址,用direct表示。
XXH目的地內(nèi)部RAMSFRXXHMOVA,3AH例:MOVA,3AH操作碼直接地址10011111APC程序存儲(chǔ)器…1110010100111010PC+1內(nèi)部RAM…3AH39H10011111…XXH目的地R0、R1DPTRMOVA,@R13.寄存器間接尋址指令操作數(shù)的地址事先存放在某個(gè)寄存器中,由該寄存器的內(nèi)容指定操作數(shù)地址的尋址方式,稱為寄存器間接尋址,@為間接尋址指示符。信在XXH中寄存器可尋址內(nèi)部RAM128B、外部RAM尋址DPTRMOVA,@R0PC操作碼程序存儲(chǔ)器11100110….….….~內(nèi)部RAM47H65H65HR0….~~~47HA4.立即數(shù)尋址立即數(shù)尋址是由指令直接給出操作數(shù)的尋址方式。#為立即數(shù)的標(biāo)識(shí)符。目的地MOVA,#30H速遞快信30HA這類指令大都是雙字節(jié)指令,僅有指令:MOVDPTR,#DATA16是三字節(jié)指令,它提供兩字節(jié)立即數(shù),如:MOVDRTR,#1600H,它的機(jī)器指令格式下所示:100100000001011000000000使用專用的匯編語(yǔ)言編譯程序把編寫的匯編語(yǔ)言源程序編譯成機(jī)器語(yǔ)言程序,對(duì)立即數(shù)的書寫一般有要求:對(duì)于單字節(jié)立即數(shù),若數(shù)值大于等于A0H,則要在其前面加一個(gè)0,如指令“MOV
A,#0A0H”,該指令含義是把立即數(shù)A0H送累計(jì)器;對(duì)于雙字節(jié)立即數(shù),若數(shù)值大于等于A000H,則要在其前面加一個(gè)0。對(duì)于直接地址和偏移量也按相同方法書寫。第一位數(shù)字是A~F時(shí)請(qǐng)?jiān)谄淝凹?5.變址尋址(基址寄存器+變址寄存器間接尋址)
變址間接尋址是將指令中基地址(基址寄存器)和偏移量地址(變址寄存器)的內(nèi)容相加形成真正的操作數(shù)地址。基址寄存器1000H變址寄存器PCDPTRA程序存儲(chǔ)器65H….….1000H+30H1030H30H65H6.相對(duì)尋址以當(dāng)前的PC值加上指令中給出的相對(duì)偏移量rel而形成轉(zhuǎn)移目的地址的尋址方式。2000H+2H+28H······SJMP28H202AH程序存儲(chǔ)器2000H2002H源地址目的地址rel轉(zhuǎn)移指令本身字節(jié)數(shù)rel是有符號(hào)的8位二進(jìn)制數(shù),用補(bǔ)碼表示。相對(duì)偏移在+127~-128字節(jié)單元之間。7.位尋址位尋址適用于可以進(jìn)行單獨(dú)位操作的指令,指令中直接給出位地址尋找位操作數(shù)。參與操作的數(shù)據(jù)是1bit而不是1B。位地址用bit表示,以區(qū)別字節(jié)地址direct。
PCPC+11010001000110111程序存儲(chǔ)器操作碼0CyACFORSIRS0OVPPSW內(nèi)部RAM位地址空間26H3736353433323130MOVC,37H0尋址空間及舉例
尋址方式存儲(chǔ)器空間寄存器尋址R0~R7、A、B、Cy(位)、DPTR直接尋址內(nèi)部數(shù)據(jù)存儲(chǔ)器00H~7FH字節(jié)單元特殊功能寄存器寄存器間接尋址內(nèi)部數(shù)據(jù)存儲(chǔ)器(@R1、@R0)
外部數(shù)據(jù)存儲(chǔ)器(@R1、@R0、@DPTR)立即數(shù)尋址程序存儲(chǔ)器(操作常數(shù))變址間接尋址程序存儲(chǔ)器(@A+DPTR、@A+PC)相對(duì)尋址程序存儲(chǔ)器(修改了PC值)位尋址內(nèi)部數(shù)據(jù)存儲(chǔ)器及特殊功能寄存器中某些單元位
表3-1每一種尋址方式可涉及的存儲(chǔ)器空間例1將D5H位的內(nèi)容送入Cy,可用幾種方式表達(dá)?
(1)
MOVC,0D5H(2)
MOVC,0D0H.5(3)
MOVC,F(xiàn)0(4)
MOVC,PSW.5例2判斷下列指令各操作數(shù)的尋址方式(1)MOVA,#65H(2)MOV@R1,65H(3)MOV30H,R2(4)MOVC,20H(5)DJNZR2,LOOP(6)MOV60H,@R1(7)MOVCA,@A+PC
寄存器尋址變址尋址直接尋址寄存器間接尋址寄存器尋址相對(duì)尋址位尋址位尋址直接尋址寄存器尋址寄存器間接尋址直接尋址寄存器尋址立即數(shù)尋址二、數(shù)據(jù)傳送類指令MCS-51單片指令系統(tǒng)中,數(shù)據(jù)傳送指令共29條,分為內(nèi)部數(shù)據(jù)傳送指令、外部數(shù)據(jù)傳送指令、堆棧指令和數(shù)據(jù)交換指令。數(shù)據(jù)傳送指令是MCS-51單片機(jī)指令系統(tǒng)中數(shù)目最多、使用最頻繁的指令。除了用POP或MOV操作向PSW傳送數(shù)據(jù)的指令外,其他傳送指令均不影響標(biāo)志位?!皞魉汀辈僮鞯墓δ苁菍⒃吹刂穯卧膬?nèi)容傳送到目的地址單元中去,而源地址單元的內(nèi)容不變。累加器A直接地址direct立即數(shù)#data寄存器R0~R7寄存器間接@R0、@R1數(shù)據(jù)指針DPTR16位入、出棧@SP入出位累加器C11數(shù)據(jù)傳送類指令示意圖1.內(nèi)部數(shù)據(jù)傳送指令
是指數(shù)據(jù)在內(nèi)部RAM單元之間傳送。內(nèi)部數(shù)據(jù)傳送指令的助記符為MOV,其匯編語(yǔ)言指令格式為:
MOV[目的地址],[源地址](1)以累加器A為目的的傳送指令
功能
執(zhí)行時(shí)間
(A)←(Rn)1Tcy(A)←(direct)1Tcy(A)←((Ri))1Tcy(A)←#data1Tcy11101rrr匯編語(yǔ)言指令MOVA,RnMOVA,directMOVA,@RiMOVA,#data機(jī)器語(yǔ)言指令11100101direct1110011i01110100data
指令中Rn表示工作寄存器R0~R7,用機(jī)器碼指令中的低3位指代工作寄存器的地址,其中:rrr=000~111,對(duì)應(yīng)的工作寄存器R0~R7。而MOVA,30H的機(jī)器嗎是1110010100110000,即E530H,它是雙字節(jié)指令。
(2)以直接地址為目的的傳送指令MOVdirect,A;(direct)←(A)MOVdirect,Rn;(direct)←(Rn)MOVdirect1,direct2;(direct1)←(direct2)MOVdirect,@Ri;(direct1)←((Ri))MOVdirect,#data;(direct1)←data
這組指令的目的操作數(shù)都是直接尋址單位,源地址操作數(shù)采用寄存器尋址、直接尋址、寄存器間接尋址和立即數(shù)尋址。
(3)以通用寄存器Rn為目的的傳送指令MOVRn,A;(Rn)←(A)MOVRn,direct;(Rn)←(direct)MOVRn,#data;(Rn)←data
這三條指令都是以工作寄存器為目的操作數(shù),源操作數(shù)的尋址方式有寄存器尋址、直接尋址和立即數(shù)尋址。
(4)以寄存器間接地址為目的的傳送指令MOV@Ri,A;((Ri))←(A)MOV@Ri,direct;((Ri))←(direct)MOV@Ri,#data;((Ri))←data
這組指令的目的操作數(shù)都是間接尋址單元,源地址單元可采用寄存器尋址、直接尋址和立即數(shù)尋址方式。例3設(shè)內(nèi)部RAM中的30H單元的內(nèi)容為50H,試分析執(zhí)行下面程序后各有關(guān)單元的內(nèi)容。
MOV60H,#30HMOVR0,#60HMOVA,@R0MOVR1,AMOV40H,@R1MOV60H,30H2.16位數(shù)據(jù)傳送指令MOVDPTR,#data16;(DPTR)←data16
MSC-51單片機(jī)指令系統(tǒng)中僅此一條傳送16位數(shù)據(jù)的指令,功能是將16位數(shù)據(jù)送入寄存器DPTR中,其中數(shù)據(jù)的高8位送入DPH中,低8位送入DPL中。
3.數(shù)據(jù)交換指令
數(shù)據(jù)交換指令是在內(nèi)部RAM的某一個(gè)單元和累加器A之間進(jìn)行的,并且累加器A總是作為目標(biāo)操作數(shù)。數(shù)據(jù)交換指令分為兩種;整字節(jié)交換和半字節(jié)交換。
XCHA,源操作數(shù)
XCHA,Rn;(A)<=>(Rn)XCHA,direct;(A)<=>(direct)XCHA,@Ri;(A)<=>((Ri))
這組指令的功能是將累加器A的內(nèi)容與源操作數(shù)(Rn、direct或@Ri)所指定單元相互交換內(nèi)容
MOVA,30HXCHA,40HMOV30H,A88HA結(jié)果為(30H)=11H,(40H)=88H,而功能是將30H和40H單元內(nèi)容互換。
88H30H40H11H…88H11H11H例3-4已知(30H)=88H,(40H)=11H,指出下列程序段執(zhí)行的結(jié)果和功能。(1)半字節(jié)交換指令XCHDA,@Ri;(A)3~0
<=>((Ri))3~0SWAPA;(A)3~0<=>(A)7~4
第一條指令將Ri間接尋址的單元內(nèi)容的低4位與累加器A內(nèi)容的低4位互換,高四位內(nèi)容不變,不影響標(biāo)志位。例如,設(shè)(A)=0ABH,(R0)=30H,(30H)=12H,執(zhí)行指令XCHDA,@R0后,(A)=A2H,(30H)=1BH。第二條指令將累加器A的高4位與低4位內(nèi)容互換,不影響標(biāo)志位。例5設(shè)內(nèi)部數(shù)據(jù)存儲(chǔ)器的60H、61H單元中連續(xù)存放著4位BCD碼,試編寫一段程序?qū)⑦@4位BCD碼倒序排列。MOVR0,#60H;(R0)=60HMOVR1,#61H;(R1)=61HMOVA,@R0;(A)=((R0))=(60H)=a3a2SWAPA;A中的內(nèi)容、低4位互換(A)=a2a3XCHA,@R1;(A)<=>((R1))SWAPA;(A)=a0a1MOV@R0,A;((R0))=(A),(60H)=a0a160H61H60H61Ha3a2a0a1a1a0A2a34.片外數(shù)據(jù)存儲(chǔ)器傳送指令
當(dāng)把一個(gè)數(shù)據(jù)送到單片機(jī)外部擴(kuò)展RAM的某個(gè)單元或外部擴(kuò)展I/O口某個(gè)端口,或者從該單元、端口將數(shù)據(jù)取回到單片機(jī)內(nèi)部的時(shí)候,就要用到這種指令。MOVXA,@Ri;(A)←((Ri))片外MOVXA,@DPTR;(A)←((DPTR))片外MOVX@Ri,A;((Ri))片外←(A)MOVX@DPTR,A;((DPTR))片外←(A)片外RAM讀指令片外RAM寫指令。例6將累加器A中的內(nèi)容送入外部數(shù)據(jù)存儲(chǔ)器的0060H單元。MOVR0,#60H;地址送間址寄存器MOVX@R0,A;A中內(nèi)容送外部數(shù)據(jù)存儲(chǔ)器的0060H單元MOVP2,#00;輸出地址高8位輸出00H例7將外部存儲(chǔ)器的2000H單元的內(nèi)容送入2100H單元。MOVDPTR,#2000H;(DPTR)=2000HMOVXA,@DPTR;(A)=((DPTR))MOVDPTR,#2100H;(DPTR)=2100HMOVX@DPTR,A;((DPTR))=(A)5.ROM數(shù)據(jù)訪問(wèn)指令MOVCA,@A+DPTR;
(A)←((A)+(DPTR))ROMMOVCA,@A+PC;(PC)←(PC)+1,(A)←((A)+(PC))ROM1065ALU1060H+05H=1065H程序存儲(chǔ)器PCMOVCA,@A+DPTR34H…………05HDPLDPHA10H60H…指令執(zhí)行后,A中的內(nèi)容則為34H,而不再是5H34H兩個(gè)指令的比較MOVCA,@A+DPTR:這條指令的執(zhí)行結(jié)果只與指針DPTR及累加器A的內(nèi)容有關(guān),與該指令存放的地址無(wú)關(guān),因此,表格的大小和位置可以在64KB程序存儲(chǔ)器中任意安排,并且一個(gè)表格可以為各個(gè)程序塊所共用。MOVCA,@A+PC:這條指令的優(yōu)點(diǎn)是不改變特殊功能寄存器和PC的狀態(tài),只要根據(jù)A的內(nèi)容就可以取出表格中的常數(shù)。缺點(diǎn)是表格只能放在該條查表指令后面的256個(gè)單元之內(nèi),表格的大小受到限制,而且表格只能被一段程序所利用。例8:設(shè)A的內(nèi)容為BCD碼(高4位為全0),試用查表法來(lái)求得相應(yīng)的ASCII碼。方法(一):BCD_ASC:MOVDPTR,#TABMOVCA,@A+DPTRRETTAB:DB30H,31H,32H,33H,34HDB35H,36H,37H,38H,39H6.棧操作指令片內(nèi)RAM中有一個(gè)先進(jìn)后出的堆棧操作緩沖區(qū)域,主要用于保護(hù)和恢復(fù)CPU的工作現(xiàn)場(chǎng),也可實(shí)現(xiàn)內(nèi)部RAM單元之間的數(shù)據(jù)傳送。(1)入棧指令:PUSHdirect;(SP)←(SP)+1,((SP))←(direct)先將堆棧指針寄存器的內(nèi)容加1,指向堆棧頂?shù)囊粋€(gè)單元中,然后將指令指定的直接尋址單元內(nèi)容傳送到這個(gè)單元中。(2)出棧指令:POPdirect;(direct)←((SP)),(SP)←(SP)-1出棧指令是將當(dāng)前堆棧指針寄存器SP所指示單元內(nèi)容傳送到該指令指定的直接尋址單元中去,然后SP內(nèi)容減1指向新棧頂。指令的操作數(shù)是direct直接地址,不能是間接地址、通用寄存器或其他。
例9已知(SP)=30H,(40H)=88H,(50H)=11H,指出下列程序段的執(zhí)行結(jié)果和功能。PUSH40H;(SP)←(SP)+1=31H,((SP))←(40H),(31H)=88HPUSH50H;(SP)←(SP)+1=32H,((SP))←(50H),(32H)=11HPOP40H;(40H)←((SP)),(SP)←(SP)-1=31H,(40H)=11HPOP50H;(50H)←((SP)),(SP)←(SP)-1=30H,(50H)=88H三、算術(shù)運(yùn)算類指令
1.加法指令加法指令包括帶進(jìn)位與不帶進(jìn)位加法指令、加1指令和十進(jìn)制調(diào)整指令。(1)不帶進(jìn)位加法指令
ADDA,Rn;(A)←(A)+(Rn)
ADDA,direct;(A)←(A)+(direct)
ADDA,@Ri;(A)←(A)+(Ri)
ADDA,#data;(A)←(A)+data ADDCA,Rn
;(A)←(Cy)+(A)+(Rn)ADDCA,direct;
(A)←(Cy)+(A)+(direct)ADDCA,@Ri;(A)←(Cy)+(A)+((Ri))
ADDCA,#data;(A)←(Cy)+(A)+data
這些指令是將源字節(jié)單元的內(nèi)容與累加器A的內(nèi)容相加,并加上進(jìn)位位Cy的內(nèi)容,結(jié)果放入累加器A中。指令執(zhí)行將影響標(biāo)志AC、OV、Cy、P。其余功能和上面的ADD指令相同。帶進(jìn)位加法指令主要用于多字節(jié)加法的多字節(jié)求和,以考慮低字節(jié)求和向高字節(jié)的進(jìn)位。(2)帶進(jìn)位加法指令例11計(jì)算6655H+11FFH的程序,結(jié)果放入50H、51H中。MOVA,#55HADDA,#0FFHMOV50H,AMOVA,#66HADDCA,#11HMOV51H,A
DAA;若[(A)3~0>9]或[(AC)=1],則(A)3~0←(A)3~0+06H;若[(A)7~4>9]或[(Cy)=1],則[(A)7~4←[(A)7~4+60H
(3).十進(jìn)制調(diào)整指令
在指令系統(tǒng)中,沒有專門的十進(jìn)制(BCD碼)的加法運(yùn)算指令,只能使用ADD、ADDC命令,但有時(shí)會(huì)產(chǎn)生錯(cuò)誤,該指令就是用于對(duì)A中BCD碼加法運(yùn)算結(jié)果進(jìn)行調(diào)整。即兩個(gè)壓縮型BCD碼(兩個(gè)BCD碼存放在一個(gè)字節(jié)存儲(chǔ)單元)按照二進(jìn)制數(shù)相加之后,必須經(jīng)本指令調(diào)整,才能得到壓縮型BCD碼和數(shù)。
執(zhí)行該指令時(shí),判斷A中的低4位是否大于9和輔助進(jìn)位標(biāo)志AC是否為“1”,若兩者有一個(gè)條件滿足,則低4位加6操作;同樣,A中的高4位大于9或進(jìn)位標(biāo)志Cy為“1”兩者有一個(gè)條件滿足時(shí),高4位加6操作。MOVA,#56HADDA,#67HDAA
這段程序中,第一條指令將立即數(shù)送入累加器A;第二條指令進(jìn)行如下加法:0101011056011001116710111101BD0110011066++100100011123得結(jié)果BDH;第三條指令對(duì)累加器A進(jìn)行十進(jìn)制調(diào)整,高4、低4位均大于9,因此要加66H,得調(diào)整的BCD碼123。例13設(shè)有4個(gè)壓縮BCD碼,分別放在內(nèi)部數(shù)據(jù)存儲(chǔ)器50H~51H單元和60H~61H單元中,試編寫求出兩個(gè)數(shù)的和的程序,結(jié)果存放到40H~41H單元中。
MOVA,50H;(A)←(50H)
ADDA,60H;(A)←(A)+(60H)
DAA,;BCD碼調(diào)整
MOV40H,AMOVA,51HADDCA,61HDAAMOV41H,A(4)
加1指令I(lǐng)NCA;(A)←(A)+1INCRn;(Rn)←(Rn)+1INCdirect;(direct)←(direct)+1INC@Ri;((Ri))←((Ri))+1INCDPTR;(DPTR)←(DPTR)+1
將指令中所指出操作數(shù)的內(nèi)容加1,結(jié)果仍存放于原單元中去。若原來(lái)的內(nèi)容為0FFH,則加1后將產(chǎn)生溢出,使操作數(shù)的內(nèi)容變成00H,除“INCA”影響P外,不影響任何標(biāo)志。
2.減法指令
(1)帶借位減法指令SUBBA,Rn;(A)←(A)-(Cy)-(Rn)SUBBA,direct;(A)←(A)-(Cy)-(direct)SUBBA,@Ri;(A)←(A)-(Cy)-((Ri))SUBBA,#data;
(A)←(A)-(Cy)-data帶借位減法指令的功能是將累加器A內(nèi)容減去源地址單元內(nèi)容,并減去進(jìn)位位Cy的內(nèi)容,結(jié)果放入累加器A中。兩個(gè)數(shù)相減時(shí),若D7位有借位,則置Cy為1,否則Cy清0;若D3位有借位,則輔助進(jìn)位AC=1,否則清AC。若D6、D7位不同時(shí)借位,則置OV=1,否則清OV。若A的結(jié)果有奇數(shù)個(gè)1,則置奇偶校驗(yàn)位P為1,否則清0。
例15計(jì)算0EE33H-A0E0H的程序
CLRC;(Cy)←0MOVA,#33H;(A)←33HSUBBA,#0E0H;(A)←(A)-E0HMOV50H,A;(50H)←(A)
MOVA,#0EEHSUBBA,#0A0HMOV51H,A(2)減1指令DECA;(A)←(A)-1DECRn;(Rn)←(Rn)-1DECdirect;(direct)←(direct)-1DEC@Ri;((Ri))←((Ri))-1這組指令的功能是將操作數(shù)所指的單元內(nèi)容減1,其操作不影響標(biāo)志位Cy。若單元原始值為00H,則經(jīng)過(guò)減1操作后變?yōu)?FFH,除“DECA”影響P外,不會(huì)影響任何標(biāo)志位。3.乘、除法指令MCS-51單片機(jī)指令系統(tǒng)中有乘法、除法指令各一條,它們是兩條執(zhí)行時(shí)間最長(zhǎng)的指令,執(zhí)行時(shí)間為4個(gè)機(jī)器周期。(1)乘法指令
MULAB;(B)(A)←(A)×(B)
乘法指令的功能是將累加器A和寄存器B的8位無(wú)符號(hào)整數(shù)相乘,16位積的低8位存于A中,高8位存于B中。如果積大于255(FFH),則溢出標(biāo)志OV置1,否則清0。進(jìn)位標(biāo)志位Cy總是為0。(2)除法指令DIVAB;(A)←(A)/(B)商
;(B)←(A)/(B)
余數(shù)該指令的功能是將A中無(wú)符號(hào)整數(shù)除以B中無(wú)符號(hào)整數(shù),所得到商整數(shù)部分存于A中,余數(shù)部分存于B中。標(biāo)志位Cy和OV清0(當(dāng)除數(shù)為0時(shí)OV置1)。
四.邏輯運(yùn)算類指令1.A操作指令(1)累加器A的“清零”與“取反”指令
CLR
A;(A)←#00HCPLA;(A)←/(A)CPLA指令對(duì)累加器的內(nèi)容逐位取反,不影響標(biāo)志位。
2)累加器A的內(nèi)容帶進(jìn)位標(biāo)志位循環(huán)左移指令:RLCA
3)累加器A循環(huán)右移指令:RRACyD7D04)累加器A的內(nèi)容帶進(jìn)位標(biāo)志位循環(huán)右移指令RRCA1)累加器A循環(huán)左移指令
RL
A(1)移位指令D7D0D7D0CyD7D01)移位操作都是對(duì)累加器A進(jìn)行操作。2)移位指令常用做乘2或除2運(yùn)算。例3-17若(A)=10111101B=0BDH,Cy=0,分析執(zhí)行RLCA后,(A)和Cy的結(jié)果。解:執(zhí)行RLCA后,(A)=01111010B=7AH,Cy=1。
ANLA,RnANLA,directANLA,@RiANLA,#dataANLdirect,AANLdirect,#data
這組指令的功能是:將兩個(gè)操作數(shù)的內(nèi)容按位進(jìn)行邏輯與操作,并將結(jié)果送回目的操作數(shù)的單元中。與0相與,使被修改數(shù)相應(yīng)位清零,與1相與,使被修改數(shù)相應(yīng)位保持原值不變2.邏輯與指令例3-18將累加器A中壓縮BCD碼分為兩個(gè)字節(jié),形成非壓縮BCD碼,放入30H和31H單元中。
MOV40H,A;保存A中的內(nèi)容
ANLA,#00001111B;清高4位,保留低4位
MOV30H,AMOVA,40H;取原數(shù)據(jù)
ANLA,#11110000B;保留高4位,清低4位
SWAPAMOV31H,AORLA,RnORLA,directORLA,@RiORLA,#dataORLdirect,AORLdirect,#data
這組指令的功能是:將兩個(gè)操作數(shù)的內(nèi)容按位進(jìn)行邏輯或操作,并將結(jié)果送回目的操作數(shù)的單元中。與1相或,使被修改數(shù)相應(yīng)位置1,與0相或,使被修改數(shù)相應(yīng)位保持原值不變3.邏輯或指令例3-19將累加器A中的低4位由P1口的低4位輸出,P1口的高4位不變。解:ANLA,#00001111BMOV30H,A;保留A中的低4位
MOVA,P1ANLA,#11110000B;P1的高4位不變
ORLA,30HMOVP1,A4.邏輯異或運(yùn)算指令XPLA,Rn;(A)←(A)⊕(Rn)XRLA,direct;(A)←(A)⊕(direct)XRLA,@Ri;(A)←(A)⊕((Ri))XRLA,#data;(A)←(A)⊕dataXRLdirect,A;(direct)←(A)⊕(direct)XRLdirect,#data;(direct)←(direct)⊕data
與1相異或,使被修改數(shù)相應(yīng)位取反,與0相異或,使被修改數(shù)相應(yīng)位保持原值不變;本指令可判斷兩個(gè)數(shù)是否相等,若相等,則異或結(jié)果為全“0”;否則不相等。
練習(xí):P88,17題五、控制轉(zhuǎn)移類指令
1.無(wú)條件轉(zhuǎn)移指令是指當(dāng)程序執(zhí)行到該指令時(shí),無(wú)條件轉(zhuǎn)移到指令所提供地址處執(zhí)行。無(wú)條件轉(zhuǎn)移指令共有4條,包括長(zhǎng)轉(zhuǎn)移指令、短轉(zhuǎn)移指令、絕對(duì)轉(zhuǎn)移指令和散轉(zhuǎn)指令。(1)長(zhǎng)轉(zhuǎn)移指令
LJMPaddr16;(PC)←addr16該指令執(zhí)行后將16位地址(addr16)傳送給PC,從而實(shí)現(xiàn)程序轉(zhuǎn)移到新的地址開始運(yùn)行,該指令可實(shí)現(xiàn)64KB的范圍內(nèi)任意轉(zhuǎn)移。該指令不影響標(biāo)志位。
(2)絕對(duì)轉(zhuǎn)移指令A(yù)JMPaddr11;(PC)←(PC)+2,(PC10~0)←addr11
由PC15~11信息和指令提供低11位地址組成16位轉(zhuǎn)移目標(biāo)地址,使程序無(wú)條件轉(zhuǎn)向同一2KB存儲(chǔ)空間目的地址執(zhí)行。本指令不影響標(biāo)志位。
(3)相對(duì)轉(zhuǎn)移指令
SJMPrel;(PC)←(PC)+2,(PC)←(PC)+rel
指令中rel是一個(gè)有符號(hào)數(shù)偏移量,其范圍為-128~+127,以補(bǔ)碼形式給出。若rel是正數(shù),則向前轉(zhuǎn)移;若rel是負(fù)數(shù),則向后轉(zhuǎn)移。
1)一條帶有FEH偏移量的SJMP指令,將實(shí)現(xiàn)無(wú)限循環(huán)。這是因?yàn)镕EH是-2的補(bǔ)碼,目的地址=PC+2-2=PC,結(jié)果轉(zhuǎn)向自己,無(wú)限循環(huán),一般在程序用SJMP$來(lái)表示SJMP0FEH。2)該指令中尋址方式稱相對(duì)尋址方式。存儲(chǔ)器80H–128rel+127PCPC+1PC+2……(4)散轉(zhuǎn)指令JMP@A+DPTR;(PC)←(A)+(DPTR)PCDPTR(A)+(DPTR)→PC256BJMP@A+DPTR………
該指令執(zhí)行時(shí),把累加器A中的8位無(wú)符號(hào)數(shù)與DPTR中16位數(shù)相加,其中裝入程序計(jì)數(shù)器PC,控制程序轉(zhuǎn)到目的地址執(zhí)行程序。整個(gè)指令的執(zhí)行過(guò)程中,不改變累加器A和DPTR的內(nèi)容。例3-20
某單片機(jī)應(yīng)用系統(tǒng)有16個(gè)鍵,對(duì)應(yīng)的鍵碼值(00H~0FH)存放在R7中,16個(gè)鍵處理程序的入口地址分別為KEY0,KEY1,……
,KEY15。要求按下某鍵,程序即轉(zhuǎn)移到該鍵的相應(yīng)處理程序執(zhí)行。解:預(yù)先在ROM中建立一張起始地址為KEYG的轉(zhuǎn)移表:AJMPKEY0,……,AJMPKEY15,利用散轉(zhuǎn)指令即可實(shí)現(xiàn)多路分支轉(zhuǎn)移處理。
MOVA,R7RLA;由于AJMP指令為雙字節(jié)指令,鍵值乘2倍
MOVDPTR,#KEYG;轉(zhuǎn)移入口基地址送DPTRJMP@A+DPTR
……
KEYG:AJMPKEY0AJMPKEY1
……AJMPKEY152.條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令是當(dāng)滿足給定的條件時(shí),程序轉(zhuǎn)移到目的地址去執(zhí)行;條件不滿足則順序執(zhí)行下一條指令。條件轉(zhuǎn)移指令分為累加器A判零轉(zhuǎn)移指令、比較轉(zhuǎn)移指令和循環(huán)指令。(1)累加器A判零轉(zhuǎn)移指令
JZrel;(PC)←(PC)+2
當(dāng)(A)=0,(PC)=(PC)+rel,即轉(zhuǎn)移當(dāng)(A)≠0,則程序順序執(zhí)行
JNZrel;(PC)←(PC)+2
當(dāng)(A)≠0,(PC)=(PC)+rel,即轉(zhuǎn)移當(dāng)(A)=0,則程序順序執(zhí)行P102程序閱讀
在MCS-51中沒有專門的比較指令,但提供了下面4條比較不相等轉(zhuǎn)移指令:CJNEA,direct,relCJNEA,#data,relCJNERn,#data,relCJNE@Ri,#data,rel
這組指令的功能是:比較前面兩個(gè)操作數(shù)的大小,如果它們的值不相等則轉(zhuǎn)移。轉(zhuǎn)移地址的計(jì)算方法與上述兩條指令相同。如果第一個(gè)操作數(shù)(無(wú)符號(hào)整數(shù))小于第二個(gè)操作數(shù),則進(jìn)位標(biāo)志Cy置“1”,否則清“0”,但不影響任何操作數(shù)的內(nèi)容。(2)比較轉(zhuǎn)移指令P104程序閱讀(3)循環(huán)控制轉(zhuǎn)移指令DJNZRn,rel;(PC)←(PC)+2,(Rn)←(Rn)-1
當(dāng)(Rn)≠0時(shí),(PC)←(PC)+rel;當(dāng)(Rn)=0時(shí),程序順序執(zhí)行。DJNZdirect,rel;(PC)←(PC)+3,(direct)←(direct)-1
當(dāng)(direct)≠0時(shí),(PC)←(PC)+rel;當(dāng)(direct)=0時(shí),程序順序執(zhí)行。執(zhí)行本指令時(shí),將第一個(gè)操作數(shù)減1后判斷結(jié)果是否為0,若為0,則終止循環(huán)程序段的執(zhí)行,程序往下順序執(zhí)行;若不為0,則轉(zhuǎn)移到目的地址繼續(xù)執(zhí)行循環(huán)程序段。用兩條指令可以構(gòu)成循環(huán)程序,循環(huán)次數(shù)就是第一個(gè)操作數(shù)的值。rel為相對(duì)偏移量。
P95程序閱讀3.子程序調(diào)用
為簡(jiǎn)化程序設(shè)計(jì),經(jīng)常把功能完全相同或反復(fù)使用的程序段單獨(dú)編寫成子程序,供主程序調(diào)用。主程序需要時(shí)通過(guò)調(diào)用指令,無(wú)條件轉(zhuǎn)移到子程序處執(zhí)行,子程序結(jié)束時(shí)執(zhí)行返回指令,再返回到主程序繼續(xù)執(zhí)行。(1)長(zhǎng)調(diào)用指令LCALLaddr16
;(PC)←(PC)+3,
(SP)←(SP)+1,((SP))←(PC7~0);
(SP)←(SP)+1,((SP))←(PC15~8);
(PC)←addr16(2)短調(diào)用指令A(yù)CALLaddr11;(PC)←(PC)+2(SP)←(SP)+1,((SP))←(PC7~0);
(SP)←(SP)+1,((SP))←(PC15~8);
(PC15~0)←addr16
該指令的目的地址形成與11位的無(wú)條件轉(zhuǎn)移指令類似,只是增加了斷點(diǎn)壓棧過(guò)程。指令的執(zhí)行不影響標(biāo)志位。
4.返回指令
返回指令應(yīng)能自動(dòng)恢復(fù)斷點(diǎn),將原壓入棧的PC值彈回到PC中,保證回到斷點(diǎn)處繼續(xù)執(zhí)行主程序。返回指令必須用在子程序或中斷服務(wù)程序的末尾。(1)子程序返回指令RET;(PC15~8)←((SP)),(SP)←(SP)-1;
(PC7~0)←((SP)),(SP)←(SP)-1;這條指令將堆棧頂?shù)?字節(jié)單元內(nèi)容送到PC中,使程序返回到調(diào)用處。
(2)中斷返回指令RETI;(PC15~8)←((SP)),(SP)←(SP)-1;
(PC7~0)←((SP)),(SP)←(SP)-1;該指令用于中斷服務(wù)于程序的末尾,將堆棧頂?shù)?字節(jié)的內(nèi)容送到PC中,它與RET指令不同之處是它同釋放中斷邏輯,使同級(jí)中斷可以被接受。
5.空操作指令NOP;(PC)←(PC)+1
該指令不作任何操作,僅僅將程序計(jì)數(shù)器PC加1,使程序繼續(xù)向下執(zhí)行。該指令為單周期指令,所以在時(shí)間上占用一個(gè)機(jī)器周期,常用于延時(shí)。P116程序閱讀六、位操作類指令數(shù)據(jù)存儲(chǔ)器:片內(nèi)RAM20H~2FH單元共128位,位地址為00H~7FHA、B兩個(gè)寄存器中的各8位,位地址為E0H~E7H、F0H~F7H位累加器:由C兼任I/O口:在SRF中共有44個(gè)布爾I/O口通用I/O口:共32個(gè)(P0.0~P0.7、P1.0~P1.7、P2.0~P2.7、P3.0~P3.7)用于定時(shí)器和串行口進(jìn)行控制和測(cè)試的:16個(gè)(TCON0~TCON7、SCON0~SCON7)用于中斷系統(tǒng)的:11個(gè)(IE1~IE4、IE7、IP0~IP4)用于PSW中的:7個(gè)(PSW.0、PSW.2~PSW.7)位操作指令:17條位地址的表示形式(1)直接(位)地址表示方式,如0D4H。(2)點(diǎn)表示方式,如PSW.4。(3)位名稱表示方式,如RS1。(4)標(biāo)號(hào)表示方式,如用偽指令BIT定義:
WBZD0BITEX0經(jīng)定義后,允許指令中使用WBZD0代替EX0。
位數(shù)據(jù)傳送指令
位數(shù)據(jù)傳送指令的兩個(gè)操作數(shù),一個(gè)是指定的位單元,另一個(gè)必須是位累加器Cy(進(jìn)位位標(biāo)志Cy)。MOVC,bit;(Cy)←(bit)MOVbit,C;(bit)←(Cy)bit為內(nèi)部RAM中的20H~2FH單元中128個(gè)可尋址位和特殊功能寄存器中的可位尋址位。此指令不影響其他寄存器或標(biāo)志位。1.位邏輯運(yùn)算指令(1)置“1”指令SETBC;(Cy)←1SETBbit;(bit)←1(2)位清“0”指令CLRC;(Cy)←0CLRbit;(bit)←0(3)位取反指令
CPLC;(Cy)←/(Cy)
CPLbit;(bit)←/(bit)(4)位邏輯“與”指令
ANLC,bit;(Cy)←(Cy)∧(bit)
ANLC,/bit;(Cy)←(Cy)∧/(bit)(5)位邏輯“或”指令
ORLC,bit;(Cy)←(Cy)∨(bit)
ORLC,/bit;(Cy)←(Cy)∨/(bit)
2.位控制轉(zhuǎn)移指令位控制轉(zhuǎn)移指令按照不同的條件分為以Cy內(nèi)容為條件的轉(zhuǎn)移指令和以位地址bit內(nèi)容為條件的轉(zhuǎn)移指令兩類。(1)判布爾累加器Cy的轉(zhuǎn)移指令JCrel;若(Cy)=1,則(PC)←(PC)+2+rel,即轉(zhuǎn)移若(Cy)=0,則(PC)←(PC)+2,即順序執(zhí)行JNCrel;若(Cy)=0,則(PC)←(PC)+2+rel,即轉(zhuǎn)移若(Cy)=1,則(PC)←(PC)+2,即順序執(zhí)行注:執(zhí)行該指令時(shí),不改變進(jìn)位位Cy的值。(2)判位變量轉(zhuǎn)移指令JBbit,rel
;若(bit)=1,則(PC)←(PC)+3+rel,即轉(zhuǎn)移若(bit)=0,則(PC)←(PC)+3,即順序執(zhí)行JNBbit,rel
;若(bit)=0,則(PC)←(PC)+3+rel,即轉(zhuǎn)移若(bit)=1,則(PC)←(PC)+3,即順序執(zhí)行兩條指令不改變bit值,不影響標(biāo)志位。
(3)判位變量為1轉(zhuǎn)移并清零指令JBCbit,rel;若(bit)=0,則(PC)←(PC)+3;若(bit)=1,則(PC)←(PC)+3+rel,且(bit)←0
注意:不管bit位為何值,執(zhí)行該指令后,bit位值為0。例22編寫一程序完成下圖的邏輯電路運(yùn)算處理。
Z&&1&≥1ABCD
圖中A、B、C、D為邏輯輸入,而Z是運(yùn)算結(jié)果輸出量。為了使邏輯問(wèn)題用單片機(jī)來(lái)處理,先選擇一些端口位作為邏輯入變量和邏輯輸出變量。定義:P1.0=A,P1.1=B,P1.2=C,P1.3=D,P1.4=ZP1.4=P1.0∧P1.1∨((P1.2∧P1.3)∧P1.3)MOVC,P1.0;輸入變量AANLC,P1.1CPLCMOV30H,C;保存中間運(yùn)算結(jié)果
MOVC,P1.2ANLC,P1.3ANLC,/P1.3ORLC,30HCPLCMOVP1.4,C;輸出運(yùn)算結(jié)果P1.4=P1.0∧P1.1∨((P1.2∧P1.3)∧P1.3)七、源程序的編輯和匯編1、源程序的編輯源程序的編寫要依據(jù)80C51匯編語(yǔ)言的基本規(guī)則,特別要用好常用的匯編命令(即偽指令),例如下面的程序段:
ORG0040HMOVA,#7FHMOVR1,#44HEND
這里的ORG和END是兩條偽指令,其作用是告訴匯編程序此匯編源程序的起止位置。編輯好的源程序應(yīng)以“.ASM”擴(kuò)展名存盤,以備匯編程序調(diào)用。
2、源程序的匯編
將匯編語(yǔ)言源程序轉(zhuǎn)換為單片機(jī)能執(zhí)行的機(jī)器碼形式的目標(biāo)程序的過(guò)程叫匯編。常用的方法有兩種:手工匯編時(shí),把程序用助記符指令寫出后,通過(guò)手工方式查指令編碼表,逐個(gè)把助記符指令翻譯成機(jī)器碼,然后把得到的機(jī)器碼程序(以十六進(jìn)制形式)鍵入到單片機(jī)開發(fā)機(jī)中,并進(jìn)行調(diào)試。機(jī)器匯編是在常用的個(gè)人計(jì)算機(jī)PC上,使用交叉匯編程序?qū)R編語(yǔ)言源程序轉(zhuǎn)換為機(jī)器碼形式的目標(biāo)程序。生成的目標(biāo)程序由PC機(jī)傳送到開發(fā)機(jī)上,經(jīng)調(diào)試無(wú)誤后,再固化到單片機(jī)的程序存儲(chǔ)器ROM中。
源程序經(jīng)過(guò)機(jī)器匯編后,形成的若干文件中含有兩個(gè)主要文件,一是列表文件,另一個(gè)是目標(biāo)碼文件。因匯編軟件的不同,文件的格式及信息會(huì)有一些不同。但主要信息如下:列表文件:地址目標(biāo)碼匯編程序
ORG0040H0040H747FMOVA,#7FH0042H7944MOVR1,#44HEND目標(biāo)碼文件:首地址末地址目標(biāo)碼0040H0044H747F7944
偽指令是匯編程序能夠識(shí)別并對(duì)匯編過(guò)程進(jìn)行某種控制的匯編命令。它不是單片機(jī)執(zhí)行的指令,所以沒有對(duì)應(yīng)的可執(zhí)行目標(biāo)碼,匯編后產(chǎn)生的目標(biāo)程序中不會(huì)再出現(xiàn)偽指令。八、偽指令1、起始地址設(shè)定偽指令ORG格式為:
ORG表達(dá)式該指令的功能是向匯編程序說(shuō)明下面緊接的程序段或數(shù)據(jù)段存放的起始地址。表達(dá)式通常為16進(jìn)制地址,也可以是已定義的標(biāo)號(hào)地址。
ORG8000HSTART:MOVA,#30H……
此時(shí)規(guī)定該段程序的機(jī)器碼從地址8000H單元開始存放。
在每一個(gè)匯編語(yǔ)言源程序的開始,都要設(shè)置一條ORG偽指令來(lái)指定該程序在存儲(chǔ)器中存放的起始位置。若省略O(shè)RG偽指令,則該程序段從0000H單元開始存放。在一個(gè)源程序中,可以多次使用ORG偽指令規(guī)定不同程序段或數(shù)據(jù)段存放的起始地址,但要求地址值由小到大依序排列,不允許空間重疊。2、匯編結(jié)束偽指令END格式為:
END
該指令的功能是結(jié)束匯編。匯編程序遇到END偽指令后即結(jié)束匯編。處于END之后的程序,匯編程序?qū)⒉惶幚怼?、字節(jié)數(shù)據(jù)定義偽指令DB
變量DB字節(jié)數(shù)據(jù)表
功能是從標(biāo)號(hào)指定的地址開始,在ROM中定義字節(jié)數(shù)據(jù)。該偽指令將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲(chǔ)單元中。一個(gè)數(shù)據(jù)占一個(gè)存儲(chǔ)單元。例如: DB“howareyou?” 把字符串中的字符以ASCII碼的形式存放在連續(xù)的ROM單元中。又如:
DB-2,-4,-6,8,10,18
把6個(gè)數(shù)轉(zhuǎn)換為十六進(jìn)制表示(FEH,F(xiàn)CH,F(xiàn)AH,08H,0AH,12H),并連續(xù)地存放在6個(gè)ROM單元。
該偽指令常用于存放數(shù)據(jù)表格。如要存放顯示用的十六進(jìn)制的字形碼,可以用多條DB指令完成:
DB0C0H,0F9H,0A4H,0B0HDB99H,92H,82H,0F8HDB80H,90H,88H,83HDBC6H,A1H,86H,84H4、字?jǐn)?shù)據(jù)定義偽指令DW變量DW字?jǐn)?shù)據(jù)表功能是從標(biāo)號(hào)指定的地址單元開始,在程序存儲(chǔ)器中定義字?jǐn)?shù)據(jù)。該偽指令將字或字表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲(chǔ)單元中。應(yīng)特別注意:16位的二進(jìn)制數(shù),高8位存放在低地址單元,低8位存放在高地址單元。例如:ORG1400HDATA:DW324AH,3CH……
匯編后,(1400H)=32H,(1401H)=4AH,(1402H)=00H,(1403H)=3CH。5、空間定義偽指令DS[標(biāo)號(hào):]DS表達(dá)式功能是從標(biāo)號(hào)指定的地址單元開始,在程序存儲(chǔ)器中保留由表達(dá)式所指定的個(gè)數(shù)的存儲(chǔ)單元作為備用的空間,并都填以零值。例如:ORG3000HBUF:DS50……
匯編后,從地址3000H開始保留50個(gè)存儲(chǔ)單元作為備用單元。
6、賦值偽指令EQU
符號(hào)名EQU表達(dá)式功能是將表達(dá)式的值或特定的某個(gè)匯編符號(hào)定義為一個(gè)指定的符號(hào)名。例如:
ORG1000H LEN EQU10 SUM EQU21H BLOCK EQU22H CLRA MOVR7,#LEN MOVR0,#BLOCK LOOP: ADDA,@R0 INCR0 DJNZR7,LOOP MOVSUM,A END
該程序的功能是,把BLOCK單元開始存放的10個(gè)無(wú)符號(hào)數(shù)進(jìn)行求和(≤255),并將結(jié)果存入SUM單元中。7、位地址符號(hào)定義偽指令BIT格式為:符號(hào)名BIT位地址表達(dá)式功能是將位地址賦給指定的符號(hào)名。其中,位地址表達(dá)式可以是絕對(duì)地址,也可以是符號(hào)地址。例如:
STBITP1.0
將P1.0的位地址賦給符號(hào)名ST,在其后的編程中就可以用ST來(lái)代替P1.0。4.3.1順序程序(無(wú)分支、無(wú)循環(huán))程序舉例【例4-1】片內(nèi)RAM的21H單元存放一個(gè)十進(jìn)制數(shù)據(jù)十位的ASCII碼,22H單元存放該數(shù)據(jù)個(gè)位的ASCII碼。編寫程序?qū)⒃摂?shù)據(jù)轉(zhuǎn)換成壓縮BCD碼存放在20H單元。ORG0040HSTART:MOVA,21H;取十位ASCII碼
ANLA,#0FH;保留低半字節(jié)
SWAPA;移至高半字節(jié)
MOV20H,A;存于20H單元
MOVA,22H;取個(gè)位ASCII碼
ANLA,#0FH;保留低半字節(jié)
ORL20H,A;合并到結(jié)果單元
SJMP$END4.3.2分支程序【例4-2】設(shè)變量x以補(bǔ)碼的形式存放在片內(nèi)RAM的30H單元,變量y與x的關(guān)系是:當(dāng)x大于0時(shí),y=x;當(dāng)x=0時(shí),y=20H;當(dāng)x小于0時(shí),y=x+5。編制程序,根據(jù)x的大小求y并送回原單元。
ORG0040HSTART:MOVA,30H;取x至累加器
JZNEXT;x=0,轉(zhuǎn)NEXTANLA,#80H;否,保留符號(hào)位
JZDONE;x>0,轉(zhuǎn)結(jié)束
MOVA,#05H;x<0處理
ADDA,30HMOV30H,A;X+05H送YSJMPDONENEXT:MOV30H,#20H;x=0,20H送YDONE:SJMPDONEEND2023/3/1110【例4-3】根據(jù)R7的內(nèi)容x(轉(zhuǎn)移序號(hào))轉(zhuǎn)向相應(yīng)的處理程序。設(shè)R7內(nèi)容為0~4,對(duì)應(yīng)的處理程序入口地址分別為PP0~PP4。
2023/3/1111START: MOVR7,#3;以轉(zhuǎn)移序號(hào)3為例
ACALLJPNUM AJMPSTARTJPNUM: MOVDPTR,#TAB;置分支入口地址表首址
MOVA,R7 ADDA,R7;乘2,調(diào)整偏移量
MOVR3,AMOVCA,@A+DPTR;取地址高字節(jié),暫存于R3XCHA,R3INCAMOVCA,@A+DPTR;取地址低字節(jié)
MOVDPL,A;處理程序入口地址低8位送DPLMOVDPH,R3;處理程序入口地址高8位送DPHCLRA
JMP@A+DPTR
2023/3/1112TAB: DWPP0 DWPP1 DWPP2
DWPP3 DWPP4PP0: MOV30H,#0;轉(zhuǎn)移序號(hào)為0時(shí),置功能號(hào)“0”于30H單元
RETPP1: MOV30H,#1;轉(zhuǎn)移序號(hào)為1時(shí),置功能號(hào)“1”于30H單元
RETPP2: MOV30H,#2;轉(zhuǎn)移序號(hào)為2時(shí),置功能號(hào)“2”于30H單元
RET
PP3: MOV30H,#3;轉(zhuǎn)移序號(hào)為3時(shí),置功能號(hào)“3”于30H單元
RETPP4: MOV30H,#4;轉(zhuǎn)移序號(hào)為4時(shí),置功能號(hào)“4”于30H單元
RET 4.3.3循環(huán)程序【例4-4】將內(nèi)部RAM的30H至3FH單元初始化為00H。ORG0040HMAIN:MOVR0,#30H;置初值
MOVA,#00H;MOVR7,#16;LOOP:MOV@R0,A;循環(huán)處理
INCR0;DJNZR7,LOOP;循環(huán)修改,判結(jié)束
SJMP$;結(jié)束處理END2023/3/11144.4子程序及其調(diào)用完成通用功能、反復(fù)使用的程序設(shè)計(jì)成子程序。使應(yīng)用程序結(jié)構(gòu)清晰緊湊,便于閱讀和調(diào)試執(zhí)行要由其它程序來(lái)調(diào)用,執(zhí)行完后要返回到調(diào)用程序結(jié)構(gòu)上仍然采用一般程序的3種結(jié)構(gòu)調(diào)用時(shí)注意:一是現(xiàn)場(chǎng)的保護(hù)和恢復(fù);二是主程序與子程序間的參數(shù)傳遞。4.4子程序及其調(diào)用現(xiàn)場(chǎng)保護(hù)與恢復(fù)在主程序中實(shí)現(xiàn)(結(jié)構(gòu)靈活)在子程序中實(shí)現(xiàn)(程序規(guī)范、清晰)參數(shù)傳遞利用累加器或寄存器(簡(jiǎn)單、快速,但參數(shù)個(gè)數(shù)不多)利用存儲(chǔ)器(個(gè)數(shù)多,用R0或R1及DPTR為參數(shù)表指針)利用堆棧
4.4.3常用子程序示例(略)查表程序p112延時(shí)程序p116練習(xí):編寫程序,控制p1.0連接的發(fā)光二極管實(shí)現(xiàn)0.5s的閃亮,系統(tǒng)晶振為6MHz。要求,至少兩個(gè)函數(shù)的設(shè)計(jì)主函數(shù)延時(shí)子函數(shù)練習(xí):編寫程序,控制p2連接的數(shù)碼管,實(shí)現(xiàn)0.5s的切換數(shù)值從0-9循環(huán)顯示,系統(tǒng)晶振為6MHz。要求,至少三個(gè)函數(shù)的設(shè)計(jì)主函數(shù)延時(shí)子函數(shù)查表子函數(shù)(獲取數(shù)值x的段碼)匯編語(yǔ)言編程總結(jié)特點(diǎn):操作對(duì)象(變量)——全局變量功能有限優(yōu)勢(shì):代碼高效冗余少,運(yùn)行速度快,實(shí)時(shí)性高,適合短小高速的程序。劣勢(shì):編程難度大,不便于閱讀、修改、移植概述C51開發(fā)流程C51的優(yōu)點(diǎn)1、編譯器能自動(dòng)完成變量的存儲(chǔ)單元的分配。2、能對(duì)算法和應(yīng)用程序進(jìn)行移植。3、能對(duì)關(guān)鍵代碼進(jìn)行優(yōu)化。第二部分80C51單片機(jī)的C語(yǔ)言程序設(shè)計(jì)一、C51數(shù)據(jù)類型C51具有標(biāo)準(zhǔn)C語(yǔ)言的所有標(biāo)準(zhǔn)數(shù)據(jù)類型,針對(duì)51單片機(jī)內(nèi)部結(jié)構(gòu)增加了以下特殊數(shù)據(jù)類型:(1)bit位變量。(2)sbit可獨(dú)立尋址的位變量。(3)sfr8位特殊功能寄存器。(4)sfr1616位特殊功能寄存器。1.bit位變量
bit位變量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,利用它可定義一個(gè)位標(biāo)量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個(gè)二進(jìn)制位,不是0就是1。2.sbit可尋址位 sbit同樣是單片機(jī)C語(yǔ)言中的一種擴(kuò)充數(shù)據(jù)類型,利用它能訪問(wèn)芯片內(nèi)部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。
C51數(shù)據(jù)類型3.sfr特殊功能寄存器
sfr也是一種擴(kuò)充數(shù)據(jù)類型,占用一個(gè)內(nèi)存單元,值域?yàn)?~255。利用它能訪問(wèn)51單片機(jī)內(nèi)部的所有特殊功能寄存器。4.sfr1616位特殊功能寄存器 sfr16占用兩個(gè)內(nèi)存單元,值域?yàn)?~65535。sfr16和sfr一樣用于操作特殊功能寄存器,不同的是它用于操作占兩個(gè)字節(jié)的寄存器,如定時(shí)器T2。C51數(shù)據(jù)類型表1
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國(guó)燃燒電池氧分析儀行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)家用燃?xì)鈱S媚z管行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2030年中國(guó)彎玻璃數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 二零二五年度老舊違建拆除及環(huán)境整治項(xiàng)目合作協(xié)議書3篇
- 二零二五版電子元器件物品質(zhì)押融資合同3篇
- 2025版消防應(yīng)急廣播系統(tǒng)安裝與維護(hù)承包合同范本3篇
- 二零二五版林業(yè)資源保護(hù)土地承包協(xié)議3篇
- 2025版物業(yè)委托經(jīng)營(yíng)管理合同范本(含社區(qū)醫(yī)院)3篇
- 二零二五年度企業(yè)職工失業(yè)保險(xiǎn)補(bǔ)貼協(xié)議書3篇
- 《眼科》主治醫(yī)師考試測(cè)試題(含答案)
- 化學(xué)-河南省TOP二十名校2025屆高三調(diào)研考試(三)試題和答案
- 智慧農(nóng)貿(mào)批發(fā)市場(chǎng)平臺(tái)規(guī)劃建設(shè)方案
- 小學(xué)數(shù)學(xué)分?jǐn)?shù)四則混合運(yùn)算300題帶答案
- 林下野雞養(yǎng)殖建設(shè)項(xiàng)目可行性研究報(bào)告
- 2023年水利部黃河水利委員會(huì)招聘考試真題
- Python編程基礎(chǔ)(項(xiàng)目式微課版)教案22
- 01J925-1壓型鋼板、夾芯板屋面及墻體建筑構(gòu)造
- 欠電費(fèi)合同范本
- 2024年新高考地區(qū)數(shù)學(xué)選擇題填空壓軸題匯編十八含解析
- 大型商場(chǎng)招商招租方案(2篇)
- 2022年袋鼠數(shù)學(xué)競(jìng)賽真題一二年級(jí)組含答案
評(píng)論
0/150
提交評(píng)論