單片機(jī)-匯編例題_第1頁
單片機(jī)-匯編例題_第2頁
單片機(jī)-匯編例題_第3頁
單片機(jī)-匯編例題_第4頁
單片機(jī)-匯編例題_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

匯編語言程序設(shè)計(jì)例題

例1兩個(gè)無符號(hào)雙字節(jié)數(shù)相加。設(shè)被加數(shù)存放于內(nèi)部RAM的40H〔高位字節(jié)〕,41H〔低位字節(jié)〕,加數(shù)存放于50H〔高位字節(jié)〕,51H〔低位字節(jié)〕,和數(shù)存入40H和41H單元中。2023/7/26

START:CLRC;將Cy清零

MOVR0,#41H;將被加數(shù)地址送數(shù)據(jù)指針R0MOVR1,#51H;將加數(shù)地址送數(shù)據(jù)指針R1AD1:MOVA,@R0;被加數(shù)低字節(jié)的內(nèi)容送入AADDA,@R1;兩個(gè)低字節(jié)相加MOV@R0,A;低字節(jié)的和存入被加數(shù)低字節(jié)中DECR0;指向被加數(shù)高位字節(jié)DECR1;指向加數(shù)高位字節(jié)MOVA,@R0;被加數(shù)高位字節(jié)送入AADDCA,@R1;兩個(gè)高位字節(jié)帶Cy相加MOV@R0,A;高位字節(jié)的和送被加數(shù)高位字節(jié)RET例1兩個(gè)無符號(hào)雙字節(jié)數(shù)相加。設(shè)被加數(shù)存放于內(nèi)部RAM的40H〔高位字節(jié)〕,41H〔低位字節(jié)〕,加數(shù)存放于50H〔高位字節(jié)〕,51H〔低位字節(jié)〕,和數(shù)存入40H和41H單元中。2023/7/26例2將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。

設(shè)內(nèi)部RAM40H#,41H單元中分別存放著8位二進(jìn)制數(shù),要求取出兩個(gè)單元中的低半字節(jié),并成一個(gè)字節(jié)后,存入50H單元中。2023/7/26

設(shè)內(nèi)部RAM40H#,41H單元中分別存放著8位二進(jìn)制數(shù),要求取出兩個(gè)單元中的低半字節(jié),并成一個(gè)字節(jié)后,存入50H單元中

START:

MOVR1,#40H;

設(shè)置R1為數(shù)據(jù)指針

MOVA,@R1;

取出第一個(gè)單元中的內(nèi)容

ANLA,#0FH;

取第一個(gè)數(shù)的低半字節(jié)

SWAPA;

移至高半字節(jié)

INCR1 ;

修改數(shù)據(jù)指針

XCHA,@R1 ;

取第二個(gè)單元中的內(nèi)容

ANLA,#0FH;

取第二個(gè)數(shù)的低半字節(jié)

ORLA,@R1 ;

拼字

MOV50H,A ;

存放結(jié)果RET2023/7/26例3x,y均為8位二進(jìn)制數(shù),設(shè)x存入R0,y存入R1,求解:y=syn(x)2023/7/26例3x,y均為8位二進(jìn)制數(shù),設(shè)x存入R0,y存入R1,求解:y=syn(x)程序如下:START:CJNER0,#00H,SUL1;R0中的數(shù)與00比較不等轉(zhuǎn)移MOVR1,#00H;相等,R1←0SJMPSUL2SUL1:JCNEG;兩數(shù)不等,假設(shè)〔R0〕<0,轉(zhuǎn)向NEGMOVR1,#01H;〔R0〕>0,那么R1←01HSJMPSUL2NEG:MOVR1,#0FFH;〔R0〕<0,那么R1←0FFHSUL2:RET2023/7/26正確程序如下:SUBF:MOVA,R0JZZEROJBACC.7,NEGMOVR1,#1ZERO:MOVR1,#0SJMPENDFNEG:MOVR1,#0FFHENDF:RET

2023/7/262023/7/26例4比較兩個(gè)無符號(hào)數(shù)的大小。設(shè)外部RAM的存儲(chǔ)單元ST1和ST2中存放兩個(gè)不帶符號(hào)的二進(jìn)制數(shù),找出其中的大數(shù)存入外部RAM中的ST3單元中。2023/7/26例4比較兩個(gè)無符號(hào)數(shù)的大小。2023/7/26程序如下:

ORG1000HST1 EQU2000HST2EQU2100HST3EQU2200HSTART:CLRC ;清零Cy MOVDPTR,#ST1;第一個(gè)數(shù)的指針MOVXA,@DPTR;取第一個(gè)數(shù)MOVR2,A;保存MOVDPTR,#ST2;第二個(gè)數(shù)的指針MOVXA,@DPTR;取第二個(gè)數(shù)CLRC2023/7/26SUBBA,R2;兩數(shù)比較JNCBIG2;假設(shè)第二個(gè)數(shù)大,那么轉(zhuǎn)XCHA,R2;第一個(gè)數(shù)大BIG1:MOVDPTR,#ST3MOVX@DPTR,A;存大數(shù)RETBIG2:MOVXA,@DPTR;第二個(gè)數(shù)大SJMPBIG1RET2023/7/26例5工作單元清零。在應(yīng)用系統(tǒng)程序設(shè)計(jì)時(shí),有時(shí)經(jīng)常需要將存儲(chǔ)器中各局部地址單元作為工作單元,存放程序執(zhí)行的中間值或執(zhí)行結(jié)果,工作單元清零工作常常放在程序的初始化局部中。設(shè)有50個(gè)工作單元,其首址為外部存儲(chǔ)器8000H單元,那么其工作單元清零程序如下:2023/7/26

CLEAR:CLRA

MOVDPTR,#8000H;工作單元首址送指針

MOVR2,50;置循環(huán)次數(shù)

CLEAR1:MOVX@DPTR,A

INCDPTR;修改指針

DJNZR2,CLEAR1;控制循環(huán)

RET2023/7/26例6設(shè)在內(nèi)部RAM的BLOCK單元開始處有長度為LEN個(gè)的無符號(hào)數(shù)據(jù)塊,試編一個(gè)求和程序,并將和存入內(nèi)部RAM的SUM單元〔設(shè)和不超過8位〕。

BLOCKEQU20HLENEQU30HSUMEQU40HSTART:CLRA;清累加器AMOVR2,#LEN;數(shù)據(jù)塊長度送R2MOVR1,#BLOCK;數(shù)據(jù)塊首址送R1LOOP:ADDA,@R1;循環(huán)加法INCR1;修改地址指針DJNZR2,LOOP;修改計(jì)數(shù)器并判斷MOVSUM,A;存和RET2023/7/26二、多重循環(huán)

例710秒延時(shí)程序。延時(shí)程序與MCS-51執(zhí)行指令的時(shí)間有關(guān),如果使用6MHz晶振,一個(gè)機(jī)器周期為2μs,計(jì)算出一條指令以至一個(gè)循環(huán)所需要的執(zhí)行時(shí)間,給出相應(yīng)的循環(huán)次數(shù),便能到達(dá)延時(shí)的目的。編寫10秒延時(shí)程序2023/7/26延時(shí)程序與MCS-51執(zhí)行指令的時(shí)間有關(guān),如果使用6MHz晶振,一個(gè)機(jī)器周期為2μs,計(jì)算出一條指令以至一個(gè)循環(huán)所需要的執(zhí)行時(shí)間,給出相應(yīng)的循環(huán)次數(shù),便能到達(dá)延時(shí)的目的。10秒延時(shí)程序如下:DELAY:MOVR5,#100DEL0:MOVR6,#200DEL1:MOVR7,#248DEL2:DJNZR7,DEL2DJNZR6,DEL1DJNZR5,DEL0RET2023/7/26上例程序中采用了多重循環(huán)程序,即在一個(gè)循環(huán)體中又包含了其它的循環(huán)程序,這種方式是實(shí)現(xiàn)延時(shí)程序的常用方法。使用多重循環(huán)時(shí),必須注意:(1〕循環(huán)嵌套,必須層次清楚,不允許產(chǎn)生內(nèi)外層循環(huán)交叉。(2〕外循環(huán)可以一層層向內(nèi)循環(huán)進(jìn)入,結(jié)束時(shí)由里往外一層層退出。(3〕內(nèi)循環(huán)可以直接轉(zhuǎn)入外循環(huán),實(shí)現(xiàn)一個(gè)循環(huán)由多個(gè)條件控制的循環(huán)結(jié)構(gòu)方式。2023/7/26例8在內(nèi)部RAM中從50H單元開始的連續(xù)單元依次存放了一串字符,該字符串以回車符為結(jié)束標(biāo)志,測(cè)試該字符串長度。

程序如下:START:MOVR2,#0FFHMOVR0,#4FH;數(shù)據(jù)指針R0置初值LOOP:INCR0INCR2CJNE@R0,#0DH,LOOPRET2023/7/266查表程序設(shè)計(jì)

查表程序是一種常用程序,它廣泛使用于LED顯示控制、打印機(jī)打印控制、數(shù)據(jù)補(bǔ)償、數(shù)值計(jì)算、轉(zhuǎn)換等功能程序中,這類程序具有簡單、執(zhí)行速度快等特點(diǎn)。所謂查表法,就是預(yù)先將滿足一定精度要求的表示變量與函數(shù)值之間關(guān)系的一張表求出,然后把這張表存于單片機(jī)的程序存儲(chǔ)器中,這時(shí)自變量值為單元地址,相應(yīng)的函數(shù)值為該地址單元中的內(nèi)容。查表,就是根據(jù)變量X在表格中查找對(duì)應(yīng)的函數(shù)值Y,使Y=f(X)。2023/7/26MCS-51指令系統(tǒng)中,有兩條查表指令:MOVCA,@A+PCMOVCA,@A+DPTR2023/7/26

例9

一個(gè)十六進(jìn)制數(shù)存放在內(nèi)部RAM的HEX單元的低4位中,將其轉(zhuǎn)換成ASCII碼并送回HEX單元。

十六進(jìn)制0~9的ASCII碼為30H~39H,A~F的ASCII碼為41H~46H,ASCII碼表格的首地址為ASCTAB。編程如下:

ORG1000HHEXASC:MOVA,HEX ANLA,#0FH ADDA,#3;修改指針 MOVCA,@A+PC MOVHEX,A RET2023/7/26ASCTAB:DB30H,31H,32H,33H,34H DB35H,36H,37H,38H,39H DB41H,42H,43H,44H,45HDB46H在這個(gè)程序中,查表指令MOVCA,@A+PC到表格首地址有兩條指令,占用3個(gè)字節(jié)地址空間,故修改指針應(yīng)加3。

2023/7/26例10設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置,需對(duì)96路輸入進(jìn)行控制,每路有一個(gè)額定的最大值,是雙字節(jié)數(shù)。當(dāng)檢測(cè)量大于該路對(duì)應(yīng)的最大值時(shí),就越限報(bào)警。假設(shè)R2為保存檢測(cè)路數(shù)的存放器,其對(duì)應(yīng)的最大額定值存放于31H和32H單元中。查找最大額定值的程序如下:

FMAX:MOVA,R2 ADDA,R2;表中一個(gè)額定值為2個(gè)字節(jié) MOV31H,A MOVDPTR,#TAB;表首址2023/7/26

MOVCA,@A+DPTR;查表讀取第一個(gè)字節(jié) XCHA,31H;第一個(gè)字節(jié)內(nèi)容存入31H INCDPTR MOVCA,@A+DPTR;查表讀取第二個(gè)字節(jié) MOV32H,A;第二字節(jié)的內(nèi)容存入32HTAB:DW1230H,1450H,... DW2230H,2440H,... DW3120H,3300H,...2023/7/26例15在一個(gè)溫度檢測(cè)系統(tǒng)中,溫度模擬信號(hào)由10位A/D輸入。將A/D結(jié)果轉(zhuǎn)換為對(duì)應(yīng)溫度值,可采用查表方法實(shí)現(xiàn)。先由實(shí)驗(yàn)測(cè)試出整個(gè)溫度量程范圍內(nèi)的A/D轉(zhuǎn)換結(jié)果,把A/D轉(zhuǎn)換結(jié)果000H~3FFH所對(duì)應(yīng)的溫度值組織為一個(gè)表存儲(chǔ)在程序存儲(chǔ)器中,那么就可以根據(jù)檢測(cè)到的模擬量的A/D轉(zhuǎn)換值查找出相應(yīng)的溫度值。設(shè)測(cè)得的A/D轉(zhuǎn)換結(jié)果已存入20H#,21H單元中〔高位字節(jié)在20H中,低位字節(jié)在21H中〕,查表得到的溫度值存放在22H#,23H單元〔高位字節(jié)在22H中,低位字節(jié)在23H中〕。2023/7/26程序如下:FTMP:MOVDPTR,#TAB;DPTR←表首地址 MOVA,21H;〔20H〕〔21H〕×2 CLRC RLCA MOV21H,A MOVA,20H RLCA MOV20H,A MOVA,21H;表首地址+偏移量 ADDCA,DPL MOVDPL,A2023/7/26MOVA,20HADDCA,DPHMOVDPH,ACLRAMOVCA,@A+DPTR;查表得溫度值高位字節(jié)MOV22H,ACLRAINCDPTRMOVCA,@A+DPTR;查表得溫度值低位字節(jié)MOV23H,ARETTAB:DW…2023/7/267數(shù)制轉(zhuǎn)換例16將一個(gè)字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成3位非壓縮型BCD碼。設(shè)一個(gè)字節(jié)二進(jìn)制數(shù)在內(nèi)部RAM40H單元,轉(zhuǎn)換結(jié)果放入內(nèi)部RAM50H#,51H,52H單元中〔高位在前〕,程序如下:HEXBCD:MOVA,40HMOVB,#100DIVABMOV50H,AMOVA,#10XCHA,BDIVABMOV51H,AMOV52H,BRET2023/7/26例17設(shè)4位BCD碼依次存放在內(nèi)存RAM中40H~43H單元的低4位,高4位都為0,要求將其轉(zhuǎn)換為二進(jìn)制數(shù),結(jié)果存入R2R3中。

一個(gè)十進(jìn)制數(shù)可表示為:Dn×10n+Dn-1×10n-1+…+D0×100=〔…〔〔Dn×10+Dn-1〕×10+Dn-2〕×10+…〕+D0當(dāng)n=3時(shí),上式可表示為:〔〔D3×10+D2〕×10+D1〕×10+D02023/7/26BCDHEX:MOVR0,#40H;R0指向最高位地址MOVR1,#03;計(jì)數(shù)值送R1MOVR2,#0;存放結(jié)果的高位清零MOVA,@R0MOVR3,ALOOP:MOVA,R3MOVB,#10MULABMOVR3,A;(R3)×10的低8位送R3MOVA,BXCHA,R2;(R3)×10的高8位暫存R2MOVB,#102023/7/26MULABADDA,R2MOVR2,A;R2×10+〔R3×10〕高8位送R2INCR0;取下一個(gè)BCD數(shù)MOVA,R3ADDA,@R0MOVR3,AMOVA,R2ADDCA,#0;加低字節(jié)來的進(jìn)位MOVR2,ADJNZR1,LOOPRET2023/7/268運(yùn)算程序

一、加、減法程序例18將40H開始存放的10個(gè)字節(jié)的數(shù)與50H開始存放的10個(gè)字節(jié)的數(shù)相減〔假設(shè)被減數(shù)大于減數(shù)〕。設(shè)被減數(shù)指針為R0,減數(shù)指針為R1,差數(shù)放回被減數(shù)單元,R5存放字節(jié)個(gè)數(shù),那么程序如下:2023/7/26

SUB:MOVR0,#40H MOVR1,#50H MOVR5,#10 CLRCSUB1:MOVA,@R0 SUBBA,@R1 MOV@R0,A INCR0 INCR1 DJNZR5,SUB1 RET2023/7/26二、乘法運(yùn)算程序在計(jì)算機(jī)中,常將乘法采用移位和加法來實(shí)現(xiàn)。例19將〔R2R3〕和〔R6R7〕中雙字節(jié)無符號(hào)數(shù)相乘,結(jié)果存入R4R5R6R7。此乘法可以采用局部積右移的方法來實(shí)現(xiàn),其程序框圖如圖4.6所示,程序如下:NMUL:MOVR4,#0;初始化 MOVR5,#0 CLRC MOVR0,#162023/7/26NMUL1:MOVA,R4;CyR4R5R6R7右移一位 RRCA MOVR4,A MOVA,R5 RRCA MOVR5,A MOVA,R6 RRCA MOVR6,A MOVA,R7 RRC MOVR7,A JNCNMUL2;C為移出乘數(shù)的最低位 MOVA,R5;〔R4R5〕+〔R6F7)→〔R4R5〕2023/7/26

ADDA,R3MOVR5,AMOVA,R4ADDCA,R2MOVR4,ANMUL2:DJNZR0,NMUL1;循環(huán)16位MOVA,R4;最后結(jié)果再移一位RRCAMOVR4,AMOVA,R5RRCAMOVR5,AMOVA,R6

RRCA

MOVR6,A

MOVA,R7

RRCA

MOVR7,A

RET2023/7/26圖7.6NMUL程序框圖2023/7/26例假定被乘數(shù)在〔R4R3〕中,乘數(shù)放在R2中,乘積放在R7R6和R5中。MCS-51中有8位數(shù)的乘法指令MUL,用它來實(shí)現(xiàn)多字節(jié)乘法時(shí),可表示為〔R4R3〕×〔R2〕=[〔R4〕×28+〔R3〕]×〔R2〕=〔R4〕×〔R2〕×28+〔R3〕×〔R2〕其中〔R4〕×〔R2〕和〔R3〕×〔R2〕都是可直接用MUL指令來實(shí)現(xiàn),而乘以28意味著左移8位。由此可編寫如下程序:2023/7/26NMUL1:MOVA,R2MOVB,R3MULAB;〔R3〕×〔R2〕MOVR5,A;積的低位送R5MOVR6,B;積的高位送R6MOVA,R2MOVB,R4MULAB;〔R4〕×〔R2〕ADDA,R6;〔R3〕×〔R2〕的高位加(R4)×(R2)的低位MOVA,BADDCA,#00H;〔R4〕×〔R2〕的高位加CyMOVR7,A;結(jié)果送R7RET2023/7/26三、除法運(yùn)算程序除法是乘法的逆運(yùn)算,用移位、相減的方法來完成。首先比較被除數(shù)的高位字與除數(shù),如被除數(shù)高位大于除數(shù),那么商為1,并從被除數(shù)中減去除數(shù),形成一個(gè)局部余數(shù);否那么商位為0,不執(zhí)行減法。然后把新的局部余數(shù)左移一位,并與除數(shù)再次進(jìn)行比較。循環(huán)此步驟,直到被除數(shù)的所有位都處理完為止,一般商的字長為n,那么需循環(huán)n次。一般計(jì)算機(jī)中,被除數(shù)均為雙倍位,即如果除數(shù)和商為雙字節(jié),那么被除數(shù)為四字節(jié)。如果在除法中發(fā)生商大于規(guī)定字節(jié),稱為溢出。在進(jìn)行除法前,應(yīng)該檢查是否會(huì)產(chǎn)生溢出。一般可在進(jìn)行除法前,先比較被除數(shù)的高位與除數(shù),如被除數(shù)高位大于除數(shù),那么溢出,置溢出標(biāo)志,不執(zhí)行除法。2023/7/26圖7.7除法程序的流程2023/7/26例21將〔R4R5R6R7〕除以〔R2R3〕,商放在〔R6R7〕中,余數(shù)放在〔R4R5〕中。

NDIV:MOVA,R5;判商是否產(chǎn)生溢出 CLRC SUBBA,R3 MOVA,R4 SUBBA,R2 JNCNDIV1;溢出,轉(zhuǎn)溢出處理 MOVB,#16;無溢出,執(zhí)行除法2023/7/26NDIV2:CLRC;被除數(shù)左移一位,低位送0MOVA,R7RLCAMOVR7,AMOVA,R6RLCAMOVR6,AMOVA,R5RLCAMOVR5,AXCHA,R4RLCAXCHA,R42023/7/26MOVF0,C;保護(hù)移出的最高位CLRCSUBBA,R3;局部余數(shù)與除數(shù)比較MOVR1,AMOVA,R4SUBBA,R2JBF0,NDIV3;移出的高位為1,肯定夠減JCNDIV4;否那么,(Cy)=0才夠減NDIV3:MOVR4,A;回送減法結(jié)果MOVA,R1MOVR5,AINCR7;商上12023/7/26NDIV4:DJNZB,NDIV2;循環(huán)次數(shù)減1,假設(shè)不為零那么循環(huán)CLRF0;正常執(zhí)行無溢出F0=0RETNDIV1:SETBF0;溢出F0=1RET2023/7/26將20H當(dāng)中的8位無符號(hào)數(shù)轉(zhuǎn)換成3位BCD碼存放在30H和31H中,30H放百位,個(gè)位十位放31HBCDCHG:

MOV

A,20H

MOV

B,#100

DIV

AB

MOV

30H,A

MOV

A,B

MOV

B,#10

DIV

AB

SWAP

A

ORL

A,B

MOV

31H,A

RET2023/7/26例設(shè)有一帶符號(hào)的數(shù)組存放在內(nèi)部RAM以20H為首址的連續(xù)單元中,其長度為90,要求找出其中的最大值,并將其存放到內(nèi)部RAM的1FH單元中,試編寫相應(yīng)的程序。2023/7/26程序如下ORG 1000HSTART:MOV R0,#20H ;置取數(shù)指針R0初值 MOV B,#59H ;置循環(huán)計(jì)數(shù)器B初值MOV A,@R0 ;第一個(gè)數(shù)送ALOOP:INC R0 ;修改指針 MOV R1,A ;暫存 XRL A,@R0 ;兩數(shù)符號(hào)相同? JB ACC.7,LAT ;假設(shè)相異,那么轉(zhuǎn)LAT MOVA,R1 ;假設(shè)相同,那么恢復(fù)A中原來值 CLRC ;C清零 SUBBA,@R0;兩數(shù)相減,以判斷兩者的大小2023/7/26

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論