版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
工程二指令系統(tǒng)學(xué)習(xí)目標(biāo)知識目標(biāo):掌握匯編語言的尋址方式、根本指令格式、熟悉常用指令功能;程序流程圖的繪制方法;常用程序的編寫方法和技巧。掌握C語言的編寫方法和技巧。技能目標(biāo):能根據(jù)要求編寫常用程序。2.1概述一、指令指令是指揮計(jì)算機(jī)工作的命令,一種計(jì)算機(jī)所能執(zhí)行的指令集合稱之為計(jì)算機(jī)指令系統(tǒng)。
MCS-51單片機(jī)主要有兩種指令形式:機(jī)器語言指令匯編語言指令。
1.機(jī)器指令用二進(jìn)制代碼表示的指令稱為機(jī)器語言指令,也稱機(jī)器碼。例如:“累加器A加1〞指令用二進(jìn)制數(shù)表示時,是“00000100〞,在程序存儲器中占用一個字節(jié)單元。2.匯編語言指令用容易記憶的縮寫符號表示機(jī)器語言指令就是匯編語言指令。例如,“A加B〞用英語寫出來是“AddBtoA〞,縮寫成“ADDA,B〞。這個“ADDA,B〞就是匯編語言指令。MCS-51單片機(jī)的開發(fā)商約定:“ADDA,B〞與25F0H對應(yīng)。我們將“ADD〞縮寫符號稱為“助記符〞。編寫機(jī)器語言程序?qū)嵸|(zhì)上就是用匯編語言編寫程序。兩種語言指令對照:匯編語言指令機(jī)器語言指令MOVA,#0AH74H0AHADDA,#14H24H14H2.28051匯編語言指令指令組成:操作碼助記符操作數(shù)括號內(nèi)的局部是可選項(xiàng)。每個字段之間要用分隔符分隔,可以用作分隔符的符號有空格、冒號、逗號、分號等。指令格式:[標(biāo)號:]操作碼[目的操作數(shù)][,源操作數(shù)];[注釋]LOOP:MOVA,3AH;〔A〕←(3AH)1.標(biāo)號標(biāo)號是語句地址的標(biāo)志符號,代表該語句指令代碼第一個字節(jié)的地址。(1)標(biāo)號由1~8個ASCII字符組成,且第一個字符必須是字母,其余字符可以是字母、數(shù)字或其他特定字符。(2)不能使用該匯編語言已經(jīng)定義了的符號作為標(biāo)號。如指令助記符、存放器符號名稱等。(3)標(biāo)號后必須跟冒號。2.操作碼操作碼用于規(guī)定語句執(zhí)行的操作。它是匯編語句中唯一不能空缺的局部,也是語句的核心,它用指令助記符表示。3.操作數(shù)操作數(shù)用于給指令的操作提供數(shù)據(jù)或地址。在一條匯編語句中操作數(shù)可能是空缺的,也可能包括一項(xiàng),還可能包括兩項(xiàng)或三項(xiàng)。當(dāng)有多個操作數(shù)時,各操作數(shù)間以逗號分隔。(1)工作存放器名。(2)特殊功能存放器名。(3)標(biāo)號名。(4)常數(shù)。(5)符號“$〞,表示程序計(jì)數(shù)器PC的當(dāng)前值。(6)表達(dá)式。4.注釋注釋不屬于匯編語句的功能局部,它只是對語句的說明。注釋字段可以增加程序的可讀性,有助于編程人員的閱讀和維護(hù)。注釋字段必須以分號“;〞開頭,長度不限可以換行接著書寫,但換行時應(yīng)注意在開頭使用分號“;〞。指令的描述中經(jīng)常用到一些特殊符號
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位帶符號的偏移量字節(jié)bit:內(nèi)部數(shù)據(jù)RAM或SFR的可直接尋址位。/位操作數(shù)的前綴,表示對該位取反。(X)X中的內(nèi)容。((X))由X尋址的單元中的內(nèi)容?!硎緮?shù)據(jù)的傳送方向。<=>表示數(shù)據(jù)交換。MCS-51單片機(jī)指令系統(tǒng)的分類
按指令所占存儲器字節(jié)數(shù)分〔1〕單字節(jié)指令〔49條〕〔2〕雙字節(jié)指令〔46條〕〔3〕三字節(jié)指令〔16條〕按指令執(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程序存儲器…1110010100111010PC+1內(nèi)部RAM…3AH39H10011111…XXH目的地R0、R1DPTRMOVA,@R13.存放器間接尋址指令操作數(shù)的地址事先存放在某個存放器中,由該存放器的內(nèi)容指定操作數(shù)地址的尋址方式,稱為存放器間接尋址,@為間接尋址指示符。信在XXH中存放器可尋址內(nèi)部RAM128B、外部RAM尋址DPTRMOVA,@R0PC操作碼程序存儲器11100110….….….~內(nèi)部RAM47H65H65HR0….~~~47HA4.立即數(shù)尋址立即數(shù)尋址是由指令直接給出操作數(shù)的尋址方式。#為立即數(shù)的標(biāo)識符。目的地MOVA,#30H速遞快信30HA這類指令大都是雙字節(jié)指令,僅有指令:MOVDPTR,#DATA16是三字節(jié)指令,它提供兩字節(jié)立即數(shù),如:MOVDRTR,#1600H,它的機(jī)器指令格式下所示:100100000001011000000000使用專用的匯編語言編譯程序把編寫的匯編語言源程序編譯成機(jī)器語言程序,對立即數(shù)的書寫一般有要求:對于單字節(jié)立即數(shù),假設(shè)數(shù)值大于等于A0H,那么要在其前面加一個0,如指令“MOVA,#0A0H〞,該指令含義是把立即數(shù)A0H送累計(jì)器;對于雙字節(jié)立即數(shù),假設(shè)數(shù)值大于等于A000H,那么要在其前面加一個0。對于直接地址和偏移量也按相同方法書寫。第一位數(shù)字是A~F時請?jiān)谄淝凹?5.變址尋址〔基址存放器+變址存放器間接尋址〕變址間接尋址是將指令中基地址〔基址存放器〕和偏移量地址〔變址存放器〕的內(nèi)容相加形成真正的操作數(shù)地址?;反娣牌?000H變址存放器PCDPTRA程序存儲器65H….….1000H+30H1030H30H65H6.相對尋址以當(dāng)前的PC值加上指令中給出的相對偏移量rel而形成轉(zhuǎn)移目的地址的尋址方式。2000H+2H+28H······SJMP28H202AH程序存儲器2000H2002H源地址目的地址rel轉(zhuǎn)移指令本身字節(jié)數(shù)rel是有符號的8位二進(jìn)制數(shù),用補(bǔ)碼表示。相對偏移在+127~-128字節(jié)單元之間。7.位尋址位尋址適用于可以進(jìn)行單獨(dú)位操作的指令,指令中直接給出位地址尋找位操作數(shù)。參與操作的數(shù)據(jù)是1bit而不是1B。位地址用bit表示,以區(qū)別字節(jié)地址direct。
PCPC+11010001000110111程序存儲器操作碼0CyACFORSIRS0OVPPSW內(nèi)部RAM位地址空間26H3736353433323130MOVC,37H0尋址空間及舉例
尋址方式存儲器空間存放器尋址R0~R7、A、B、Cy〔位〕、DPTR直接尋址內(nèi)部數(shù)據(jù)存儲器00H~7FH字節(jié)單元特殊功能存放器存放器間接尋址內(nèi)部數(shù)據(jù)存儲器(@R1、@R0)外部數(shù)據(jù)存儲器(@R1、@R0、@DPTR)立即數(shù)尋址程序存儲器(操作常數(shù))變址間接尋址程序存儲器(@A+DPTR、@A+PC)相對尋址程序存儲器(修改了PC值)位尋址內(nèi)部數(shù)據(jù)存儲器及特殊功能存放器中某些單元位
表3-1每一種尋址方式可涉及的存儲器空間例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
存放器尋址變址尋址直接尋址存放器間接尋址存放器尋址相對尋址位尋址位尋址直接尋址存放器尋址存放器間接尋址直接尋址存放器尋址立即數(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,其匯編語言指令格式為:
MOV[目的地址],[源地址]〔1〕以累加器A為目的的傳送指令
功能
執(zhí)行時間
(A)←(Rn)1Tcy(A)←(direct)1Tcy(A)←((Ri))1Tcy(A)←#data1Tcy11101rrr匯編語言指令MOVA,RnMOVA,directMOVA,@RiMOVA,#data機(jī)器語言指令11100101direct1110011i01110100data指令中Rn表示工作存放器R0~R7,用機(jī)器碼指令中的低3位指代工作存放器的地址,其中:rrr=000~111,對應(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ù)尋址?!?〕以通用存放器Rn為目的的傳送指令MOVRn,A;(Rn)←〔A〕MOVRn,direct;(Rn)←(direct)MOVRn,#data;(Rn)←data這三條指令都是以工作存放器為目的操作數(shù),源操作數(shù)的尋址方式有存放器尋址、直接尋址和立即數(shù)尋址?!?〕以存放器間接地址為目的的傳送指令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的某一個單元和累加器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é)果和功能?!?〕半字節(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ù)存儲器的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ù)存儲器傳送指令
當(dāng)把一個數(shù)據(jù)送到單片機(jī)外部擴(kuò)展RAM的某個單元或外部擴(kuò)展I/O口某個端口,或者從該單元、端口將數(shù)據(jù)取回到單片機(jī)內(nèi)部的時候,就要用到這種指令。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ù)存儲器的0060H單元。MOVR0,#60H;地址送間址存放器MOVX@R0,A;A中內(nèi)容送外部數(shù)據(jù)存儲器的0060H單元MOVP2,#00;輸出地址高8位輸出00H例7將外部存儲器的2000H單元的內(nèi)容送入2100H單元。MOVDPTR,#2000H;(DPTR)=2000HMOVXA,@DPTR;(A)=((DPTR))MOVDPTR,#2100H;(DPTR)=2100HMOVX@DPTR,A;((DPTR))=(A)5.ROM數(shù)據(jù)訪問指令MOVCA,@A+DPTR;
(A)←((A)+(DPTR))ROMMOVCA,@A+PC;(PC)←(PC)+1,(A)←((A)+(PC))ROM1065ALU1060H+05H=1065H程序存儲器PCMOVCA,@A+DPTR34H…………05HDPLDPHA10H60H…指令執(zhí)行后,A中的內(nèi)容那么為34H,而不再是5H34H兩個指令的比較MOVCA,@A+DPTR:這條指令的執(zhí)行結(jié)果只與指針DPTR及累加器A的內(nèi)容有關(guān),與該指令存放的地址無關(guān),因此,表格的大小和位置可以在64KB程序存儲器中任意安排,并且一個表格可以為各個程序塊所共用。MOVCA,@A+PC:這條指令的優(yōu)點(diǎn)是不改變特殊功能存放器和PC的狀態(tài),只要根據(jù)A的內(nèi)容就可以取出表格中的常數(shù)。缺點(diǎn)是表格只能放在該條查表指令后面的256個單元之內(nèi),表格的大小受到限制,而且表格只能被一段程序所利用。例8:設(shè)A的內(nèi)容為BCD碼〔高4位為全0〕,試用查表法來求得相應(yīng)的ASCII碼。方法(一):BCD_ASC:MOVDPTR,#TABMOVCA,@A+DPTRRETTAB:DB30H,31H,32H,33H,34HDB35H,36H,37H,38H,39H6.棧操作指令片內(nèi)RAM中有一個先進(jìn)后出的堆棧操作緩沖區(qū)域,主要用于保護(hù)和恢復(fù)CPU的工作現(xiàn)場,也可實(shí)現(xiàn)內(nèi)部RAM單元之間的數(shù)據(jù)傳送。〔1〕入棧指令:PUSHdirect;(SP)←〔SP〕+1,〔〔SP〕〕←〔direct〕先將堆棧指針存放器的內(nèi)容加1,指向堆棧頂?shù)囊粋€單元中,然后將指令指定的直接尋址單元內(nèi)容傳送到這個單元中?!?〕出棧指令: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〕=88H1.加法指令加法指令包括帶進(jìn)位與不帶進(jìn)位加法指令、加1指令和十進(jìn)制調(diào)整指令?!?〕不帶進(jìn)位加法指令A(yù)DDA,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,ADAA;假設(shè)[(A)3~0>9]或[(AC)=1],那么(A)3~0←(A)3~0+06H;假設(shè)[(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命令,但有時會產(chǎn)生錯誤,該指令就是用于對A中BCD碼加法運(yùn)算結(jié)果進(jìn)行調(diào)整。即兩個壓縮型BCD碼〔兩個BCD碼存放在一個字節(jié)存儲單元〕按照二進(jìn)制數(shù)相加之后,必須經(jīng)本指令調(diào)整,才能得到壓縮型BCD碼和數(shù)。執(zhí)行該指令時,判斷A中的低4位是否大于9和輔助進(jìn)位標(biāo)志AC是否為“1〞,假設(shè)兩者有一個條件滿足,那么低4位加6操作;同樣,A中的高4位大于9或進(jìn)位標(biāo)志Cy為“1〞兩者有一個條件滿足時,高4位加6操作。MOVA,#56HADDA,#67HDAA
這段程序中,第一條指令將立即數(shù)送入累加器A;第二條指令進(jìn)行如下加法:0101011056011001116710111101BD0110011066++100100011123得結(jié)果BDH;第三條指令對累加器A進(jìn)行十進(jìn)制調(diào)整,高4、低4位均大于9,因此要加66H,得調(diào)整的BCD碼123。例13設(shè)有4個壓縮BCD碼,分別放在內(nèi)部數(shù)據(jù)存儲器50H~51H單元和60H~61H單元中,試編寫求出兩個數(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é)果仍存放于原單元中去。假設(shè)原來的內(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中。兩個數(shù)相減時,假設(shè)D7位有借位,那么置Cy為1,否那么Cy清0;假設(shè)D3位有借位,那么輔助進(jìn)位AC=1,否那么清AC。假設(shè)D6、D7位不同時借位,那么置OV=1,否那么清OV。假設(shè)A的結(jié)果有奇數(shù)個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。假設(shè)單元原始值為00H,那么經(jīng)過減1操作后變?yōu)?FFH,除“DECA〞影響P外,不會影響任何標(biāo)志位。3.乘、除法指令MCS-51單片機(jī)指令系統(tǒng)中有乘法、除法指令各一條,它們是兩條執(zhí)行時間最長的指令,執(zhí)行時間為4個機(jī)器周期?!玻薄吵朔ㄖ噶頜ULAB;(B)(A)←(A)×(B)乘法指令的功能是將累加器A和存放器B的8位無符號整數(shù)相乘,16位積的低8位存于A中,高8位存于B中。如果積大于255〔FFH〕,那么溢出標(biāo)志OV置1,否那么清0。進(jìn)位標(biāo)志位Cy總是為0?!?〕除法指令DIVAB;(A)←(A)/(B)商;(B)←(A)/(B)余數(shù)該指令的功能是將A中無符號整數(shù)除以B中無符號整數(shù),所得到商整數(shù)局部存于A中,余數(shù)局部存于B中。標(biāo)志位Cy和OV清0〔當(dāng)除數(shù)為0時OV置1〕。四.邏輯運(yùn)算類指令1.A操作指令〔1〕累加器A的“清零〞與“取反〞指令CLRA;(A)←#00HCPLA;(A)←/(A)CPLA指令對累加器的內(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)左移指令
RLA〔1〕移位指令D7D0D7D0CyD7D01〕移位操作都是對累加器A進(jìn)行操作。2〕移位指令常用做乘2或除2運(yùn)算。例3-17假設(shè)〔A〕=10111101B=0BDH,Cy=0,分析執(zhí)行RLCA后,〔A〕和Cy的結(jié)果。解:執(zhí)行RLCA后,〔A〕=01111010B=7AH,Cy=1。ANLA,RnANLA,directANLA,@RiANLA,#dataANLdirect,AANLdirect,#data
這組指令的功能是:將兩個操作數(shù)的內(nèi)容按位進(jìn)行邏輯與操作,并將結(jié)果送回目的操作數(shù)的單元中。與0相與,使被修改數(shù)相應(yīng)位清零,與1相與,使被修改數(shù)相應(yīng)位保持原值不變2.邏輯與指令例3-18將累加器A中壓縮BCD碼分為兩個字節(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
這組指令的功能是:將兩個操作數(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)位保持原值不變;本指令可判斷兩個數(shù)是否相等,假設(shè)相等,那么異或結(jié)果為全“0〞;否那么不相等。練習(xí):P88,17題五、控制轉(zhuǎn)移類指令
1.無條件轉(zhuǎn)移指令是指當(dāng)程序執(zhí)行到該指令時,無條件轉(zhuǎn)移到指令所提供地址處執(zhí)行。無條件轉(zhuǎn)移指令共有4條,包括長轉(zhuǎn)移指令、短轉(zhuǎn)移指令、絕對轉(zhuǎn)移指令和散轉(zhuǎn)指令?!?〕長轉(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)志位?!?〕絕對轉(zhuǎn)移指令A(yù)JMPaddr11;(PC)←(PC)+2,(PC10~0)←addr11
由PC15~11信息和指令提供低11位地址組成16位轉(zhuǎn)移目標(biāo)地址,使程序無條件轉(zhuǎn)向同一2KB存儲空間目的地址執(zhí)行。本指令不影響標(biāo)志位。
〔3〕相對轉(zhuǎn)移指令SJMPrel;(PC)←(PC)+2,(PC)←(PC)+rel指令中rel是一個有符號數(shù)偏移量,其范圍為-128~+127,以補(bǔ)碼形式給出。假設(shè)rel是正數(shù),那么向前轉(zhuǎn)移;假設(shè)rel是負(fù)數(shù),那么向后轉(zhuǎn)移。1〕一條帶有FEH偏移量的SJMP指令,將實(shí)現(xiàn)無限循環(huán)。這是因?yàn)镕EH是-2的補(bǔ)碼,目的地址=PC+2-2=PC,結(jié)果轉(zhuǎn)向自己,無限循環(huán),一般在程序用SJMP$來表示SJMP0FEH。2〕該指令中尋址方式稱相對尋址方式。存儲器80H–128rel+127PCPC+1PC+2……〔4〕散轉(zhuǎn)指令JMP@A+DPTR;(PC)←(A)+(DPTR)PCDPTR(A)+(DPTR)→PC256BJMP@A+DPTR………
該指令執(zhí)行時,把累加器A中的8位無符號數(shù)與DPTR中16位數(shù)相加,其中裝入程序計(jì)數(shù)器PC,控制程序轉(zhuǎn)到目的地址執(zhí)行程序。整個指令的執(zhí)行過程中,不改變累加器A和DPTR的內(nèi)容。例3-20某單片機(jī)應(yīng)用系統(tǒng)有16個鍵,對應(yīng)的鍵碼值〔00H~0FH〕存放在R7中,16個鍵處理程序的入口地址分別為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)滿足給定的條件時,程序轉(zhuǎn)移到目的地址去執(zhí)行;條件不滿足那么順序執(zhí)行下一條指令。條件轉(zhuǎn)移指令分為累加器A判零轉(zhuǎn)移指令、比較轉(zhuǎn)移指令和循環(huán)指令?!?〕累加器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這組指令的功能是:比較前面兩個操作數(shù)的大小,如果它們的值不相等那么轉(zhuǎn)移。轉(zhuǎn)移地址的計(jì)算方法與上述兩條指令相同。如果第一個操作數(shù)〔無符號整數(shù)〕小于第二個操作數(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時,(PC)←(PC)+rel;當(dāng)(Rn)=0時,程序順序執(zhí)行。DJNZdirect,rel;(PC)←(PC)+3,(direct)←(direct)-1當(dāng)(direct)≠0時,(PC)←(PC)+rel;當(dāng)(direct)=0時,程序順序執(zhí)行。執(zhí)行本指令時,將第一個操作數(shù)減1后判斷結(jié)果是否為0,假設(shè)為0,那么終止循環(huán)程序段的執(zhí)行,程序往下順序執(zhí)行;假設(shè)不為0,那么轉(zhuǎn)移到目的地址繼續(xù)執(zhí)行循環(huán)程序段。用兩條指令可以構(gòu)成循環(huán)程序,循環(huán)次數(shù)就是第一個操作數(shù)的值。rel為相對偏移量。P95程序閱讀3.子程序調(diào)用
為簡化程序設(shè)計(jì),經(jīng)常把功能完全相同或反復(fù)使用的程序段單獨(dú)編寫成子程序,供主程序調(diào)用。主程序需要時通過調(diào)用指令,無條件轉(zhuǎn)移到子程序處執(zhí)行,子程序結(jié)束時執(zhí)行返回指令,再返回到主程序繼續(xù)執(zhí)行。〔1〕長調(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位的無條件轉(zhuǎn)移指令類似,只是增加了斷點(diǎn)壓棧過程。指令的執(zhí)行不影響標(biāo)志位。
4.返回指令返回指令應(yīng)能自動恢復(fù)斷點(diǎn),將原壓入棧的PC值彈回到PC中,保證回到斷點(diǎn)處繼續(xù)執(zhí)行主程序。返回指令必須用在子程序或中斷效勞程序的末尾。〔1〕子程序返回指令RET;(PC15~8)←((SP)),(SP)←(SP)-1;(PC7~0)←((SP)),(SP)←(SP)-1;這條指令將堆棧頂?shù)?字節(jié)單元內(nèi)容送到PC中,使程序返回到調(diào)用處?!?〕中斷返回指令RETI;(PC15~8)←((SP)),(SP)←(SP)-1;(PC7~0)←((SP)),(SP)←(SP)-1;該指令用于中斷效勞于程序的末尾,將堆棧頂?shù)?字節(jié)的內(nèi)容送到PC中,它與RET指令不同之處是它同釋放中斷邏輯,使同級中斷可以被接受。5.空操作指令NOP;〔PC〕←〔PC〕+1該指令不作任何操作,僅僅將程序計(jì)數(shù)器PC加1,使程序繼續(xù)向下執(zhí)行。該指令為單周期指令,所以在時間上占用一個機(jī)器周期,常用于延時。P116程序閱讀六、位操作類指令數(shù)據(jù)存儲器:片內(nèi)RAM20H~2FH單元共128位,位地址為00H~7FHA、B兩個存放器中的各8位,位地址為E0H~E7H、F0H~F7H位累加器:由C兼任I/O口:在SRF中共有44個布爾I/O口通用I/O口:共32個〔P0.0~P0.7、P1.0~P1.7、P2.0~P2.7、P3.0~P3.7〕用于定時器和串行口進(jìn)行控制和測試的:16個〔TCON0~TCON7、SCON0~SCON7〕用于中斷系統(tǒng)的:11個〔IE1~IE4、IE7、IP0~IP4〕用于PSW中的:7個〔PSW.0、PSW.2~PSW.7〕位操作指令:17條位地址的表示形式〔1〕直接〔位〕地址表示方式,如0D4H。〔2〕點(diǎn)表示方式,如PSW.4?!?〕位名稱表示方式,如RS1。〔4〕標(biāo)號表示方式,如用偽指令BIT定義:WBZD0BITEX0經(jīng)定義后,允許指令中使用WBZD0代替EX0。位數(shù)據(jù)傳送指令位數(shù)據(jù)傳送指令的兩個操作數(shù),一個是指定的位單元,另一個必須是位累加器Cy〔進(jìn)位位標(biāo)志Cy〕。MOVC,bit;(Cy)←(bit)MOVbit,C;(bit)←(Cy)bit為內(nèi)部RAM中的20H~2FH單元中128個可尋址位和特殊功能存放器中的可位尋址位。此指令不影響其他存放器或標(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〕位邏輯“與〞指令A(yù)NLC,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;假設(shè)〔Cy〕=1,那么〔PC〕←〔PC〕+2+rel,即轉(zhuǎn)移假設(shè)〔Cy〕=0,那么〔PC〕←〔PC〕+2,即順序執(zhí)行JNCrel;假設(shè)〔Cy〕=0,那么〔PC〕←〔PC〕+2+rel,即轉(zhuǎn)移假設(shè)〔Cy〕=1,那么〔PC〕←〔PC〕+2,即順序執(zhí)行注:執(zhí)行該指令時,不改變進(jìn)位位Cy的值?!?〕判位變量轉(zhuǎn)移指令JBbit,rel;假設(shè)(bit)=1,那么(PC)←(PC)+3+rel,即轉(zhuǎn)移假設(shè)〔bit〕=0,那么〔PC〕←〔PC〕+3,即順序執(zhí)行JNBbit,rel;假設(shè)〔bit〕=0,那么〔PC〕←〔PC〕+3+rel,即轉(zhuǎn)移假設(shè)〔bit〕=1,那么〔PC〕←〔PC〕+3,即順序執(zhí)行兩條指令不改變bit值,不影響標(biāo)志位。
〔3〕判位變量為1轉(zhuǎn)移并清零指令JBCbit,rel;假設(shè)〔bit〕=0,那么〔PC〕←〔PC〕+3;假設(shè)〔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é)果輸出量。為了使邏輯問題用單片機(jī)來處理,先選擇一些端口位作為邏輯入變量和邏輯輸出變量。定義: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匯編語言的根本規(guī)那么,特別要用好常用的匯編命令〔即偽指令〕,例如下面的程序段:ORG0040HMOVA,#7FHMOVR1,#44HEND這里的ORG和END是兩條偽指令,其作用是告訴匯編程序此匯編源程序的起止位置。編輯好的源程序應(yīng)以“.ASM〞擴(kuò)展名存盤,以備匯編程序調(diào)用。2、源程序的匯編
將匯編語言源程序轉(zhuǎn)換為單片機(jī)能執(zhí)行的機(jī)器碼形式的目標(biāo)程序的過程叫匯編。常用的方法有兩種:手工匯編時,把程序用助記符指令寫出后,通過手工方式查指令編碼表,逐個把助記符指令翻譯成機(jī)器碼,然后把得到的機(jī)器碼程序〔以十六進(jìn)制形式〕鍵入到單片機(jī)開發(fā)機(jī)中,并進(jìn)行調(diào)試。機(jī)器匯編是在常用的個人計(jì)算機(jī)PC上,使用交叉匯編程序?qū)R編語言源程序轉(zhuǎn)換為機(jī)器碼形式的目標(biāo)程序。生成的目標(biāo)程序由PC機(jī)傳送到開發(fā)機(jī)上,經(jīng)調(diào)試無誤后,再固化到單片機(jī)的程序存儲器ROM中。源程序經(jīng)過機(jī)器匯編后,形成的假設(shè)干文件中含有兩個主要文件,一是列表文件,另一個是目標(biāo)碼文件。因匯編軟件的不同,文件的格式及信息會有一些不同。但主要信息如下:列表文件:地址目標(biāo)碼匯編程序
ORG0040H0040H747FMOVA,#7FH0042H7944MOVR1,#44HEND目標(biāo)碼文件:首地址末地址目標(biāo)碼0040H0044H747F7944
偽指令是匯編程序能夠識別并對匯編過程進(jìn)行某種控制的匯編命令。它不是單片機(jī)執(zhí)行的指令,所以沒有對應(yīng)的可執(zhí)行目標(biāo)碼,匯編后產(chǎn)生的目標(biāo)程序中不會再出現(xiàn)偽指令。八、偽指令1、起始地址設(shè)定偽指令ORG格式為:
ORG表達(dá)式該指令的功能是向匯編程序說明下面緊接的程序段或數(shù)據(jù)段存放的起始地址。表達(dá)式通常為16進(jìn)制地址,也可以是已定義的標(biāo)號地址。
ORG8000HSTART:MOVA,#30H……
此時規(guī)定該段程序的機(jī)器碼從地址8000H單元開始存放。在每一個匯編語言源程序的開始,都要設(shè)置一條ORG偽指令來指定該程序在存儲器中存放的起始位置。假設(shè)省略O(shè)RG偽指令,那么該程序段從0000H單元開始存放。在一個源程序中,可以屢次使用ORG偽指令規(guī)定不同程序段或數(shù)據(jù)段存放的起始地址,但要求地址值由小到大依序排列,不允許空間重疊。2、匯編結(jié)束偽指令END格式為:
END
該指令的功能是結(jié)束匯編。匯編程序遇到END偽指令后即結(jié)束匯編。處于END之后的程序,匯編程序?qū)⒉惶幚怼?、字節(jié)數(shù)據(jù)定義偽指令DB
變量DB字節(jié)數(shù)據(jù)表
功能是從標(biāo)號指定的地址開始,在ROM中定義字節(jié)數(shù)據(jù)。該偽指令將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲單元中。一個數(shù)據(jù)占一個存儲單元。例如: DB“howareyou?〞 把字符串中的字符以ASCII碼的形式存放在連續(xù)的ROM單元中。又如: DB-2,-4,-6,8,10,18 把6個數(shù)轉(zhuǎn)換為十六進(jìn)制表示〔FEH,F(xiàn)CH,F(xiàn)AH,08H,0AH,12H〕,并連續(xù)地存放在6個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)號指定的地址單元開始,在程序存儲器中定義字?jǐn)?shù)據(jù)。該偽指令將字或字表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲單元中。應(yīng)特別注意:16位的二進(jìn)制數(shù),高8位存放在低地址單元,低8位存放在高地址單元。例如:ORG1400HDATA:DW324AH,3CH……匯編后,〔1400H〕=32H,〔1401H〕=4AH,〔1402H〕=00H,〔1403H〕=3CH。5、空間定義偽指令DS[標(biāo)號:]DS表達(dá)式功能是從標(biāo)號指定的地址單元開始,在程序存儲器中保存由表達(dá)式所指定的個數(shù)的存儲單元作為備用的空間,并都填以零值。例如:ORG3000HBUF:DS50……匯編后,從地址3000H開始保存50個存儲單元作為備用單元。6、賦值偽指令EQU
符號名EQU表達(dá)式功能是將表達(dá)式的值或特定的某個匯編符號定義為一個指定的符號名。例如:
ORG1000H LEN EQU10 SUM EQU21H BLOCK EQU22H CLRA MOVR7,#LEN MOVR0,#BLOCK LOOP: ADDA,@R0 INCR0 DJNZR7,LOOP MOVSUM,A END
該程序的功能是,把BLOCK單元開始存放的10個無符號數(shù)進(jìn)行求和(≤255),并將結(jié)果存入SUM單元中。7、位地址符號定義偽指令BIT格式為:符號名BIT位地址表達(dá)式功能是將位地址賦給指定的符號名。其中,位地址表達(dá)式可以是絕對地址,也可以是符號地址。例如:
STBITP1.0
將P1.0的位地址賦給符號名ST,在其后的編程中就可以用ST來代替P1.0。4.3.1順序程序〔無分支、無循環(huán)〕程序舉例【例4-1】片內(nèi)RAM的21H單元存放一個十進(jìn)制數(shù)據(jù)十位的ASCII碼,22H單元存放該數(shù)據(jù)個位的ASCII碼。編寫程序?qū)⒃摂?shù)據(jù)轉(zhuǎn)換成壓縮BCD碼存放在20H單元。ORG0040HSTART:MOVA,21H;取十位ASCII碼ANLA,#0FH;保存低半字節(jié)SWAPA;移至高半字節(jié)MOV20H,A;存于20H單元MOVA,22H;取個位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時,y=x;當(dāng)x=0時,y=20H;當(dāng)x小于0時,y=x+5。編制程序,根據(jù)x的大小求y并送回原單元。ORG0040HSTART:MOVA,30H;取x至累加器JZNEXT;x=0,轉(zhuǎn)NEXTANLA,#80H;否,保存符號位JZDONE;x>0,轉(zhuǎn)結(jié)束MOVA,#05H;x<0處理ADDA,30HMOV30H,A;X+05H送YSJMPDONENEXT:MOV30H,#20H;x=0,20H送YDONE:SJMPDONEEND2024/8/11110【例4-3】根據(jù)R7的內(nèi)容x〔轉(zhuǎn)移序號〕轉(zhuǎn)向相應(yīng)的處理程序。設(shè)R7內(nèi)容為0~4,對應(yīng)的處理程序入口地址分別為PP0~PP4。2024/8/11111START: MOVR7,#3;以轉(zhuǎn)移序號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
2024/8/11112TAB: DWPP0 DWPP1 DWPP2 DWPP3 DWPP4PP0: MOV30H,#0;轉(zhuǎn)移序號為0時,置功能號“0〞于30H單元 RETPP1: MOV30H,#1;轉(zhuǎn)移序號為1時,置功能號“1〞于30H單元 RETPP2: MOV30H,#2;轉(zhuǎn)移序號為2時,置功能號“2〞于30H單元 RETPP3: MOV30H,#3;轉(zhuǎn)移序號為3時,置功能號“3〞于30H單元 RETPP4: MOV30H,#4;轉(zhuǎn)移序號為4時,置功能號“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é)束處理END2024/8/111144.4子程序及其調(diào)用完成通用功能、反復(fù)使用的程序設(shè)計(jì)成子程序。使應(yīng)用程序結(jié)構(gòu)清晰緊湊,便于閱讀和調(diào)試執(zhí)行要由其它程序來調(diào)用,執(zhí)行完后要返回到調(diào)用程序結(jié)構(gòu)上仍然采用一般程序的3種結(jié)構(gòu)調(diào)用時注意:一是現(xiàn)場的保護(hù)和恢復(fù);二是主程序與子程序間的參數(shù)傳遞。4.4子程序及其調(diào)用現(xiàn)場保護(hù)與恢復(fù)在主程序中實(shí)現(xiàn)〔結(jié)構(gòu)靈活〕在子程序中實(shí)現(xiàn)〔程序標(biāo)準(zhǔn)、清晰〕參數(shù)傳遞利用累加器或存放器〔簡單、快速,但參數(shù)個數(shù)不多〕利用存儲器〔個數(shù)多,用R0或R1及DPTR為參數(shù)表指針〕利用堆棧4.4.3常用子程序例如〔略〕查表程序p112延時程序p116練習(xí):編寫程序,控制p1.0連接的發(fā)光二極管實(shí)現(xiàn)0.5s的閃亮,系統(tǒng)晶振為6MHz。要求,至少兩個函數(shù)的設(shè)計(jì)主函數(shù)延時子函數(shù)練習(xí):編寫程序,控制p2連接的數(shù)碼管,實(shí)現(xiàn)0.5s的切換數(shù)值從0-9循環(huán)顯示,系統(tǒng)晶振為6MHz。要求,至少三個函數(shù)的設(shè)計(jì)主函數(shù)延時子函數(shù)查表子函數(shù)〔獲取數(shù)值x的段碼〕匯編語言編程總結(jié)特點(diǎn):操作對象〔變量〕——全局變量功能有限優(yōu)勢:代碼高效冗余少,運(yùn)行速度快,實(shí)時性高,適合短小高速的程序。劣勢:編程難度大,不便于閱讀、修改、移植概述C51開發(fā)流程C51的優(yōu)點(diǎn)1、編譯器能自動完成變量的存儲單元的分配。2、能對算法和應(yīng)用程序進(jìn)行移植。3、能對關(guān)鍵代碼進(jìn)行優(yōu)化。第二局部80C51單片機(jī)的C語言程序設(shè)計(jì)一、C51數(shù)據(jù)類型C51具有標(biāo)準(zhǔn)C語言的所有標(biāo)準(zhǔn)數(shù)據(jù)類型,針對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ù)類型,利用它可定義一個位標(biāo)量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個二進(jìn)制位,不是0就是1。2.sbit可尋址位 sbit同樣是單片機(jī)C語言中的一種擴(kuò)充數(shù)據(jù)類型,利用它能訪問芯片內(nèi)部的RAM中的可尋址位或特殊功能存放器中的可尋址位。
C51數(shù)據(jù)類型3.sfr特殊功能存放器sfr也是一種擴(kuò)充數(shù)據(jù)類型,占用一個內(nèi)存單元,值域?yàn)?~255。利用它能訪問51單片機(jī)內(nèi)部的所有特殊功能存放器。4.sfr1616位特殊功能存放器 sfr16占用兩個內(nèi)存單元,值域?yàn)?~65535。sfr16和sfr一樣用于操作特殊功能存放器,不同的是它用于操作占兩個字節(jié)的存放器,如定時器T2。C51數(shù)據(jù)類型表1KeiluVision2單片機(jī)C語言編譯器所支持的數(shù)據(jù)類型C51數(shù)據(jù)類型二、C51數(shù)據(jù)存儲類型C51編譯器可以通過將變量、常量定義為不同的存儲類型〔data,bdata,idata,pdata,xdata,code〕的方法,將它們定義在不同的存儲區(qū)中。C51數(shù)據(jù)存儲類型與MCS-51單片機(jī)實(shí)際存儲空間的對應(yīng)關(guān)系如表2所示。表2C51存儲類型與MCS-51單片機(jī)存儲空間的對應(yīng)關(guān)系當(dāng)使用存儲類型data,bdata定義常量和變量時,C51編譯器會將它們定位在片內(nèi)數(shù)據(jù)存儲區(qū)中。片內(nèi)RAM是存放臨時性傳遞變量或使用頻率較高變量的理想場所。訪問片內(nèi)數(shù)據(jù)存儲器〔data,bdata,idata〕比訪問片外數(shù)據(jù)存儲器〔xdata,pdata〕相對快一些,因此可將經(jīng)常使用的變量置于片內(nèi)數(shù)據(jù)存儲器,而將規(guī)模較大的,或不常使用的數(shù)據(jù)置于片外數(shù)據(jù)存儲器中。表3C51存儲類型及其大小和值域C51數(shù)據(jù)存儲類型如果在變量定義時略去存儲類型標(biāo)志符,編譯器會自動默認(rèn)存儲類型。默認(rèn)的存儲類型進(jìn)一步有SMALL、COMPACT和LARGE存儲模式指令限制。見表4。表4存儲模式及說明C51數(shù)據(jù)存儲類型三、C51定義SFR
在C51中,特殊功能存放器及其可位尋址的位是通過關(guān)鍵字sfr和sbit來定義的,這種方法與標(biāo)準(zhǔn)C不兼容,只適用于C51。〔1〕sfr:定義為8位特殊功能存放器。例如:sfrPSW=0xD0;//定義程序狀態(tài)字PSW的地址為D0HsfrTMOD=0x69;//定義定時器/計(jì)數(shù)器方式控制存放器TMOD的地址為69HsfrP1=0x90;//定義P1口的地址為90H“sfr〞后面必須跟一個特殊存放器名;“=〞后面的地址必須為常數(shù),常數(shù)值的范圍必須在特殊功能存放器地址范圍內(nèi),即位于地址0x60到0xff之間,不允許帶有運(yùn)算符的表達(dá)式。〔2〕sfr16:定義的16位特殊功能存放器。 sfr16T2=0xCC;//定義6052定時器2,低8位地址為 T2L=CCH,高8位T2H=CDH 用sfr16定義16位特殊功能存放器時,等號后面是它的低位地址。sfr16不能用于定時器0和1的定義。〔3〕sbit:定義為可位尋址對象,如訪問特殊功能存放器中的某位。例如,PSW是可位尋址的SFR,其中各位可用sbit定義。sbitCY=0xD7;//定義進(jìn)位標(biāo)志CY的地址為D7HsbitAC=0xD0^6;//定義輔助進(jìn)位標(biāo)志AC的地址為D6HsbitRS0=0xD3;//定義RS0的地址為D3H注意:sfr和sbit只能在函數(shù)外使用,一般放在程序的開頭。C51定義SFR四、C51定義并行口
MCS-51單片機(jī)的根本I/O口只有P0、P1、P2、和P3四個,除此之外,還可以在片外擴(kuò)展I/O口和其他功能芯片,它們與外部數(shù)據(jù)存儲器統(tǒng)一編址,即MCS-51單片機(jī)把它們當(dāng)作外部數(shù)據(jù)存儲單元。P0、P1、P2和P3的定義在頭文件reg51.h和reg52.h中,擴(kuò)展的外部RAM單元和外部I/O口需要用戶自己定義。例如:#include"absacc.h"#definePAXBYTE[0xffec]main(){PA=0x3A;//將數(shù)據(jù)3AH寫入地址為0xffec的存儲單元或I/O端口}以上程序用C中的編譯預(yù)處理命令#define將PA定義為外部I/O口,地址為0xffec,是單字節(jié)量。其中XBYTE是一個指針,指向外部數(shù)據(jù)存儲器的零地址單元,它是在絕對地址訪問頭文件absacc.h中定義的。五、C51定義位變量
1.位變量的定義位變量用關(guān)鍵字“bit〞來定義,它的值是一個二進(jìn)制位。例如,bitlock;//將lock定義為位變量bitdirection;//將direction定義為位變量2.函數(shù)可以有bit類型的參數(shù),也可以有bit類型的返回值例如,bitfunc(bitb0,bitb1){bita;……returna;}使用禁止中斷宏命令#progmadisable,或指定明確的存放器切換〔usingn)的函數(shù)不能返回位值。C51定義位變量3.對位變量定義的限制不能定義位變量的指針,如:bit*bit_point;不能定義位數(shù)組,如:bitbit_array[5];位變量說明中可以指定存儲類型,位變量的存儲類型只能是bdata。在程序設(shè)計(jì)時,對于可位尋址的對象,既可以字節(jié)尋址又可以位尋址的變量,那么其存儲類型只能是bdata。C51定義位變量六、C51運(yùn)算符、表達(dá)式及其規(guī)那么〔2〕自增、自減運(yùn)算符:++為自增運(yùn)算符,為自減運(yùn)算符。例如,++j、j++、i、i ++和運(yùn)算符只能用于變量,不能用于常量和表達(dá)式。++j表示先加1,再取值;j++表示先取值,再加1。同理,自減運(yùn)算也是這個道理。C51運(yùn)算符、表達(dá)式及其規(guī)那么C51運(yùn)算符、表達(dá)式及其規(guī)那么如果一個運(yùn)算符兩側(cè)的數(shù)據(jù)類型不同,那么必須通過數(shù)據(jù)類型轉(zhuǎn)換將數(shù)據(jù)轉(zhuǎn)換成同種類型。轉(zhuǎn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物流行業(yè)工作計(jì)劃范文
- 低??乒ぷ饔?jì)劃
- 酒店銷售部工作總結(jié)及計(jì)劃范文
- 2025年部門銷售主管工作計(jì)劃范文
- 醫(yī)院信息中心工作計(jì)劃范文
- 政研室工作計(jì)劃
- 《E芯片試產(chǎn)報(bào)告》課件
- 《大學(xué)有機(jī)化學(xué)》課件
- 合同 條款 內(nèi)部邏輯
- 投標(biāo)合同條款
- 安徽省合肥市包河區(qū)2023-2024學(xué)年三年級上學(xué)期語文期末試卷
- 【MOOC】新媒體文化十二講-暨南大學(xué) 中國大學(xué)慕課MOOC答案
- 2024-2025學(xué)年二年級數(shù)學(xué)上冊期末樂考非紙筆測試題(二 )(蘇教版)
- 2024年度智能制造生產(chǎn)線改造項(xiàng)目合同
- 2024年度食堂檔口承包合同(含菜品研發(fā))3篇
- DB32T 4578.2-2023 丙型病毒性肝炎防治技術(shù)指南 第2部分:患者管理
- 護(hù)理輪科心得
- 英語期末復(fù)習(xí)講座模板
- 北京市西城區(qū)2023-2024學(xué)年六年級上學(xué)期語文期末試卷
- 2025年蛇年年會匯報(bào)年終總結(jié)大會模板
- 九年級學(xué)業(yè)水平-信息技術(shù)考試試題題庫及答案
評論
0/150
提交評論