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

下載本文檔

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

文檔簡(jiǎn)介

第4章80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)本講重點(diǎn):

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

√同一標(biāo)號(hào),在同一段程序中只允許定義一次;

[標(biāo)號(hào):]操作碼

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

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

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

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

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

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

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

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

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

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

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

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

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

JNCBIG1;第二個(gè)數(shù)大則轉(zhuǎn)BUG1XCHA,R2;第一個(gè)數(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正確合理地運(yùn)用條件語(yǔ)句組1語(yǔ)句組2YesNo入口出口用條件轉(zhuǎn)移語(yǔ)句實(shí)現(xiàn)二分支≠?Cy=0?語(yǔ)句組1語(yǔ)句組2語(yǔ)句組3入口YesYesNoNoCJNE出口或CY=1?用CJNE實(shí)現(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ù)比較,實(shí)現(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單元中的兩個(gè)帶符號(hào)數(shù)比較大小,將較大者存入MAX單元中。兩數(shù)相等則任一個(gè)存入MAX即可。若X-Y為負(fù),則OV=0,X<YOV=1,X>Y若X-Y為正,則OV=0,X>YOV=1,X<Y√2)用查地址表方法實(shí)現(xiàn)多分支程序轉(zhuǎn)移關(guān)鍵是建立一個(gè)差值表,并將各分支入口地址與該表首地址的差值按順序排列其中,差值表首地址送入DPTR,分支序號(hào)值送入A中,然后就可通過(guò)轉(zhuǎn)移指令JMP@A+DPTR進(jìn)行分支。(A)=?語(yǔ)句組1語(yǔ)句組2語(yǔ)句組3語(yǔ)句組40AH0BH0CH0DH入口AAABBBCCCDDD√3)其他方法實(shí)現(xiàn)多分支程序轉(zhuǎn)移(自學(xué))地址表、堆棧等……4.2.3循環(huán)程序結(jié)構(gòu)循環(huán)是為了重復(fù)執(zhí)行一個(gè)程序段。與高級(jí)語(yǔ)言不同,匯編語(yǔ)言中沒(méi)有專用的循環(huán)指令,但可以使用條件轉(zhuǎn)移指令通過(guò)條件判斷來(lái)控制循環(huán)。在程序運(yùn)行時(shí),有時(shí)需要連續(xù)重復(fù)執(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)初值對(duì)于循環(huán)程序中所使用的工作單元,在循環(huán)開始時(shí)應(yīng)置初值。例如,工作寄存器設(shè)置計(jì)數(shù)初值,累加器A清0,以及設(shè)置地址指針、長(zhǎng)度等。2、循環(huán)體(循環(huán)工作部分)重復(fù)執(zhí)行的程序段部分,分為循環(huán)工作部分和循環(huán)控制部分。循環(huán)控制部分每循環(huán)一次,檢查結(jié)束條件,當(dāng)滿足條件時(shí),就停止循環(huán),往下繼續(xù)執(zhí)行其他程序3、修改控制變量在循環(huán)程序中,不許給出循環(huán)結(jié)束條件。常見的是計(jì)數(shù)循環(huán),當(dāng)循環(huán)了一定的次數(shù)后,就停止循環(huán)。在單片機(jī)中,一般用一個(gè)工作寄存器Rn作為計(jì)數(shù)器,對(duì)該計(jì)數(shù)器賦初值作為循環(huán)次數(shù)。每循環(huán)一次,計(jì)數(shù)器的值減1,即修改循環(huán)控制變量,當(dāng)計(jì)數(shù)器的置件為0時(shí),就停止循環(huán)。4、循環(huán)控制部分根據(jù)循環(huán)結(jié)束條件,判斷是否結(jié)束循環(huán)。89C51可采用DJNZ指令來(lái)自動(dòng)修改控制變量并能結(jié)束循環(huán)。例:設(shè)有一字符串以回車符為結(jié)束標(biāo)志,并存放在內(nèi)部RAM從40H單元開始的連續(xù)存儲(chǔ)單元中,編寫測(cè)試字符串長(zhǎng)度的程序。思路:1.逐個(gè)字符與回車符(0DH)比較;

2.設(shè)置一個(gè)字符串指針;

3.設(shè)置一個(gè)長(zhǎng)度計(jì)數(shù)器。

MOVR2,#0FFH;設(shè)置長(zhǎng)度計(jì)數(shù)器初值

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

JZXMAX

JBACC.7,NEG

JBOV,YMAXSJMPXMAX

NEG:JBOV,XMAXYMAX:MOVA,TWO

SJMPRMAX

XMAX:MOVA,ONERMAX:MOVMAX,ASJMP$END[例]ONE和TWO單元中的兩個(gè)帶符號(hào)數(shù)比較大小,將較大者存入MAX單元中。兩數(shù)相等則任一個(gè)存入MAX即可。若X-Y為負(fù),則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個(gè)例

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

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

匯編可分成兩種:人工匯編機(jī)器匯編

機(jī)器匯編是用機(jī)器自動(dòng)把匯編語(yǔ)言源程序翻譯成可以運(yùn)行的目標(biāo)代碼程序,即二進(jìn)制程序的過(guò)程,它是一種用機(jī)器來(lái)代替人腦的匯編,完成這一匯編過(guò)程的軟件稱為“匯編程序”。4.4單片機(jī)匯編語(yǔ)言源程序的編輯和匯編(自學(xué))匯編機(jī)器語(yǔ)言目標(biāo)程序匯編語(yǔ)言源程序匯編程序匯編機(jī)器語(yǔ)言目標(biāo)程序匯編語(yǔ)言源程序人工查指令機(jī)器碼表4.580C51單片機(jī)匯編語(yǔ)言偽指令匯編程序→

軟件→

工具→工具軟件:

將程序員用匯編語(yǔ)言編寫的程序翻譯成機(jī)器碼

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

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

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

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

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

——“當(dāng)前PC值”也叫位置計(jì)數(shù)器

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

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

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

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

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

END

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

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

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

ORG1000HDat:DW1122h,3344h,-1END1000H

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論