單片機(jī)原理及接口技術(shù) 匯編語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
單片機(jī)原理及接口技術(shù) 匯編語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
單片機(jī)原理及接口技術(shù) 匯編語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
單片機(jī)原理及接口技術(shù) 匯編語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
單片機(jī)原理及接口技術(shù) 匯編語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章匯編語(yǔ)言程序設(shè)計(jì)簡(jiǎn)介偽指令匯編語(yǔ)言程序設(shè)計(jì)4.1

偽指令偽指令是對(duì)匯編過(guò)程起控制作用,但本身并沒(méi)有對(duì)應(yīng)的機(jī)器代碼的指令。一、匯編起始指令ORG指令格式為:ORG

nn該指令的作用是指明后面的程序或數(shù)據(jù)塊的起始地址,

它總是出現(xiàn)在每段源程序或數(shù)據(jù)塊的開(kāi)始。式中,nn為16位地址,匯編時(shí)nn確定了此語(yǔ)句后面第一條指令或第一個(gè)數(shù)據(jù)的地址,此后的源程序或數(shù)據(jù)塊就依次連續(xù)存放在以后的地址內(nèi),直到遇到另一個(gè)ORG指令為止。例:ORG

2000HMOV

SP,

#60HMOV

R0,

#2FHMOV

R2,

0FFHORG偽指令說(shuō)明其后面程序的目標(biāo)代碼在存儲(chǔ)器中存放的起始地址是2000H,即存儲(chǔ)器地址目標(biāo)程序2000H7581

602003H782F2005H7AFF二、等值指令EQU指令格式:字符名稱EQU數(shù)字或匯編符號(hào)例:PA8155

EQU

8001H;即給標(biāo)號(hào)PA8155賦值為8001H。功能:使指令中的字符名稱等價(jià)于給定的數(shù)字或匯編符號(hào)。使用等值指令可給程序的編制、調(diào)試、修改帶來(lái)方便,如果在程序中要多次使用到某一地址,由EQU指令將其賦值給一個(gè)字符名稱,一旦需要對(duì)其進(jìn)行變動(dòng),只要改變EQU命令后面的數(shù)字即可,而不需要對(duì)程序中涉及到該地址的所有指令逐句進(jìn)行修改。但要注意,由EQU等值的字符名稱必須先賦值后使用,且在同一個(gè)源程序中,同一個(gè)標(biāo)號(hào)只能賦值一次。三、定義字節(jié)指令DB指令格式:[標(biāo)號(hào):]

DB

8位二進(jìn)制數(shù)表功能:把8位二進(jìn)制數(shù)表依次存入從標(biāo)號(hào)開(kāi)始的連續(xù)的存儲(chǔ)單元中。格式中,標(biāo)號(hào)區(qū)段可有可無(wú),DB指令之后的8位二進(jìn)制數(shù)表是字節(jié)常數(shù)或用逗號(hào)隔開(kāi)的字節(jié)串,也可以是用引號(hào)括起來(lái)的ASCII碼字符串(一個(gè)ASCII字符相當(dāng)于一個(gè)字節(jié))。例:ORG

1000HBUF1:

DB

38H,

7FH,

80HBUF2:

DB

45H,

66HORG偽指令指定了標(biāo)號(hào)BUF1的地址為1000H,而DB偽指令是將其后的二進(jìn)制數(shù)表38H,

7FH,

80H依次存放在1000H,

1001H,

1002H

3

個(gè)連續(xù)單元之中,

BUF2也是一個(gè)標(biāo)號(hào),

其地址與前一條偽指令連續(xù),即1003H,1004H地址單元中依次存放45H,66H。四、定義字指令DW指令格式:[標(biāo)號(hào):]

DW

16位數(shù)據(jù)表該指令的功能與DB相似,區(qū)別僅在于從指定地址開(kāi)始存放的是指令中的16位數(shù)據(jù),而不是字節(jié)串。每個(gè)16位數(shù)據(jù)要占兩個(gè)存儲(chǔ)單元,高8位先存,低8位后存,這和MCS-51指令中的16位數(shù)據(jù)存放順序是

一致的。五、匯編結(jié)束指令END指令格式:[標(biāo)號(hào):]

END地址或標(biāo)號(hào)格式中標(biāo)號(hào)以及END后面的地址或標(biāo)號(hào)可有可無(wú)。功能:

提供匯編結(jié)束標(biāo)志。匯編程序遇到

END后就停止匯編,

對(duì)END以后的語(yǔ)句不予處理,

END應(yīng)放在程序的結(jié)束處。4.2

匯編語(yǔ)言程序設(shè)計(jì)4.2.1

簡(jiǎn)單程序設(shè)計(jì)例

1

兩個(gè)無(wú)符號(hào)雙字節(jié)數(shù)相加。設(shè)被加數(shù)存放于內(nèi)部RAM的40H(高位字節(jié)),41H(低位字節(jié)),加數(shù)存放于50H(高位字節(jié)),51H(低位字節(jié)),

和數(shù)存入

40H和41H單元中。程序如下:START:

MOV

R0,

#41H

;

將被加數(shù)地址送數(shù)據(jù)指針R0MOV

R1,

#51H

;

將加數(shù)地址送數(shù)據(jù)指針R1AD1:

MOV

A,

@R0ADD

A,@R1;被加數(shù)低字節(jié)的內(nèi)容送入A;兩個(gè)低字節(jié)相加MOV@R0,A;低字節(jié)的和存入被加數(shù)低字節(jié)中DECR0;指向被加數(shù)高位字節(jié)DECR1;指向加數(shù)高位字節(jié);被加數(shù)高位字節(jié)送入A;兩個(gè)高位字節(jié)帶Cy相加;高位字節(jié)的和送被加數(shù)高位字節(jié)MOV

A,

@R0

ADD

A,

@R1

MOV

@R0,

A

END正確程序如下:START:

CLR

C;將Cy清零MOVR0,#41H

;將被加數(shù)地址送數(shù)據(jù)指針R0MOVR1,#51H

;將加數(shù)地址送數(shù)據(jù)指針R1AD1:MOV

A,

@R0ADD

A,@R1MOV

@R0,

ADEC

R0DEC

R1;被加數(shù)低字節(jié)的內(nèi)容送入A;兩個(gè)低字節(jié)相加;低字節(jié)的和存入被加數(shù)低字節(jié)中;指向被加數(shù)高位字節(jié);指向加數(shù)高位字節(jié)MOVA,

@R0;被加數(shù)高位字節(jié)送入AADDCA,

@R1;兩個(gè)高位字節(jié)帶Cy相加MOV@R0,

A;高位字節(jié)的和送被加數(shù)高位字節(jié)END例2將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。設(shè)內(nèi)部RAM

40H(高4位),41H(低4位)單元中分別存放著8位二進(jìn)制數(shù),要求取出兩個(gè)單元中的低半字節(jié),并成一個(gè)字節(jié)后,存入50H單元中。程序如下:;設(shè)置R1為數(shù)據(jù)指針;取出第一個(gè)單元中的內(nèi)容;取第一個(gè)數(shù)的低半字節(jié);移至高半字節(jié);修改數(shù)據(jù)指針;取第二個(gè)單元中的內(nèi)容;取第二個(gè)數(shù)的低半字節(jié);拼字;存放結(jié)果START:

MOV

R1,

#40HMOV

A,

@R1ANL

A,

#0FHSWAP

AINC

R1XCH

A,

@R1ANL

A,

0FHORL

A,

@R1MOV

50H,

AEND4.2.2

分支程序設(shè)計(jì)圖4.1分支結(jié)構(gòu)框圖(a)

單分支流程;

(b)

多分支流程例

3

x,

y均為8位二進(jìn)制數(shù),設(shè)x存入R0,y存入R1,求解:

y=syn(x)程序如下:START:CJNE R0,#00H,SUL1;R0中的數(shù)與00比較不等轉(zhuǎn)移MOV R1,

#00H;

相等,

R1←

0SJMP

SUL2SUL1:

JC

NEG

;

兩數(shù)不等,

若(R0)<0,

轉(zhuǎn)向NEGMOV R1,

#01H

;

(R0)>0,

R1←01HSJMP

SUL2NEG:

MOV R1,#0FFH;(R0)<0,則R1←0FFHSUL2

:

RET程序如下:SUBF :

MOV

A,R0JZ

ZEROJB

ACC.7

,

NEG

MOV R1,

#1SJMP

ENDFZERO

:

MOV

R1

,

#0SJMP

ENDFNEG

:

MOV

R1

,

#0FFHENDF

:

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

CLR

CMOV

DPTR,

#ST1;清零Cy;第一個(gè)數(shù)的指針MOVX

A,

@DPTRMOV

R2,

A;取第一個(gè)數(shù);保存MOV

DPTR,

#ST2;第二個(gè)數(shù)的指針;取第二個(gè)數(shù)MOVX

A,

@DPTRCLR

CSUBB

A,R2;兩數(shù)比較JNC

BIG2;若第二個(gè)數(shù)大,則轉(zhuǎn)

XCH

A,R2;第一個(gè)數(shù)大BIG1:

MOV

DPTR,

#ST3MOVX

@DPTR,A;存大數(shù)RETBIG2:MOVX

A,@DPTR;第二個(gè)數(shù)大SJMP

BIG1RET4.2.3循環(huán)程序設(shè)計(jì)一、循環(huán)程序圖7.4循環(huán)程序一般由四個(gè)主要部分組成:初始化部分:為循環(huán)程序做準(zhǔn)備,如規(guī)定循環(huán)次數(shù)、給各變量和地址指針預(yù)置初值。處理部分:為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實(shí)體,也是循環(huán)程序的主體。循環(huán)控制部分:這部分的作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結(jié)束,直到符合結(jié)束條件時(shí),跳出循環(huán)為止結(jié)束部分:這部分主要是對(duì)循環(huán)程序的結(jié)果進(jìn)行分析、處理和存放。例5工作單元清零。在應(yīng)用系統(tǒng)程序設(shè)計(jì)時(shí),有時(shí)經(jīng)常需要將存儲(chǔ)器中各部分地址單元作為工作單元,存放程序執(zhí)行的中間值或執(zhí)行結(jié)果,工作單元清零工作常常放在程序的初始化部分中。設(shè)有50個(gè)工作單元,其首址為外部存儲(chǔ)器8000H單元,則其工作單元清零程序如下:CLEAR:

CLR

A;工作單元首址送指針MOV

DPTR,

#8000HMOV

R2,#50;置循環(huán)次數(shù)CLEAR1:

MOVX

@DPTR,

AINC

DPTR;修改指針DJNZ

R2,CLEAR1;控制循環(huán)RET例6設(shè)在內(nèi)部RAM的BLOCK單元開(kāi)始處有長(zhǎng)度為L(zhǎng)EN個(gè)的無(wú)符號(hào)數(shù)據(jù)塊,試編一個(gè)求和程序,并將和存入內(nèi)部

RAM的SUM單元(設(shè)和不超過(guò)8位)。例6設(shè)在內(nèi)部RAM的BLOCK單元開(kāi)始處有長(zhǎng)度為L(zhǎng)EN個(gè)的無(wú)符號(hào)數(shù)據(jù)塊,試編一個(gè)求和程序,并將和存入內(nèi)部

RAM的SUM單元(設(shè)和不超過(guò)8位)。BLOCK

EQU

20HEQU

30HEQU

40HLENSUMSTART:CLR

A;清累加器AMOV

R2,#LEN;數(shù)據(jù)塊長(zhǎng)度送R2LOOP:MOV

R1,#BLOCK;數(shù)據(jù)塊首址送R1ADD

A,@R1;循環(huán)加法INC

R1;修改地址指針DJNZ

R2,LOOP;修改計(jì)數(shù)器并判斷MOV

SUM,A;存和RET二、多重循環(huán)例

7

10

秒延時(shí)程序。延時(shí)程序與MCS-51執(zhí)行指令的時(shí)間有關(guān),如果

使用6

MHz晶振,一個(gè)機(jī)器周期為2

μs,計(jì)算出一條指令以至一個(gè)循環(huán)所需要的執(zhí)行時(shí)間,給出相應(yīng)的循環(huán)次數(shù),便能達(dá)到延時(shí)的目的。例7

10秒延時(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í)程序如下:DELAY:

MOV R5,

#100DEL0:DEL1:DEL2:MOV R6,

#200MOV R7,

#248DJNZ R7,

DEL2DJNZ R6,

DEL1DJNZ R5,

DEL0RET上例程序中采用了多重循環(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)方式。例

8

在外部RAM中,

BLOCK開(kāi)始的單元中有一

無(wú)符號(hào)數(shù)據(jù)塊,

其個(gè)數(shù)為

LEN個(gè)字節(jié)。試將這些無(wú)符號(hào)數(shù)按遞減次序重新排列,

并存入原存儲(chǔ)區(qū)。ORG

1000HSTART:MOV

DPTR,#BLOCK;置地址指針MOVP2,

DPH;P2作地址指針高字節(jié)MOVR7,

#LEN;置外循環(huán)計(jì)數(shù)初值DECR7;比較與交換n-1次LOOP0:CLR

F0

;交換標(biāo)志清0MOV

R0,DPL;MOV

R1,DPL;置相鄰兩數(shù)地址指針低字節(jié)INC

R1MOV

R6,R7

;置內(nèi)循環(huán)計(jì)數(shù)器初值LOOP1:MOVX

A,@R0;取數(shù)MOV

B,

AMOVX

A,

@R1;暫存;取下一個(gè)數(shù)CJNE

A,

B,

NEXT;

相鄰兩數(shù)比較,

不等轉(zhuǎn)SJMP

NOCHA ;

相等不交換NEXT:JC

NOCHA;Cy

=1,則前者大于后者,不必交換SETB

F0;否則,置交換標(biāo)志MOVX

@R0,

A

;XCH

A,B;兩數(shù)交換,大者在前,小者在后MOVX

@R1,A;NOCHA:

INC

R0INC

R1;修改指針DJNZ

R6,LOOP1;內(nèi)循環(huán)未完,則繼續(xù)JNB

F0,EXIT;若從未交換,則結(jié)束DJNZ

R7,LOOP0;外循環(huán)未完,則繼續(xù)EXIT:

RET圖5.5例9

設(shè)某系統(tǒng)的模數(shù)轉(zhuǎn)換器是ADC0809,口地址為7FFFH,

它的轉(zhuǎn)換結(jié)束信號(hào)

EOC連接到8031

的P1.7端,

當(dāng)

EOC的狀態(tài)由低變高時(shí),

則結(jié)束循環(huán)等待,

并讀取轉(zhuǎn)換值,

其程序如下:…例

9

設(shè)某系統(tǒng)的模數(shù)轉(zhuǎn)換器是ADC0809,口地址為7FFFH,

它的轉(zhuǎn)換結(jié)束信號(hào)

EOC連接到8031

的P1.7端,

當(dāng)EOC的狀態(tài)由低變高時(shí),

則結(jié)束循環(huán)等待,

并讀取轉(zhuǎn)換值,其程序如下:START:

MOV

DPTR,#7FFFH;0809端口地址送DPTRMOV

A,

#00H

;

啟動(dòng)0809轉(zhuǎn)換MOVX

@DPTR,

ALOOP:JNB

P1.7,LOOP;檢測(cè)P1.7狀態(tài),判是否轉(zhuǎn)換結(jié)束MOVX

A…,@DPTR;讀取轉(zhuǎn)換結(jié)果例10

在內(nèi)部RAM中從

50H單元開(kāi)始的連續(xù)單元依次存放了一串字符,該字符串以回車符為結(jié)束標(biāo)志,要求測(cè)試該字符串的長(zhǎng)度。例10

在內(nèi)部RAM中從

50H單元開(kāi)始的連續(xù)單元依次存放了一串字符,該字符串以回車符為結(jié)束標(biāo)志,要求測(cè)試該字符串的長(zhǎng)度。程序如下:START:

MOV R2,

#0FFHMOVR0,

#4FH;數(shù)據(jù)指針R0置初值LOOP:INCR0INCR2CJNE

@R0,

#0DH,

LOOPRET4.2.4

散轉(zhuǎn)程序設(shè)計(jì)散轉(zhuǎn)程序是分支程序的一種,它可根據(jù)運(yùn)算結(jié)果或輸入數(shù)據(jù)將程序轉(zhuǎn)入不同的分支。MCS-51指令系統(tǒng)中有一條跳轉(zhuǎn)指令JMP@A+DPTR,用它可以很容易地實(shí)現(xiàn)散轉(zhuǎn)功能。該指令把累加器的8位無(wú)符號(hào)數(shù)與16位數(shù)據(jù)指針的內(nèi)容相加,并把相加的結(jié)果裝入程序計(jì)數(shù)器PC,控制程序轉(zhuǎn)向目標(biāo)地址去執(zhí)行。此指令的特點(diǎn)在于,轉(zhuǎn)移的目標(biāo)地址不是在編程或匯編時(shí)預(yù)先確定的,而是在程序運(yùn)行過(guò)程中動(dòng)態(tài)地確定的。目標(biāo)地址是以數(shù)據(jù)指針DPTR的內(nèi)容為起始的256字節(jié)范圍內(nèi)的指定地址,即由DPTR的內(nèi)容決定分支轉(zhuǎn)移程序的首地址,由累加器A的內(nèi)容來(lái)動(dòng)態(tài)選擇其中的某一個(gè)分支轉(zhuǎn)移程序。例11根據(jù)工作寄存器R0內(nèi)容的不同,使程序轉(zhuǎn)入相應(yīng)的分支。(R0)=0對(duì)應(yīng)的分支程序標(biāo)號(hào)為PR0;(R0)=1對(duì)應(yīng)的分支程序標(biāo)號(hào)為PR1;…(R0)=N對(duì)應(yīng)的分支程序標(biāo)號(hào)為PRN。程序如下:LP0:

MOVDPTR,

#TAB;取表頭地址MOVA,

R0ADDA,

R0;R0內(nèi)容乘以2JNCLP1;無(wú)進(jìn)位轉(zhuǎn)移INCDPH;加進(jìn)位位AJMP

PRNLP1:

JMP

@A+DPTR;跳至散轉(zhuǎn)表中相應(yīng)位置TAB:

AJMP

PR0

…AJMP

PR1…本例程序僅適用于散轉(zhuǎn)表首地址TAB和處理程序入口地址PR0,PR1,…,PRN在同一個(gè)2

KB范圍的存儲(chǔ)區(qū)內(nèi)的情形。若超出2

KB范圍可在分支程序入口處安排一條長(zhǎng)跳轉(zhuǎn)指令,可采用如下程序:MOV

DPTR,

#TABMOV

A,

R0MOV

B,

#03H;長(zhǎng)跳轉(zhuǎn)指令占3個(gè)字節(jié)MUL

ABXCH

A,

BADD

A,

DPHMOV

DPH,

A

XCH

A,

BJMP

@A+DPTR;跳至散轉(zhuǎn)表中相應(yīng)的位置…TAB:LJMP

PR0;跳至不同的分支LJMP

PR1…LJMP

PRN4.2.5

查表程序設(shè)計(jì)查表程序是一種常用程序,它廣泛使用于LED顯示控制、打印機(jī)打印控制、數(shù)據(jù)補(bǔ)償、數(shù)值計(jì)算、轉(zhuǎn)換等功能程序中,這類程序具有簡(jiǎ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)。MCS-51指令系統(tǒng)中,有兩條查表指令:MOVC

A,

@A+PC

MOVC

A,

@A+DPTR例13一個(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。編程如下:例13一個(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。編程如下:ORG

1000HHEXASC:

MOV

A,

HEXANL

A,

0FHADD

A,

3;

修改指針MOVC

A,

@A+PCMOV

HEX,

ARETASCTAB:

DB

30H,

31H,

32H,

33H,

34HDB

35H,

36H,

37H,

38H,

39HDB

41H,

42H,

43H,

44H,

45HDB

46H在這個(gè)程序中,查表指令MOVC

A,@A+PC到表格首地址有兩條指令,占用3個(gè)字節(jié)地址空間,故修改指針應(yīng)加3例14設(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單元中。查找最大額定值的程序如下:例14設(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:

MOV

A,

R2ADD

A,

R2;表中一個(gè)額定值為2個(gè)字節(jié)MOV

31H,

AMOV

DPTR,#TAB;表首址MOVC

A,@A+DPTR;查表讀取第一個(gè)字節(jié)XCH

A,31H;第一個(gè)字節(jié)內(nèi)容存入31HINC

DPTRMOVC

A,@A+DPTR;查表讀取第二個(gè)字節(jié)MOV

32H,A;第二字節(jié)的內(nèi)容存入32HTAB:

DW

1230H,

1450H,

...DW

2230H,

2440H,

...DW

3120H,

3300H,

...例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中)。程序如下:FTMP:MOVDPTR,

#TAB;DPTR←表首地址MOVA,

21H;

(20H)(21H)×2CLRCRLCAMOV21H,

AMOVA,

20HRLCAMOV20H,

AMOVA,

21H;表首地址+偏移量CLRCADDC

A,

DPLMOV

DPL,

AMOV

A,

20HADDC

A,

DPHMOV

DPH,

ACLR

AMOVC

A,

@A+DPTR;

查表得溫度值高位字節(jié)MOV

22H,

ACLR

AINC

DPTRTAB:MOVC

A,

@A+DPTR;

查表得溫度值低位字節(jié)MOV

23H,

ARETDW

…4.2.6子程序和參數(shù)傳遞一、子程序的概念通常把這些基本操作功能編制為程序段作為獨(dú)立的子程序,以供不同程序或同一程序反復(fù)調(diào)用。在程序中需要執(zhí)行這種操作的地方放置一條調(diào)用指令,當(dāng)程序執(zhí)行到調(diào)用指令,就轉(zhuǎn)到子程序中完成規(guī)定的操作,并返回到原來(lái)的程序繼續(xù)執(zhí)行下去。二、子程序的調(diào)用調(diào)用子程序的指令有“ACALL”和“LCALL”,執(zhí)行調(diào)

用指令時(shí),先將程序地址指針PC改變(“ACALL”加2,“LCALL”加3),然后PC值壓入堆棧,用新的地址值代替。執(zhí)行返回指令時(shí),再將PC值彈出。子程序調(diào)用中,主程序應(yīng)先把有關(guān)的參數(shù)存入約定的位置,子程序在執(zhí)行時(shí),可以從約定的位置取得參數(shù),當(dāng)子程序執(zhí)行完,將得到的結(jié)果再存入約定的位置,返回主程序后,主程序可以從這些約定的位置上取得需要的結(jié)果,這就是參數(shù)的傳遞。例12把內(nèi)部RAM某一單元中一個(gè)字節(jié)的十六進(jìn)制數(shù)轉(zhuǎn)換成兩位ASCII碼,結(jié)果存放在內(nèi)部RAM的連續(xù)兩個(gè)單元中。假設(shè)一個(gè)字節(jié)的十六進(jìn)制數(shù)在內(nèi)部RAM

40H單元,而結(jié)果存入50H,51H單元,可以用堆棧進(jìn)行參數(shù)傳遞,程序如下:例12把內(nèi)部RAM某一單元中一個(gè)字節(jié)的十六進(jìn)制數(shù)轉(zhuǎn)換成兩位ASCII碼,結(jié)果存放在內(nèi)部RAM的連續(xù)兩個(gè)單元中。假設(shè)一個(gè)字節(jié)的十六進(jìn)制數(shù)在內(nèi)部RAM

40H單元,而結(jié)果存入50H,51H單元,可以用堆棧進(jìn)行參數(shù)傳遞,程序如下:MAIN:MOV

R1,#50H;R1為存結(jié)果的指針

MOV

A,40H;A為需轉(zhuǎn)換的十六進(jìn)制數(shù)

SWAP

A;先轉(zhuǎn)換高位半字PUSH

ACC;壓棧LCALL

HEASC;調(diào)用將低半字節(jié)的內(nèi)容轉(zhuǎn)換;成ASCII碼子程序HEASCPOP

ACCMOV

@R1,A;存高半字節(jié)轉(zhuǎn)換結(jié)果INC

R1PUSH

40HLCALL

HEASCPOP

ACCMOV

@R1,A

;存低半字節(jié)轉(zhuǎn)換結(jié)果ENDHEASC:

MOV

R0,

SPDEC

R0DEC

R0

;

R0

指向十六進(jìn)制數(shù)參數(shù)地址XCH

A,

@R0

;

取被轉(zhuǎn)換參數(shù)ANL

A,

#0FH

;

保留低半字節(jié)ADD

A,

#2

;修改

A值TAB:MOVC

A,@A+PC

;查表XCH

A,@R0;結(jié)果送回堆棧RETDB 30H,

31H,

32H,

…4.2.7數(shù)制轉(zhuǎn)換例16將一個(gè)字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成3位非壓縮型BCD碼。設(shè)一個(gè)字節(jié)二進(jìn)制數(shù)在內(nèi)部RAM

40H單元,轉(zhuǎn)換結(jié)果放入內(nèi)部RAM

50H#,51H,52H單元中(高位在前),程序如下:例16將一個(gè)字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成3位非壓縮型BCD碼。設(shè)一個(gè)字節(jié)二進(jìn)制數(shù)在內(nèi)部RAM

40H單元,轉(zhuǎn)換結(jié)果放入內(nèi)部RAM

50H#,51H,52H單元中(高位在前),程序如下:例16將一個(gè)字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成3位非壓縮型BCD碼。設(shè)一個(gè)字節(jié)二進(jìn)制數(shù)在內(nèi)部RAM

40H單元,轉(zhuǎn)換結(jié)果放入內(nèi)部RAM

50H#,51H,52H單元中(高位在前),程序如下:HEXBCD:

MOV

A,

40HMOV

B,

#100DIV

ABMOV

50H,

A

MOVA,#10XCH

A,

BDIV

ABMOV

51H,

A

MOV

52H,

BHERE:

JMP

HERE例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+D0R0,#40H

;R0指向最高位地址R1,#03;計(jì)數(shù)值送R1;存放結(jié)果的高位清零BCDHEX:

MOVMOVMOVMOVMOVLOOP:R2,

#0A,

@R0R3,

AMOV

A,

R3MOV

B,

#10MULABMOV

R3,A;(R3)×10的低8位送R3MOV

A,BXCHA,R2;(R3)×10的高8位暫存R2MOVB,#10MULABADD

A,

R2MOVR2,A;R2×10+(

R3×10)高8位送R2INCR0;取下一個(gè)BCD數(shù)MOVA,R3ADDA,

@R0MOVR3,

AMOVA,

R2ADDC

A,#0;加低字節(jié)來(lái)的進(jìn)位MOVR2,ADJNZ

R1,

LOOPRET4.2.8

運(yùn)算程序一、加、減法程序例18將40H開(kāi)始存放的10個(gè)字節(jié)的數(shù)與50H開(kāi)始存放的10個(gè)字節(jié)的數(shù)相減(假設(shè)被減數(shù)大于減數(shù))。設(shè)被減數(shù)指針為R0,減數(shù)指針為R1,差數(shù)放回被減數(shù)單元,R5存放字節(jié)個(gè)數(shù),則程序如下:SUB:

MOVMOVMOVCLRSUB1:

MOVR0,

#40HR1,

#50HR5,

#10CA,

@R0SUBB

A,

@R1MOV

@R0,

AINC

R0INC

R1DJNZ

R5,

SUB1RET二、乘法運(yùn)算程序在計(jì)算機(jī)中,常將乘法采用移位和加法來(lái)實(shí)現(xiàn)。例19將(R2R3)和(R6R7)中雙字節(jié)無(wú)符號(hào)數(shù)相乘,結(jié)果存入R4R5R6R7。此乘法可以采用部分積右移的方法來(lái)實(shí)現(xiàn),其程序框圖如圖4.6所示,程序如下:;初始化NMUL:

MOV

R4,

#0MOV

R5,

#0CLR

CMOV

R0,

#16NMUL1:MOV

A,R4;CyR4R5R6R7右移一位RRC

AMOV

R4,

AMOV

A,

R5RRC

AMOV

R5,

AMOV

A,

R6RRC

AMOV

R6,

AMOV

A,

R7RRCMOV

R7,

AJNC

NMUL2;C為移出乘數(shù)的最低位MOV

A,

R5

;

(R4R5)+(R6F7)→(R4R5)ADD

A,

R3MOV

R5,

AMOV

A,

R4ADDC

A,

R2MOV

R4,

ANMUL2:DJNZR0,NMUL1;循環(huán)16位MOV

A,R4;最后結(jié)果再移一位RRC

AMOV

R4,

AMOV

A,

R5RRC

AMOV

R5,

AMOV

A,

R6RRC

AMOV

R6,

AMOV

A,

R7RRC

AMOV

R7,

ARET圖4.6

NMUL程序框圖例20假定被乘數(shù)在(R4R3)中,乘數(shù)放在R2中,乘積放在R7R6和R5中。MCS-51中有8位數(shù)的乘法指令MUL,用它來(lái)實(shí)現(xiàn)多字節(jié)乘法時(shí),可表示為(R4R3)×(R2)

=[(R4)×28+(R3)]×(R2)=(R4)×(R2)×28+(R3)×(R2

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論