版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章80C51單片機匯編語言程序設(shè)計4.1單片機程序設(shè)計語言概述4.2匯編語言程序的基本結(jié)構(gòu)形式4.380C51單片機匯編語言程序設(shè)計舉例4.4單片機匯編語言源程序的編輯和匯編4.580C51單片機匯編語言偽指令docin/sundae_meng第4章80C51單片機匯編語言程序設(shè)計4.1單片機程14.1單片機程序設(shè)計語言概述4.1.1機器語言和匯編語言1、機器語言用二進(jìn)制代碼“0”和“1”表示指令和數(shù)據(jù)的程序設(shè)計語言,是計算機能直接識別并執(zhí)行的指令。優(yōu)點:執(zhí)行速度快、占用內(nèi)存少。缺點:識別難、記憶難。2、匯編語言用助記符和專門的語言規(guī)則表示指令的功能和特征。 優(yōu)點:助記符與機器指令一一對應(yīng)。比機器語言直觀、易懂、易記。非常適合于實時控制的需要。缺點:難以記憶和使用,程序設(shè)計的技巧性較高,編程難度較大。要求使用者必須精通單片機的硬件系統(tǒng)和指令系統(tǒng)。缺乏通用性,程序不易移植。docin/sundae_meng4.1單片機程序設(shè)計語言概述4.1.1機器語言和匯編24.1.2單片機使用的高級語言對于8051單片機,現(xiàn)有4種語言支持,即匯編、PL/M、C和BASIC。C語言最終得到廣泛應(yīng)用。 可以大大提高單片機應(yīng)用系統(tǒng)研制的開發(fā)效率。移植性好。高級語言的不足:生成的目標(biāo)代碼較長,導(dǎo)致應(yīng)用程序運行速度較慢。docin/sundae_meng4.1.2單片機使用的高級語言對于8051單片機,現(xiàn)有434.1.380C51單片機匯編語言的語句格式80C51匯編語言的語句格式如下:
[<標(biāo)號>]:<操作碼>[<操作數(shù)>];[<注釋>]1.標(biāo)號 是語句地址的標(biāo)志符號,標(biāo)號的幾點規(guī)定:1~8個ASCII字符組成,第一個字符必須是字母。不能使用本匯編語言已經(jīng)定義的符號作為標(biāo)號。標(biāo)號后面必須跟以冒號“:”。同一標(biāo)號在一個程序中只能定義一次。標(biāo)號可有可無。錯誤的標(biāo)號正確的標(biāo)號1BT:BT1BEGINBEGIN:TA+TB:TATB:ADD:ADD1:docin/sundae_meng4.1.380C51單片機匯編語言的語句格式80C5142.操作碼 用于規(guī)定語句執(zhí)行的操作內(nèi)容,用指令助記符表示。不能空缺。3.操作數(shù)操作數(shù)用于為指令操作提供數(shù)據(jù)??梢允强瞻?,也可能有1~3個操作數(shù),各操作數(shù)之間以逗號分隔。4.注釋不屬于語句的功能部分,只是對語句的解釋說明,以“;”開頭。5.分界符(分隔符)用于把語句中的各部分隔開,以便于區(qū)分。分界符包括空格、冒號、分號或逗號等符號。docin/sundae_meng2.操作碼docin/sundae_meng54.2匯編語言程序的基本結(jié)構(gòu)形式
三種基本結(jié)構(gòu)形式:順序程序結(jié)構(gòu),分支程序結(jié)構(gòu),循環(huán)程序結(jié)構(gòu)。4.2.1順序程序結(jié)構(gòu)
順序結(jié)構(gòu)程序是最簡單的程序結(jié)構(gòu)。程序既無分支、循環(huán),也不調(diào)用子程序,程序執(zhí)行時一條接一條地按順序執(zhí)行指令。docin/sundae_meng4.2匯編語言程序的基本結(jié)構(gòu)形式三種基本結(jié)構(gòu)形6(1)分析任務(wù)(2)確定算法(3)畫流程圖(4)編寫程序(5)上機調(diào)試
2、程序設(shè)計的一般步驟
當(dāng)接到程序設(shè)計的任務(wù)后,首先對任務(wù)進(jìn)行詳盡的分析,搞清楚已知的數(shù)據(jù)和想要得到的結(jié)果,程序應(yīng)該完成何種的功能。明確在程序設(shè)計時應(yīng)該
“做什么”。根據(jù)實際問題的要求和指令系統(tǒng)的特點,確定解決問題的具體步驟。根據(jù)任務(wù)要求,對不同的計算方法進(jìn)行比較,選擇最適宜的算法。解決“怎樣做”的問題。將解決問題的具體步驟用一種約定的幾何圖形、指向線和必要的文字說明描述出來,用圖形的方法描繪解決問題的思路。用指令的形式將程序流程圖實現(xiàn)出來。查錯、改錯,對程序進(jìn)行優(yōu)化。docin/sundae_meng(1)分析任務(wù)2、程序設(shè)計的一般步驟當(dāng)接到程序設(shè)計的任務(wù)后7
50H
51H
52H53H54H55HN1高字節(jié)N1中字節(jié)N1低字節(jié)N2高字節(jié)N2中字節(jié)N2低字節(jié)(1)分析任務(wù)(2)確定算法(3)畫流程圖(4)編寫程序(5)上機調(diào)試?yán)?字節(jié)無符號數(shù)相加:其中被加數(shù)在內(nèi)部RAM的50H、51H和52H單元中;加數(shù)在內(nèi)部RAM的53H、54H和55H單元中;要求把相加之和存放在50H、51H和52H單元中,進(jìn)位存放在位尋址區(qū)的20H位中。docin/sundae_meng50H51H52H53H54H55HN1高字節(jié)N1中字8MOVR0,#52H;被加數(shù)的低字節(jié)地址MOVR1,#55H;加數(shù)的低字節(jié)地址MOVA,R0ADDA,R1;低字節(jié)相加MOVR0,A;存低字節(jié)相加結(jié)果DECR0DECR1MOVA,R0ADDCA,R1;中間字節(jié)帶進(jìn)位相加MOVR0,A;存中間字節(jié)相加結(jié)果DECR0DECR1MOVA,R0ADDCA,R1;高字節(jié)帶進(jìn)位相加MOVR0,A;存高字節(jié)相加結(jié)果CLRAADDCA,#00H;進(jìn)位送00H位保存MOVR0,#20H;存放進(jìn)位的單元地址MOVR0,Adocin/sundae_mengMOVR0,#52H;被加數(shù)的低字節(jié)地址docin/su9
分支結(jié)構(gòu)也稱為選擇結(jié)構(gòu)。為分支需要,程序設(shè)計時應(yīng)給程序段的起始地址賦予一個地址標(biāo)號,以供選擇分支使用。分支結(jié)構(gòu)又可分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。
1.單分支程序結(jié)構(gòu)單分支程序結(jié)構(gòu)即二中選一,是通過條件判斷實現(xiàn)的。一般都使用條件轉(zhuǎn)移指令對程序的執(zhí)行結(jié)果進(jìn)行判斷。可實現(xiàn)單分支轉(zhuǎn)移的指令有:JZ、JNZ、CJNE和DJNZ。位狀態(tài)轉(zhuǎn)移指令:JC、JNC、JB、JNB和JBC等。4.2.2分支程序結(jié)構(gòu)docin/sundae_meng分支結(jié)構(gòu)也稱為選擇結(jié)構(gòu)。為分支需要,程序設(shè)計時410(1)單分支結(jié)構(gòu)舉例假定在外部RAM中有ST1、ST2和ST3共3個連續(xù)單元,其中ST1和ST2單元中存放著兩個無符號二進(jìn)制數(shù),要求找出其中的大數(shù)并存入ST3單元中。解:(1)分析任務(wù):比較兩個數(shù)的大?。?)算法:算術(shù)運算、控制轉(zhuǎn)移(3)程序結(jié)構(gòu):單分支(4)數(shù)據(jù)類型:單字節(jié)、二進(jìn)制、無符號數(shù)(5)數(shù)據(jù)結(jié)構(gòu):單元地址升序排列
(6)RAM單元安排:外部RAM單元(7)采用寄存器間接尋址方式(R0、R1或DPTR)(8)程序設(shè)計流程框圖;(9)程序清單;docin/sundae_meng(1)單分支結(jié)構(gòu)舉例解:(1)分析任務(wù):比較兩個數(shù)的大小do11docin/sundae_mengdocin/sundae_meng12START:CLRC ;進(jìn)位位清0 MOVDPTR,#ST1 ;設(shè)置數(shù)據(jù)指針
MOVXA,DPTR ;取第1個數(shù)
MOVR2,A ;第1個數(shù)存于R2 INCDPTR ;數(shù)據(jù)指針加1 MOVXA,DPTR ;取第2個數(shù)
SUBBA,R2 ;兩數(shù)比較
JNCBIG1 ;若第2個數(shù)大,則轉(zhuǎn)向BIG1 XCHA,R2 ;若第1個數(shù)大,則整字節(jié)交換BIG0: INCDPTR MOVXDPTR,A ;存大數(shù)
RETBIG1: MOVXA,DPTR SJMPBIG0上例中,如果采用CJNEA,direct,rel指令,應(yīng)如何修改程序?docin/sundae_mengSTART:CLRC ;進(jìn)位位清0上例中,如果采用CJ13(2)多重單分支結(jié)構(gòu)舉例
多重單分支結(jié)構(gòu)中,通過一系列條件判斷,進(jìn)
行逐級分支。為此可使用比較轉(zhuǎn)移指令CJNE實現(xiàn)。docin/sundae_meng(2)多重單分支結(jié)構(gòu)舉例
多重單分支結(jié)構(gòu)中,14
CJNEA,55H,LOOP1 ;若Ta≠T55,則轉(zhuǎn)向LOOP1 AJMPFH ;若Ta=T55,則返回LOOP1: JNCJW;若(CY)=0,表明Ta>T55,轉(zhuǎn)降溫處理程序
CJNEA,54H,LOOP2;若Ta≠T54,則轉(zhuǎn)向LOOP2 AJMPFH ;若Ta=T54,則返回LOOP2: JCSW ;若(CY)=1,表明Ta<T54,轉(zhuǎn)升溫處理程序
FH: RET ;若T55≥Ta≥T54,則返回主程序例:假定采集的溫度值Ta放在累加器A中。此外,在內(nèi)部RAM54H單元存放溫度下限值T54,在55H單元存放溫度上限值T55。若Ta>T55,程序轉(zhuǎn)向JW(降溫處理程序);若Ta<T54,則程序轉(zhuǎn)向SW(升溫處理程序);若T55≥Ta≥T54,則程序轉(zhuǎn)向FH(返回主程序)。docin/sundae_meng CJNEA,55H,LOOP1 ;若Ta≠T55,15解:(1)分析任務(wù):解方程(2)算法:控制轉(zhuǎn)移(3)程序結(jié)構(gòu):多分支(4)數(shù)據(jù)類型:單字節(jié)、二進(jìn)制、有符號數(shù)(5)RAM單元安排:外部RAM單元(6)采用寄存器間接尋址方式(R0、R1或DPTR)(7)程序設(shè)計流程框圖(8)程序清單;
例:已知:127≥X≥-128,求Y。設(shè)X,Y分別存放在外部RAM1000H和2000H單元中。docin/sundae_meng解:(1)分析任務(wù):解方程例:已知:127≥X≥-128,求16返回docin/sundae_meng返回docin/sundae_meng17XADEQU1000H;
BUFEQU2000H;
ORG1000HSTART:MOVDPTR,#XAD;數(shù)據(jù)X的地址送數(shù)據(jù)指針DPTRMOVXA,DPTR;A←取數(shù)據(jù)X
JZSAV;X=0轉(zhuǎn)SAVJBACC.7,NEG;X<0轉(zhuǎn)NEG,否則,X>0MOVA,#01H;
SJMPSAV;
NEG:MOVA,#0FFH;(0FFH為-1補碼)SAV:MOVDPTR,#BUF;數(shù)據(jù)Y的地址送數(shù)據(jù)指針DPTRMOVXDPTR,A;保存Y值
END上例中,如果采用CJNE指令,應(yīng)如何修改程序?docin/sundae_mengXADEQU1000H;上18XADEQU1000H;
BUFEQU2000H;
ORG1000HSTART:MOVDPTR,#XAD;數(shù)據(jù)X的地址送數(shù)據(jù)指針DPTRMOVXA,DPTR;A←取數(shù)據(jù)X
CJNEA,#0,ANZ;X≠0轉(zhuǎn)ANZSJMPSAV;
ANZ:JC
NEG
;X<0轉(zhuǎn)NEG,否則,X>0MOVA,#01H;
SJMPSAV;
NEG:MOVA,#0FFH;(0FFH為-1補碼)SAV:MOVDPTR,#BUF;數(shù)據(jù)Y的地址送數(shù)據(jù)指針DPTRMOVXDPTR,A;保存Y值
ENDdocin/sundae_mengXADEQU1000H;d192.多分支程序結(jié)構(gòu)多分支程序結(jié)構(gòu)流程中具有兩個以上條件可供選擇??晒┦褂玫氖亲冎穼ぶ忿D(zhuǎn)移指令“JMPA+DPTR”,但使用該指令實現(xiàn)多分支轉(zhuǎn)移時,需要有數(shù)據(jù)表格配合。多分支程序結(jié)構(gòu)docin/sundae_meng2.多分支程序結(jié)構(gòu)docin/sundae_meng20(1)通過數(shù)據(jù)表實現(xiàn)程序多分支 MOVA,n ;分支序號送A MOVDPTR,#BRTAB ;地址表首址
MOVCA,A+DPTR ;查表
JMPA+DPTR ;轉(zhuǎn)移BRTAB:DBBR0-BRTAB ;地址表
DBBR1-BRTAB DBBRn-BRTABBR0: … 分支程序BR1: …BRn: …docin/sundae_meng(1)通過數(shù)據(jù)表實現(xiàn)程序多分支 MOVA,n 21(2)通過轉(zhuǎn)移指令表實現(xiàn)程序多分支
MOVA,n RLA;分支序號值乘以2 MOVDPTR,#BRTAB;轉(zhuǎn)移指令表首址
JMPA+DPTRBRTAB: AJMPBR0;轉(zhuǎn)分支程序0 AJMPBR1;轉(zhuǎn)分支程序1 AJMPBR127;轉(zhuǎn)分支程序127BR0: … ;分支程序BR1: …BRn: …docin/sundae_meng(2)通過轉(zhuǎn)移指令表實現(xiàn)程序多分支 MOVA,ndo22(3)其他實現(xiàn)程序多分支的方法 MOVDPTR,#BRTAB ;分支入口地址表首址
MOVA,R0 RLA ;分支轉(zhuǎn)移值乘以2 MOVR1,A ;暫存A值
INCA MOVCA,A+DPTR ;取低位地址
PUSHACC ;低位地址入棧
MOVA,R1 ;恢復(fù)A值
MOVCA,A+DPTR ;取高位地址
PUSHACC ;高位地址入棧
RET ;分支入口地址裝入PCBRTAB:DWBR0 ;分支程序入口地址表
DWBR1 DWBR127docin/sundae_meng(3)其他實現(xiàn)程序多分支的方法 MOVDPTR,#BR23例:假設(shè)鍵盤上有4個按鍵,功能說明如下表:分析任務(wù)確定算法
程序流程框圖鍵功能鍵值(分支程序序號)鍵處理程序(分支程序)刪除00HER讀數(shù)據(jù)01HDS寫數(shù)據(jù)02HXS插入03HCRdocin/sundae_meng例:假設(shè)鍵盤上有4個按鍵,功能說明如下表:鍵功能鍵值(分支程24docin/sundae_mengdocin/sundae_meng25
假設(shè)轉(zhuǎn)移指令表名稱為BRTAB,分支程序序號已在A中。
MOVDPTR,#BRTABCLRCRLCAJMPA+DPTR;
ORG3000H3000HBRTAB:AJMPER;轉(zhuǎn)刪除分支程序3001H3002HAJMPDS;轉(zhuǎn)讀數(shù)據(jù)分支程序3003H3004HAJMPXS;轉(zhuǎn)寫數(shù)據(jù)分支程序3005H3006HAJMPCR;轉(zhuǎn)插入分支程序ORG3100H3100HER:………………;刪除分支程序
ORG3200H3200HDS:………………;讀數(shù)據(jù)分支程序
ORG3300H3300HXS:………………;寫數(shù)據(jù)分支程序
ORG3400H3400HCR:………………;插入分支程序
ENDdocin/sundae_meng假設(shè)轉(zhuǎn)移指令表名稱為BRTAB,分支程序序號已在A中。26(4)使用比較轉(zhuǎn)移指令CJNE實現(xiàn)。docin/sundae_meng(4)使用比較轉(zhuǎn)移指令CJNE實現(xiàn)。docin/sundae274.2.3循環(huán)程序結(jié)構(gòu)循環(huán)結(jié)構(gòu)是重復(fù)執(zhí)行某個程序段。使用條件轉(zhuǎn)移指令通過條件判斷來實現(xiàn)和控制循環(huán)。循環(huán)程序一般由四個主要部分組成:
(1)初始化部分:為循環(huán)程序做準(zhǔn)備,如規(guī)定循環(huán)次數(shù)、給各變量和地址指針預(yù)置初值。(2)處理部分:為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實體,也是循環(huán)程序的主體。(3)循環(huán)控制部分:其作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結(jié)束,直到符合結(jié)束條件時,跳出循環(huán)為止。(4)結(jié)束部分:這部分主要是對循環(huán)程序的結(jié)果進(jìn)行分析、處理和存放。docin/sundae_meng4.2.3循環(huán)程序結(jié)構(gòu)循環(huán)結(jié)構(gòu)是重復(fù)執(zhí)行某個程序段。使用28
MOVR2,#0FFH;設(shè)置長度計數(shù)器初值
MOVR0,#3FH;設(shè)置字符串指針初值LOOP: INCR2 INCR0 CJNER0,#0DH,LOOP RET舉例:通過查找結(jié)束標(biāo)志(回車符)以統(tǒng)計字符串長度的循環(huán)程序。假定字符串存放在內(nèi)部RAM從40H單元開始的連續(xù)存儲單元中。為找到結(jié)束標(biāo)志,應(yīng)采用逐個字符依次與回車符(ASCII碼0DH)比較的方法。同時在程序中還應(yīng)設(shè)置一個字符串指針以順序定位字符,設(shè)置一個字符長度計數(shù)器以累計字符個數(shù)。docin/sundae_meng MOVR2,#0FFH;設(shè)置長度計數(shù)器初值舉例:通過29
單循環(huán)程序一般有以下兩種典型結(jié)構(gòu):docin/sundae_meng單循環(huán)程序一般有以下兩種典型結(jié)構(gòu):docin/sun30
雙重循環(huán)程序的結(jié)構(gòu):docin/sundae_meng雙重循環(huán)程序的結(jié)構(gòu):docin/sundae_men31解:(1)分析任務(wù):數(shù)據(jù)傳送;(2)算法:比較、控制轉(zhuǎn)移(3)程序結(jié)構(gòu):分支、循環(huán)(4)數(shù)據(jù)類型:多字節(jié)字符串
(5)RAM單元安排:內(nèi)部RAM單元、外部RAM單元(6)采用寄存器間接尋址方式(R0、R1或DPTR)例:把內(nèi)部RAM中起始地址為DATA的數(shù)據(jù)串傳送到外部
RAM以BUFFER為首地址的區(qū)域,直到發(fā)現(xiàn)“$”字符的ASCⅡ碼為止,同時規(guī)定數(shù)據(jù)串最大長度為32個字節(jié)。docin/sundae_meng解:(1)分析任務(wù):數(shù)據(jù)傳送;(2)算法:比較、控制轉(zhuǎn)移例:32
(7)程序流程框圖;docin/sundae_meng(7)程序流程框圖;docin/sundae_men33ORG0030HDATACS:MOVR0,#DATA;DATA數(shù)據(jù)區(qū)首地址
MOVDPTR,#BUFFER;BUFFER數(shù)據(jù)區(qū)首地址
MOVR1,#20H;最大數(shù)據(jù)串長
LOOP:MOVA,R0;取數(shù)據(jù)
SUBBA,#24H;判是否為“$”字符
JZLOOP1;是“$”字符,轉(zhuǎn)結(jié)束
MOVXA,R0;
MOVXDPTR,A;數(shù)據(jù)傳送
INCR0;
INCDPTR;
DJNZR1,LOOP;循環(huán)控制
LOOP1:RET;結(jié)束
ENDdocin/sundae_mengORG0030Hdocin/34【補充程序】存儲器清零程序。假設(shè)在內(nèi)部RAM區(qū),開辟96個工作單元,工作單元首地址為20H,則工作單元清零程序子程序如下:思考題:如采用CJNE指令,應(yīng)如何修改程序?解:ORG1000HCLR0:MOVR0,#20H;循環(huán)初始化部分
MOVR7,#96;
CLRALOOP:MOVR0,A;循環(huán)體部分
INCR0;修改變量
DJNZR7,LOOP;循環(huán)控制部分
RETENDDECR7CJNER7,#00H,LOOP;docin/sundae_meng【補充程序】存儲器清零程序。假設(shè)在內(nèi)部RAM區(qū),開辟思考題:35
例:兩個三字節(jié)二進(jìn)制無符號數(shù)相加,被加數(shù)放在內(nèi)部RAM50H~52H單元(低字節(jié)存放在高地址單元,高字節(jié)存放在低地址單元,即低位在前,高位在后),加數(shù)放在53H~55H單元,和放在50H~52H單元,最高位如有進(jìn)位,則放在23H單元中。被加數(shù)(N1)加數(shù)(N2)和(N3)50H單元高字節(jié)53H單元高字節(jié)50H單元高字節(jié)51H單元中字節(jié)54H單元中字節(jié)51H單元中字節(jié)52H單元低字節(jié)55H單元低字節(jié)52H單元低字節(jié)23H單元進(jìn)位位
被加數(shù)N1高字節(jié)(8位)中字節(jié)(8位)低字節(jié)(8位)加數(shù)N2高字節(jié)(8位)中字節(jié)(8位)低字節(jié)(8位)
+)進(jìn)位位(CY)進(jìn)位位(CY)進(jìn)位位(CY)和N3進(jìn)位高字節(jié)(8位)中字節(jié)(8位)低字節(jié)(8位)docin/sundae_meng例:兩個三字節(jié)二進(jìn)制無符號數(shù)相加,被加數(shù)放在內(nèi)部RA36返回程序流程框圖docin/sundae_meng返回程序流程框圖docin/sundae_meng37ORG0030HADDUDO:MOVR0,#52H;循環(huán)初始化部分
MOVR1,#55H;
MOVR7,#03H;循環(huán)次數(shù)
CLRC;
LOOP:MOVA,R0;循環(huán)體部分
ADDCA,R1;
MOVR0,A;
DECR0;修改指針變量
DECR1;
DJNZR7,LOOP;循環(huán)控制部分
CLRA;循環(huán)結(jié)束處理部分
ADDCA,#00H;
MOVR0,#23H;
MOVR0,A;
RET;
END程序清單docin/sundae_mengORG0030H程序清單docin/384.380C51單片機匯編語言程序設(shè)計舉例4.3.2定時程序在單片機的控制應(yīng)用中,常有定時的需要,如定時中斷、定時檢測和定時掃描等。定時功能除可以使用純硬件電路、可編程定時/計數(shù)器實現(xiàn)外,還可以使用軟件程序(定時程序)完成。定時程序是典型的循環(huán)程序,它是通過執(zhí)行一個具有固定延遲時間的循環(huán)體來實現(xiàn)定時的。docin/sundae_meng4.380C51單片機匯編語言程序設(shè)計舉例4.3.239(1)單循環(huán)定時程序
MOVR5,#TIME;LOOP:NOP;
NOP;
DJNZR5,LOOP;
假設(shè)單片機晶振頻率fosc=6MHz,則一個機器周期為2μs,NOP、DJNZ指令分別是單、雙機器周期指令。定時程序的總延遲時間是循環(huán)程序段延時時間的整數(shù)倍,由于R5是8位寄存器,因此,這個定時程序的最長定時時間為:
256(28)×8=2048(μs)docin/sundae_meng(1)單循環(huán)定時程序假設(shè)單片機晶振頻率fosc=6M40(2)較長時間的定時程序(多重循環(huán)定時子程序)
TIME:MOVR5,#TTME1;
LOOP2:MOVR4,#TEME2;
LOOP1:NOP;
NOP;
DJNZR4,LOOP1;
DJNZR5,LOOP2;
RET;
這個定時子程序的最長定時時間為:
[256(28)×4+2+1]×256(28)×2+4=525828(μs)docin/sundae_meng(2)較長時間的定時程序docin/sundae_meng41(3)調(diào)整定時時間在定時程序中可通過在循環(huán)程序段中增減指令的方法對定時時間進(jìn)行微調(diào)。例:MOVR0,#TTME;
LOOP:ADDA,R1;
INCDPTR;
DJNZR0,LOOP;由于ADD、INC、DJNZ指令的機器周期分別為1、2、2,所以,該程序定時時間為=(1+2+2)×2μs×Time(μs)。docin/sundae_meng(3)調(diào)整定時時間docin/sundae_meng42假定要求定時時間為24us。對于這個定時程序,只須增加一條NOP指令即可實現(xiàn)。
MOVR0,#TIME;LOOP:ADDA,R1;
INCDPTR;
NOP;
DJNZR0,LOOP;只須TIME取2,即可得到精確的24μs定時。docin/sundae_meng假定要求定時時間為24us。對于這個定時程序,只須增加一條N43(4)以一個基本的延時程序滿足不同的定時要求如果一個系統(tǒng)有多個定時需要,我們就可以設(shè)計一個基本延時程序,使其延時時間為各定時時間的最大公約數(shù),然后可以以此基本程序作為子程序,通過調(diào)用的方法實現(xiàn)所需不同定時。
docin/sundae_meng(4)以一個基本的延時程序滿足不同的定時要求docin/su44MOVR0,#05H;5S定時LOOP:LCALLDELAY;
DJNZR0,LOOP1;┋
MOVR0,#0AH;10S定時LOOP2:LCALLDELAY;
DJNZR0,LOOP2;┋
MOVR0,#14H;20S定時LOOP3:LCALLDELAY;
DJNZR0,LOOP3;┋
例:在單片機應(yīng)用系統(tǒng)中,假設(shè)需要的定時時間分別為5S、10S、20S,可設(shè)計一個1S延時子程序DELAY,則5S、10S、20S的定時時間可通過調(diào)用DELAY實現(xiàn)。docin/sundae_mengMOVR0,#05H;5S定時454.3.3查表程序
所謂查表程序,就是指預(yù)先把數(shù)據(jù)以表格形式存放在程序存儲器中,然后使用程序讀出,這種能讀出表格數(shù)據(jù)的程序就稱之為查表程序。查表操作對單片機的控制應(yīng)用十分重要,查表程序常用于實現(xiàn)非線性修正,非線性函數(shù)轉(zhuǎn)換以及代碼轉(zhuǎn)換等場合。
docin/sundae_meng4.3.3查表程序docin/sundae_46MCS-51單片機指令系統(tǒng)中有兩條專用查表指令:(1)MOVCA,A+DPTR;A←((A)+(DPTR))(2)MOVCA,
A+PC;A←((A)+(PC))這兩條查表指令的功能是完全相同的,其共同優(yōu)點是:能在不改變PC和DPTR的狀態(tài)下,只根據(jù)A的內(nèi)容就可以取出表格中的數(shù)據(jù)。注意:A的內(nèi)容均為8位無符號數(shù)。適用于64KBROM范圍內(nèi)查表,一個數(shù)據(jù)表格可以被多個程序塊使用。編寫查表程序時,首先把表的首地址送入DPTR中,再將要查表的數(shù)據(jù)序號(或下標(biāo)值)送入A中,然后就可以使用該指令進(jìn)行查表操作,并把結(jié)果送A中。常用于“本地”范圍查表(數(shù)據(jù)表格只能放在該指令后面256個地址單元之內(nèi),而且表格只能被本程序使用)。編寫查表程序時,首先把查表數(shù)據(jù)的序號送入A中,再把從查表指令的下一條指令的首地址到表的首地址間的偏移量與A值相加,然后再使用該指令進(jìn)行查表操作,并把結(jié)果送入A中。docin/sundae_mengMCS-51單片機指令系統(tǒng)中有兩條專用查表指令:適用于64K47
ORG1000H1000HSQR:MOVA,30H;A←x1002HPUSHDPH;現(xiàn)場保護1004HPUSHDPL;1006HMOVDPTR,#TAB1;DPTR←表首地址TAB11009HMOVCA,A+DPTR;查表得y100AHMOV40H,A;40H←y100CHPOPDPL;現(xiàn)場恢復(fù)100EHPOPDPH;1010HRET1011HTAB1:DB00H,01H,04H,09H,10H,19HDB24H,31H,40H,51H例:設(shè)計一個子程序,其功能為根據(jù)x的內(nèi)容(0~9之間)查平方表,求出相應(yīng)的結(jié)果y(y=x2)。假設(shè)x的內(nèi)容已存放在內(nèi)部RAM30H單元中,求出y的內(nèi)容存放在內(nèi)部RAM40H單元中。docin/sundae_mengORG1000H例:設(shè)計一48上例中,如果使用MOVCA,A+PC指令,則編程如下:
ORG1000H1000HSQR:MOVA,30H;A←x1002HPUSHDPH;現(xiàn)場保護1004HPUSHDPL;1006HADDA,#07H;加偏移量1008HMOVCA,A+PC;查表得y1009HMOV40H,A;40H←y100BHPOPDPL;現(xiàn)場恢復(fù)100DHPOPDPH;100FHRET1010HTAB1:DB00H,01H,04H,09H,10H,19HDB24H,31H,40H,51H此題中,偏移量=1010H-1009H=07Hdocin/sundae_meng上例中,如果使用MOVCA,A+PC指令,則編程如下:49編輯:編寫程序的過程。匯編語言源程序:用匯編語言編寫的程序稱為匯編語言源程序。匯編:匯編語言源程序不能在單片機中直接執(zhí)行,必須將其“翻譯”為用二進(jìn)制代碼(機器語言)表示的目標(biāo)程序才能執(zhí)行。這個“翻譯”過程稱為匯編。
4.4單片機匯編語言源程序的編輯和匯編docin/sundae_meng編輯:編寫程序的過程。4.4單片機匯編語言源程序的編輯和504.4.1手工編程與匯編手工匯編:先把程序用助記符指令寫出,然后通過查指令代碼表,逐個把助記符指令“翻譯”成機器碼,最后再把機器碼的程序輸入單片機,進(jìn)行調(diào)試和運行。通常把這種查表翻譯指令的方法稱為手工匯編。由于手工編程是按絕對地址進(jìn)行定位的,所以手工匯編時要根據(jù)轉(zhuǎn)移的目標(biāo)地址計算轉(zhuǎn)移指令的偏移量,不但麻煩而且容易出錯。docin/sundae_meng4.4.1手工編程與匯編手工匯編:先把程序用助記符指令寫514.4.2機器編輯與交叉匯編機器編輯:是指借助于微型機或開發(fā)系統(tǒng)進(jìn)行單片機的程序設(shè)計,通常都是使用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個由匯編指令和偽指令構(gòu)成的擴展名為“.ASM”的ASCII碼文件。機器匯編:由計算機完成從匯編語言源程序到機器語言目標(biāo)程序的“翻譯”工作。交叉匯編:是指使用一種計算機的匯編程序為另一種計算機的源程序進(jìn)行匯編,即運行匯編程序進(jìn)行匯編的是一種計算機,而匯編得到的目標(biāo)程序是另一種計算機的。
單片機只能采用機器交叉匯編的方法對匯編語言程序進(jìn)行匯編docin/sundae_meng4.4.2機器編輯與交叉匯編機器編輯:是指借助于微型機或52
在微型機或開發(fā)系統(tǒng)上采用交叉匯編方法對源程序進(jìn)行匯編。交叉匯編后,再使用串行通信,把匯編得到的目標(biāo)程序傳送到單片機,進(jìn)行程序調(diào)試和運行??梢姡皺C器編輯→交叉匯編→串行傳送”的過程構(gòu)成了單片機軟件設(shè)計的“三步曲”,全過程如圖所示。單片機匯編語言程序生成過程
對匯編語言程序進(jìn)行機器交叉匯編時,必須告訴計算機的匯編程序應(yīng)該如何完成匯編工作,這一任務(wù)就是通過使用偽指令來實現(xiàn)的。docin/sundae_meng在微型機或開發(fā)系統(tǒng)上采用交叉匯編方法對源53偽指令是程序設(shè)計人員發(fā)給匯編程序的指令,也稱匯編命令或匯編程序控制指令。它具有控制匯編程序的輸入輸出、定義數(shù)據(jù)和符號、條件匯編、分配存儲空間等功能。偽指令沒有與之相對應(yīng)的二進(jìn)制機器代碼,不同匯編語言的偽指令也有所不同。手工匯編不需要偽指令,但機器交叉匯編必須使用偽指令。在對匯編語言程序進(jìn)行機器交叉匯編前,偽指令存在于匯編語言程序中,但匯編后得到的機器代碼程序中不存在偽指令相對應(yīng)的二進(jìn)制機器代碼,這一點請?zhí)貏e注意。4.580C51單片機匯編語言偽指令docin/sundae_meng偽指令是程序設(shè)計人員發(fā)給匯編程序的指令,也稱匯編命令或匯編程541.匯編起始地址命令ORG(ORiGin)本命令總出現(xiàn)在匯編語言源程序的開頭位置,用于規(guī)定目標(biāo)程序的起始地址,即此命令后面的程序或數(shù)據(jù)塊的起始地址。
命令格式:[〈標(biāo)號:〉]ORG〈地址〉
在匯編語言程序的開始,通常都用一條ORG偽指令來規(guī)定程序的起始地址,如果不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開始。
選擇項通常為16位絕對地址,但也可以使用標(biāo)號或表達(dá)式表示例:
ORG8000HSTART:MOVA,#00H;┇即規(guī)定標(biāo)號START代表地址8000H,目標(biāo)程序的第一條指令從8000H開始。docin/sundae_meng1.匯編起始地址命令ORG(ORiGin)選擇項通常為16位552.匯編終止命令END(ENDofassembly)該命令用于終止源程序的匯編工作。
END是匯編語言源程序的結(jié)束標(biāo)志,因此,在整個匯編語言源程序中只能有一個END指令,且位于程序的最后。如果END命令出現(xiàn)在程序中間,則在END之后的指令,匯編程序?qū)⒉挥杼幚怼C罡袷綖椋篬<標(biāo)號:>]END[<表達(dá)式>][<表達(dá)式>]是選擇項,只有主程序模塊才有;[<標(biāo)號:>]也是選擇項,當(dāng)源程序為主程序時才具有,其值為主程序第一條指令的符號地址docin/sundae_meng2.匯編終止命令END(ENDofassembly)d563.賦值命令EQU(EQUate)該命令用于給字符名稱賦值。賦值后,其值在整個程序中有效。命令格式為:<字符名稱>EQU<賦值項>
其中<賦值項>可以是常數(shù)、地址、標(biāo)號或表達(dá)式。其值為8位或16位二進(jìn)制數(shù)。賦值以后的字符名稱既可以作地址使用,也可以作立即數(shù)使用。例:HOUREQU30HORG1000HSTART:MOVHOUR,#40H;等同于
START:MOV30H,#40H;docin/sundae_meng3.賦值命令EQU(EQUate)例:HOUR574.DB(DefineByte)定義數(shù)據(jù)字節(jié)命令本命令用于從指定的地址單元開始,在程序存儲器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。常使用本命令存放數(shù)據(jù)表格。
命令格式:[〈標(biāo)號:〉]DB〈8位數(shù)表〉
例如:DB “howareyou?”DB -2,-4,-6,10,11,17
例:存放7段數(shù)碼管(共陽極)顯示的十六進(jìn)制基數(shù)(0~F)的十六進(jìn)制數(shù)的字形代碼,可使用多條DB命令定義。
DB0C0H,0F9H,0A4H,0B0H;0,1,2,3DB99H,92H,82H,0F8H;4,5,6,7
DB80H,90H,88H,83H;8,9,A,BDB0C6H,0A1H,86H,84H;C,D,E,F(xiàn)docin/sundae_meng4.DB(DefineByte)定義數(shù)據(jù)字節(jié)命令例:58查表時,為確定數(shù)據(jù)區(qū)的起始地址,可采用兩種方法:
a)根據(jù)DB命令前一條指令的地址確定。把該地址加上它的字節(jié)數(shù)就是DB的定義的數(shù)據(jù)字節(jié)的起始地址。例:8100:MOVA,#49H;一字節(jié)指令
TAB:DB0COH,0F9H,0A4H,0B0H;┋定義的7段數(shù)碼管(共陽極)顯示的十六進(jìn)制基數(shù)(0~F)的十六進(jìn)制數(shù)的字形代碼從8101H地址單元開始存放。docin/sundae_meng查表時,為確定數(shù)據(jù)區(qū)的起始地址,可采用兩種方法:docin/59b)使用0RG命令專門規(guī)定。例:ORG8100HTAB:DB0COH,0F9H,0A4H,0B0H;┋定義的7段數(shù)碼管(共陽極)顯示的十六進(jìn)制基數(shù)(0~F)的十六進(jìn)制數(shù)的字形代碼從8101H地址單元開始存放。docin/sundae_mengb)使用0RG命令專門規(guī)定。docin/sundae605.定義數(shù)據(jù)字命令DW(DefineWord)本命令用于從指定地址開始,在程序存儲器單元中定義16位的數(shù)據(jù)字。
命令格式:[〈標(biāo)號:〉]DW〈16位數(shù)表〉
存放時,數(shù)據(jù)字的高8位在前(低地址),低8位在后(高地址)。
例如,DW“AA” ;存入41H,41H DW“A” ;存入00H,41H DW“ABC” ;不合法,因超過兩字節(jié)
DW100H,1ACH,-804;按順序存入01H、00H、01H、
0ACH、0FCH、0DCH
DB和DW定義的數(shù)表,數(shù)的個數(shù)不得超過80個。如數(shù)據(jù)的數(shù)目較多時,可使用多個定義命令。在MCS-51程序設(shè)計應(yīng)用中,常以DB來定義數(shù)據(jù),以DW來定義地址。docin/sundae_meng5.定義數(shù)據(jù)字命令DW(DefineWord)例如,DW616.定義存儲區(qū)命令DS(DefineStonage)該命令用于從指定地址開始,在程序存儲器中保留指定數(shù)目的單元作為預(yù)留存儲區(qū),供程序運行使用。源程序匯編時,對預(yù)留單元不賦值。命令格式為:[<標(biāo)號:>]DS<16位數(shù)表>例如:ADDRTABL:DS20 ;從標(biāo)號ADDRTABL代表的地址開始,預(yù)留20個連續(xù)的地址單元
ORG 8100H DS 08H;從8100H地址開始,保留8個連續(xù)的地址單元docin/sundae_meng6.定義存儲區(qū)命令DS(DefineStonage)該命627.位定義命令BIT該命令用于給字符名稱賦以位地址。命令格式為: <字符名稱>BIT<位地址>其中:<位地址>可以是絕對地址,也可以是符號地址(即位符號名稱)。例:AQBITP1.0功能是把P1.0的位地址賦給變量AQ,在其后的編程中AQ就可以作為位地址使用docin/sundae_meng7.位定義命令BITdocin/sundae_meng63補充內(nèi)容:子程序結(jié)構(gòu)
子程序結(jié)構(gòu)是一種非常重要的程序結(jié)構(gòu)。在一個程序中經(jīng)常遇到反復(fù)多次使用某程序段的情況,如果重復(fù)書寫這個程序段,會使程序變得冗長而雜亂。對此,可采用子程序結(jié)構(gòu),即把重復(fù)的程序段編寫為一個子程序,通過主程序調(diào)用而使用它。這樣不但減少了編程工作量,而且也縮短了程序的長度。
調(diào)用和返回構(gòu)成了子程序調(diào)用的完整過程。為了實現(xiàn)這一過程,必須有子程序調(diào)用指令和返回指令。調(diào)用指令在主程序中使用,而返回指令則應(yīng)該是子程序的最后一條指令。執(zhí)行完這條指令后,程序返回主程序斷點處繼續(xù)執(zhí)行。docin/sundae_meng補充內(nèi)容:子程序結(jié)構(gòu)子程序結(jié)構(gòu)是一種非常重要的程序結(jié)構(gòu)64
(1)子程序的編程原則在實際的單片機應(yīng)用系統(tǒng)軟件設(shè)計中,為了程序結(jié)構(gòu)更加清晰,易于設(shè)計,易于修改,增強程序可讀性,基本上都要使用子程序結(jié)構(gòu)。子程序作為一個具有獨立功能的程序段,編程時需遵循以下原則:
a)子程序的第一條指令必須有標(biāo)號,明確子程序入口地址;
b)以返回指令RET結(jié)束子程序;
c)子程序說明部分;
子程序名稱:提供給主程序調(diào)用的名字,通常用符號或子程序第一條語句的標(biāo)號來表示。
子程序功能:簡要說明子程序能完成的主要功能。
子程序入口參數(shù):主程序需要向子程序提供的參數(shù)。docin/sundae_meng(1)子程序的編程原則docin/sundae_m65
子程序出口參數(shù):子程序執(zhí)行完之后向主程序返回的參數(shù)。
子程序占用資源:子程序中使用了哪些存儲單元、寄存器等
子程序堆棧深度:子程序占用堆棧區(qū)的最大字節(jié)數(shù)。
子程序嵌套情況:子程序中繼續(xù)調(diào)用子程序的情況。
子程序的字節(jié)數(shù):子程序中所有指令字節(jié)數(shù)的總和。
子程序執(zhí)行時間:子程序中所有指令的機器周期數(shù)總和。這些說明是寫給程序員看的,供以后使用子程序時參考。
d)較強的通用性和可浮動性,盡可能避免使用具體的內(nèi)存單元和絕對轉(zhuǎn)移地址等。
docin/sundae_meng子程序出口參數(shù):子程序執(zhí)行完之后向主程序返回的參數(shù)。66e)注意保護現(xiàn)場和恢復(fù)現(xiàn)場。
子程序在編制過程中經(jīng)常會用到一些通用單元,如工作寄存器、累加器、數(shù)據(jù)指針DPTR以及PSW等。而這些工作單元在調(diào)用它的主程序中也會用到,為此,需要將子程序用到的這些通用編程資源加以保護,稱為保護現(xiàn)場。在子程序執(zhí)行完后需恢復(fù)這些單元的內(nèi)容,稱為恢復(fù)現(xiàn)場。通常保護和恢復(fù)現(xiàn)場是在子程序中利用堆棧操作實現(xiàn)的,在子程序的開始部分把子程序中要用到的編程資源都保護起來,在執(zhí)行返回指令之前恢復(fù)現(xiàn)場,這是一種比較規(guī)范的方法。
另外,保護現(xiàn)場和恢復(fù)現(xiàn)場也可以在主程序中實現(xiàn)。在調(diào)用子程序前保護現(xiàn)場,子程序返回后恢復(fù)現(xiàn)場,這種方式比較靈活,可以根據(jù)當(dāng)時的需要確定要保護的內(nèi)容。docin/sundae_menge)注意保護現(xiàn)場和恢復(fù)現(xiàn)場。docin/sundae_men67
(2)參數(shù)傳遞的方法主程序調(diào)用子程序時,主程序和子程序之間存在著參數(shù)互相傳遞的問題。參數(shù)傳遞一般有以下幾種方法:
1)寄存器傳遞參數(shù)通過寄存器A傳遞入口參數(shù)和出口參數(shù)。
docin/sundae_meng(2)參數(shù)傳遞的方法docin/sundae_meng68例:假設(shè)a、b均小于10,計算c=a2+b2,其中a事先存在內(nèi)部RAM的31H單元,b事先存在32H單元,請把c存入33H單元。
SQR:y=x2子程序
ORG0000H;主程序
MAIN:MOVSP,#3FH;設(shè)置棧底
MOV A,31H;取數(shù)a存放到A中作為入口參數(shù)
LCALLSQR;
MOVR1,A;出口參數(shù):a的平方值存放在A中
MOV A,32H;取數(shù)b存放到A中作為入口參數(shù)
LCALLSQR;
ADD A,R1;
MOV 33H,A;
SJMP$;子程序名稱:SQR
功能:通過查表求出平方值y=x2
入口參數(shù):x存放在累加器A中出口參數(shù):求得的平方值y存放在A中占用資源:累加器A,數(shù)據(jù)指針DPTRdocin/sundae_meng例:假設(shè)a、b均小于10,計算c=a2+b2,其中a事先存在69SQR:PUSHDPH;保護現(xiàn)場,將主程序中DPTR的高8位入棧
PUSHDPL;保護現(xiàn)場,將主程序中DPTR的低8位入棧
MOVDPTR,#TABLE;DPTR←表首地址
MOVCA,A+DPTR;查表
POPDPL;恢復(fù)現(xiàn)場,將主程序中DPTR
的低8位從堆棧中彈出
POPDPH;恢復(fù)現(xiàn)場,將主程序中DPTR
的高8位從堆棧中彈出
RETTABLE:DB0,1,4,9,16,25,36,49,64,81END
docin/sundae_mengSQR:PUSHDPH;保護現(xiàn)場,將主程序中DP702)利用堆棧傳遞參數(shù)*
ORG0000H;主程序
MAIN:MOVSP,#3FH;設(shè)置棧底
PUSH31H;將數(shù)a存放到堆棧中,作為入口參數(shù)
LCALLSQR;
POPACC;
MOV R1,A ;出口參數(shù):a的平方值存放在A中
PUSH32H;
LCALLSQR;
POPACC;
ADDA,R1;
MOV 33H,A;
SJMP$;子程序名稱:SQR
功能:通過查表求出平方值y=x2
入口參數(shù):x存放在堆棧中出口參數(shù):求得的平方值y存放在堆棧中占用資源:累加器A,數(shù)據(jù)指針DPTRdocin/sundae_meng2)利用堆棧傳遞參數(shù)*子程序名稱:SQRdocin71SQR:MOVR0,SP;R0作為參數(shù)指針
DEC R0;堆棧指針退回子程序調(diào)用前的地址
DEC R0;
XCH A,R0;保護ACC,取出參數(shù)
MOV DPTR,#TABLE;DPTR←表首地址
MOVC A,A+DPTR;查表
XCHA,R0;查表結(jié)果放回堆棧中
RETTABLE:DB 0,1,4,9,16,25,36,49,64,81docin/sundae_mengSQR:MOVR0,SP;R0作為參數(shù)指72(3)子程序調(diào)用中應(yīng)注意的問題由于子程序調(diào)用過程中,CPU自動使用了堆棧,因此,容易出現(xiàn)以下幾種錯誤:
a)忘記給堆棧指針SP賦棧底初值,堆棧初始化位置與第1組工作寄存器重合,如果以不同的方式使用了同一個內(nèi)存區(qū)域,會導(dǎo)致程序亂套。
b)程序中的PUSH和POP沒有配對使用,使RET指令執(zhí)行時不能彈出正確的斷點地址,造成返回錯誤。
c)堆棧設(shè)置太小,堆棧操作增長太大,使棧區(qū)與其它內(nèi)存單元重合。docin/sundae_meng(3)子程序調(diào)用中應(yīng)注意的問題docin/sundae_me73思考題:統(tǒng)計正數(shù)、負(fù)數(shù)、零的個數(shù)。(一)2.5.(二)1.2.
docin/sundae_meng思考題:統(tǒng)計正數(shù)、負(fù)數(shù)、零的個數(shù)。docin/sundae_74第4章80C51單片機匯編語言程序設(shè)計4.1單片機程序設(shè)計語言概述4.2匯編語言程序的基本結(jié)構(gòu)形式4.380C51單片機匯編語言程序設(shè)計舉例4.4單片機匯編語言源程序的編輯和匯編4.580C51單片機匯編語言偽指令docin/sundae_meng第4章80C51單片機匯編語言程序設(shè)計4.1單片機程754.1單片機程序設(shè)計語言概述4.1.1機器語言和匯編語言1、機器語言用二進(jìn)制代碼“0”和“1”表示指令和數(shù)據(jù)的程序設(shè)計語言,是計算機能直接識別并執(zhí)行的指令。優(yōu)點:執(zhí)行速度快、占用內(nèi)存少。缺點:識別難、記憶難。2、匯編語言用助記符和專門的語言規(guī)則表示指令的功能和特征。 優(yōu)點:助記符與機器指令一一對應(yīng)。比機器語言直觀、易懂、易記。非常適合于實時控制的需要。缺點:難以記憶和使用,程序設(shè)計的技巧性較高,編程難度較大。要求使用者必須精通單片機的硬件系統(tǒng)和指令系統(tǒng)。缺乏通用性,程序不易移植。docin/sundae_meng4.1單片機程序設(shè)計語言概述4.1.1機器語言和匯編764.1.2單片機使用的高級語言對于8051單片機,現(xiàn)有4種語言支持,即匯編、PL/M、C和BASIC。C語言最終得到廣泛應(yīng)用。 可以大大提高單片機應(yīng)用系統(tǒng)研制的開發(fā)效率。移植性好。高級語言的不足:生成的目標(biāo)代碼較長,導(dǎo)致應(yīng)用程序運行速度較慢。docin/sundae_meng4.1.2單片機使用的高級語言對于8051單片機,現(xiàn)有4774.1.380C51單片機匯編語言的語句格式80C51匯編語言的語句格式如下:
[<標(biāo)號>]:<操作碼>[<操作數(shù)>];[<注釋>]1.標(biāo)號 是語句地址的標(biāo)志符號,標(biāo)號的幾點規(guī)定:1~8個ASCII字符組成,第一個字符必須是字母。不能使用本匯編語言已經(jīng)定義的符號作為標(biāo)號。標(biāo)號后面必須跟以冒號“:”。同一標(biāo)號在一個程序中只能定義一次。標(biāo)號可有可無。錯誤的標(biāo)號正確的標(biāo)號1BT:BT1BEGINBEGIN:TA+TB:TATB:ADD:ADD1:docin/sundae_meng4.1.380C51單片機匯編語言的語句格式80C51782.操作碼 用于規(guī)定語句執(zhí)行的操作內(nèi)容,用指令助記符表示。不能空缺。3.操作數(shù)操作數(shù)用于為指令操作提供數(shù)據(jù)??梢允强瞻?,也可能有1~3個操作數(shù),各操作數(shù)之間以逗號分隔。4.注釋不屬于語句的功能部分,只是對語句的解釋說明,以“;”開頭。5.分界符(分隔符)用于把語句中的各部分隔開,以便于區(qū)分。分界符包括空格、冒號、分號或逗號等符號。docin/sundae_meng2.操作碼docin/sundae_meng794.2匯編語言程序的基本結(jié)構(gòu)形式
三種基本結(jié)構(gòu)形式:順序程序結(jié)構(gòu),分支程序結(jié)構(gòu),循環(huán)程序結(jié)構(gòu)。4.2.1順序程序結(jié)構(gòu)
順序結(jié)構(gòu)程序是最簡單的程序結(jié)構(gòu)。程序既無分支、循環(huán),也不調(diào)用子程序,程序執(zhí)行時一條接一條地按順序執(zhí)行指令。docin/sundae_meng4.2匯編語言程序的基本結(jié)構(gòu)形式三種基本結(jié)構(gòu)形80(1)分析任務(wù)(2)確定算法(3)畫流程圖(4)編寫程序(5)上機調(diào)試
2、程序設(shè)計的一般步驟
當(dāng)接到程序設(shè)計的任務(wù)后,首先對任務(wù)進(jìn)行詳盡的分析,搞清楚已知的數(shù)據(jù)和想要得到的結(jié)果,程序應(yīng)該完成何種的功能。明確在程序設(shè)計時應(yīng)該
“做什么”。根據(jù)實際問題的要求和指令系統(tǒng)的特點,確定解決問題的具體步驟。根據(jù)任務(wù)要求,對不同的計算方法進(jìn)行比較,選擇最適宜的算法。解決“怎樣做”的問題。將解決問題的具體步驟用一種約定的幾何圖形、指向線和必要的文字說明描述出來,用圖形的方法描繪解決問題的思路。用指令的形式將程序流程圖實現(xiàn)出來。查錯、改錯,對程序進(jìn)行優(yōu)化。docin/sundae_meng(1)分析任務(wù)2、程序設(shè)計的一般步驟當(dāng)接到程序設(shè)計的任務(wù)后81
50H
51H
52H53H54H55HN1高字節(jié)N1中字節(jié)N1低字節(jié)N2高字節(jié)N2中字節(jié)N2低字節(jié)(1)分析任務(wù)(2)確定算法(3)畫流程圖(4)編寫程序(5)上機調(diào)試?yán)?字節(jié)無符號數(shù)相加:其中被加數(shù)在內(nèi)部RAM的50H、51H和52H單元中;加數(shù)在內(nèi)部RAM的53H、54H和55H單元中;要求把相加之和存放在50H、51H和52H單元中,進(jìn)位存放在位尋址區(qū)的20H位中。docin/sundae_meng50H51H52H53H54H55HN1高字節(jié)N1中字82MOVR0,#52H;被加數(shù)的低字節(jié)地址MOVR1,#55H;加數(shù)的低字節(jié)地址MOVA,R0ADDA,R1;低字節(jié)相加MOVR0,A;存低字節(jié)相加結(jié)果DECR0DECR1MOVA,R0ADDCA,R1;中間字節(jié)帶進(jìn)位相加MOVR0,A;存中間字節(jié)相加結(jié)果DECR0DECR1MOVA,R0ADDCA,R1;高字節(jié)帶進(jìn)位相加MOVR0,A;存高字節(jié)相加結(jié)果CLRAADDCA,#00H;進(jìn)位送00H位保存MOVR0,#20H;存放進(jìn)位的單元地址MOVR0,Adocin/sundae_mengMOVR0,#52H;被加數(shù)的低字節(jié)地址docin/su83
分支結(jié)構(gòu)也稱為選擇結(jié)構(gòu)。為分支需要,程序設(shè)計時應(yīng)給程序段的起始地址賦予一個地址標(biāo)號,以供選擇分支使用。分支結(jié)構(gòu)又可分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。
1.單分支程序結(jié)構(gòu)單分支程序結(jié)構(gòu)即二中選一,是通過條件判斷實現(xiàn)的。一般都使用條件轉(zhuǎn)移指令對程序的執(zhí)行結(jié)果進(jìn)行判斷。可實現(xiàn)單分支轉(zhuǎn)移的指令有:JZ、JNZ、CJNE和DJNZ。位狀態(tài)轉(zhuǎn)移指令:JC、JNC、JB、JNB和JBC等。4.2.2分支程序結(jié)構(gòu)docin/sundae_meng分支結(jié)構(gòu)也稱為選擇結(jié)構(gòu)。為分支需要,程序設(shè)計時484(1)單分支結(jié)構(gòu)舉例假定在外部RAM中有ST1、ST2和ST3共3個連續(xù)單元,其中ST1和ST2單元中存放著兩個無符號二進(jìn)制數(shù),要求找出其中的大數(shù)并存入ST3單元中。解:(1)分析任務(wù):比較兩個數(shù)的大小(2)算法:算術(shù)運算、控制轉(zhuǎn)移(3)程序結(jié)構(gòu):單分支(4)數(shù)據(jù)類型:單字節(jié)、二進(jìn)制、無符號數(shù)(5)數(shù)據(jù)結(jié)構(gòu):單元地址升序排列
(6)RAM單元安排:外部RAM單元
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年電池管理系統(tǒng)公司技術(shù)改造及擴產(chǎn)項目可行性研究報告
- 2024-2030年水性金屬油墨搬遷改造項目可行性研究報告
- 工業(yè)園區(qū)建設(shè)施工圍擋協(xié)議
- 施工期間進(jìn)度跟蹤會議協(xié)議
- 大型娛樂中心基礎(chǔ)加固強夯協(xié)議
- 正擠壓實心件課程設(shè)計
- 臺球館租賃協(xié)議模板
- 2024外墻保溫施工勞務(wù)分包合同范本(綠色建材)3篇
- 藥店藥品區(qū)設(shè)計裝修合同案例
- 歷史建筑群改造合同
- 全國第三屆職業(yè)技能大賽(數(shù)字孿生應(yīng)用技術(shù))選拔賽理論考試題庫(含答案)
- 應(yīng)用數(shù)理統(tǒng)計知到智慧樹章節(jié)測試課后答案2024年秋中國農(nóng)業(yè)大學(xué)
- 大國三農(nóng)II-農(nóng)業(yè)科技版智慧樹知到期末考試答案章節(jié)答案2024年中國農(nóng)業(yè)大學(xué)
- JBT 1472-2023 泵用機械密封 (正式版)
- 二級公立醫(yī)院績效考核三級手術(shù)目錄(2020版)
- 6人小品《沒有學(xué)習(xí)的人不傷心》臺詞完整版
- 部編本小學(xué)五年級上冊語文期末考試(選擇題)專項訓(xùn)練題及答案
- 讀《讓兒童在問題中學(xué)數(shù)學(xué)》有感范文三篇
- 陳述句改成雙重否定句(課堂PPT)
- 人教版六年級數(shù)學(xué)上冊總復(fù)習(xí)教案
- 自閉癥兒童行為檢核表學(xué)前版
評論
0/150
提交評論