版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 藝術(shù)品搬運(yùn)合同范本
- 液體潤(rùn)滑油配送協(xié)議
- 林業(yè)工程車輛租賃協(xié)議模板
- 馬術(shù)俱樂(lè)部休息區(qū)裝修合同
- 服裝店裝修材料購(gòu)買合同
- 研發(fā)中心渣土清運(yùn)服務(wù)合同
- 火車站候車區(qū)裝修合同
- 酒吧特色裝修增項(xiàng)合同
- 裝修監(jiān)理合同模板
- 航空生鮮食品運(yùn)輸協(xié)議范本
- 細(xì)胞外囊泡在韌帶損傷修復(fù)中的作用
- 建立安全管理的領(lǐng)導(dǎo)力與執(zhí)行力
- 大象版科學(xué)五年級(jí)上冊(cè)人體司令部課件
- 《食品微生物學(xué)》實(shí)驗(yàn)實(shí)訓(xùn)教學(xué)大綱
- 初中作文校本教材
- 2024年北汽集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 撫養(yǎng)權(quán)轉(zhuǎn)讓協(xié)議書(shū)
- 醫(yī)院醫(yī)用輸液泵和醫(yī)用注射泵安全管理
- 鐵人三項(xiàng):挑戰(zhàn)身體與意志的極限
- 防災(zāi)減災(zāi)課件
- 精神科 護(hù)理查房記錄
評(píng)論
0/150
提交評(píng)論