版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章匯編語言程序設(shè)計(jì)教學(xué)目的:熟悉80C51系列單片機(jī)的匯編語言,能夠熟練編寫匯編語言源程序。教學(xué)重點(diǎn):常用匯編語言程序設(shè)計(jì)方法。
教學(xué)難點(diǎn):分支程序、散轉(zhuǎn)程序與子程序的設(shè)計(jì)7.1概述
7.1.1匯編語言源程序的格式
1.匯編語句格式
[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]
這4部份只有操作碼段是必須具有的,其余部分為可選項(xiàng),但對(duì)于包含操作數(shù)的指令,則操作數(shù)段也是必須具有的。例如:
SU:MOVA,#0CDH;CDH
A7.1.2匯編語言偽指令
(1)ORG匯編起始指令
規(guī)定目標(biāo)程序的起始地址,格式如下:
標(biāo)號(hào)操作碼操作數(shù)
ORG表達(dá)式(exp)(2)
END匯編結(jié)束指令(3)EQU賦值指令把操作數(shù)段中的地址或數(shù)據(jù)賦值給標(biāo)號(hào),格式如下:標(biāo)號(hào)操作碼操作數(shù)字符名稱EQU數(shù)或匯編符號(hào)例1AA EQUR1;R1與AA等值則MOVA,AA指令與MOVA,R1指令結(jié)果相同。(4)DB定義字節(jié)指令
定義程序存儲(chǔ)器中存放的8位常數(shù)表,格式如下:
(標(biāo)號(hào))操作碼操作數(shù)
DB字節(jié)常數(shù)或ASCII字符例2ORG1000HDB76H,73,‘C’,‘B’
;在表示ASCII字 符時(shí)要用‘
’括號(hào)
DBOACH
則(1000H)=76H(1001H)=49H (1002H)=43H(1003H)=42H (1004H)=0ACH
(5)DW定義字指令
定義程序存儲(chǔ)器中存放的16位常數(shù)表
格式DW<16位數(shù)據(jù)表>。例3ORG2200HDW1246H,7BH,10
則(2200H)=12H(2201H)=46H
(2202H)=00(2203H)=7BH
(2204H)=00(2205H)=0AH(6)BIT定義位地址指令
格式<字符名稱>BIT<位地址>
例4ABCBITP1.0 Q4BITP2.2
則匯編后,位地址P1.0,P1.2分別賦給變量ABC和Q4。
7.DATA定義標(biāo)號(hào)數(shù)值偽指令它的功能是給標(biāo)號(hào)段中的數(shù)據(jù)地址標(biāo)號(hào)賦以數(shù)值,也稱為數(shù)據(jù)地址賦值指令。它的格式如下:字符名稱DATA表達(dá)式例5M5DATA1A00H
匯編后M5的值為1A00H。8.DS定義存儲(chǔ)空間指令
它的功能是從指定地址開始,定義一個(gè)存儲(chǔ)區(qū),保留由表達(dá)式指定的若干字節(jié)空間作為備用空間,這個(gè)存儲(chǔ)區(qū)預(yù)留的存儲(chǔ)單元數(shù)由DS表達(dá)式的值決定。它的格式如下:
DS表達(dá)式 表達(dá)式通常是一個(gè)常數(shù)。例6ORG100HDS 30HDB 56H,8AH匯編后,從100H地址開始保留48個(gè)單元,(131H)=56H,(132H)=8AH。
7.2順序與循環(huán)程序設(shè)計(jì)
7.2.1順序程序設(shè)計(jì)
例7.8將R5中的兩個(gè)BCD碼拆開并變成ASCII碼,存入61H、62H單元。解:在此采用把BCD數(shù)除以10H的方法,除后相當(dāng)于把此數(shù)右移了4位,剛好把兩個(gè)BCD碼分別移到A、B的低4位。由于ASCII碼的0~9為30H~39H。然后再各自與30H相或即變?yōu)锳SCII碼。源程序如下:ORG0000HLJMPMAIN……ORG30H;主程序起始地址MAIN:MOVA,R5MOVB,#10H;用10H作除數(shù)DIVABORLB,#30H;低4位BCD碼變?yōu)锳SCII碼MOV62H,BORLA,#30H;高4位BCD碼變?yōu)锳SCII碼MOV61H,ASJMP$;循環(huán)等待END7.2.2循環(huán)程序設(shè)計(jì)
1.循環(huán)初始化(或稱初始條件)循環(huán)初態(tài)是設(shè)置循環(huán)過程中工作單元的初始值。
2.循環(huán)體重復(fù)執(zhí)行的程序段部分。
3.循環(huán)控制部分。用于控制循環(huán)的執(zhí)行和結(jié)束。
例7.9已知:80C51單片機(jī)使用的晶振為12MHz,要求設(shè)計(jì)一個(gè)軟件延時(shí)程序,延時(shí)時(shí)間為20ms。解:延時(shí)程序的延時(shí)時(shí)間主要與兩個(gè)因素有關(guān),一個(gè)是所用晶振,一個(gè)是延時(shí)程序中的循環(huán)次數(shù)。一旦晶振確定之后,則主要是如何設(shè)計(jì)與計(jì)算需給定的延時(shí)循環(huán)次數(shù)。在本題中已知晶振為12MHz,則可知一個(gè)機(jī)器周期為1
s,可預(yù)計(jì)采用單重循環(huán)是有可能實(shí)現(xiàn)1ms的延時(shí)的?,F(xiàn)根據(jù)題意編寫源程序如下:周期數(shù)
1MOVR0,#14H;毫秒數(shù)
R01DL2:MOVR1,#MT;1ms延時(shí)的預(yù) 定值MT
R11DL1:NOP1NOP2DJNZR1,DL1;lms延時(shí)循環(huán)
2DJNZR0,DL2;毫秒數(shù)減1,不等于0,繼續(xù)循環(huán),等于0結(jié)束MT可計(jì)算如下:
(1+1+2)×1×MT=1?000
sMT=250=FAH 例7.10從22H單元開始有一個(gè)無符號(hào)數(shù)據(jù)塊,其長(zhǎng)度在20H單元。求出數(shù)據(jù)塊中最大值,并存入21H單元ORG200HCLRA;清A作為初始最大值MOVR2,20H;數(shù)據(jù)個(gè)數(shù)初值MOVR1,#22H;數(shù)據(jù)塊首地址初值LP:CLRC;清進(jìn)位SUBBA,@R1;最大值減隊(duì)列中數(shù)JNCNEXT;小于最大值繼續(xù)SJMPNEXT1SUBBA,@R1;最大值減隊(duì)列中數(shù)JNCNEXT;小于最大值繼續(xù)SJMPNEXT1MOVA,@R1;大于最大值,則用此值代換NEXT:ADDA,@R1;小于最大值,則恢復(fù)NEXT1:INCR1;修改地址指針DJNZR2,LP;依次重復(fù)比較,直至R2=0MOV21H,A;最大值存入21H單元7.3分支程序設(shè)計(jì)7.3.1分支程序設(shè)計(jì)綜述分支程序應(yīng)用要點(diǎn)是正確使用轉(zhuǎn)移指令,通常有如下3種指令。1.無條件轉(zhuǎn)移2.條件轉(zhuǎn)移3.散轉(zhuǎn)例7.11設(shè)5AH單元中有一變量X,請(qǐng)編寫計(jì)算下述函數(shù)式的程序,結(jié)果存入5BH單元
7.3.2無條件/條件轉(zhuǎn)移程序
MOV A,5AH MOV B,A MUL AB ;X2
BA MOV R1,A MOV A,5AH ;重新把X裝入A CJNE A,#5,L1Ll:JC L2 ;X<5轉(zhuǎn)L2
MOV R0,#41 ;先假設(shè)X>10 CJNE A,#11,L3 ;與11比L3:JNC L4 ;X>10轉(zhuǎn)L4 MOV A,R1
ADD A,#08 ;10
X
5,Y=X2+8 MOV R0,A SJMP L4L2:MOV A,R1 CLR C SUBB A,#01 ;X<10,Y=X2–1 MOV R0,AL4:MOV 5BH,R0 SJMP $7.3.3散轉(zhuǎn)程序設(shè)計(jì)
散轉(zhuǎn)程序的設(shè)計(jì)可采用下面兩種方法:(1)數(shù)據(jù)指針DPTR固定,根據(jù)累加器A的內(nèi)容,程序轉(zhuǎn)入相應(yīng)的分支程序中去。(2)累加器A清零,根據(jù)數(shù)據(jù)指針DPTR的值,決定程序轉(zhuǎn)向的目的地址,DPTR的值可用查表或其他方法獲得。下面介紹兩種不同方法的散轉(zhuǎn)程序。1.采用轉(zhuǎn)移指令表
例7.12設(shè)有n個(gè)分支程序,n小于256,將n存放在R4中,設(shè)計(jì)散轉(zhuǎn)程序。
解:程序清單如下。
MOVDPTR,#TAB1;跳轉(zhuǎn)表首地址送數(shù)據(jù)指針
MOVA,R4ADDA,R4 ;R4×2
A(修正變址值)
JNCNOAD;判有否進(jìn)位
INCDPH;有進(jìn)位則加到高字節(jié)地址
NOAD:JMP@A+DPTR;轉(zhuǎn)向形成的散轉(zhuǎn)地址入口
TAB1:AJMPOPR0;轉(zhuǎn)移到分支程序OPR0AJMPOPR1…….AJMPOPRn2.采用轉(zhuǎn)向地址表例7.13
根據(jù)R2的內(nèi)容轉(zhuǎn)入各對(duì)應(yīng)的分支程序中去。解設(shè)轉(zhuǎn)移入口地址為OPR0、OPR1、…、OPRn,散轉(zhuǎn)程序及轉(zhuǎn)移表如下:
MOV DPTR,#TAB1 MOV A,R2 ADD A,R2 ;(R2)×2
A JNC NADD INC DPH ;(R2)×2的進(jìn)位加至DPHNADD: MOV R3,A ;暫存
MOVC A,@A+DPTR ;取地址高8位
XCH A,R3 ;轉(zhuǎn)移地址高8位暫存到R3 INC A MOVCA,@A+DPTR;取地址低8位
MOV DPL,A ;置轉(zhuǎn)移地址低8位
MOV DPH,R3 ;置轉(zhuǎn)移地址高8位
CLR A JMP @A+DPTR;轉(zhuǎn)向分支程序TAB1: DW OPR0;16位轉(zhuǎn)移地址表的首地址
DW OPR1………. DW OPRn7.4子程序設(shè)計(jì)
7.4.1子程序結(jié)構(gòu)與設(shè)計(jì)注意事項(xiàng)
子程序結(jié)構(gòu)編寫子程序時(shí)的注意事項(xiàng)在編寫子程序時(shí)要注意以下幾點(diǎn):(1)要給每個(gè)子程序賦一個(gè)名字,實(shí)際上是一個(gè)入口地址的代號(hào)。(2)要能正確地傳遞參數(shù)。即首先要有入口條件,說明進(jìn)入子程序時(shí),它所要處理的數(shù)據(jù)如何得到。另外,要有出口條件,即處理的結(jié)果是如何存放的。(3)注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。7.4.2子程序的調(diào)用與返回
主程序調(diào)用子程序是通過子程序調(diào)用指令LCALLaddl6和ACALLadd11實(shí)現(xiàn)的。子程序的返回是通過返回指令RET實(shí)現(xiàn)的。主程序在調(diào)用子程序時(shí)要注意以下問題:(l)在需要保護(hù)現(xiàn)場(chǎng)的程序中,在主程序初始化時(shí)要正確地設(shè)置堆棧指針。(2)在主程序中,要安排相應(yīng)指令,滿足子程序的入口條件。(3)在主程序中,安排相應(yīng)的指令,在子程序返回后,處理子程序提供的出口參數(shù)。7.4.3子程序設(shè)計(jì)舉例
例7.14有兩個(gè)ASCII碼值表示的字符串,2個(gè)字符串的首地址分別為50H和70H,每個(gè)字符串的第一個(gè)字節(jié)都存放字符串長(zhǎng)度。求出這2個(gè)字符串中字符A的個(gè)數(shù),并將其和存入4FH單元。解:本例采用分別求出兩個(gè)字符串字符A的個(gè)數(shù),然后求和的方法,求字符A個(gè)數(shù)的過程可采用子程序。子程序的入口條件是字符串首地址,返回參數(shù)即為個(gè)數(shù)值,放在A中。下面分別列出主程序和子程序:主程序
MOVR1,#50H;置入口條件參數(shù)ACALLZF;調(diào)求字符A個(gè)數(shù)子程序MOV40H,R0;第一個(gè)數(shù)據(jù)塊的A個(gè)數(shù)暫存40HMOVR1,#70H;置入口條件參數(shù)
ACALLZF ;調(diào)求字符A個(gè)數(shù)子程序
MOVA,,R0ADDA,40H ;兩個(gè)字符A個(gè)數(shù)相加
MOV4FH,A;把和送入4FHSJMP$子程序;子程序入口參數(shù):R1為字符串首地址;子程序出口參數(shù):R0為字符串中A的個(gè)數(shù)
ZF:MOVR0,#0 ;清R0作為初始值
MOVA,@R1;取字符個(gè)數(shù)初值
MOVR2,A ;字符個(gè)數(shù)初值送R2LP:MOVA,@ R1 ;取字符
CJNEA,#41H,LP1;與字符A比較
INCR0 ;等于加1后繼續(xù)
LP1:INCR1 ;修改地址指針
DJNZR2,LP ;依次重復(fù)比較,直至R2=0RET ;返回例7.15
在圖7.3所示電路中,AT89S51的P1口各位分別與8個(gè)發(fā)光二極管相接,當(dāng)P1口為低電平時(shí)發(fā)光二極管可被點(diǎn)亮。P3.1與P3.2各通過開關(guān)S1、S2與地相接。當(dāng)開關(guān)閉合時(shí)P3.1與P3.2端口為低電平。設(shè)單片機(jī)采用的晶振為6MHz,編制一個(gè)控制發(fā)光二極管發(fā)光方式的程序。要求當(dāng)S1閉合時(shí),發(fā)光二極管發(fā)光方式為:二極管從第0位開始發(fā)光,延時(shí)1s后,第0位二極管滅,第1位開始發(fā)光;延時(shí)1秒后,第1位二極管滅,第2位開始發(fā)光;以此類推……直至第7位開始發(fā)光。
圖7.3LED閃爍線路
源程序如下:S1 EQUP3.1S2 EQUP3.2 ORG 0000H LJMP MAIN
……MAIN:MOV P3,#0FFH ;
設(shè)P3口為輸入MAIN2:JB S1,F(xiàn)F1 ;檢查是否按過S1鍵 LCALL DELAY10ms ;延時(shí)10ms去鍵抖動(dòng) JB S1FF1 ;如果又變?yōu)?,說明剛才是干
擾信號(hào) LCALL FF11 ;如果仍然為0,說明確實(shí)按過S1鍵,則調(diào)第一種發(fā)光方式子程序 LCALLDELAY10ms ;延時(shí)10ms去鍵抖動(dòng) JB S2MAIN2 ;如果又變?yōu)?,說明剛才是干擾
信號(hào)LCALL DELAY10ms ;延時(shí)10ms去鍵抖動(dòng)FF1:JB S2,MAIN2 ;檢查是否按過S2鍵 LCALL FF22 ;如果仍然為0,說明確實(shí)按過S2鍵,則調(diào)第二種發(fā)光方式子程序 SJMP MAIN2 ;反復(fù)循環(huán)FF11:MOV A,#0FEH ;第一種發(fā)光方式初值L1:MOVP1,A ;A值送P1口
LCALLDL1S ;1s延時(shí) JNB ACC.7,MA1 ;A值的第7位是否為0 RL A ;A中數(shù)據(jù)循環(huán)左移一位 SJMP L1 ;未完繼續(xù)MA1: RETFF22: MOV A,#0FEH ;第二種發(fā)光方式初值L2: MOV P1,A ;A值送P1口 LCALLDL1S ;1s延時(shí) JZ MA2 ;A值是否為0 RL A ;A中數(shù)據(jù)循環(huán)左移一位 ANL A,P1 ;P1口當(dāng)前值與移位后值相與 SJMP L2MA2: RET
DELAY10ms: MOV R0,#10DL2: MOV R1,#125 ;1ms延時(shí)的預(yù)定值DL1: NOP NOP DJNZ R1,DL1 ;延時(shí)循環(huán) DJNZ R0,DL2 RETDL1S: MOV R3,#100 ;1s延時(shí)的預(yù)定值DL3: LCALL DELAY10ms ;延時(shí)循環(huán) DJNZ R3,DL3 RET END7.5查表程序設(shè)計(jì)7.5.1查表程序綜述
為了實(shí)現(xiàn)查表功能,在80C51匯編語言中專門設(shè)置了兩條查表指令:
MOVC A, @A+DPTR MOVC A, @A+PC這2條指令特點(diǎn)不同,在應(yīng)用時(shí)要注意區(qū)別。為了便于查表,要求表中的數(shù)或符號(hào)按照便于查找的次序排列,并將它存放在從指定的首地址(或稱基地址)開始的存儲(chǔ)單元。7.5.2查表程序設(shè)計(jì)舉例
例7.16
在某儀器的鍵盤程序中,根據(jù)命令的鍵值(0,1,2,…,9)轉(zhuǎn)換成相應(yīng)的雙字節(jié)16位
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人與公司間藝術(shù)品收藏與交易合同4篇
- 2025年度個(gè)人房產(chǎn)買賣資金監(jiān)管服務(wù)合同4篇
- 二零二五年度車位鎖維修與保養(yǎng)服務(wù)合同3篇
- 二零二五年度體育用品買賣合同附帶運(yùn)動(dòng)損傷防護(hù)與售后服務(wù)4篇
- 2025年物流園區(qū)車位租賃與倉儲(chǔ)管理合作協(xié)議4篇
- 2025年度智能挖掘機(jī)銷售與遠(yuǎn)程控制技術(shù)支持合同4篇
- 二零二五山地旅游交通服務(wù)租賃協(xié)議3篇
- 二零二五年度寵物寄養(yǎng)中心租賃合同規(guī)范4篇
- 二零二五年度工業(yè)用地租賃合同示范文本
- 2025年度旅行社與租車公司合作租車服務(wù)合同3篇
- 2024年山東省泰安市高考物理一模試卷(含詳細(xì)答案解析)
- 腫瘤患者管理
- 2025春夏運(yùn)動(dòng)戶外行業(yè)趨勢(shì)白皮書
- 《法制宣傳之盜竊罪》課件
- 通信工程單位勞動(dòng)合同
- 2024年醫(yī)療器械經(jīng)營質(zhì)量管理規(guī)范培訓(xùn)課件
- 2024年計(jì)算機(jī)二級(jí)WPS考試題庫380題(含答案)
- 高低壓配電柜產(chǎn)品營銷計(jì)劃書
- 2024年4月自考02202傳感器與檢測(cè)技術(shù)試題
- 新入職員工培訓(xùn)考試附有答案
- 外觀質(zhì)量評(píng)定報(bào)告
評(píng)論
0/150
提交評(píng)論