版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
單片機原理與應(yīng)用
Principle&ApplicationofMCU
第4章80C51單片機匯編語言程序設(shè)計1教學(xué)內(nèi)容及要求教學(xué)內(nèi)容匯編語言程序的基本結(jié)構(gòu)形式、子程序結(jié)構(gòu)形式80C51單片機匯編語言偽指令80C51單片機匯編語言程序設(shè)計舉例教學(xué)要求掌握順序結(jié)構(gòu)程序、分支程序、循環(huán)程序和子程序等結(jié)構(gòu)程序的設(shè)計等熟悉單片機匯編程序常用的偽指令了解匯編語言程序的格式2匯編語言源程序的編輯和匯編3機器編輯→交叉匯編→串行傳送4地址機器碼標號助記符指令80007820SORT:MOVR0,#20H80027F07MOVR7,#07H*.ASM編輯、匯編編輯:編寫程序的過程稱為編輯。機器編輯指借助于微型機進行單片機的程序設(shè)計,通常都是使用編輯軟件進行源程序的編輯。編輯完成后,生成一個由匯編指令和偽指令構(gòu)成的擴展名為”.ASM”的ASCII碼文件。匯編:匯編語言源程序不能在單片機中直接執(zhí)行,必須將其“翻譯”為用二進制代碼(機器語言)表示的目標程序才能執(zhí)行。這個“翻譯”過程稱為匯編。機器匯編指由計算機通過匯編程序完成從匯編語言源程序到機器語言目標程序的“翻譯”工作。交叉匯編指使用一種計算機(PC)的匯編程序為另一種計算機(單片機)的源程序進行匯編即運行匯編程序進行匯編的是一種計算機,而匯編得到的目標程序是另一種計算機用的。580C51單片機匯編語言偽指令匯編時,源程序須向匯編程序發(fā)出一些指示信息,協(xié)助完成匯編工作,這一工作是由偽指令來完成的。匯編起始地址命令ORG(Origin)定義字節(jié)命令DB(DefineByte)定義數(shù)據(jù)字命令DW(DefineWord)預(yù)留存儲區(qū)命令DS(DefineStorage)位定義命令BIT賦值命令EQU(Equate)數(shù)據(jù)地址賦值偽指令DATA匯編終止命令END(Endofassembly)注意!偽指令僅供匯編程序?qū)⒃闯绦蚍g成目標程序,本身并不形成機器碼。6匯編起始地址命令
ORG(Origin)規(guī)定程序或數(shù)據(jù)的起始存放地址。出現(xiàn)在每段源程序或數(shù)據(jù)塊的開始<地址>項是16位絕對地址,或者標號,或者表達式。在一個匯編語言源程序中允許使用多條定位偽指令,但其值應(yīng)從小到大,并與前面的存放地址不重疊。如果程序的開始不放ORG,則匯編程序?qū)?000H單元開始放目標程序代碼。ORG<地址>7 ORG0000H;從0000H單元開始存放下面的指令 LJMP0030H ORG0030H;從0030H單元開始存放下面的指令MAIN: MOVSP,#50H ORG0040H;從0040H單元開始存放下面的數(shù)據(jù)TAB: DB23,89 定義字節(jié)命令
DB(DefineByte)在程序存儲器中定義字節(jié)數(shù)據(jù)。Xn可以是一字節(jié)常數(shù);用雙引號或者單引號括起來的字符或字符串;各個數(shù)之間用逗號隔開。DB
<X1,X2,…,Xn>8ORG1000HA1:DB01001010B,23o,23,78H,A2:DB‘5’,”12AB”,12D,-2(1000H)=01001010B=4AH,(1001H)=23o=13H,(1002H)=23=17H,(1003H)=78H,(1004H)=35H(5的ASCII碼),(1005H)=31H(1的ASCII碼),(1006H)=32H(2的ASCII碼),(1007H)=41H(A的ASCII碼),(1008H)=42H(B的ASCII碼),(1009H)=12D=0CH(100AH)=-2=0FEH【例】定義數(shù)據(jù)字命令
DW(Define
Word)在程序存儲器中定義16位的數(shù)據(jù)字。存放時,數(shù)據(jù)字的高8位在低地址,低8位在后高地址。通常,DB用來定義數(shù)據(jù),DW用來定義地址。DW
<Y1,Y2,…,Yn>DW“AA” ;存入41H,41HDW“A” ;存入00H,41HDW“ABC” ;不合法,因為超過了兩個字節(jié)DW100H,1ACH,-804 ;按順序存入01H、00H、01H、0ACH、0FCH、0DCH9【例】預(yù)留存儲區(qū)命令
DS(DefineStorage)在程序存儲器中保留指定數(shù)目的單元作為預(yù)留存儲區(qū),供程序運行使用?!纠緼DDRTAB:DS20;從標號ADDRTAB代表的地址開始,預(yù)留20個;連續(xù)的地址單元。[<標號:>]DS<16位數(shù)表>DB、DW、DS只能對于程序存儲器使用10位定義命令
BIT把位地址賦給字符名稱。【例】:AQBITP1.0;把P1.0的位地址賦給字符名AQ,在其后;的編程中AQ可以作為位地址使用。<字符名稱>BIT<位地址>11賦值命令
EQU(Equate)給數(shù)或符號賦給字符<賦值項>可以是常數(shù)、地址、標號或表達式。賦值以后的字符既可以作地址使用,也可以作立即數(shù)使用。【例】CSEQU0FFFFHA1EQUR1A2EQU10HDELAYEQU0708HA1可作為寄存器R1來使用,A2可作為8位直接地址或立即數(shù)使用,DELAY可作為16位地址或者立即數(shù)使用。字符名EQU數(shù)或匯編符號12數(shù)據(jù)地址賦值偽指令
DATA將表達式的值賦給字符。表達式可以是一個數(shù)據(jù)或地址,也可以是一個包含所定義字符名在內(nèi)的表達式,但不能是一個匯編符號(如R0~R7)。與EQU的區(qū)別:EQU必須先定義后使用。DATA無此限制,所以DATA偽指令可以放在源程序的開頭或末尾MOVR0,ADDRESSMOVR1,#ADDRESSADDRESSDATA31H將31H單元內(nèi)容送R0,(R1)=31H。字符名DATA表達式13匯編終止命令
END(Endofassembly)用于終止源程序的匯編工作,在一個源程序中只能有一條END命令,并且位于程序的最后。如果END命令出現(xiàn)在程序中間,則其后面的源程序?qū)⒉挥杼幚怼?4一般匯編調(diào)試工具要求的匯編格式一般用匯編語言編寫的程序,要求指出該程序存放于內(nèi)存地址的位置,并且將用到的數(shù)據(jù)和需要預(yù)留存放數(shù)據(jù)的空間用偽指令定義好然后編寫程序代碼最后用原地踏步或返回起始位置循環(huán)作為結(jié)束。ORG……SJMP$END【例】程序格式如下:15匯編語言程序的基本結(jié)構(gòu)形式16分支結(jié)構(gòu)使用條件轉(zhuǎn)移指令對程序的執(zhí)行結(jié)果進行判斷JZ、JNZ、CJNE、DJNZJC、JNC、JB、JNB、JBC17【例】二分支。在外部RAM中有ST1、ST2和ST3共3個連續(xù)單元,其中ST1和ST2單元中存放著兩個無符號二進制數(shù),要求找出其中的大數(shù)并存入ST3單元中。18【例】三分支-多次二選一。設(shè)變量x存入30H單元,求得函數(shù)y存入31H單元。按下式要求給y賦值:x-1(x<5)0(5≤x≤
10)x+1(x>10)Y=要根據(jù)x的大小來決定y值,在判斷x<5和y>10時,采用CJNE和JC以及CJNE和JNC指令進行判斷。19 ORG1000H MOVA,30H ;取x
CJNEA,#5,NEXT1 ;與5比較NEXT1: JCNEXT3 ;x<5,則轉(zhuǎn)NEXT3
CJNEA,#10,NEXT2 ;與10比較 NEXT2: JNCNEXT4 ;x>10,則轉(zhuǎn)NEXT4 MOVR0,#0 ;5≤x≤10,y=0 SJMPNEXT5NEXT3: MOVR0,A DECR0 ;x<5,y=x-1 SJMPNEXT5NEXT4: MOVR0,A INCR0 ;x>10,y=x+1 NEXT5: MOV31H,R0 ;存結(jié)果
SJMP$ END20多分支轉(zhuǎn)移使用變址尋址轉(zhuǎn)移指令(散轉(zhuǎn)指令)JMP@A+DPTR;PC←(A)+(DPTR)數(shù)據(jù)表、轉(zhuǎn)移指令表、堆棧操作21通過數(shù)據(jù)表實現(xiàn)程序多分支22 MOVA,#k ;分支序號k送A MOVDPTR,#BRTAB ;表首址
MOVCA,@A+DPTR ;查表后,(A)=BRk-BRTAB JMP@A+DPTR ;散轉(zhuǎn)指令,(PC)=BRkBRTAB: DB BR0-BRTAB ;數(shù)據(jù)表,BRTAB+0 DB BR1-BRTAB ;分支入口地址與表首址之差,BRTAB+1 … DB BRn-BRTAB ;BRTAB+nBR0: … ;各個分支程序BR1: … …BRn: …通過轉(zhuǎn)移指令表實現(xiàn)程序多分支23 MOVA,#k ;分支序號k送A
RLA ;分支序號乘以2 MOVDPTR,#BRTAB ;表首址
JMP@A+DPTR ;(PC)=BATAB+2kBRTAB:
AJMPBR0 ;轉(zhuǎn)分支程序0,BRTAB
AJMPBR1 ;轉(zhuǎn)分支程序1,BRTAB+2
…
AJMPBRn ;轉(zhuǎn)分支程序n,BRTAB+2nBR0: … ;各個分支程序BR1: … …BRn: …使用長轉(zhuǎn)移指令LJMP時, MOVA,#k
RLA ADDA,R3 MOVDPTR,#BRTAB JMP@A+DPTRBRTAB: LJMPBR0 ;BRTAB
LJMPBR1 ;BRTA+3 …
LJMPBRn ;BRTAB+3n24通過堆棧操作實現(xiàn)程序多分支25 MOVDPTR,#BRTAB; 分支程序入口地址表首址 MOVA,#k ;分支序號放入A中
RLA ;分支序號值乘以2 MOVR1,A ;暫存A值入R1
INCA ;A指向低位地址 MOVCA,@A+DPTR ;取低位地址BRn7-0
PUSHACC ;低位地址入棧 MOVA,R1 ;恢復(fù)A值 MOVCA,@A+DPTR ;取高位地址BRn15-8
PUSHACC ;高位地址入棧
RET ;分支入口地址裝入PCBRTAB:
DWBR0 ;分支程序入口地址表,BRTAB、BRTAB+1
DWBR1 ;BRTAB+2、BRTA+3
… DWBRn ;BRTAB+2n、BRTAB+2n+1RETPC15~8←((SP)),SP←(SP)-1PC7~0←((SP)),SP←(SP)-1循環(huán)結(jié)構(gòu)初始化部分對于循環(huán)次數(shù)計數(shù)器、地址指針賦初值,對于使用到的寄存器或者存儲單元賦初值,為循環(huán)作準備。循環(huán)體部分為下一次循環(huán)創(chuàng)造條件:修改循環(huán)次數(shù)計數(shù)器、地址指針,避免死循環(huán)。循環(huán)的判斷與控制:判斷循環(huán)次數(shù)計數(shù)器,或者檢查判斷循環(huán)條件??梢灾苯佑裳h(huán)體內(nèi)轉(zhuǎn)到循環(huán)體外或外層循環(huán);不能從循環(huán)體外直接跳轉(zhuǎn)到循環(huán)體內(nèi),只能從外層向內(nèi)層一層層進入。循環(huán)結(jié)束處理:結(jié)果保存等。26【例】單循環(huán)。編程實現(xiàn)把外部RAM中從8000H開始的100個字節(jié)數(shù)據(jù)傳送到8100H開始的單元中。 MOVR7,#100 MOVDPL,#00HLOOP: MOVDPH,#80H MOVXA,@DPTR MOVDPH,#81H MOVX@DPTR,A INCDPL DJNZR7,LOOP MOVR0,#00LOOP: MOVP2,#80H MOVXA,@R0 MOVP2,#81H MOVX@R0,A INCR0 CJNER0,#100,LOOP或27【例】由循環(huán)內(nèi)部跳出循環(huán)。把長度為10H的字符串從內(nèi)部RAM緩沖區(qū)inbuf向位于外部RAM的輸出緩沖區(qū)outbuf傳送,一直進行遇到回車符CR或整個字符串傳送完畢。START: MOVR7,#10H MOVR0,#inbuf
MOVDPTR,#outbufLOOP: MOVA,@R0 CJNEA,#0D0H,CONTINUE
SJMPFINISHCONTINUE: MOVX@DPTR,A INCR0 INCDPTR DJNZR7,LOOPFINISH: SJMP$ END28子程序在主程序中調(diào)用子程序LCALL/ACALL標號;調(diào)用子程序時,斷點入棧保存由子程序返回主程序RET;子程序返回時,斷點出棧從而回到主程序。子程序中,視情況進行現(xiàn)場保護和現(xiàn)場恢復(fù)1、使用堆棧:PUSH/POP2、暫存到其它存儲單元中,最終恢復(fù)即可29調(diào)用延時子程序DELAY。主程序:子程序:該子程序根本不需要主程序提供入口參數(shù),從進入子程序開始,到子程序返回,這個過程花費CPU一定的時長。循環(huán)體只能執(zhí)行有限次,避免“死循環(huán)”。DELAY: PUSH06H PUSH07H
MOVR7,#100DLY0: MOVR6,#98 NOPDLY1: DJNZR6,DLY1 DJNZR7,DLY0
POP07H POP06H
RETLCALLDELAY3080C51單片機匯編語言程序設(shè)計舉例定時程序查表程序求平方極值查找程序查找關(guān)鍵字擴展階乘計算壓縮和解壓程序算術(shù)運算:加、減、乘、除數(shù)據(jù)排序數(shù)制與編碼轉(zhuǎn)換程序LED的簡單控制KEY+LED的簡單控制31單循環(huán)定時程序DELAY: MOVR5,#TIME ;1LOOP: NOP ;1 NOP ;1 DJNZR5,LOOP ;2 RET ;2[1+(1+1+2)*R5+2]*機器周期12M機器周期=1us定時時長為:32如何調(diào)整定時時長?較長時間的定時程序DELAY: MOVR5,#TIME1 ;1LOOP2: MOVR4,#TIME2 ;1LOOP1: NOP ;1 NOP ;1 DJNZR4,LOOP1 ;2 DJNZR5,LOOP2 ;2 RET ;2{1+[1+(1+1+2)*R4+2]*R5+2}*機器周期33通過一個基本延時程序產(chǎn)生不同的定時 MOVR0,#05H ;5msLOOP1: LCALLDELAY ;1ms DJNZR0,LOOP1
… MOVR0,#OAH ;10ms LOOP2: LCALDELAY DJNZR0,LOOP2
… MOVR0,#14H ;20msLOOP3: LCALLDELAY DJNZR0,LOOP3
…34查表指令按順序讀出存儲器中的數(shù)據(jù)稱為查表。先確定好PC或DPTR的內(nèi)容,然后有規(guī)律地改變A的內(nèi)容,就可以進行程序存儲器中表格數(shù)據(jù)的讀出。MOVCA,@A+DPTR可在64KB范圍內(nèi)查表,長查表指令。MOVCA,@A+PC查距本指令256個字節(jié)以內(nèi)的數(shù)據(jù),短查表指令。PC=當前查表指令地址+1變址調(diào)整值,即該指令執(zhí)行后的地址到表格首址之間的距離注意:如果數(shù)據(jù)表存放在外部ROM中,執(zhí)行查表指令時,會在控制引腳PSEN上產(chǎn)生一個程序存儲器讀信號。35查表程序功能:復(fù)雜計算、非線性計算、非數(shù)值計算的處理。查表:把事先計算或測得的數(shù)據(jù)按順序編制成表格存放在程序存儲器ROM中(偽指令DB或DW);查表程序根據(jù)被測數(shù)據(jù),查出表格中對應(yīng)的結(jié)果。優(yōu)點:編程簡單、執(zhí)行速度快、適合于實時控制。36【例】分別用兩條查表指令編寫一段子程序,功能為:根據(jù)累加器A中的數(shù)(0~9之間)查找平方表,求出相應(yīng)的平方數(shù),放在A中。SQUARE: MOVDPTR,#TAB MOVCA,@A+DPTR RETTAB: DB0,1,4,9,16,25,36,49,64,81SQUARE: ADDA,#1 MOVCA,@A+PC RET ;1TAB: DB0,1,4,9,16,25,36,49,64,81或37【例】子程序。編程實現(xiàn)運算式c=a2+b2。假定a、b、c分別存放在內(nèi)部RAM的30H、31H、32H單元中 ORG0000H SJMPMAIN ORG0030H
MAIN:MOVA,30H
LCALLSQUARE MOV30H,A MOVA,31H
LCALLSQUARE ADDA,30H MOV32H,A SJMP$38【例】階乘計算
求Y=n!(n=0,1,2,…,9)的值。按照求階乘的運算,需繼續(xù)n-1次乘法,運算程序復(fù)雜。采用查表法。事先計算n的階乘值并作成表格,通過查表程序獲得結(jié)果。9!=362880=58980H,表格中每個結(jié)果占用3個存儲單元。Y地址=表首址+n×3程序中:n值存放在A中,Y值存入R2R1R0中。39 ORG2000H TEMEQU30HFACTORIAL: MOVB,#3 MULAB ;n在A中,n×3 MOVB,A ;暫存B中
MOVDPTR,#TAB ;指向表首址TABL MOVA,@A+DPTR ;查表取低字節(jié)
MOVR0,A ;存入R0
INCDPTR ;修正地址指針
MOVA,B ;恢復(fù)n×3 MOVA,@A+DPTR ;查表取中間字節(jié)
MOVR1,A ;存入R1
INCDPTR
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024藝術(shù)品拍賣與宣傳推廣綜合服務(wù)合同3篇
- 2025年度環(huán)保設(shè)施PPP項目合作合同范本3篇
- 2025年度智能車庫產(chǎn)權(quán)交易合同范本4篇
- 2025年度文化產(chǎn)業(yè)園開發(fā)與租賃合同3篇
- 2025年企事業(yè)單位食堂承包與托管全面合作協(xié)議12篇
- 2025年度廠長任期項目投資與風險管理合同3篇
- 2025年中投中財基金管理有限公司招聘筆試參考題庫含答案解析
- 2025年中化集團中化能源物流公司招聘筆試參考題庫含答案解析
- 二零二五版美容院專業(yè)護膚技術(shù)研發(fā)與轉(zhuǎn)讓合同4篇
- 二零二五版門窗安裝工程環(huán)保驗收合同2篇
- MT/T 199-1996煤礦用液壓鉆車通用技術(shù)條件
- GB/T 6144-1985合成切削液
- GB/T 10357.1-2013家具力學(xué)性能試驗第1部分:桌類強度和耐久性
- 第三方在線糾紛解決機制(ODR)述評,國際商法論文
- 第5章-群體-團隊溝通-管理溝通
- 腎臟病飲食依從行為量表(RABQ)附有答案
- 深基坑-安全教育課件
- 園林施工管理大型園林集團南部區(qū)域養(yǎng)護標準圖例
- 排水許可申請表
- 低血糖的觀察和護理課件
- 計量檢定校準技術(shù)服務(wù)合同協(xié)議書
評論
0/150
提交評論