第一章 單片機(jī)基礎(chǔ)知識(shí)3_第1頁
第一章 單片機(jī)基礎(chǔ)知識(shí)3_第2頁
第一章 單片機(jī)基礎(chǔ)知識(shí)3_第3頁
第一章 單片機(jī)基礎(chǔ)知識(shí)3_第4頁
第一章 單片機(jī)基礎(chǔ)知識(shí)3_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1.5程序設(shè)計(jì)舉例單片機(jī)匯編語言程序設(shè)計(jì)的基本步驟1.分析問題,明確被控對(duì)象對(duì)軟件的要求2.確定算法3.設(shè)計(jì)程序流程圖4.分配內(nèi)存單元及有關(guān)端口地址5.編寫匯編語言源程序6.調(diào)試程序7.固化程序主要的幾種程序設(shè)計(jì)方法順序程序:順序程序是最簡單、最基本的程序結(jié)構(gòu),其特點(diǎn)是按指令的排列順序一條條地執(zhí)行,直到全部指令執(zhí)行完畢為止。分支程序:分支程序是通過轉(zhuǎn)移指令對(duì)相應(yīng)條件的判斷實(shí)現(xiàn)改變程序的執(zhí)行方向的設(shè)計(jì)方法。循環(huán)程序:在程序中需要反復(fù)的執(zhí)行的程序段,為了避免在程序中多次的編寫,可以通過利用條件轉(zhuǎn)移或無條件轉(zhuǎn)移指令來控制程序的執(zhí)行。子程序:在編寫程序時(shí),經(jīng)常有一些的程序會(huì)被頻繁的使用。通常情況下,我們將這些程序段定義成子程序,使程序變的便于調(diào)試和閱讀,同時(shí)也縮小了程序的長度。一、順序程序設(shè)計(jì)將30H單元內(nèi)的兩位BCD碼拆開并轉(zhuǎn)換成ASCII碼,存入31H、32H兩個(gè)單元中。1、題意分析2、程序流程結(jié)束取數(shù)據(jù)低4位轉(zhuǎn)換成ASCII碼存ASCII碼取數(shù)據(jù)高4位轉(zhuǎn)換成ASCII碼存ASCII碼開始參考程序如下:

ORG 2000H MOV A,30H ;取值

ANL A,#0FH ;取低4位

ADD A,#30H ;轉(zhuǎn)換成ASCII碼

MOV 31H,A ;保存結(jié)果

MOV A,30H ;取值

SWAP A ;高4位與低4位互換

ANL A,#0FH ;取低4位(原來的高4位)

ADD A,#30H

;轉(zhuǎn)換成ASCII碼

MOV 32H,A

;保存結(jié)果

END二、分支程序設(shè)計(jì)分支程序有三種基本形式:單分支、雙分支、多分支。單分支:雙分支:條件成立?程序段下條指令NY程序段1條件成立?程序段2NY多分支:程序段2條件N=?程序段N-10N程序段1程序段N1N-1……分支程序的設(shè)計(jì)要點(diǎn)如下:(1)先建立可供條件轉(zhuǎn)移指令測試的條件。(2)選用合適的條件轉(zhuǎn)移指令。(3)在轉(zhuǎn)移的目的地址處設(shè)定標(biāo)號(hào)。雙分支程序設(shè)計(jì)舉例設(shè)X存在30H單元中,根據(jù)下式

X+2 X>0Y= 100 X=0∣X∣ X<0求出Y值,將Y值存入31H單元。1、題意分析:根據(jù)數(shù)據(jù)的符號(hào)位判別該數(shù)的正負(fù),若最高位為0,再判別該數(shù)是否為0。2、程序流程 A為負(fù)數(shù)?Y取數(shù),A←(30H)開始結(jié)束A=0?YNNA←|X|A←64HA←X+2存數(shù),(31H)←A(30H)

參考程序如下:

ORG 1000H MOV A,30H ;取數(shù)

JB ACC.7,NEG;負(fù)數(shù),轉(zhuǎn)NEG JZ ZER0 ;為零,轉(zhuǎn)ZER0 ADD A,#02H ;為正數(shù),求X+2 AJMPSAVE ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)

ZER0:MOV A,#64H ;數(shù)據(jù)為零,Y=100 AJMPSAVE ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)

NEG: DEC A ;

CPL A ;求∣X∣ SAVE: MOV 31H,A ;保存數(shù)據(jù)

SJMP $ ;暫停

END多分支程序設(shè)計(jì)舉例根據(jù)R0的值轉(zhuǎn)向7個(gè)分支程序。R0<10,轉(zhuǎn)向SUB0;R0<20,轉(zhuǎn)向SUB1;

|R0<60,轉(zhuǎn)向SUB5;R0>=60,轉(zhuǎn)向SUB6;1、題意分析:利用JMP@A+DPTR指令直接給PC賦值,使程序?qū)崿F(xiàn)轉(zhuǎn)移。2、程序流程。K=?轉(zhuǎn)SUB0轉(zhuǎn)SUB1轉(zhuǎn)SUB6K=0K=1……K=6開始參考程序如下:

ORG2000H MOVDPTR,#TAB;轉(zhuǎn)移指令表首地址

MOVA,R0 ;取數(shù)

MOV B,#10 DIV AB ;A/10,商在A中

CLR C RLCA ;A←2A JMP@A+DPTR ;PC←A+DPTRTAB: AJMP SUB0 ;轉(zhuǎn)移指令表

AJMPSUB1 AJMP SUB2 …… AJMPSUB5 AJMP SUB6 …… 三、循環(huán)程序設(shè)計(jì)☆循環(huán)程序一般包括如下四個(gè)部分:(1)初始化(2)循環(huán)體(3)循環(huán)控制(4)結(jié)束☆循環(huán)程序按結(jié)構(gòu)形式,有單重循環(huán)與多重循環(huán)?!钤诙嘀匮h(huán)中,只允許外重循環(huán)嵌套內(nèi)重循環(huán)?!畈辉试S循環(huán)相互交叉,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部(a)當(dāng)型循環(huán)結(jié)構(gòu)(b)直到型循環(huán)結(jié)構(gòu)循環(huán)結(jié)束?循環(huán)體YN初始化修改循環(huán)參數(shù)結(jié)束部分開始結(jié)束循環(huán)結(jié)束?循環(huán)體Y初始化修改循環(huán)參數(shù)結(jié)束部分開始N結(jié)束有一數(shù)據(jù)塊從片內(nèi)RAM的30H單元開始存入,設(shè)數(shù)據(jù)塊長度為10個(gè)單元。根據(jù)下式:

X+2X>0Y=100X=0求出Y值,并將Y值放回原處。∣X∣X<01、題意分析:設(shè)置一個(gè)計(jì)數(shù)器控制循環(huán)次數(shù),每處理完一個(gè)數(shù)據(jù),計(jì)數(shù)器減12、程序流程A=0?YYNNYNA為負(fù)數(shù)?取數(shù),A←((R1))開始結(jié)束A←∣X∣A←64HA←X+2存數(shù),((R1))←A(30H)設(shè)置地址指針R1、計(jì)數(shù)器R0初值R1←R1+1;R0←R0-1R0=0?參考源程序如下:

ORG 2000H MOV R0,#10 MOV R1,#30H START: MOV A,@R1 ;取數(shù)

JB ACC.7,NEG;若為負(fù)數(shù),轉(zhuǎn)NEG JZ ZER0 ;若為零,轉(zhuǎn)ZER0 ADD A,#02H ;若為正數(shù),求X+2 AJMP SAVE ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)

ZER0: MOV A,#64H ;數(shù)據(jù)為零,Y=100 AJMP SAVE ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)

NEG: DEC A CPL A ;求∣X∣ SAVE: MOV @R1,A ;保存數(shù)據(jù)

INC R1 ;地址指針指向下一個(gè)地址

DJNZ R0,START ;未處理完,繼續(xù)處理

SJMP $ ;暫停

END單重循環(huán)延時(shí)例:假設(shè)單片機(jī)的fosc=12MHz,計(jì)算單片機(jī)執(zhí)行下面程序消耗的時(shí)間。DELAY:MOVR5,#TIME;1機(jī)器周期MM:NOP;1機(jī)器周期

DJNZR5,MM;2機(jī)器周期

RET;2機(jī)器周期執(zhí)行完以上4條語句,所花時(shí)間:T=(1+(1+2)×TIME+2)×1s推廣計(jì)算式:T(機(jī)器周期數(shù))=(循環(huán)體機(jī)器周期數(shù))×循環(huán)次數(shù)+初始化機(jī)器周期數(shù)多重循環(huán)延時(shí)例:假設(shè)單片機(jī)的fosc=12MHz,計(jì)算單片機(jī)執(zhí)行下面程序消耗的時(shí)間。DELAY2:MOVR3,#TIME1;1機(jī)器周期LOOP1:MOVR2,#TIME2;1機(jī)器周期LOOP2:NOP;1機(jī)器周期

DJNZR2,LOOP2;2機(jī)器周期

DJNZR3,LOOP1;2機(jī)器周期

RET;2機(jī)器周期執(zhí)行完以上6條語句,所花時(shí)間:

T=(1+(1+(1+2)×TIME2+2)×TIME1+2)×1s四、子程序設(shè)計(jì)在編寫子程序時(shí),應(yīng)注意以下幾點(diǎn):子程序的第一條指令地址為子程序的入口地址。主程序調(diào)用子程序利用指令LCALL、ACALL指令進(jìn)行,返回使用RET。在子程序的內(nèi)部有轉(zhuǎn)移指令時(shí),最好使用相對(duì)轉(zhuǎn)移指令。在使用子程序時(shí),要注意現(xiàn)場的保護(hù),在退出時(shí)要恢復(fù)現(xiàn)場。2)子程序參數(shù)傳遞 在調(diào)用子程序時(shí),經(jīng)常要進(jìn)行參數(shù)的傳遞,常用的方法有以下幾種:利用工作寄存器或累加器進(jìn)行傳遞。利用可間接尋址的寄存器進(jìn)行傳遞。使用堆棧進(jìn)行參數(shù)傳遞。有一數(shù)據(jù)塊從片內(nèi)RAM的30H單元開始存入,設(shè)數(shù)據(jù)塊長度為10個(gè)單元。根據(jù)下式:

X+2X>0Y=100X=0求出Y值,并將Y值放回原處。∣X∣X<0題意分析:數(shù)據(jù)塊中的十個(gè)數(shù)都需要進(jìn)行符號(hào)判斷并作相應(yīng)處理,可把一部分工作交給子程序完成,主程序只負(fù)責(zé)讀取數(shù)據(jù)、調(diào)用判斷處理子程序、保存數(shù)據(jù)、循環(huán)控制工作。源程序如下:

ORG 0000H MOV R0,#10 MOV R1,#30H START: MOV A,@R1 ;取數(shù)

ACALL DISPOSE ;調(diào)用判斷、處理子程序

SAVE: MOV @R1,A ;保存數(shù)據(jù)

INC R1 ;修改地址指針,指向下一個(gè)地址

DJNZ R0,START ;數(shù)據(jù)未處理完,繼續(xù)處理

SJMP $ ;暫停

ORG 0200H DISPOSE: JB ACC.7,NEG ;若為負(fù)數(shù),轉(zhuǎn)NEG JZ ZER0 ;若為零,轉(zhuǎn)ZER0 ADD A,#02H ;若為正數(shù),求X+2 AJMP BACK ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)

ZER0: MOV A,#64H ;數(shù)據(jù)為零,Y=100 AJMP BACK ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)

NEG: DEC A CPL A ;求∣X∣ BACK: RET END五、查表程序設(shè)計(jì)程序使用的專用指令:

MOVCA,@A+PC

MOVCA,@A+DPTR一般情況下,常使用后者程序設(shè)計(jì)一般規(guī)則:先確定表格存放的位置在表格中填入相應(yīng)的數(shù)據(jù)查表時(shí)先將表格的首地址給DPTR,再將要查表的數(shù)據(jù)送給A,最后用

MOVCA,@A+DPTR例:假如在內(nèi)部RAM的30H單元中存放有一個(gè)BCD編碼的十進(jìn)制數(shù),查出其共陰7段顯示代碼,并送到外部RAM的CFA0H單元中。題意分析:先建立一個(gè)相應(yīng)的數(shù)值表格,定義在程序存儲(chǔ)器中,利用輸入的值進(jìn)行查表。源程序如下:

……

MOVDPTR,#0050H

MOVA,30H

MOVCA,@A+DPTR

MOVDPTR,#0CFA0H

MOVX@DPTR,A

……

ORG0050H

DB3FH;0的7段共陰顯示代碼

DB06H;1的7段共陰顯示代碼

DB

溫馨提示

  • 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)論