版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第7章匯編語言程序設(shè)計教學(xué)目的:熟悉80C51系列單片機(jī)的匯編語言,能夠熟練編寫匯編語言源程序。教學(xué)重點:常用匯編語言程序設(shè)計方法。
教學(xué)難點:分支程序、散轉(zhuǎn)程序與子程序的設(shè)計7.1概述
7.1.1匯編語言源程序的格式
1.匯編語句格式
[標(biāo)號:]操作碼[操作數(shù)][;注釋]
這4部份只有操作碼段是必須具有的,其余部分為可選項,但對于包含操作數(shù)的指令,則操作數(shù)段也是必須具有的。例如:
SU:MOVA,#0CDH;CDH
A7.1.2匯編語言偽指令
(1)ORG匯編起始指令
規(guī)定目標(biāo)程序的起始地址,格式如下:
標(biāo)號操作碼操作數(shù)
ORG表達(dá)式(exp)(2)
END匯編結(jié)束指令(3)EQU賦值指令把操作數(shù)段中的地址或數(shù)據(jù)賦值給標(biāo)號,格式如下:標(biāo)號操作碼操作數(shù)字符名稱EQU數(shù)或匯編符號例1AA EQUR1;R1與AA等值則MOVA,AA指令與MOVA,R1指令結(jié)果相同。(4)DB定義字節(jié)指令
定義程序存儲器中存放的8位常數(shù)表,格式如下:
(標(biāo)號)操作碼操作數(shù)
DB字節(jié)常數(shù)或ASCII字符例2ORG1000HDB76H,73,‘C’,‘B’
;在表示ASCII字 符時要用‘
’括號
DBOACH
則(1000H)=76H(1001H)=49H (1002H)=43H(1003H)=42H (1004H)=0ACH
(5)DW定義字指令
定義程序存儲器中存放的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)號數(shù)值偽指令它的功能是給標(biāo)號段中的數(shù)據(jù)地址標(biāo)號賦以數(shù)值,也稱為數(shù)據(jù)地址賦值指令。它的格式如下:字符名稱DATA表達(dá)式例5M5DATA1A00H
匯編后M5的值為1A00H。8.DS定義存儲空間指令
它的功能是從指定地址開始,定義一個存儲區(qū),保留由表達(dá)式指定的若干字節(jié)空間作為備用空間,這個存儲區(qū)預(yù)留的存儲單元數(shù)由DS表達(dá)式的值決定。它的格式如下:
DS表達(dá)式 表達(dá)式通常是一個常數(shù)。例6ORG100HDS 30HDB 56H,8AH匯編后,從100H地址開始保留48個單元,(131H)=56H,(132H)=8AH。
7.2順序與循環(huán)程序設(shè)計
7.2.1順序程序設(shè)計
例7.8將R5中的兩個BCD碼拆開并變成ASCII碼,存入61H、62H單元。解:在此采用把BCD數(shù)除以10H的方法,除后相當(dāng)于把此數(shù)右移了4位,剛好把兩個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è)計
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è)計一個軟件延時程序,延時時間為20ms。解:延時程序的延時時間主要與兩個因素有關(guān),一個是所用晶振,一個是延時程序中的循環(huán)次數(shù)。一旦晶振確定之后,則主要是如何設(shè)計與計算需給定的延時循環(huán)次數(shù)。在本題中已知晶振為12MHz,則可知一個機(jī)器周期為1
s,可預(yù)計采用單重循環(huán)是有可能實現(xiàn)1ms的延時的?,F(xiàn)根據(jù)題意編寫源程序如下:周期數(shù)
1MOVR0,#14H;毫秒數(shù)
R01DL2:MOVR1,#MT;1ms延時的預(yù) 定值MT
R11DL1:NOP1NOP2DJNZR1,DL1;lms延時循環(huán)
2DJNZR0,DL2;毫秒數(shù)減1,不等于0,繼續(xù)循環(huán),等于0結(jié)束MT可計算如下:
(1+1+2)×1×MT=1?000
sMT=250=FAH 例7.10從22H單元開始有一個無符號數(shù)據(jù)塊,其長度在20H單元。求出數(shù)據(jù)塊中最大值,并存入21H單元ORG200HCLRA;清A作為初始最大值MOVR2,20H;數(shù)據(jù)個數(shù)初值MOVR1,#22H;數(shù)據(jù)塊首地址初值LP:CLRC;清進(jìn)位SUBBA,@R1;最大值減隊列中數(shù)JNCNEXT;小于最大值繼續(xù)SJMPNEXT1SUBBA,@R1;最大值減隊列中數(shù)JNCNEXT;小于最大值繼續(xù)SJMPNEXT1MOVA,@R1;大于最大值,則用此值代換NEXT:ADDA,@R1;小于最大值,則恢復(fù)NEXT1:INCR1;修改地址指針DJNZR2,LP;依次重復(fù)比較,直至R2=0MOV21H,A;最大值存入21H單元7.3分支程序設(shè)計7.3.1分支程序設(shè)計綜述分支程序應(yīng)用要點是正確使用轉(zhuǎn)移指令,通常有如下3種指令。1.無條件轉(zhuǎn)移2.條件轉(zhuǎn)移3.散轉(zhuǎn)例7.11設(shè)5AH單元中有一變量X,請編寫計算下述函數(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è)計
散轉(zhuǎn)程序的設(shè)計可采用下面兩種方法:(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個分支程序,n小于256,將n存放在R4中,設(shè)計散轉(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)入各對應(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è)計
7.4.1子程序結(jié)構(gòu)與設(shè)計注意事項
子程序結(jié)構(gòu)編寫子程序時的注意事項在編寫子程序時要注意以下幾點:(1)要給每個子程序賦一個名字,實際上是一個入口地址的代號。(2)要能正確地傳遞參數(shù)。即首先要有入口條件,說明進(jìn)入子程序時,它所要處理的數(shù)據(jù)如何得到。另外,要有出口條件,即處理的結(jié)果是如何存放的。(3)注意保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場。7.4.2子程序的調(diào)用與返回
主程序調(diào)用子程序是通過子程序調(diào)用指令LCALLaddl6和ACALLadd11實現(xiàn)的。子程序的返回是通過返回指令RET實現(xiàn)的。主程序在調(diào)用子程序時要注意以下問題:(l)在需要保護(hù)現(xiàn)場的程序中,在主程序初始化時要正確地設(shè)置堆棧指針。(2)在主程序中,要安排相應(yīng)指令,滿足子程序的入口條件。(3)在主程序中,安排相應(yīng)的指令,在子程序返回后,處理子程序提供的出口參數(shù)。7.4.3子程序設(shè)計舉例
例7.14有兩個ASCII碼值表示的字符串,2個字符串的首地址分別為50H和70H,每個字符串的第一個字節(jié)都存放字符串長度。求出這2個字符串中字符A的個數(shù),并將其和存入4FH單元。解:本例采用分別求出兩個字符串字符A的個數(shù),然后求和的方法,求字符A個數(shù)的過程可采用子程序。子程序的入口條件是字符串首地址,返回參數(shù)即為個數(shù)值,放在A中。下面分別列出主程序和子程序:主程序
MOVR1,#50H;置入口條件參數(shù)ACALLZF;調(diào)求字符A個數(shù)子程序MOV40H,R0;第一個數(shù)據(jù)塊的A個數(shù)暫存40HMOVR1,#70H;置入口條件參數(shù)
ACALLZF ;調(diào)求字符A個數(shù)子程序
MOVA,,R0ADDA,40H ;兩個字符A個數(shù)相加
MOV4FH,A;把和送入4FHSJMP$子程序;子程序入口參數(shù):R1為字符串首地址;子程序出口參數(shù):R0為字符串中A的個數(shù)
ZF:MOVR0,#0 ;清R0作為初始值
MOVA,@R1;取字符個數(shù)初值
MOVR2,A ;字符個數(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個發(fā)光二極管相接,當(dāng)P1口為低電平時發(fā)光二極管可被點亮。P3.1與P3.2各通過開關(guān)S1、S2與地相接。當(dāng)開關(guān)閉合時P3.1與P3.2端口為低電平。設(shè)單片機(jī)采用的晶振為6MHz,編制一個控制發(fā)光二極管發(fā)光方式的程序。要求當(dāng)S1閉合時,發(fā)光二極管發(fā)光方式為:二極管從第0位開始發(fā)光,延時1s后,第0位二極管滅,第1位開始發(fā)光;延時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 ;延時10ms去鍵抖動 JB S1FF1 ;如果又變?yōu)?,說明剛才是干
擾信號 LCALL FF11 ;如果仍然為0,說明確實按過S1鍵,則調(diào)第一種發(fā)光方式子程序 LCALLDELAY10ms ;延時10ms去鍵抖動 JB S2MAIN2 ;如果又變?yōu)?,說明剛才是干擾
信號LCALL DELAY10ms ;延時10ms去鍵抖動FF1:JB S2,MAIN2 ;檢查是否按過S2鍵 LCALL FF22 ;如果仍然為0,說明確實按過S2鍵,則調(diào)第二種發(fā)光方式子程序 SJMP MAIN2 ;反復(fù)循環(huán)FF11:MOV A,#0FEH ;第一種發(fā)光方式初值L1:MOVP1,A ;A值送P1口
LCALLDL1S ;1s延時 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延時 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延時的預(yù)定值DL1: NOP NOP DJNZ R1,DL1 ;延時循環(huán) DJNZ R0,DL2 RETDL1S: MOV R3,#100 ;1s延時的預(yù)定值DL3: LCALL DELAY10ms ;延時循環(huán) DJNZ R3,DL3 RET END7.5查表程序設(shè)計7.5.1查表程序綜述
為了實現(xiàn)查表功能,在80C51匯編語言中專門設(shè)置了兩條查表指令:
MOVC A, @A+DPTR MOVC A, @A+PC這2條指令特點不同,在應(yīng)用時要注意區(qū)別。為了便于查表,要求表中的數(shù)或符號按照便于查找的次序排列,并將它存放在從指定的首地址(或稱基地址)開始的存儲單元。7.5.2查表程序設(shè)計舉例
例7.16
在某儀器的鍵盤程序中,根據(jù)命令的鍵值(0,1,2,…,9)轉(zhuǎn)換成相應(yīng)的雙字節(jié)16位
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度存量房買賣雙方權(quán)利義務(wù)合同范本4篇
- 二零二五年度內(nèi)外墻粉刷與室內(nèi)外安防系統(tǒng)集成合同
- 二零二五年度金融數(shù)據(jù)安全保密協(xié)議范本4篇
- 2025版高端住宅美縫施工質(zhì)量保證合同4篇
- 《漢英科技翻譯》課件
- 2025版苗圃場租賃與綠色認(rèn)證服務(wù)合同4篇
- 2025年度二手車交易車輛質(zhì)押擔(dān)保與售后服務(wù)協(xié)議4篇
- 高教版中職語文基礎(chǔ)模塊上冊《夢和淚》課件
- 二零二五年度綠化工程施工安全監(jiān)管協(xié)議3篇
- 二零二五年度新能源充電樁安裝與勞務(wù)分包合同4篇
- 中介費合同范本(2025年)
- 《kdigo專家共識:補體系統(tǒng)在腎臟疾病的作用》解讀
- 生產(chǎn)調(diào)度員崗位面試題及答案(經(jīng)典版)
- 交通運輸安全生產(chǎn)管理規(guī)范
- 2025春夏運動戶外行業(yè)趨勢白皮書
- 電力行業(yè) 電力施工組織設(shè)計(施工方案)
- 《法制宣傳之盜竊罪》課件
- 通信工程單位勞動合同
- 查對制度 課件
- 2024-2030年中國豬肉市場銷售規(guī)模及競爭前景預(yù)測報告~
- 2024年三人工程合伙協(xié)議書
評論
0/150
提交評論