80c51汇编语言程序案例指导,新第4章80C51的汇编语言程序设计
《新第4章80C51的匯編語言程序設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《新第4章80C51的匯編語言程序設(shè)計(36頁珍藏版)》請在人人文庫網(wǎng)上搜索。
1、2020/6/30,1,第4章 匯編語言程序設(shè)計,2020/6/30,2,單片機應(yīng)用系統(tǒng)由硬件系統(tǒng)和應(yīng)用程序構(gòu)成,匯編語言 高級語言,應(yīng)用程序設(shè)計方法,匯編語言,生成的目標程序占內(nèi)存空間少、運行速度快,具有效率高、實時性強。,高級語言,對系統(tǒng)的功能描述與實現(xiàn)簡單,程序閱讀、修改和移植方便,適合于編寫復(fù)雜的程序。,2020/6/30,3,4.1 程序編制的方法和技巧,4.1.1 匯編語言程序設(shè)計的步驟,分析問題,抽象出描述問題的數(shù)學模型。,確定解決問題的算法或解題思想。,分配存儲空間和工作單元。,繪制流程圖,編制程序。,程序調(diào)試和程序優(yōu)化。,2020/6/30,4,繪制流程圖,流程圖符號,202。
2、0/6/30,5,強化模塊化觀念,使程序占用空間減少、結(jié)構(gòu)清晰 循環(huán)初值和結(jié)束條件,避免“死機”現(xiàn)象 子程序的現(xiàn)場保護(注意棧平衡、寄存器內(nèi)容),程序模塊(主程序模塊、各種子程序模塊) 模塊化優(yōu)點:分塊設(shè)計、便于閱讀、調(diào)試方便,4.1.2 編制程序的方法和技巧,采用循環(huán)和子程序結(jié)構(gòu),對中斷子程序還有注意保護PSW的內(nèi)容,2020/6/30,6,4.1.3 匯編語言的語句格式,非數(shù)字字符開頭,后跟字母、數(shù)字、“-”、“?”等 不能用已定義的保留字(指令助記符、偽指令等) 后跟英文冒號“:”,標號(即符號地址),標號: 指令助記符 操作數(shù)1, 操作數(shù)2, 操作數(shù)3, ;注釋,指令助記符,是指令功能。
3、的英文縮寫。,2020/6/30,7,數(shù)據(jù):二進制(B) 十進制(D或省略D) 十六進制(H),注意AF開頭時要加“0” ASCII碼,如 A,1245 符號:符號名、標號或“$”(PC的當前值) 表達式:由運算符和數(shù)據(jù)構(gòu)成,操作數(shù),注釋,英文分號“;”開頭,4.1.3 匯編語言的語句格式,2020/6/30,8,補充知識,2020/6/30,9,4.2.1 順序結(jié)構(gòu)程序設(shè)計,4.2 基本程序結(jié)構(gòu),【例4-1】試編制雙字節(jié)加法程序。 題目要求:設(shè)被加數(shù)的高字節(jié)放在30H中,低字節(jié)放在31H中,加數(shù)的高字節(jié)放在32H,低字節(jié)放在33H中。加法結(jié)果的高字節(jié)放在34H中,低字節(jié)放在35H中(大端模式。
4、)。,程序分析:由于80C51單片機的加法指令只能處理8位二進制數(shù),所以雙字節(jié)加法程序的算法應(yīng)首先從低字節(jié)開始相加,然后依次將次低字節(jié)和來自低字節(jié)相加的進位進行加法運算。,2020/6/30,10,ORG 0040H START:CLR C MOV A,31H ADD A,33H MOV 35H,A MOV A,30H ADDC A,32H MOV 34H,A SJMP $ END,2020/6/30,11,【例4-3】片內(nèi)RAM的21H單元存放一個十進制數(shù)據(jù)十位的ASCII碼,22H單元存放該數(shù)據(jù)個位的ASCII碼。編寫程序?qū)⒃摂?shù)據(jù)轉(zhuǎn)換成壓縮BCD碼存放在20H單元。,2020/6/30,1。
5、2,ORG 0040H START:MOV A,21H ;取十位ASCII碼 ANL A,#0FH ;保留低半字節(jié) SWAP A ;移至高半字節(jié) MOV 20H,A ;存于20H單元 MOV A,22H ;取個位ASCII碼 ANL A,#0FH ;保留低半字節(jié) ORL 20H,A ;合并到結(jié)果單元 SJMP $ END,2020/6/30,13,4.2.2 分支結(jié)構(gòu)程序設(shè)計,在實際問題的編程處理中,通常會根據(jù)不同的條件進行判斷,根據(jù)不同的判斷結(jié)果,程序作出不同的相應(yīng)處理,這種結(jié)構(gòu)被稱為分支。分支程序的設(shè)計主要依靠條件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令和位轉(zhuǎn)移指令來實現(xiàn)。,2020/6/30,14,該圖使。
6、用條件轉(zhuǎn)移指令來實現(xiàn)分支,當給出的條件成立時,執(zhí)行程序段1,否則執(zhí)行程序段2。,2020/6/30,15,該圖使用條件轉(zhuǎn)移指令來實現(xiàn)分支,當給出的條件成立時,執(zhí)行程序段A,否則執(zhí)行程序段B。,2020/6/30,16,該圖使用散轉(zhuǎn)指令JMP來實現(xiàn)多分支轉(zhuǎn)移,它首先將分支程序按序號的值來實現(xiàn)分支轉(zhuǎn)移。,2020/6/30,17,【例4-6】 編制計算符號函數(shù)y=SGN(x)的程序。 y= 設(shè)片內(nèi)RAM的30H單元內(nèi)有自變量x(-128x127)的值,編制程序求函數(shù)Y的值,并將其存入片內(nèi)RAM的31H單元中。,2020/6/30,18,2020/6/30,19,ORG 1000H START:MO。
7、V A,30H ;將X送入A中 JZ ZERO ;為0轉(zhuǎn)移 JNB ACC.7,POSITIVE ; 為正數(shù)轉(zhuǎn)移 MOV A, #0FFH ; 將1(補碼)送入A中 SJMP ZERO POSITIVE:MOV A, #01H ;將+1送入A中 ZERO:MOV 31H, A ; 結(jié)果存入Y END,2020/6/30,20,【補充例題】設(shè)變量x以補碼的形式存放在片內(nèi)RAM的30H單元,變量y與x的關(guān)系是:當x大于0時,y=x;當x=0時,y=20H;當x小于0時,y=x+5。編制程序,根據(jù)x的大小求y并送回原單元。,2020/6/30,21,ORG 0040H START:MOV A,30H。
8、 ;取x至累加器 JZ NEXT ;x = 0,轉(zhuǎn)NEXT ANL A,#80H ;否,保留符號位 JZ DONE ;x 0,轉(zhuǎn)結(jié)束 MOV A,#05H ;x 0處理 ADD A,30H MOV 30H,A ;X+05H送Y SJMP DONE NEXT:MOV 30H,#20H ;x = 0,20H送Y DONE:SJMP DONE END,2020/6/30,22,4.2.3 循環(huán)結(jié)構(gòu)程序設(shè)計,2020/6/30,23,循環(huán)程序的組成大致包括以下內(nèi)容: 1、循環(huán)初始化:位于循環(huán)程序開頭,設(shè)置各工作單元的初始值,設(shè)定循環(huán)次數(shù)等。 2、循環(huán)體:循環(huán)體也稱為循環(huán)處理部分,是循環(huán)程序的核心;用于。
9、完成實際操作處理,是重復(fù)的執(zhí)行部分。 3、循環(huán)控制:位于循環(huán)體內(nèi),一般由循環(huán)次數(shù)修改、指針修改和條件控制等組成,用于控制循環(huán)次數(shù)循環(huán)參數(shù)。 4、循環(huán)結(jié)束:用于存放執(zhí)行循環(huán)程序運行后的結(jié)果,以及恢復(fù)各工作單元的初值。,2020/6/30,24,【例4-8】將內(nèi)部RAM的30H至3FH單元初始化為00H。,MAIN:MOV R0,#30H ;置初值 MOV A,#00H ; MOV R7,#16 ; LOOP:MOV R0,A ;循環(huán)處理 INC R0 ; DJNZ R7,LOOP ;循環(huán)修改,判結(jié)束 SJMP $ ;結(jié)束處理,2020/6/30,25,【例4-9】將內(nèi)部RAM起始地址為60H的數(shù)。
10、據(jù)串傳送到外部RAM中起始地址為1000H的存儲區(qū)域,直到發(fā)現(xiàn)$ 字符停止傳送。,MAIN:MOV R0,#60H ;置初值 MOV DPTR,#1000H LOOP0:MOV A,R0 ;取數(shù)據(jù) CJNE A,#24H,LOOP1 ;循環(huán)結(jié)束? SJMP DONE ;是 LOOP1:MOVX DPTR,A ;循環(huán)處理 INC R0 ;循環(huán)修改 INC DPTR SJMP LOOP0 ;繼續(xù)循環(huán) DONE:SJMP DONE ;結(jié)束處理,2020/6/30,26,【例 4-12】 設(shè)80C51單片機的時鐘頻率為fosc =12 MHz,試設(shè)計0.1s的延時程序。 DELAY:MOV R3, #。
11、Data1 ;1個機器周期(T) DEL2:MOV R4, #Data2 ;1個機器周期(T) DEL1:NOP ;1個機器周期(T) NOP ;1個機器周期(T) DJNZ R4,DEL1 ;2個機器周期(T) DJNZ R3,DEL2 ;2個機器周期(T) RET 延時時間的計算結(jié)果: 1+1+(1+1+2)*Data2+2* Data1*機器周期(T) 若Datat1=125,Data2=200,則該程序產(chǎn)生的延時時間為:100376*機器周期(T)=0.100376s=0.1s,2020/6/30,27,4.3 子程序設(shè)計,完成通用功能、反復(fù)使用的程序設(shè)計成子程序。使應(yīng)用程序結(jié)構(gòu)清晰緊。
12、湊,便于閱讀和調(diào)試,執(zhí)行要由其它程序來調(diào)用,執(zhí)行完后要返回到調(diào)用程序,結(jié)構(gòu)上仍然采用一般程序的3種結(jié)構(gòu),調(diào)用時注意: 一是現(xiàn)場的保護和恢復(fù); 二是主程序與子程序間的參數(shù)傳遞。,2020/6/30,28,4.3.1 子程序的調(diào)用與返回,2020/6/30,29,4.3.2 保存與恢復(fù)寄存器內(nèi)容,PUSH PSW ;保護現(xiàn)場( 含當前工作寄存器組號) PUSH ACC ; PUSH B ; POP B ;恢復(fù)現(xiàn)場 POP ACC ; POP PSW ;含當前工作寄存器組切換,2020/6/30,30,4.3.3 子程序的參數(shù)傳遞,主程序在調(diào)用子程序時傳送給子程序的參數(shù)和子程序結(jié)束后送回主程序的參數(shù)。
13、統(tǒng)稱為參數(shù)傳遞。 入口參數(shù):子程序運行時所需要的原始參數(shù)。在調(diào)用子程序前,必須將所需參數(shù)送到指定的存儲單元(或寄存器)中,然后子程序從約定的存儲單元(或寄存器)中獲得這些入口參數(shù)。 出口參數(shù):子程序根據(jù)入口參數(shù)執(zhí)行程序后所得的結(jié)果。子程序運行結(jié)束(返回)前,必須將出口參數(shù)送到指定的存儲單元(或寄存器)中,以便主程序從指定的存儲單元(或寄存器)中獲得運行結(jié)果。,2020/6/30,31,4.3.3 子程序的參數(shù)傳遞,利用累加器或寄存器(簡單、快速,但參數(shù)個數(shù)不多),【例4-15】實現(xiàn)兩個8位的十六進制無符號數(shù)求和的子程序。,SADD:MOV A,R3 ;取加數(shù)(在R3中) CLR C ADD A。
14、,R4 ;被加數(shù)(在R4中)加A JC PP1 MOV R3,#00H ;結(jié)果小于255時,高字節(jié)R3內(nèi)容為00H SJMP PP2 PP1:MOV R3,#01H ;結(jié)果大于255時,高字節(jié)R3內(nèi)容為01H PP2:MOV R4,A ;結(jié)果的低字節(jié)在R4中 RET,入口:(R3)=加數(shù); (R4)=被加數(shù)。,出口:(R3)=和的高字節(jié); (R4)=和的低字節(jié)。,2020/6/30,32,利用存儲器(個數(shù)多,用R0或R1及DPTR為參數(shù)表指針),【例4-16】將內(nèi)部RAM 中兩個4字節(jié)無符號整數(shù)相加,和的高字節(jié)由R0指向。數(shù)據(jù)采用大端模式存儲。,入口:(R0)=加數(shù)低字節(jié)地址; (R1)=被加。
15、數(shù)低字節(jié)地址。,出口:(R0)=和的高字節(jié)起始地址。,NADD:MOV R7,#4 ;字節(jié)數(shù)4送計數(shù)器 CLR C ; NADD1:MOV A,R0 ;利用指針,取加數(shù)低字節(jié) ADDC A,R1 ;利用指針,被加數(shù)低字節(jié)加A MOV R0,A ; DEC R0 DEC R1 DJNZ R7,NADD1 INC R0 ;調(diào)整指針,指向出口 RET,2020/6/30,33,利用堆棧,【例4-17】將內(nèi)部RAM中20H單元中的1個字節(jié)十六進制數(shù)轉(zhuǎn)換為2位ASCII碼,存放在R0指示的兩個單元中。,入口:預(yù)轉(zhuǎn)換數(shù)據(jù)(低半字節(jié))在棧頂,出口:轉(zhuǎn)換結(jié)果(ASCII碼)在棧頂,HEASC:MOV R1,S。
16、P ;借用R1為堆棧指針 DEC R1 DEC R1 ;R1指向被轉(zhuǎn)換數(shù)據(jù) XCH A,R1 ;取被轉(zhuǎn)換數(shù)據(jù) ANL A,#0FH ;取一位十六進制數(shù) ADD A,#2 ;偏移調(diào)整,所加值為MOVC與DB間總字節(jié)數(shù) MOVC A,A+PC ;查表 XCH A,R1 ;1字節(jié)指令,存結(jié)果于堆棧中 RET ;1字節(jié)指令 ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H,2020/6/30,34,驗證程序段,MAIN:MOV A,20H ; SWAP A PUSH ACC ;預(yù)轉(zhuǎn)換的數(shù)據(jù)(在低半字。
17、節(jié))入棧 ACALL HEASC POP ACC ;彈出棧頂結(jié)果于ACC中 MOV R0,A ;存轉(zhuǎn)換結(jié)果高字節(jié) INC R0 ;修改指針 PUSH 20H ;預(yù)轉(zhuǎn)換的數(shù)據(jù)(在低半字節(jié))入棧 ACALL HEASC POP ACC ;彈出棧頂結(jié)果于ACC中 MOV R0,A ;存轉(zhuǎn)換結(jié)果低字節(jié) SJMP $,2020/6/30,35,4.3.5 常用子程序(略),4.3.4 編寫子程序時應(yīng)注意的問題,簡要說明子程序的功能、入口參數(shù)、出口參數(shù)、占用資源。 子程序的第一條指令必須有標號,以明確子程序的入口地址。 主程序調(diào)用子程序用LCALL、ACALL指令進行,返回使用RET。 為增強子程序的通用性,應(yīng)盡量避免使用具體的內(nèi)存單元。 在子程序的內(nèi)部有轉(zhuǎn)移指令時,最好使用相對轉(zhuǎn)移指令。 在使用子程序時,要注意現(xiàn)場的保護,在退出時要恢復(fù)現(xiàn)場。,Thank You。
總結(jié)
以上是生活随笔為你收集整理的80c51汇编语言程序案例指导,新第4章80C51的汇编语言程序设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SLAMTEC-思岚科技正式发布RPLI
- 下一篇: 思岚科技陈士凯:场景化应用或成服务机器人