微機原理與應用:第4章 單片機程序設(shè)計_第1頁
微機原理與應用:第4章 單片機程序設(shè)計_第2頁
微機原理與應用:第4章 單片機程序設(shè)計_第3頁
微機原理與應用:第4章 單片機程序設(shè)計_第4頁
微機原理與應用:第4章 單片機程序設(shè)計_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

概述 簡單程序設(shè)計 分支程序設(shè)計 循環(huán)程序設(shè)計 查表程序 子程序設(shè)計 實用匯編子程序舉例 第4章

單片機程序設(shè)計1

4.1MCS51單片機匯編語言與指令格式

4.1.1

單片機的匯編語言由于構(gòu)成計算機的電子器件特性所決定,計算機只能識別二進制代碼。這種以二進制代碼來描述指令功能的語言,稱之為機器語言,用機器語言組成的程序,稱為目標程序。計算機就是按照機器語言的指令來完成各種功能操作的,它具有程序簡捷、占用存儲空間小、執(zhí)行速度快、控制功能強等特點。24.1.2

指令格式MCS—51單片機匯編語言指令的標準格式如下:[標號:]操作碼[目的操作數(shù)][,源操作數(shù)][;注釋]例如:LOOP:ADDA,#10H;(A)←(A)+10H(1)方括號[]表示該項是可選項,可有可無。(2)標號是用戶設(shè)定的符號,它實際代表該指令所在的地址。標號必須以字母開頭,其后跟1~8個字母或數(shù)字,并以“:”結(jié)尾。3(3)操作碼是用英文縮寫的指令功能助記符。它確定了本條指令完成什么樣的操作功能。如:ADD表示加法操作。任何一條指令都必須有該助記符項,不得省略。

(4)目的操作數(shù)提供操作的對象,并指出一個目標地址,表示操作結(jié)果存放單元的地址,它與操作碼之間必須以一個或幾個空格分隔。如上例中A表示操作對象是累加器A的內(nèi)容,并指出操作結(jié)果又回送A存放。4(5)源操作數(shù)指出的是一個源地址(或立即數(shù)),表示操作的對象或操作數(shù)來自何處。它與目的操作數(shù)之間要用“,”號隔開。(6)注釋部分是在編寫程序時,為了增加程序的可讀性,由用戶擬寫對該條指令或該段程序功能的說明。它以分號“;”開頭,可以用中文、英文或某些符號來表示,顯然它不存入計算機,只出現(xiàn)在源程序中。5匯編方法手工匯編:先寫出源程序,再逐條查表,以得出機器碼。PC機匯編:機器匯編,在PC機上完成對MCS-51源程序(.asm)的編譯,得出機器碼(.obj/.HEX)等。自動編排目標程序中的指令存放地址;把源程序翻譯成機器碼;分析源程序語法,若出錯,給出錯誤信息;輸出目標程序(.obj)。6單片機匯編語言程序設(shè)計的基本步驟如下:

(1)題意分析。熟悉并了解匯編語言指令的基本格式和主要特點,明確被控對象對軟件的要求,設(shè)計出算法等。

(2)畫出程序流程圖。編寫較復雜的程序,畫出程序流程圖是十分必要的。程序流程圖也稱為程序框圖,是根據(jù)控制流程設(shè)計的,它可以使程序清晰,結(jié)構(gòu)合理,便于調(diào)試。7

(3)分配內(nèi)存工作區(qū)及有關(guān)端口地址。分配內(nèi)存工作區(qū),要根據(jù)程序區(qū)、數(shù)據(jù)區(qū)、暫存區(qū)、堆棧區(qū)等預計所占空間大小,對片內(nèi)外存儲區(qū)進行合理分配并確定每個區(qū)域的首地址,便于編程使用。

(4)編制匯編源程序。

(5)仿真、調(diào)試程序。

(6)固化程序。84.3簡單程序設(shè)計

簡單程序也就是順序程序,它是最簡單、最基本的程序結(jié)構(gòu),其特點是按指令的排列順序一條條地執(zhí)行,直到全部指令執(zhí)行完畢為止。不管多么復雜的程序,總是由若干順序程序段所組成的。本節(jié)通過實例介紹簡單程序的設(shè)計方法。例14字節(jié)(雙字)加法。將內(nèi)部RAM30H開始的4個單元中存放的4字節(jié)十六進制數(shù)和內(nèi)部RAM40H單元開始的4個單元中存放的4字節(jié)十六進制數(shù)相加,結(jié)果存放到40H開始的單元中。9

(1)題意分析。題目的要求如圖4.5所示。10

ORG 0000H MOV A,30H ADD A,40H MOV 40H,A ;最低字節(jié)加法并送結(jié)果

MOV A,31H ADDC A,41H MOV 41H,A ;第二字節(jié)加法并送結(jié)果(2)匯編語言源程序。按照雙字節(jié)加法的思路,實現(xiàn)4字節(jié)加法的源程序如下:11

MOV A,32H ADDCA,42H MOV 42H,A ;第三字節(jié)加法并送結(jié)果

MOV A,33H ADDC A,43H MOV 43H,A ;第四字節(jié)加法并送結(jié)果,進位位在CY中

END12例2:將兩個半字節(jié)數(shù)合并成一個一字節(jié)數(shù)。內(nèi)部RAM40H、41H單元中分別存放著8位二進制數(shù),要求取出兩個單元中的低半字節(jié),并成一個字節(jié)后,存入50H單元中。程序如下:START:MOVR1,#40H;設(shè)置R1為數(shù)據(jù)指針

MOVA,@R1;取出第一個單元中的內(nèi)容

ANLA,#0FH;取第一個數(shù)的低半字節(jié)

SWAPA ;移至高半字節(jié)

INC

R1;

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

XCHA,@R1 ;取第二個單元中的內(nèi)容

ANLA,#0FH;取第二個數(shù)的低半字節(jié)

ORLA,@R1 ;拼字

MOV50H,A ;存放結(jié)果

END

134.3.2

分支程序設(shè)計圖4.1分支結(jié)構(gòu)框圖(a)單分支流程;(b)多分支流程14例3:x,y均為8位二進制數(shù),設(shè)x存入R0,y存入R1,求解:

15程序如下:START:CJNER0,#00H,SUL1;R0中的數(shù)與00比較不等轉(zhuǎn)移MOVR1,#00H;相等,R1←0SJMPSUL2

SUL1:

JC

NEG;兩數(shù)不等,若(R0)<0,轉(zhuǎn)向NEGMOVR1,#01H;(R0)>0,則R1←01HSJMPSUL2

NEG:MOVR1,#0FFH;(R0)<0,則R1←0FFHSUL2:SJMP$END16例4:

比較兩個無符號數(shù)的大小。設(shè)外部

RAM的存儲單元ST1和ST2中存放兩個不帶符號的二進制數(shù),找出其中的大數(shù)存入外部

RAM中的ST3單元中。17程序如下:

ORG1000HST1EQU2000HST2EQU2100HST3EQU2200HSTART:MOVDPTR,#ST1;第一個數(shù)的指針

MOVXA,@DPTR;取第一個數(shù)

MOVR2,A;保存

MOVDPTR,#ST2;第二個數(shù)的指針

MOVXA,@DPTR;取第二個數(shù)

CLRC

SUBBA,R2;兩數(shù)比較

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

XCHA,R2;第一個數(shù)大BIG0:MOVDPTR,#ST3MOVX@DPTR,A;存大數(shù)

RETBIG1:MOVXA,@DPTR;第二個數(shù)大

SJMPBIG0RET

18是指程序中有多個條件,在這種情況下,先把分支程序編上序號,按照序號進行轉(zhuǎn)移。設(shè)最大序號為N,則分支轉(zhuǎn)移結(jié)構(gòu)如圖所示。實現(xiàn)多分支程序轉(zhuǎn)移的方法有多種。

多分支程序19圖符號函數(shù)流程圖存結(jié)果結(jié)束YA←+1YA←X開始N(A)=0?N(A)>0?A←-1

1當X>0時

Y=0當X=0時

-1當X<0時(1)使用條件轉(zhuǎn)移指令,通過逐次比較,實現(xiàn)多分支程序轉(zhuǎn)移。符號函數(shù)設(shè)X存放在內(nèi)部RAM的35H單元中,結(jié)果存入36H單元.20ORG2000HSTART:MOV A,35H ;A←X JZ LP2 ;X=0轉(zhuǎn)移

JNBACC.7,LP1;X>0轉(zhuǎn)移

MOVA,#0FFH;X<0則Y=-1 SJMPLP2LP1:MOVA,#01;X>0則Y=1LP2:MOV36H,A;36H←YEND21

三分支程序設(shè)計例5

兩個有符號數(shù)比較(三分支程序)。內(nèi)部RAM的20H單元和30H單元各存放了一個8位有符號數(shù),請比較這兩個數(shù)的大小:若(20H)=(30H),則P1.0管腳連接的LED發(fā)光;若(20H)>(30H),則P1.1管腳連接的LED發(fā)光;若(20H)<(30H),則P1.2管腳連接的LED發(fā)光。22

(1)題意分析。有符號數(shù)在計算機中的表示方式與無符號數(shù)是不相同的:正數(shù)以原碼形式表示,負數(shù)以補碼形式表示,8位二進制數(shù)的補碼所能表示的數(shù)值范圍為+127~-128。

計算機本身無法區(qū)分一串二進制碼組成的數(shù)字是有符號數(shù)或無符號數(shù),也無法區(qū)分它是程序指令還是一個數(shù)據(jù)。編程員必須對程序中出現(xiàn)的每一個數(shù)據(jù)的含義非常清楚,并按此選擇相應的操作。例如,數(shù)據(jù)FEH看作無符號數(shù)其值為254,看作有符號數(shù)為-2。23比較兩個有符號數(shù)X和Y大小要比無符號數(shù)麻煩得多。這里提供一種比較思路:先判別兩個有符號數(shù)X和Y的符號,如果X、Y兩數(shù)符號相反,則非負數(shù)大;如果X、Y兩數(shù)符號相同,將兩數(shù)相減,然后根據(jù)借位標志CY進行判斷。這一比較過程如圖所示。

24圖

比較兩個有符號數(shù)X、Y的流程圖25

ORG0000HXDATA 20HYDATA 30H MOVA,X

XRLA,Y ;(X)與(Y)進行異或操作

JB ACC.7,NEXT;二數(shù)符號不同,轉(zhuǎn)NEXT1

MOVA,X CJNEA,Y,NEQUAL;(X)<>(Y),轉(zhuǎn)NEQUAL

CLRP1.0;(X)=(Y),點亮P1.0的LED

SJMPFINISH

NEQUAL:JCL2

;(X)<(Y),轉(zhuǎn)移到L2

SJMPL1

;否則,(X)>(Y),轉(zhuǎn)到L1

NEXT:MOVA,X

JNBACC.7,L1

;判斷(X)的最高位D7,以確定其正負

L2:CLRP1.2

;(X)<(Y),點亮P1.2連接的LED

SJMPFINISH

L1:CLRP1.1

;(X)>(Y),點亮P1.1連接的LED

FINISH:SJMP$ END26例6

有200個學生的成績放在外部RAM起始地址為ENGLISH的單元中,統(tǒng)計95-100和90-94的學生個數(shù)并放在內(nèi)部RAM的GRADA和GRADB中。

27

ORG0600HENGLISHXDATA1000HGRADADATA20HGRADBDATA21HMOVGRADA,#00HMOVGRADB,#00HMOVR2,#0C8HMOVDPTR,#ENGLISHLOOP:MOVXA,@DPTRCJNEA,#5FH,LOOP1LOOP1:JNCNEXTACJNEA,#5AH,LOOP2LOOP2:JCNEXTINCGRADBSJMPNEXTNEXTA:INCGRADANEXT:INCDPTRDJNZR2,LOOPSJMP$END28(2)使用變址尋址的轉(zhuǎn)移指令JMP

@A+DPTR實現(xiàn)多分支轉(zhuǎn)移。設(shè)置一個轉(zhuǎn)向各分支程序的轉(zhuǎn)移指令表,表首地址送入DPTR。根據(jù)給定條件可得序號,送入累加器A,這樣可設(shè)計出如下多分支程序。

…… RLA;序號×2 MOVDPTR,TAB;DPTR表首地址

JMP@A+DPTRTAB:AJMPROUT0;轉(zhuǎn)向分支程序0AJMPROUT1 ;轉(zhuǎn)向分支程序1

…… AJMPROUTN ;轉(zhuǎn)向分支程序N

……294.4.1

循環(huán)程序設(shè)計一、循環(huán)程序30

循環(huán)程序一般由四個主要部分組成:(1)初始化部分:為循環(huán)程序做準備,如規(guī)定循環(huán)次數(shù)、給各變量和地址指針預置初值。(2)處理部分:

為反復執(zhí)行的程序段,是循環(huán)程序的實體,也是循環(huán)程序的主體。(3)循環(huán)控制部分:

這部分的作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結(jié)束,直到符合結(jié)束條件時,跳出循環(huán)為止。(4)結(jié)束部分:

這部分主要是對循環(huán)程序的結(jié)果進行分析、處理和存放。31例7:

工作單元清零。在應用系統(tǒng)程序設(shè)計時,有時經(jīng)常需要將存儲器中各部分地址單元作為工作單元,存放程序執(zhí)行的中間值或執(zhí)行結(jié)果,工作單元清零工作常常放在程序的初始化部分中。

設(shè)有50個工作單元,其首址為外部存儲器8000H單元,則其工作單元清零程序如下:32

CLEAR:CLRA

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

MOVR2,#50;置循環(huán)次數(shù)CLEAR1:MOVX@DPTR,A

INCDPTR;修改指針

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

RET

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

BLOCKEQU20H

LENEQU30H

SUMEQU40HSTART:CLRA;清累加器A

MOVR2,#LEN;數(shù)據(jù)塊長度送R2

MOVR1,#BLOCK;數(shù)據(jù)塊首址送R1LOOP:ADDA,@R1;循環(huán)加法

INCR1;修改地址指針

DJNZR2,LOOP;修改計數(shù)器并判斷

MOVSUM,A;存和

RET

34圖

查找程序流程圖NYNR0←(R0)+1N←0FFH結(jié)束開始R0←MR1←64H(R1)-1=0?((R0))=a?N←(R0)Y

例9

查找程序。設(shè)在以M為起始地址的內(nèi)部RAM中連續(xù)存放有100個單字節(jié)數(shù),試編一程序查找一個為a的數(shù),找到后把其地址送N單元,若這個數(shù)不存在,則把FFH送N單元。解:使用比較指令查找,編寫成循環(huán)程序,其流程圖如圖5.9所示,程序設(shè)計如下:35

ORG 1800HSTART:MOV R0,#M MOV R1,#64HLP1:CJNE@R0,#a,LP2;比較,不相等轉(zhuǎn)移

MOV N,R0 ;找到,N←(R0) SJMPLP3LP2:INCR0DJNZ R1,LP1 ;(R1)-1=/0則轉(zhuǎn)移

MOVN,#0FFH

;未找到,N←0FFH

LP3:SJMP$END

36采用多重循環(huán)程序,即在一個循環(huán)體中又包含了其它的循環(huán)程序,這種方式是實現(xiàn)延時程序的常用方法。使用多重循環(huán)時,必須注意:(1)循環(huán)嵌套,必須層次分明,不允許產(chǎn)生內(nèi)外層循環(huán)交叉。(2)外循環(huán)可以一層層向內(nèi)循環(huán)進入,結(jié)束時由里往外一層層退出。二、多重循環(huán)37雙重循環(huán)程序設(shè)計——延時程序設(shè)計

延時程序在單片機匯編語言程序設(shè)計中使用非常廣泛,所謂延時,就是讓CPU做一些與主程序功能無關(guān)的操作(例如將一個數(shù)字逐次減1直到為0)來消耗掉CPU的時間。由于我們知道CPU執(zhí)行每條指令的準確時間,因此執(zhí)行整個延時程序的時間也可以精確計算出來。也就是說,我們可以寫出延時長度任意而且精度相當高的延時程序。38

例10

設(shè)計一個延時1s的程序,設(shè)單片機時鐘晶振頻率為fosc=6MHz。

(1)題意分析。設(shè)計延時程序的關(guān)鍵是計算延時時間。延時程序一般采用循環(huán)程序結(jié)構(gòu)編程,通過確定循環(huán)程序中的循環(huán)次數(shù)和循環(huán)程序段兩個因素來確定延時時間。

T機器=12T時鐘=166.7ns×12=2μs

指令周期是指執(zhí)行一條指令所需要的時間。由于指令匯編后有單字節(jié)指令、雙字節(jié)指令和三字節(jié)指令,因此指令周期沒有確定值,一般為1~4個T機器。39DELAY1:MOV R3,#0FFHDEL2:MOV R4,#0FFHDEL1:NOP

DJNZ

R4,DEL1

DJNZ

R3,DEL2

經(jīng)查指令表得到:指令MOVR4,#0FFH、NOP、DJNZ的執(zhí)行時間分別為2μs、2μs和4μs。

NOP為空操作指令,其功能是取指、譯碼,然后不進行任何操作進入下一條指令,經(jīng)常用于產(chǎn)生一個機器的延遲。40

延時程序段為雙重循環(huán),下面分別計算內(nèi)循環(huán)和外循環(huán)的延時時間。內(nèi)循環(huán):內(nèi)循環(huán)的循環(huán)次數(shù)為255(0FFH)次,循環(huán)為以下兩條指令:

NOP ;2μsDJNZ R4,DEL1 ;4μs

內(nèi)循環(huán)延時時間為:255×(2+4)=1530μs。

外循環(huán):外循環(huán)的循環(huán)次數(shù)為255(0FFH)次,循環(huán)內(nèi)容如下:

MOV R4,#0FFH ;2μs1530us內(nèi)循環(huán) ;1530μsDJNZR3,DEL2 ;4μs41

外循環(huán)一次時間為1530μs+2μs+4μs=1536μs,循環(huán)255次,另外加上第一條指令

MOV R3,#0FFH ;2μs的循環(huán)時間2μs,因此總的循環(huán)時間為

2?μs+(1530?μs+2?μs+4?μs)×255=391682?μs≈392ms

以上是比較精確的計算方法,一般情況下,在外循環(huán)的計算中,經(jīng)常忽略比較小的時間段,例如將上面的外循環(huán)計算公式簡化為

1530μs×255=390150μs≈390ms42了解了延時時間的計算方法,本例我們使用三重循環(huán)結(jié)構(gòu)。內(nèi)循環(huán)選擇為1ms,第二層循環(huán)達到延時10ms(循環(huán)次數(shù)為10),第三層循環(huán)延時到1s(循環(huán)次數(shù)為100)。程序流程圖如圖所示。

4344DELAY: MOV R0,#100 ;延時1s的循環(huán)次數(shù)DEL2:

MOV R1,#10;延時10ms的循環(huán)次數(shù)DEL1: MOV R2,#7DH;延時1ms的循環(huán)次數(shù)DEL0: NOP NOP DJNZ R2,DEL0 DJNZ R1,DEL1 DJNZ R0,DEL2(2)匯編語言源程序段一般情況下,延時程序均是作為一個子程序段使用,不會獨立運行它,否則單純的延時沒有實際意義。45

(3)程序說明本例中,第二層循環(huán)和外循環(huán)都采用了簡化計算方法,編程關(guān)鍵是延時1ms的內(nèi)循環(huán)程序如何編制。首先確定循環(huán)程序段的內(nèi)容如下:

NOP

;2μsNOP ;2μsDJNZ

R2,DEL0

;4μs

內(nèi)循環(huán)次數(shù)設(shè)為count,計算方法如下式:(一次循環(huán)時間)×count=1ms從而得到

count=1ms/(2μs+2μs+4μs)=125=7DH46本例提供了一種延時程序的基本編制方法,若需要延時更長或更短時間,只要用同樣的方法采用更多重或更少重的循環(huán)即可。值得注意的是,延時程序的目的是白白占用CPU一段時間,此時不能做任何其它工作,就像機器在不停地空轉(zhuǎn)一樣,這是程序延時的缺點。474.4.2

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

例11

在程序中定義一個0~9的平方表,利用查表指令找出累加器A=05H的平方值。

(1)題意分析。所謂表格是指在程序中定義的一串有序的常數(shù),如平方表、字型碼表、鍵碼表等。因為程序一般都是固化在程序存儲器(通常是只讀存儲器ROM類型)中,因此可以說表格是預先定義在程序的數(shù)據(jù)區(qū)中,然后和程序一起固化在ROM中的一串常數(shù)。50查表程序的關(guān)鍵是表格的定義和如何實現(xiàn)查表。

(2)匯編語言源程序。

ORG 0000H

MOV DPTR,#TABLE;表首地址→DPTR(數(shù)據(jù)指針)

MOV A,#05 ;05→AMOVC A,@A+DPTR ;查表指令,25→A,A=19HSJMP $ ;程序暫停

TABLE: DB 0,1,4,9,16,25,36,49,64,81;定義0~9平方表

END51

(3)程序說明。從程序存儲器中讀數(shù)據(jù)時,只能先讀到累加器A中,然后再送到題目要求的地方。單片機提供了兩條專門用于查表操作的查表指令:

MOVC A,@A+DPTR ;(A+DPTR)→A MOVC A,@A+PC ;PC+1→PC,(A+PC)→ADPTR為數(shù)據(jù)指針,一般用于存放表首地址。用指令MOVCA,@A+PC 實現(xiàn)查找平方表的源程序如下:52

ORG 0000H

MOV A,#05 ;05→AADD A,#02 ;修正累加器A的值,修正值為查表指令距離表格首地址

MOVC A,@A+PC ;25→A

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論