第4章80C51單片機匯編語言程序設計p - 副本_第1頁
第4章80C51單片機匯編語言程序設計p - 副本_第2頁
第4章80C51單片機匯編語言程序設計p - 副本_第3頁
第4章80C51單片機匯編語言程序設計p - 副本_第4頁
第4章80C51單片機匯編語言程序設計p - 副本_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章80C51單片機匯編語言程序設計本講重點:

匯編語言程序設計。4.1單片機程序設計語言概述4.1.1機器語言和匯編語言機器語言——用二進制表示的指令。匯編語言——用助記符表示的指令。4.1.2單片機使用的高級語言C語言、BASIC、PL/M等4.1.380C51單片機匯編語言的語句格式√標號由1~8個ASCII碼組成,但第一個字符必須是字母;

√同一標號,在同一段程序中只允許定義一次;

[標號:]操作碼

[目的操作數(shù)][,源操作數(shù)][;注釋]√標號后邊必須跟冒號。

4.2匯編語言程序的基本結(jié)構(gòu)形式一般把程序結(jié)構(gòu)分為3種形式:順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。

順序程序是最簡單的程序結(jié)構(gòu),程序執(zhí)行時,按指令的先后順序,一條條地執(zhí)行。4.2.1順序結(jié)構(gòu)例:三字節(jié)無符號數(shù)相加,其中被加數(shù)在內(nèi)部RAM的50H、51H和52H單元中;加數(shù)在內(nèi)部RAM的53H、54H和55H單元中;要求把相加之和存放在50H、51H和52H單元中,進位存放在位尋址區(qū)的00H位中。MOVR0,#52H;被加數(shù)的低字節(jié)地址

MOVR1,#55H;加數(shù)的低字節(jié)地址

MOVA,@R0ADDA,@R1;低字節(jié)相加

MOV@R0,A;存低字節(jié)相加結(jié)果DECR0DECR1MOVA,@R0ADDCA,@R1;中間字節(jié)帶進位相加

MOV@R0,A;存中間字節(jié)相加結(jié)果

DECR0DECR1MOVA,@R0ADDCA,@R1;高字節(jié)帶進位相加

MOV@R0,A;存高字節(jié)相加結(jié)果CLRAADDCA,#00HMOVR0,#00H;存放進位的單元地址

MOV@R0,A;進位送00H位保存4.2.2分支結(jié)構(gòu)

例:假定在外部RAM中有ST1、ST2和ST3共3個連續(xù)單元,其中ST1和ST2單元中分別存放著兩個8位無符號二進制數(shù),要求找出其中的大數(shù)并存入ST3單元中。START:CLRC;進位位清“0”MOVDPTR,#ST1;設置數(shù)據(jù)指針

MOVXA,@DPTR;取第一個數(shù)分支結(jié)構(gòu)是通過轉(zhuǎn)移指令實現(xiàn)的,又分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。1.單分支結(jié)構(gòu)MOVR2,A;第一個數(shù)存R2INCDPTR;數(shù)據(jù)指針加1MOVXA,@DPTR;取第二個數(shù)

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

JNCBIG1;第二個數(shù)大則轉(zhuǎn)BUG1XCHA,R2;第一個數(shù)大則整字節(jié)交換,然后繼續(xù)執(zhí)行程序BIG0:INCDPTRMOVX@DPTR,A;存大數(shù)RETBIG1:MOVXA,@DPTRSJMPBIG02.多分支結(jié)構(gòu)

根據(jù)不同的條件,執(zhí)行不同的程序段。

JZ、JNZ、JC、JNC、JB、JNB、CJNE、DJNZ正確合理地運用條件語句組1語句組2YesNo入口出口用條件轉(zhuǎn)移語句實現(xiàn)二分支≠?Cy=0?語句組1語句組2語句組3入口YesYesNoNoCJNE出口或CY=1?用CJNE實現(xiàn)三分支例:某溫度控制系統(tǒng),采集的溫度值(Ta)放在累加器A中。此外,在內(nèi)部RAM54H單元存放控制溫度下限值(T54),在55H單元存放控制溫度上限值(T55)。若Ta>T55,程序轉(zhuǎn)向JW(降溫處理程序);若Ta<T54,則程序轉(zhuǎn)向SW(升溫處理程序);若T55≥Ta≥T54,則程序轉(zhuǎn)向FH(返回主程序)。有關(guān)程序段如下:√1)用多條CJNE指令,經(jīng)連續(xù)比較,實現(xiàn)多重單分支結(jié)構(gòu)。CJNEA,55H,LOOP1;Ta≠T55則轉(zhuǎn)向LOOP1AJMPFH;Ta=T55則返回主程序LOOP1:JNCJW;若(CY)=0則表明Ta>55

轉(zhuǎn)降溫處理程序

CJNEA,54H,LOOP2;Ta≠T54則轉(zhuǎn)向LOOP2AJMPFH;Ta=T54則返回主程序LOOP2:JCSW;若(CY)=1則表明

Ta<T54,轉(zhuǎn)升溫處理程序。FH:RETORG1000HONEDATA30HTWODATA31HMAXDATA32HCLRCMOVA,ONESUBBA,TWO

JZXMAX

JBACC.7,NEG

JBOV,YMAXSJMPXMAX

NEG:JBOV,XMAXYMAX:MOVA,TWO

SJMPRMAX

XMAX:MOVA,ONERMAX:MOVMAX,ASJMP$END[例]ONE和TWO單元中的兩個帶符號數(shù)比較大小,將較大者存入MAX單元中。兩數(shù)相等則任一個存入MAX即可。若X-Y為負,則OV=0,X<YOV=1,X>Y若X-Y為正,則OV=0,X>YOV=1,X<Y√2)用查地址表方法實現(xiàn)多分支程序轉(zhuǎn)移關(guān)鍵是建立一個差值表,并將各分支入口地址與該表首地址的差值按順序排列其中,差值表首地址送入DPTR,分支序號值送入A中,然后就可通過轉(zhuǎn)移指令JMP@A+DPTR進行分支。(A)=?語句組1語句組2語句組3語句組40AH0BH0CH0DH入口AAABBBCCCDDD√3)其他方法實現(xiàn)多分支程序轉(zhuǎn)移(自學)地址表、堆棧等……4.2.3循環(huán)程序結(jié)構(gòu)循環(huán)是為了重復執(zhí)行一個程序段。與高級語言不同,匯編語言中沒有專用的循環(huán)指令,但可以使用條件轉(zhuǎn)移指令通過條件判斷來控制循環(huán)。在程序運行時,有時需要連續(xù)重復執(zhí)行某段程序,可以使用循環(huán)程序。其結(jié)構(gòu)包括四部分:

1、置循環(huán)初值

2、循環(huán)體(循環(huán)工作部分)

3、修改控制變量

4、循環(huán)控制部分其組織方式如下圖所示。置初值循環(huán)體循環(huán)修改循環(huán)控制退出循環(huán)未完完(a)置初值循環(huán)體循環(huán)修改循環(huán)控制退出循環(huán)未完完(b)循環(huán)組織方式流程圖1、置循環(huán)初值對于循環(huán)程序中所使用的工作單元,在循環(huán)開始時應置初值。例如,工作寄存器設置計數(shù)初值,累加器A清0,以及設置地址指針、長度等。2、循環(huán)體(循環(huán)工作部分)重復執(zhí)行的程序段部分,分為循環(huán)工作部分和循環(huán)控制部分。循環(huán)控制部分每循環(huán)一次,檢查結(jié)束條件,當滿足條件時,就停止循環(huán),往下繼續(xù)執(zhí)行其他程序3、修改控制變量在循環(huán)程序中,不許給出循環(huán)結(jié)束條件。常見的是計數(shù)循環(huán),當循環(huán)了一定的次數(shù)后,就停止循環(huán)。在單片機中,一般用一個工作寄存器Rn作為計數(shù)器,對該計數(shù)器賦初值作為循環(huán)次數(shù)。每循環(huán)一次,計數(shù)器的值減1,即修改循環(huán)控制變量,當計數(shù)器的置件為0時,就停止循環(huán)。4、循環(huán)控制部分根據(jù)循環(huán)結(jié)束條件,判斷是否結(jié)束循環(huán)。89C51可采用DJNZ指令來自動修改控制變量并能結(jié)束循環(huán)。例:設有一字符串以回車符為結(jié)束標志,并存放在內(nèi)部RAM從40H單元開始的連續(xù)存儲單元中,編寫測試字符串長度的程序。思路:1.逐個字符與回車符(0DH)比較;

2.設置一個字符串指針;

3.設置一個長度計數(shù)器。

MOVR2,#0FFH;設置長度計數(shù)器初值

MOVR0,#3FH;設置字符串指針初值LOOP:INCR2INCR0CJNE@R0,#0DH,LOOPRET程序設計的方法和步驟結(jié)構(gòu)化設計模塊化設計開發(fā)方法自底向上開發(fā)先底層開發(fā)自頂向下開發(fā)先頂層開發(fā)混合方法底頂程序設計的步驟分析課題,確定算法和思路;根據(jù)算法和思路畫出流程圖;根據(jù)流程圖編寫程序;上機調(diào)試,排除錯誤。一、分析問題對需要解決的問題進行分析,以求對問題由正確的理解。如,解決問題的任務是什么?工作過程?現(xiàn)有的條件,已知數(shù)據(jù),對運算的精度和速度方面的要求?設計的硬件結(jié)構(gòu)是否方便編程?二、確定算法算法就是如何將實際問題轉(zhuǎn)化成程序模塊來處理。在編程以前,先要對幾種不同的算法進行分析、比較,找出最適宜的算法三、畫程序流程圖程序流程圖是用各種圖形、符號、有向線段等來說明程序設計過程的一種直觀的表示。流程圖劃分得越細致,編寫程序是也越方便。畫流程圖是程序結(jié)構(gòu)設計的一種重要手段。一個系統(tǒng)軟件包括總流程圖和局部流程圖。流程圖常采用的圖形和符號:橢圓框或桶形框:表示程序的開始或結(jié)束。矩形框:表示要進行的工作。開始結(jié)束稱為:起止框稱為:處理框XX+1YY-1流程圖常采用的圖形和符號:菱形框:表示要判斷的事情,菱形框內(nèi)的表達式表示要判斷的內(nèi)容。圓圈:表示連接點指向線:表示程序的流向稱為:判斷框F>5?YN四、編寫程序用89C51匯編語言編寫的源程序。程序設計步驟流程圖編程的方法和技巧一、模塊化的程序設計方法二、編程技巧一、模塊化的程序設計方法1、程序功能模塊化的優(yōu)點2、劃分模塊的原則1、程序功能模塊化的優(yōu)點單個模塊結(jié)構(gòu)的程序功能單一,易于編寫、調(diào)試和修改。便于分工,從而可使多個程序員同時進行程序的編寫和調(diào)試工作,加快軟件研制進度。程序可讀性好,便于功能擴充和版本升級。對程序的修改可局部進行,其它部分可以保持不變。對使用頻繁的子程序建立子程序庫,便于多模塊調(diào)用。2、劃分模塊的原則每個模塊應具有獨立的功能,能產(chǎn)生一個明確的結(jié)果,即單模塊的功能高內(nèi)聚性。模塊之間的控制耦合應盡量簡單,數(shù)據(jù)耦合應盡量少,即模塊間的低耦合性。控制耦合是指模塊進入和退出的條件及方式,數(shù)據(jù)耦合是指模塊間的信息交換方式、交換量的多少及交換頻繁程度。模塊長度適中。20條~100條的范圍較合適。二、編程技巧1、盡量采用循環(huán)結(jié)構(gòu)和子程序。2、盡量少用無條件轉(zhuǎn)移指令。3、對于通用的子程序,考慮到其通用性,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其他寄存器的內(nèi)容應壓入堆棧(返回前再彈出),即保護現(xiàn)場。4、在中斷處理程序中,除了要保護處理程序中用到的寄存器外,還要保護標志寄存器。5、用累加器傳遞入口參數(shù)或返回參數(shù)比較方便,子程序中,一般不必把累加器內(nèi)容壓入堆棧。4.380C51單片機匯編語言程序設計舉例本節(jié)課本上的例題以自學為主。大部分程序沒用,重點看查表程序。ORG1000HONEDATA30HTWODATA31HMAXDATA32HCLRCMOVA,ONESUBBA,TWO

JZXMAX

JBACC.7,NEG

JBOV,YMAXSJMPXMAX

NEG:JBOV,XMAXYMAX:MOVA,TWO

SJMPRMAX

XMAX:MOVA,ONERMAX:MOVMAX,ASJMP$END[例]ONE和TWO單元中的兩個帶符號數(shù)比較大小,將較大者存入MAX單元中。兩數(shù)相等則任一個存入MAX即可。若X-Y為負,則OV=0,X<Y

OV=1,X>Y若X-Y為正,則OV=0,X>Y

OV=1,X<Y例:內(nèi)部數(shù)據(jù)區(qū)清零ORG0000HZero:movR0,#30HmovR7,#10movA,#00HLoop:mov@R0,AincR0djnzR7,Loopsjmp$END內(nèi)部RAM30HR023H98H0A8H0FDH…00000010個例

將兩個半字節(jié)數(shù)合并成一個一字節(jié)數(shù)。設內(nèi)部RAM40H#,41H單元中分別存放著8位二進制數(shù),要求取出兩個單元中的低半字節(jié),并成一個字節(jié)后,存入50H單元中。程序如下:START:MOVR1,#40H;設置R1為數(shù)據(jù)指針MOVA,@R1;取出第一個單元中的內(nèi)容ANLA,#0FH;取第一個數(shù)的低半字節(jié)SWAPA ;移至高半字節(jié)INCR1 ;修改數(shù)據(jù)指針XCHA,@R1 ;取第二個單元中的內(nèi)容ANLA,#0FH;取第二個數(shù)的低半字節(jié)ORLA,@R1;拼字MOV50H,A ;存放結(jié)果RETASCII碼二進制ORG0000HAtoH:MOVA,#’A’CLRCSUBBA,#30HCJNEA,#0AH,NEQSJMPBIGNEQ:JCAENDBIG:SUBBA,#07HAEND:SJMP$END

ORG0000HHtoA:MOVA,#0BHADDA,#90HDAAADDCA,#40HDAASJMP$END0BH+90H9BH+66H101H40H+142H

匯編可分成兩種:人工匯編機器匯編

機器匯編是用機器自動把匯編語言源程序翻譯成可以運行的目標代碼程序,即二進制程序的過程,它是一種用機器來代替人腦的匯編,完成這一匯編過程的軟件稱為“匯編程序”。4.4單片機匯編語言源程序的編輯和匯編(自學)匯編機器語言目標程序匯編語言源程序匯編程序匯編機器語言目標程序匯編語言源程序人工查指令機器碼表4.580C51單片機匯編語言偽指令匯編程序→

軟件→

工具→工具軟件:

將程序員用匯編語言編寫的程序翻譯成機器碼

(真)指令:告訴計算機如何操作以及做何種操作用匯編語言編寫的程序在此被稱為應用程序偽指令:告訴匯編程序在翻譯應用程序時有何具體約定。偽指令不進行具體的操作,那是真指令的事。

比如:從何處開始,何處結(jié)束,某些編程者自己規(guī)定的表述代表什么意思……ORG

addr16——ASM51程序中一定要寫!規(guī)定編譯后的機器代碼存放的起始位置。END

——ASM51程序中一定要寫!表示翻譯到此結(jié)束,其后的任何內(nèi)容不予理睬。符號名稱EQU

表達式將表達式的值賦予符號名稱。程序中凡出現(xiàn)該符號名稱就等同于該表達式。$

——“當前PC值”也叫位置計數(shù)器

代表正在執(zhí)行的指令所在位置。符號名稱BIT

位地址將位地址的值賦予符號名稱。程序中凡出現(xiàn)該符號名稱就代表該位地址。DW

雙字節(jié)數(shù)據(jù)[或雙字節(jié)數(shù)據(jù)組]將雙字節(jié)數(shù)據(jù)[或雙字節(jié)數(shù)據(jù)組]順序存放在此后的存儲單元中。占據(jù)相應存儲空間。DB

8位數(shù)據(jù)[或8位數(shù)據(jù)組]將8位數(shù)據(jù)[或8位數(shù)據(jù)組]順序存放在此后的存儲單元中。占相應數(shù)量的存儲空間。匯編起始偽指令格式:ORG<起始地址>功能:指定匯編源程序編譯成機器語言程序 的起始地址例如:ORG0000HLJMP0100H

ORG0100HStart:MOVA,#5AHSJMP$END程序中可以有多條ORG語句,但定義的起始地址既不要交叉,也不要重疊。必須從小地址向大地址分配程序所占空間。匯編結(jié)束偽指令格式:END[起始地址]功能:停止匯編仍用上例:ORG0000HLJMP0100HORG0100HStart:MOVA,#5AhSJMP$

END

定義字節(jié)偽指令格式:<標號:>DB<項或項表>功能:把項或項表的數(shù)值存入從標號開始的連續(xù)單元,其中項或項表可以是一個字節(jié)、數(shù)或以引號括起來的字符串。

ORG1000HDat:DB11h,-1,’A’,’BCD’END

該指令只能為程序存儲器賦初值,不能為其他存儲器賦初值,尤其不能為內(nèi)部數(shù)據(jù)存儲器賦初值。注意:1000H11HFFH41H42H程序存儲器43H44H補碼ASCII碼‘’定義字偽指令格式:<標號:>DW<項或項表>功能:把項或項表的數(shù)值存入從標號開始的連續(xù)單元,其中項或項表是一個字(兩字節(jié))。

ORG1000HDat:DW1122h,3344h,-1END1000H

溫馨提示

  • 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

提交評論