單片機(jī)-程序的基本結(jié)構(gòu)課件_第1頁
單片機(jī)-程序的基本結(jié)構(gòu)課件_第2頁
單片機(jī)-程序的基本結(jié)構(gòu)課件_第3頁
單片機(jī)-程序的基本結(jié)構(gòu)課件_第4頁
單片機(jī)-程序的基本結(jié)構(gòu)課件_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

MCS—51單片機(jī)2.7程序的基本結(jié)構(gòu)MCS—51單片機(jī)2.7程序的基本結(jié)構(gòu)12.7

程序的基本結(jié)構(gòu)一、緒論

二、基本結(jié)構(gòu)1.順序結(jié)構(gòu)2.分支結(jié)構(gòu)3.查表結(jié)構(gòu)4.子程序結(jié)構(gòu)5.循環(huán)結(jié)構(gòu)2.7程序的基本結(jié)構(gòu)一、緒論二、基本結(jié)緒論在匯編語言程序設(shè)計中,普遍采用結(jié)構(gòu)化程序設(shè)計方法。任何復(fù)雜的程序都可由順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、子程序結(jié)構(gòu)等程序構(gòu)成。結(jié)構(gòu)程序設(shè)計的特點是程序的結(jié)構(gòu)清晰、易于讀寫和驗證、可靠性高。緒論在匯編語言程序設(shè)計中,普遍

不管多么簡單或復(fù)雜的程序,總離不開若干順序程序段所組成的。如圖1所示,A框和B框分別代表不同的程序段,是A、B順序執(zhí)行。它是最簡單、最基本的程序結(jié)構(gòu),其特點是按指令的排列順序一條條地執(zhí)行,直到全部指令執(zhí)行完畢為止。

圖2-7-1順序程序結(jié)構(gòu)

ABab不管多么簡單或復(fù)雜的程序,總離不開若干順幾種基本結(jié)構(gòu)順序結(jié)構(gòu)分支結(jié)構(gòu)查表結(jié)構(gòu)子程序結(jié)構(gòu)循環(huán)結(jié)構(gòu)基本結(jié)構(gòu)順序結(jié)構(gòu)分支結(jié)構(gòu)查表結(jié)構(gòu)子程序結(jié)構(gòu)循環(huán)結(jié)構(gòu)幾種基本結(jié)構(gòu)順序結(jié)構(gòu)分支結(jié)構(gòu)查表結(jié)構(gòu)子程序結(jié)構(gòu)循環(huán)結(jié)構(gòu)基本結(jié)順序結(jié)構(gòu)

程序段A

程序段B

順序結(jié)構(gòu)程序:是一種最簡單、最基本的程序,按照程序編寫的順序逐條依次執(zhí)行,直到程序結(jié)束。這是程序的最基本的形式,任何程序都離不開這種形式。順序結(jié)構(gòu)順序結(jié)構(gòu)程序段A程序段B

【例1】將片內(nèi)RAM的20H單元中的壓縮BCD碼拆成兩個ASCII碼存入21H、22H單元。高4位轉(zhuǎn)換后存在21H單元,低4位轉(zhuǎn)換后存在22H單元。圖1-2壓縮BCD碼轉(zhuǎn)換成兩個ASCII字符圖方法一分析:兩個BCD碼拼裝在一個單元內(nèi)叫壓縮BCD碼。設(shè)20H內(nèi)為壓縮BCD碼59,22H通過變換BCD碼“5”為ASCII碼“35”;BCD碼“9”變換為ASCII碼“39”。【例1】將片內(nèi)RAM的20H單元中的壓縮BCD碼程序入口:20H程序出口:21H、22H根據(jù)分析圖設(shè)計程序:MOVA,20HANLA,#0FH;屏蔽高4位ADDA,#30H;得到低4位ASCII碼MOV21H,A;個位ASCII碼送21HANL20H,#0F0H;屏蔽低4位MOVA,20H;送ASWAPA;高位交換到低位ADDA,#30H;得到高4位ASCII碼MOV22H,A;十位ASCII碼送22H程序入口:20H程序出口:21H、22H分支結(jié)構(gòu)順序結(jié)構(gòu)程序只能解決一些簡單的算術(shù)、邏輯運算、傳送操作等。實際控制問題往往要求計算機(jī)能根據(jù)給定的條件進(jìn)行判斷,再選擇不同的處理路徑,從而表現(xiàn)出某種智能。程序要求改變程序執(zhí)行順序,即程序的流向有兩個或兩個以上時,這種程序結(jié)構(gòu)稱為分支程序結(jié)構(gòu),分支程序的特點是程序中包含有轉(zhuǎn)移指令。根據(jù)分支出口的不同分為簡單分支程序和多路分支程序。分支結(jié)構(gòu)順序結(jié)構(gòu)程序只能解決一些簡單的算術(shù)、分支結(jié)構(gòu)

程序段A

程序段B分支結(jié)構(gòu):程序中含有轉(zhuǎn)移指令分支結(jié)構(gòu)無條件分支有條件分支單分支結(jié)構(gòu)多分支結(jié)構(gòu)條件YN分支結(jié)構(gòu)分支結(jié)構(gòu)程序段A程序段B分支結(jié)構(gòu):程

程序段2條件滿足嗎?YN開始

程序段1

程序段3

結(jié)束分支程序2開始

程序段1

結(jié)束

數(shù)字關(guān)鍵碼

分支程序3分支程序1

程序段2

(b)多分支結(jié)構(gòu)分支程序的兩類結(jié)構(gòu)(a)單分支結(jié)構(gòu)程序段2條件滿足嗎?YN開始程序段1

解:單片機(jī)中負(fù)數(shù)一般用補碼表示,只要能夠判斷x=0、x<0和x>0便能夠方便實現(xiàn)函數(shù)。采用JZ指令進(jìn)行判斷,程序流程圖如圖2-1所示。圖2-7-2程序流程圖

解:單片機(jī)中負(fù)數(shù)一般用補碼表示,只要能夠判斷x=0、x<

START:MOVA,30HJZOUT;x=0,轉(zhuǎn)移ANLA#80H;x≠0,判斷正負(fù)號JZOUT1;x小于0,y=xMOV31H,30H

SJMPOK

OUT:MOV31H,#3;x=0,則y=3OUT1:MOVA,#5;x>0,y=5+xADDA,30HMOV31H,AOK:SJMP$START:MOVA,30H查表結(jié)構(gòu)MCS-51匯編指令系統(tǒng)提供了兩條專用的查表指令:MOVCA,@A+DPTR基址寄存器DPTR能提供16位基址,因此查表范圍可達(dá)64KB空間,且表格的大小和位置也可在64KBROM中任意安排。MOVCA,@A+PC表格只能放在該指令的256個地址單元內(nèi),地址需要調(diào)整。查表是把事先安排的數(shù)據(jù)按照一定的順序編制成表格存放在ROM中,然后根據(jù)輸入的數(shù)據(jù),從表格中查出所需的結(jié)果。查表可以將復(fù)雜的問題變得簡單。查表結(jié)構(gòu)MCS-51匯編指令系統(tǒng)提供了兩條專用的查表指令:M

【例3】根據(jù)項目一流水燈電路電路,采用查表方法實現(xiàn)相同功能。解:用查表法實現(xiàn)流水燈,要設(shè)計一個LED點亮碼表格,根據(jù)8個LED點亮次序,制作數(shù)碼表格,為了循環(huán)點亮LED,在點亮第8個LED后返回點亮第1個LED,表格可以設(shè)置一個結(jié)束標(biāo)志碼FFH。當(dāng)取顯示碼為結(jié)束標(biāo)志FFH時,返回取第1個顯示碼?!纠?】根據(jù)項目一流水燈電路電路,采用查表方法實現(xiàn)ORG0000HLJMPSTRATORG0100HSTRAT:MOVR1,#0

;

R1用于計數(shù),R1清零

MOVDPTR,#TAB

;設(shè)置表地址指針GO:MOVA,R1LOOP:MOVCA,@A+DPTR

;查表取顯示碼

CJNEA,#0FFH,OK

;不是結(jié)束碼顯示碼送P0口

SJMPSTRAT

;是結(jié)束碼,重新開始

OK:MOVP0,A

LCALLDEL

;延時1s

INCR1

;循環(huán)左移一次

SJMPGO(此處略延時程序DEL)

TAB:DB0FEH,0FDH,0FBH,0F7H,0EFH

DB0DFH,0BFH,7FH,0FFH

;LED點亮碼,0FFH為結(jié)束碼

..........

ENDORG0000H

可以被調(diào)用的程序段稱為子程序。在實際問題中,常常會遇到在一個程序中有許多相同的運算或操作,例如多字節(jié)的加、減、字符處理等。如果每遇到這些運算和操作,都從頭做起,則使程序非常繁瑣且浪費內(nèi)存。因此在實際應(yīng)用中,通常把這些多次使用的程序段,按一定結(jié)構(gòu)編好,存放在內(nèi)存中,當(dāng)需要時,程序可以去調(diào)用這些獨立的程序段。因此,字程序就是一種能完成某一特定任務(wù)的程序段。子程序可以被調(diào)用的程序段稱為子程序。在實際問題中,子程序的設(shè)計1、給每個子程序賦予名字2、現(xiàn)場保護(hù)與恢復(fù)3、參數(shù)的正確傳遞4、子程序說明子程序的設(shè)計1、給每個子程序賦予名字2、現(xiàn)場保護(hù)與恢復(fù)3、參在編寫子程序時應(yīng)注意以下問題1、子程序應(yīng)有入口地址(用標(biāo)號)2、主程序調(diào)用子程序兩個子程序調(diào)用指令:(1)絕對調(diào)用指令:ACALLaddr11(2)長調(diào)用指令:LCALLaddr16在編寫子程序時應(yīng)注意以下問題1、子程序應(yīng)有入口地址(用標(biāo)號)在編寫子程序時應(yīng)注意以下問題3、注意設(shè)置堆棧指針和現(xiàn)場保護(hù)4、最后一條指令必須是RET指令5、子程序可以嵌套,即子程序可以調(diào)用子程序(最多8層)6、在子程序調(diào)用時,還要注意參數(shù)傳遞的問題在編寫子程序時應(yīng)注意以下問題3、注意設(shè)置堆棧指針和現(xiàn)場保護(hù)4子程序的基本結(jié)構(gòu)MAIN:┇ ;IN為主程序或調(diào)用程序標(biāo)號┇

LCALLSUB;調(diào)用子程序SUB ┇┇SUB: PUSHPSW ;現(xiàn)場保護(hù)

PUSHACC

子程序處理程序段

POPACC ;現(xiàn)場恢復(fù)

POPPSW RET ;最后一條指令必須為RET子程序的基本結(jié)構(gòu)MAIN:┇ ;I【例4】編寫一個通用子程序,實現(xiàn)N個單字節(jié)無符號數(shù)之和(N<100H)。調(diào)用該子程序完成將片內(nèi)部30H~5FH中存放的單字節(jié)無符號數(shù)求和,結(jié)果存入60H、61H單元中(高位在前)?!纠?】編寫一個通用子程序,實現(xiàn)N個單字節(jié)無符號數(shù)之和

ORG 0100HSUB2: PUSH PSW ;保護(hù)現(xiàn)場

MOV @R1,#0 ;目的單元清0 INC R1 MOV @R1,#0LOOP: MOV A,@R0 ;取數(shù)

ADD A,@R1 ;求和

MOV @R1,A ;存和的低字節(jié)數(shù)

DEC R1 ;修改指針,指向和的高位地址

CLR A ADDC A,@R1 ;取進(jìn)位位

MOV @R1,A ;存和的高字節(jié)數(shù)

INC R1 ;修改指針,指向和的低位地址

INC R0;修改指針,指向下一個單元

DJNZ R2,LOOP POP PSW ;恢復(fù)現(xiàn)場

RET(1)子程序如下: ORG 0100H(1)子程序如 ORG 0000HMAIN: MOV R0,#30H ;設(shè)置R0為入口指針寄存器

MOV R1,#60H ;設(shè)置R1為出口指針寄存器

MOV R2,#2FH ;設(shè)置R2傳遞字節(jié)數(shù)

ACALL SUB2 ……TOEND:END(2)子程序如下: ORG 0000H(2)子程序如下:在應(yīng)用程序中,有時需要多次反復(fù)執(zhí)行相同的操作,只是操作的操作數(shù)不同,這時就可以采用循環(huán)程序結(jié)構(gòu)。循環(huán)程序可以顯著縮短程序,減少程序所占用的存儲空間,使程序結(jié)構(gòu)大大優(yōu)化。循環(huán)結(jié)構(gòu)循環(huán)程序一般包括以下幾部分:(1)設(shè)置循環(huán)初值在進(jìn)入循環(huán)之前,要設(shè)置循環(huán)次數(shù)、循環(huán)體工作單元的

初值等。(2)循環(huán)處理循環(huán)體是循環(huán)程序需要反復(fù)執(zhí)行的部分,是循環(huán)程序結(jié)構(gòu)的

主體部分。(3)循環(huán)修改每執(zhí)行一次循環(huán),要對參數(shù)進(jìn)行修改,使指針指向下一數(shù)據(jù)

所在的位置,為進(jìn)入下一輪循環(huán)作準(zhǔn)備。(4)循環(huán)控制應(yīng)用程序的條件判斷循環(huán)程序是否結(jié)束。在應(yīng)用程序中,有時需要多次反復(fù)執(zhí)行相同

循環(huán)程序有兩種基本結(jié)構(gòu),圖2-7-3循環(huán)程序基本結(jié)構(gòu)一種是先執(zhí)行后判斷,一種是先判斷后執(zhí)行。循環(huán)程序有兩種基本結(jié)構(gòu),圖2-7-3循環(huán)【例5】設(shè)8051使用12MHz晶振,試設(shè)計延遲100ms的延時程序。(一般延時程序采用循環(huán)程序結(jié)構(gòu))

DELAY:MOVR2,#200 ;延時一個機(jī)器周期T=1msLOOP1:MOVB,#250 ;每循環(huán)延時1ms

LOOP2:NOP DJNZB,LOOP2 ;250*2=500ms DJNZR2,LOOP1 ;0.5ms*200=100ms RET延時程序如下:【例5】設(shè)8051使用12MHz晶振,試設(shè)計延遲100m【例6】對項目一流水燈電路,要求每個LED閃亮5次(亮滅各0.5s)后,再轉(zhuǎn)到下一個LED閃亮,循環(huán)不止。

ORG0000H

;程序開始地址

MAIN:MOVA,#0FEH;初值11111110送P0口

;低電平點亮LEDLOOP:MOVR5,#5;閃爍次數(shù)設(shè)置

MOVP0,ALCALLDEL;延時0.5sLOOP1:MOVP0,#0FFH;LED熄滅0.5s

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論