版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、4.1 程序編制的方法和技巧程序編制的方法和技巧本章內容:本章內容:4.3 基本程序結構基本程序結構4.2 源程序的編輯和匯編源程序的編輯和匯編 4.4 常用程序舉例常用程序舉例第第4 4章章 80c5180c51的程序設計的程序設計 4.1 程序編制的方法和技巧程序編制的方法和技巧 4.1.14.1.1程序編制的步驟程序編制的步驟一、預完成任務的分析一、預完成任務的分析 功能功能要求要求 技術技術指標指標 硬件資源和工作環(huán)境硬件資源和工作環(huán)境二、進行算法的優(yōu)化二、進行算法的優(yōu)化 速度速度 內存內存使用使用 清晰的流程圖是正確編制應用程序的基礎清晰的流程圖是正確編制應用程序的基礎和條件,是一個
2、良好的編程習慣和條件,是一個良好的編程習慣 總流程圖總流程圖:程序的程序的邏輯結構邏輯結構,各程序各程序模塊間模塊間的相互關系。的相互關系。局部流程圖局部流程圖:程序模塊的具體實施程序模塊的具體實施細節(jié)細節(jié)。三、程序總體設計及流程圖繪制三、程序總體設計及流程圖繪制開始、結束開始、結束判斷分支判斷分支程序流向程序流向工作任務工作任務程序連接程序連接程序流向程序流向常用的流程圖符號常用的流程圖符號4.1.2 4.1.2 編制程序的方法和技巧編制程序的方法和技巧一、采用模塊化程序設計方法一、采用模塊化程序設計方法 主程序、子程序主程序、子程序,如:發(fā)送、接收、延時、,如:發(fā)送、接收、延時、打印和顯示
3、等。打印和顯示等。 模塊化的優(yōu)點模塊化的優(yōu)點 便于程序設計和調試便于程序設計和調試 便于程序優(yōu)化和分工便于程序優(yōu)化和分工 提高程序閱讀性和可靠性提高程序閱讀性和可靠性二、盡量采用循環(huán)結構和子程序二、盡量采用循環(huán)結構和子程序 長度減少、內存空間減少。長度減少、內存空間減少。 避免避免 “死循環(huán),注意循環(huán)死循環(huán),注意循環(huán)初值初值和和結束結束條條件件 子程序用到的子程序用到的寄存器內容應壓棧寄存器內容應壓棧保護,并保護,并注意堆棧操作的壓入和彈出的平衡;注意堆棧操作的壓入和彈出的平衡;中斷處理子程序中斷處理子程序除了要保護程序中用到的除了要保護程序中用到的寄存器外,寄存器外,還應保護標志寄存器還應保
4、護標志寄存器。4.1.3 4.1.3 匯編語言的語句格式匯編語言的語句格式 語句行組成語句行組成 : 標號:標號: 操作碼操作碼 操作數操作數 ;注釋;注釋 字段間用分隔符分隔字段間用分隔符分隔: 空格、冒號、逗號、分號等。空格、冒號、逗號、分號等。 標號標號 語句地址的標志符號,幾項規(guī)定:語句地址的標志符號,幾項規(guī)定: 操作碼操作碼 規(guī)定語句執(zhí)行的操作。它是匯編語句中唯一不能空規(guī)定語句執(zhí)行的操作。它是匯編語句中唯一不能空缺的部分。缺的部分。 由由18個個ascii字符字符第第1個字符必須是字母個字符必須是字母,其余為字母、數字或其他,其余為字母、數字或其他特定字符特定字符 不使用已定義的符號
5、不使用已定義的符號 后邊必須跟冒號后邊必須跟冒號 操作數操作數 給指令的操作提供給指令的操作提供數據數據或或地址地址。匯編語句中操作。匯編語句中操作數可能是空缺的,也可能包括一項,還可能包括兩數可能是空缺的,也可能包括一項,還可能包括兩項或三項。操作數字段可包括以下幾種情況:項或三項。操作數字段可包括以下幾種情況:工作寄存器名工作寄存器名特殊功能寄存器名特殊功能寄存器名標號名標號名常數常數符號符號“$”,表示,表示pc的當前值的當前值表達式表達式 注釋注釋 增加程序可讀性,該字段要以分號增加程序可讀性,該字段要以分號“;”開頭,長度不限。開頭,長度不限。 數據的表示形式數據的表示形式 二進制數
6、,末尾以字母二進制數,末尾以字母 b 標識標識 十進制數,末尾以字母十進制數,末尾以字母 d 標識或將字母標識或將字母d省略。省略。 十六進制數十六進制數,末尾以字母,末尾以字母 h 標識。但應注意以字標識。但應注意以字母母af開頭時應在其前面加上數字開頭時應在其前面加上數字“0”。 ascii碼,以單引號標識。如:碼,以單引號標識。如:ab,1245 4.2 源程序的編輯和匯編源程序的編輯和匯編 源程序的編輯源程序的編輯 據匯編語言規(guī)則,正確使用匯編命令(即據匯編語言規(guī)則,正確使用匯編命令(即偽指令偽指令):): org 0040h mov a,#7fh mov r1,#44h end 4.
7、2.1 4.2.1 源程序的編輯與匯編源程序的編輯與匯編 org和和end是兩條偽指令是兩條偽指令 以以“ . asm”擴展名存盤。擴展名存盤。 源程序的匯編源程序的匯編 匯編語言源程序轉換為單片機能執(zhí)行的機器碼形匯編語言源程序轉換為單片機能執(zhí)行的機器碼形式的目標程序叫匯編。常用方法有兩種:式的目標程序叫匯編。常用方法有兩種: 手工匯編手工匯編,通過手工方式查指令編碼表,逐個,通過手工方式查指令編碼表,逐個把助記符指令翻譯成機器碼,然后把得到的機器把助記符指令翻譯成機器碼,然后把得到的機器碼程序(以十六進制形式)鍵入到單片機開發(fā)機碼程序(以十六進制形式)鍵入到單片機開發(fā)機中,并進行調試。中,并
8、進行調試。 機器匯編機器匯編,在,在pc上,用交叉匯編程序將匯編語上,用交叉匯編程序將匯編語言源程序轉換為機器碼形式的目標程序。言源程序轉換為機器碼形式的目標程序。 匯編形成兩個主要文件為:列表文件和目標匯編形成兩個主要文件為:列表文件和目標碼文件。例:碼文件。例:列表文件列表文件:地地 址址 目標碼目標碼 匯編程序匯編程序 org 0040h0040h 747f mov a,#7fh0042h 7944 mov r1,#44h end目標碼文件目標碼文件:首地址首地址 末地址末地址 目標碼目標碼0040h 0044h 747f7944 匯編程序能識別并對匯編過程進行某種控匯編程序能識別并對匯
9、編過程進行某種控制的制的匯編命令匯編命令。無對應的可執(zhí)行目標碼。無對應的可執(zhí)行目標碼4.2.2 4.2.2 偽指令偽指令 起始地址設定起始地址設定 org 表達式表達式 向匯編程序說明下面緊接的程序段或數據段存向匯編程序說明下面緊接的程序段或數據段存放的起始地址。放的起始地址。 表達式通常為表達式通常為16進制地址,也可以是已定義的進制地址,也可以是已定義的標號地址。標號地址。 源程序的開始,要設置一條源程序的開始,要設置一條org偽指令來指定該程偽指令來指定該程序在存儲器中存放的起始位置。序在存儲器中存放的起始位置。省略省略org,則該程序段從,則該程序段從0000h單元開始存放。單元開始存
10、放。可以多次使用可以多次使用org偽指令,但要求地址值由小到偽指令,但要求地址值由小到大依序排列,不允許空間重疊。大依序排列,不允許空間重疊。 匯編結束匯編結束 end 匯編程序遇到匯編程序遇到end偽指令后即結束匯編。偽指令后即結束匯編。 字節(jié)數據定義字節(jié)數據定義 標號:標號: db 字節(jié)數據表字節(jié)數據表 將字節(jié)數據表中的數據根據從左到右的順將字節(jié)數據表中的數據根據從左到右的順序依次存放在指定的存儲單元中。一個數據序依次存放在指定的存儲單元中。一個數據占一個存儲單元。例:占一個存儲單元。例:db “how are you?”把字符串中的字符以把字符串中的字符以ascii碼的形式存放在連續(xù)的碼
11、的形式存放在連續(xù)的rom單元中。又如:單元中。又如:db 2,4,6,8,10,18把把6個數轉換為十六進制表示(個數轉換為十六進制表示(feh,fch,fah,08h,0ah,12h),并連續(xù)地存放在),并連續(xù)地存放在6個個rom。 常用于存放數據表格。如存放顯示用的十常用于存放數據表格。如存放顯示用的十六進制的字形碼:六進制的字形碼: db 0c0h,0f9h,0a4h,0b0h db 99h,92h,82h,0f8h db 80h,90h,88h,83h db 0c6h,0a1h,86h,84h 字數據定義字數據定義 標號:標號: dw 字數據表字數據表 從標號指定的地址單元開始,在程序
12、存儲從標號指定的地址單元開始,在程序存儲器中定義器中定義字字數據。應注意:高數據。應注意:高8位存放在低地位存放在低地址單元,低址單元,低8位存放在高地址單元。例:位存放在高地址單元。例: org 1400hdata:dw 324ah,3ch 匯編后,(匯編后,(1400h)=32h,(,(1401h)= 4ah,(1402h)=00h,(,(1403h)=3ch。 空間定義空間定義 標號:標號: ds 表達式表達式 從標號指定的地址單元開始,在程序存儲器中保從標號指定的地址單元開始,在程序存儲器中保留由表達式所指定的個數的存儲單元,并都填以零留由表達式所指定的個數的存儲單元,并都填以零值。例
13、如:值。例如: org 3000hbuf:ds 50 匯編后,從地址匯編后,從地址3000h開始保留開始保留50個存?zhèn)€存儲單元作為備用單元。儲單元作為備用單元。 賦值賦值符號名符號名 equ 表達式表達式 將表達式的值或特定的某個匯編符號定義將表達式的值或特定的某個匯編符號定義為一個指定的符號名。為一個指定的符號名。 len equ 10len equ 10 sum equ 21h sum equ 21h block equ 22h block equ 22h clr a clr a mov r7 mov r7,lenlen mov r0 mov r0,blockblock loop loop
14、:add aadd a,r0r0 inc r0 inc r0 djnz r7 djnz r7,looploop mov sum mov sum,a a end end 功能:把功能:把block單元開始存放的單元開始存放的10個無個無符號數進行求和,并將結果存入符號數進行求和,并將結果存入sum單元中。單元中。 位地址符號定義位地址符號定義 符號名符號名 bit 位地址表達式位地址表達式 將位地址賦給指定的符號名。位地址表達式將位地址賦給指定的符號名。位地址表達式可以是絕對地址,也可以是符號地址??梢允墙^對地址,也可以是符號地址。例如:例如: st bit p1.0將將p1.0的位地址賦給符號
15、名的位地址賦給符號名st,在其后的編,在其后的編程中就可以用程中就可以用st來代替來代替p1.0。4.3 基本程序結構基本程序結構 4.3.1 順序程序順序程序 指無分支、無循環(huán)結構的程序。指無分支、無循環(huán)結構的程序。一、數據傳送一、數據傳送 例:內部例:內部ram的的2ah2eh單元中存儲的數據如單元中存儲的數據如圖所示。試編寫程序實現圖示的數據傳送結果。圖所示。試編寫程序實現圖示的數據傳送結果。方法一:方法一:mov a,2eh ;2字節(jié),字節(jié),1個機器周期個機器周期mov 2eh,2dh ;3字節(jié),字節(jié),2個機器周期個機器周期mov 2dh,2ch ;3字節(jié),字節(jié),2個機器周期個機器周期
16、mov 2ch,2bh ;3字節(jié),字節(jié),2個機器周期個機器周期mov 2bh,#00h ;3字節(jié),字節(jié),2個機器周期個機器周期方法二:方法二:clr a ;1字節(jié),字節(jié),1個機器周期個機器周期xch a,2bh ;2字節(jié),字節(jié),1個機器周期個機器周期xch a,2ch ;2字節(jié),字節(jié),1個機器周期個機器周期xch a,2dh ;2字節(jié),字節(jié),1個機器周期個機器周期xch a,2eh ;2字節(jié),字節(jié),1個機器周期個機器周期方法一:方法一:14個字節(jié),個字節(jié),9個機器周期;個機器周期;方法二:方法二: 9個字節(jié),個字節(jié),5個機器周期。個機器周期。 例例 有一變量在片內有一變量在片內ram的的20h
17、單單元,取值范圍:元,取值范圍:00h05h。編制一。編制一段程序,根據變量值求其平方值,段程序,根據變量值求其平方值,并存入片內并存入片內ram的的21h單元。程序單元。程序如下:如下: org 1000horg 1000hstartstart:mov dptrmov dptr,#2000h#2000h mov a mov a,20h20h movc a movc a,a+dptr a+dptr mov 21h mov 21h,a a sjmp $ sjmp $ org 2000h org 2000htabletable:db 00db 00,0101,0404,0909,1616,2525
18、 end end #2000h dptr(20h) a(a+dptr) aa 21h開始結束 movc a,a+ dptr,用,用dptr指向表指向表首址,則變量與首址,則變量與dptr之和的地址單元中的內之和的地址單元中的內容就是變量的平方值。容就是變量的平方值。 movc a,a+pc不破壞不破壞dptr的內容,從而可以減少保護的內容,從而可以減少保護dptr的內容所需的開銷。的內容所需的開銷。表格存放在表格存放在該該指令后的指令后的256字節(jié)內字節(jié)內。 三、簡單運算三、簡單運算 對于多字節(jié)的相加運算必須從低位字節(jié)開對于多字節(jié)的相加運算必須從低位字節(jié)開始分字節(jié)進行。除最低字節(jié)可以使用始分字
19、節(jié)進行。除最低字節(jié)可以使用add指指令外,其他字節(jié)相加時要使用令外,其他字節(jié)相加時要使用addc指令。指令。例例 雙字節(jié)無符號數加法。雙字節(jié)無符號數加法。 設被加數存放在內部設被加數存放在內部ram的的51h、50h單元,加單元,加數存放在內部數存放在內部ram的的61h、60h單元,相加的結果單元,相加的結果存放在內部存放在內部ram的的51h、50h單元,進位存放在位單元,進位存放在位尋址區(qū)的尋址區(qū)的00h位中。(程序見下頁)位中。(程序見下頁) mov r0mov r0,50h 50h ;被加數的低字節(jié)地址;被加數的低字節(jié)地址mov r1mov r1,60h 60h ;加數的低字節(jié)地址;
20、加數的低字節(jié)地址mov amov a,r0 r0 ;取被加數低字節(jié);取被加數低字節(jié)add aadd a,r1 r1 ;加上加數低字節(jié);加上加數低字節(jié)mov r0mov r0,a a ;保存低字節(jié)相加結果;保存低字節(jié)相加結果inc r0 inc r0 ;指向被加數高字節(jié);指向被加數高字節(jié)inc r1 inc r1 ;指向加數高字節(jié);指向加數高字節(jié)mov amov a,r0 r0 ;取被加數高字節(jié);取被加數高字節(jié)addc aaddc a,r1 r1 ;加上加數高字節(jié)(帶進位加);加上加數高字節(jié)(帶進位加)mov r0mov r0,a a ;存高字節(jié)相加結果;存高字節(jié)相加結果mov 00hmov 0
21、0h,c c ;保存進位;保存進位 。 4.3.2 4.3.2 分支程序分支程序可分成單分支、雙分支和多分支幾種可分成單分支、雙分支和多分支幾種 :條件成立?條件成立?程序段程序段a下條指令下條指令條件成立?條件成立?程序段程序段a程序段程序段bk=0?k=1?k=2?y分支分支0y分支分支1y分支分支2nnn一、單分支程序一、單分支程序例例 求單字節(jié)有符號數的二進制補碼。求單字節(jié)有符號數的二進制補碼。設有一個單字節(jié)二進制數存于設有一個單字節(jié)二進制數存于a中中。start: jnb acc.7start: jnb acc.7,ok ok ;(;(a a)00,無需轉換,無需轉換 mov cmo
22、v c, acc.7 acc.7 ; mov amov a,r0 r0 ; cpl a cpl a ; 取補取補 add aadd a,#1 #1 ; mov acc.7 mov acc.7 ,c c ; 存符號位存符號位 okok:ret ret 二、雙分支程序二、雙分支程序例例 設變量設變量 x 以補碼的形式存放在片內以補碼的形式存放在片內ram的的30h單元,變量單元,變量 y 與與 x 的關系是:當的關系是:當 x 大于大于0時,時,y =x;當;當 x =0時,時,y =20h;當;當 x 小于小于0時,時,y =x+5。編制程序,根據。編制程序,根據 x 的大小求的大小求y并送回原
23、單元。程序段如下:并送回原單元。程序段如下:startstart:mov amov a,30h 30h jz next jz next anl a anl a,#80h #80h ;判斷符號位;判斷符號位 jz lp jz lp mov a mov a,#05h #05h add a add a,30h 30h mov 30h mov 30h,a a sjmp lp sjmp lp next next:mov 30hmov 30h,#20h#20h lp lp:sjmp $ sjmp $ 三、多分支程序三、多分支程序例例 根據根據r7的內容轉向相應的處理程序。的內容轉向相應的處理程序。設設r7
24、的內容為的內容為0n,對應的處理程序的入口地址分別為,對應的處理程序的入口地址分別為pp0ppn。 startstart:mov dptrmov dptr,#tab #tab ;置分支入口地址表首址;置分支入口地址表首址 mov amov a,r7 r7 ;分支轉移序號送;分支轉移序號送a a add a add a,r7 r7 ;分支轉移序號乘以;分支轉移序號乘以2 2 mov r3 mov r3,a a ;暫存于;暫存于r3r3 movc a movc a,a+dptr a+dptr ;取高位地址;取高位地址 xch axch a,r3 r3 inc a inc a movc a movc
25、 a,a+dptr a+dptr ;取低位地址;取低位地址 mov dplmov dpl,a a ;處理程序入口地址低;處理程序入口地址低8 8位送位送dpldpl mov dph mov dph,r3 r3 ;處理程序入口地址高;處理程序入口地址高8 8位送位送dphdph clr a clr a jmp a+dptr jmp a+dptr tab tab:dw pp0dw pp0 dw pp1 dw pp1 dw ppn dw ppn 4.3.3 4.3.3 循環(huán)程序循環(huán)程序有先執(zhí)行后判斷有先執(zhí)行后判斷和和先判斷后執(zhí)行先判斷后執(zhí)行兩種結構兩種結構 :一、先執(zhí)行后判斷一、先執(zhí)行后判斷例例 5
26、0ms延時程序。延時程序。若晶振頻率為若晶振頻率為12mhz,則一個機器周期為,則一個機器周期為1s。執(zhí)行一條。執(zhí)行一條djnz指令需要指令需要2個機器周期,即個機器周期,即 2s。采用循環(huán)計數法實。采用循環(huán)計數法實現延時,循環(huán)次數可以通過計算獲得,并選擇先執(zhí)行后判現延時,循環(huán)次數可以通過計算獲得,并選擇先執(zhí)行后判斷的循環(huán)結構。程序段如下:斷的循環(huán)結構。程序段如下: deldel:mov r7mov r7,#200 #200 ;1 s1 sdel1del1:mov r6mov r6,#123 #123 ;1 s1 s nop nop ;1 s1 sdel2del2:djnz r6djnz r6
27、,del2 del2 ;2s2s,計(,計(2 2123123)ss djnz r7 djnz r7,del1 del1 ;2s2s, ret ret 共計共計 (2 21231232 2 2 2)200+1 s200+1 s,即,即50.001ms50.001ms 例例 無符號數排序程序。在片內無符號數排序程序。在片內ram中,起始地中,起始地址為址為30h的的8個單元中存放有個單元中存放有8個無符號數。試對這個無符號數。試對這些無符號數進行升序排序。些無符號數進行升序排序。冒泡排序法。從前向后進行冒泡排序法。從前向后進行相鄰數的比較相鄰數的比較,如數,如數據的大小次序與要求的據的大小次序與
28、要求的順序不符順序不符就將這兩個數就將這兩個數互換互換,否則不互換。對于升序排序,通過這種相鄰數的互否則不互換。對于升序排序,通過這種相鄰數的互換,使小數向前移動,換,使小數向前移動,大數向后移動大數向后移動。一次冒泡。一次冒泡(相鄰數的互換),就會把(相鄰數的互換),就會把最大的數換到最后最大的數換到最后。再再進行一次進行一次冒泡,就會把冒泡,就會把次大的數次大的數排在排在倒數第二倒數第二的位的位置。置。設設r7為比較次數計數器,初始值為為比較次數計數器,初始值為07h,位地址,位地址00h為數據互換標志位。為數據互換標志位。 start start:clr 00h clr 00h ;互換標
29、志清;互換標志清0 0 mov r7 mov r7,#07h #07h ;各次冒泡比較次數;各次冒泡比較次數 mov r0mov r0,#30h #30h ;數據區(qū)首址;數據區(qū)首址 looploop:mov amov a,r0 r0 ;取前數;取前數 mov 2bhmov 2bh,a a ;暫存;暫存 inc r0 inc r0 mov 2ah mov 2ah,r0 r0 ;取后數;取后數 clr c clr c subb a subb a,r0 r0 ;前數減后數;前數減后數 jc next jc next ;前數小于后數,不互換;前數小于后數,不互換 mov r0mov r0,2bh 2b
30、h dec r0 dec r0 mov r0 mov r0,2ah 2ah ;兩數交換;兩數交換 inc r0 inc r0 ;準備下一次比較;準備下一次比較 setb 00h setb 00h ;置互換標志;置互換標志 nextnext:djnz r7djnz r7,loop loop ;進行下一次比較;進行下一次比較 jb 00hjb 00h,start start ;進行下一輪冒泡;進行下一輪冒泡 sjmp $ sjmp $ 二、先判斷后執(zhí)行二、先判斷后執(zhí)行 例例 將內部將內部ram中起始地址為中起始地址為data的數據串傳送到外部的數據串傳送到外部ram中起始地址為中起始地址為buff
31、er的存儲區(qū)域內,直到發(fā)現的存儲區(qū)域內,直到發(fā)現$ 字符字符停止傳送。由于循環(huán)次數事先不知道,但停止傳送。由于循環(huán)次數事先不知道,但循環(huán)條件可以測試循環(huán)條件可以測試到。所以,采用先判斷后執(zhí)行的結構比較適宜。到。所以,采用先判斷后執(zhí)行的結構比較適宜。 mov r0mov r0,#data #data mov dptr mov dptr,#buffer#buffer loop0 loop0:mov amov a,r0 r0 cjne a cjne a,#24h#24h,loop1 loop1 ;判是否為;判是否為 $ $ 字符字符 sjmp loop2 sjmp loop2 ;是;是 $ $ 字符
32、,轉結束字符,轉結束 loop1loop1:movx dptrmovx dptr,a a ;不是;不是 $ $ 字符,執(zhí)行傳送字符,執(zhí)行傳送 inc r0 inc r0 inc dptr inc dptr sjmp loop0 sjmp loop0 ;傳送下一數據;傳送下一數據 loop2loop2: 4.3.4 4.3.4 子程序及其調用子程序及其調用 子程序的調用子程序的調用 對于通用性的問題,例如:數值轉換、數值計算對于通用性的問題,例如:數值轉換、數值計算等,往往要進行多次。宜將其設計成等,往往要進行多次。宜將其設計成子程序。子程序。 子程序在執(zhí)行時需要由其它程序來調用子程序在執(zhí)行時需
33、要由其它程序來調用 執(zhí)行完后又需要把執(zhí)行流程返回到調用的主程序。執(zhí)行完后又需要把執(zhí)行流程返回到調用的主程序。 調用時注意:一是現場的保護和恢復;二是主程調用時注意:一是現場的保護和恢復;二是主程序與子程序的參數傳遞。序與子程序的參數傳遞。 現場保護與恢復現場保護與恢復 子程序經常用到子程序經常用到r0r7、a、dptr,以及,以及psw等。等。而這些單元中的內容在調用結束后的主程序中仍有用,而這些單元中的內容在調用結束后的主程序中仍有用,所以所以需要進行保護需要進行保護(即(即現場保護現場保護)。)。 在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復其原在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復其原內容
34、,稱為內容,稱為現場恢復現場恢復。保護與恢復的方法有以下兩種:。保護與恢復的方法有以下兩種:在主程序中實現;在主程序中實現;在子程序中實現。在子程序中實現。 1、在主程序中實現、在主程序中實現 push psw push psw ;保護現場;保護現場 push acc push acc ; push b push b ; mov pswmov psw,#10h #10h ;換當前工作寄存器組;換當前工作寄存器組 lcall addr16 lcall addr16 ;子程序調用;子程序調用 pop b pop b ;恢復現場;恢復現場 pop acc pop acc ; pop psw pop
35、psw ; 特點是結構靈活特點是結構靈活。 2、在子程序中實現、在子程序中實現 sub1sub1:push psw push psw ;保護現場;保護現場 push acc push acc ; push b push b ; mov psw mov psw,#10h #10h ;換當前工作寄存器組;換當前工作寄存器組 pop b pop b ;恢復現場;恢復現場 pop acc pop acc ; pop psw pop psw ; retret程序規(guī)范、清晰。要注意保護與恢復的順序程序規(guī)范、清晰。要注意保護與恢復的順序。三、參數傳遞三、參數傳遞 傳遞參數的方法有三種:傳遞參數的方法有三種:
36、 利用累加器或寄存器利用累加器或寄存器 先把子程序需要的數據送入先把子程序需要的數據送入a或指定的或指定的工作工作寄存器寄存器中中 當子程序執(zhí)行時,可從指定的單元中取得當子程序執(zhí)行時,可從指定的單元中取得數據,執(zhí)行運算數據,執(zhí)行運算 子程序也可以用同樣的方法把結果傳送給子程序也可以用同樣的方法把結果傳送給主程序。主程序。 例例 編寫程序,實現編寫程序,實現c=a2+b2 。設。設a,b,c分別存于內分別存于內部部ram的的30h,31h,32h三個單元中。三個單元中。startstart:mov amov a,30h 30h ;取;取a a acall sqr acall sqr ;調用查平方
37、表;調用查平方表 mov r1mov r1,a a ;a2 a2 暫存于暫存于r1r1中中 mov amov a,31h 31h ;取;取b b acall sqr acall sqr ;調用查平方表;調用查平方表 add aadd a,r1 r1 ;a2+b2 a2+b2 存于存于a a中中 mov 32hmov 32h,a a ;存結果;存結果 sjmp $sjmp $ sqr sqr :mov dptrmov dptr,#tab #tab ;子程序;子程序 movc amovc a,a+dptr a+dptr ; ret ret tab tab :db 0db 0,1 1,4 4,9 9
38、,16 16 ,2525,3636,4949,6464,81 81 利用存儲器利用存儲器 數據量比較大時,利用存儲器實現參數的傳遞,數據量比較大時,利用存儲器實現參數的傳遞,先建立一個參數表,用指針指示參數表所在位置。先建立一個參數表,用指針指示參數表所在位置。 參數表建立在內部參數表建立在內部ram時,用時,用r0或或r1作指針。作指針。 參數表建立在外部參數表建立在外部ram時,用時,用dptr作指針。作指針。 例例 將將r0和和r1指向的內部指向的內部ram 中兩個中兩個3字節(jié)無字節(jié)無符號整數相加,結果送到由符號整數相加,結果送到由r0指向的內部指向的內部ram中。中。入口時,入口時,r
39、0和和r1分別指向加數和被加數的低位字分別指向加數和被加數的低位字節(jié);出口時,節(jié);出口時,r0指向結果的高位字節(jié)。低字節(jié)在指向結果的高位字節(jié)。低字節(jié)在高地址,高字節(jié)在低地址。高地址,高字節(jié)在低地址。 實現程序:實現程序: naddnadd:mov r7mov r7,#3 #3 ;三字節(jié)加法;三字節(jié)加法 clr c clr c ;nadd1nadd1:mov amov a,r0 r0 ;取加數低字節(jié);取加數低字節(jié) addc aaddc a,r1 r1 ;被加數低字節(jié)加;被加數低字節(jié)加a a mov r0 mov r0,a a ; dec r0dec r0 dec r1 dec r1 djnz r
40、7 djnz r7,nadd1nadd1 inc r0 inc r0 ret ret 利用堆棧利用堆棧 堆棧傳遞參數是在子程序嵌套中常采用的堆棧傳遞參數是在子程序嵌套中常采用的一種方法。一種方法。 例例 把內部把內部ram中中20h單元中的單元中的1個字節(jié)十個字節(jié)十六進制數轉換為六進制數轉換為2位位ascii碼,存放在碼,存放在r0指指示的兩個單元中。示的兩個單元中。 mainmain:mov amov a,20h 20h ; swap aswap a push acc push acc ;參數入棧;參數入棧 acall heascacall heasc pop acc pop acc mov
41、 r0 mov r0,a a ;存高位十六進制數轉換結果;存高位十六進制數轉換結果 inc r0 inc r0 ;修改指針;修改指針 push 20h push 20h ;參數入棧;參數入棧 acall heascacall heasc pop acc pop acc mov r0 mov r0,a a ;存低位十六進制數轉換結果;存低位十六進制數轉換結果 sjmp $sjmp $ heascheasc:mov r1mov r1,sp sp ;借用;借用r1r1為堆棧指針為堆棧指針 dec r1dec r1 dec r1 dec r1 ;r1r1指向被轉換數據指向被轉換數據 xch axch
42、a,r1 r1 ;取被轉換數據;取被轉換數據 anl aanl a,#0fh #0fh ;取一位十六進制數;取一位十六進制數 add aadd a,#2 #2 ; 所加值為所加值為movcmovc與與dbdb間字節(jié)間字節(jié)數數 movc amovc a,a+pc a+pc ;查表;查表 xch axch a,r1 r1 ;1 1字節(jié)指令,存結果于堆棧字節(jié)指令,存結果于堆棧 ret ret ;1 1字節(jié)指令字節(jié)指令asctabasctab:db 30hdb 30h,31h31h,32h32h,33h33h,34h34h,35h35h,36h36h,37h37h db 38h db 38h,39h3
43、9h,41h41h,42h42h,43h43h,44h44h,45h45h,46h46h 一般說來:一般說來: 數據較少數據較少時,采用時,采用寄存器寄存器傳遞方式可傳遞方式可以獲得較快的傳遞速度;以獲得較快的傳遞速度; 數據較多數據較多時,宜采用時,宜采用存儲器存儲器或或堆棧堆棧方方式傳遞;式傳遞; 若是若是子程序嵌套子程序嵌套,宜采用,宜采用堆棧堆棧方式。方式。4.4 常用程序舉例常用程序舉例4.4.1 算術運算程序算術運算程序 多字節(jié)多字節(jié)數的數的加、減加、減運算運算 合理地運用進位(借位)標志合理地運用進位(借位)標志 例例 多字節(jié)無符號數的加法。多字節(jié)無符號數的加法。設兩個設兩個n字
44、節(jié)的無符號數分別存放在內部字節(jié)的無符號數分別存放在內部ram中以中以data1和和data2開始的單元中。相加后的結果要開始的單元中。相加后的結果要求存放在求存放在data2數據區(qū)。數據區(qū)。 mov r0 mov r0,#data1 #data1 ; mov r1mov r1,#data2 #data2 ; mov r7mov r7,#n #n ;置字節(jié)數;置字節(jié)數 clr c clr c ; looploop:mov amov a,r0 r0 ; addc aaddc a,r1 r1 ;求和;求和 mov r1mov r1,a a ;存結果;存結果 inc r0 inc r0 ;修改指針;修
45、改指針 inc r1 inc r1 ; djnz r7djnz r7, loop loop ; 多字節(jié)數多字節(jié)數乘法乘法運算運算例例 設雙字節(jié)無符號被乘數存放在設雙字節(jié)無符號被乘數存放在r3、r2中,中,乘數存放在乘數存放在r5、r4中,中,r0指向積的高位。指向積的高位。 例例 多字節(jié)無符號數的多字節(jié)無符號數的減法減法。 設兩設兩n字節(jié)數分別放在內部字節(jié)數分別放在內部ram中以中以data1和和data2開始的單元中。相減后的結果要求存放在開始的單元中。相減后的結果要求存放在data2數據區(qū)數據區(qū)。 mov r0mov r0,#data1 #data1 ; mov r1mov r1,#dat
46、a2 #data2 ; mov r7mov r7,#n #n ;置字節(jié)數;置字節(jié)數 clr c clr c ; looploop:mov amov a,r0 r0 ; subb asubb a,r1 r1 ;求差;求差 mov r1mov r1,a a ;存結果;存結果 inc r0 inc r0 ;修改指針;修改指針 inc r1 inc r1 ; djnz r7djnz r7,loop loop ;主程序:主程序: multbmultb:mov r7mov r7,#04 #04 ;結果單元清;結果單元清0 0 loop loop:mov r0mov r0,#00h #00h ; djnz
47、r7djnz r7,loop loop ; dec r0dec r0 acall bmul acall bmul ; sjmp $sjmp $另有另有2段子程序:段子程序: bmulbmul radd radd(在(在bmulbmul中被調用)中被調用)子程序段:子程序段: raddradd:add aadd a,r0 r0 ; mov r0mov r0,a a ; mov amov a,b b ; inc r0 inc r0 ; addc aaddc a,r0 r0 ; mov r0mov r0,a a ; inc r0 inc r0 ; mov amov a,r0 r0 ; addc aa
48、ddc a,#00h #00h ;加進位;加進位 mov r0mov r0,a a ; retret bmul bmul:mov amov a,r2 r2 ; mov bmov b,r4 r4 ; mul ab mul ab ;低位乘;低位乘 acall radd acall radd ; mov amov a,r2 r2 ; mov bmov b,r5 r5 ; mul ab mul ab ;交叉乘;交叉乘 dec r0 dec r0 ; acall radd acall radd ; mov amov a,r4 r4 ; mov bmov b,r3 r3 ; mul ab mul ab ;
49、交叉乘;交叉乘 dec r0 dec r0 ; dec r0 dec r0 ; acall radd acall radd ; mov amov a,r5 r5 ; mov bmov b,r3 r3 ; mul ab mul ab ;高字節(jié)乘;高字節(jié)乘 dec r0 dec r0 ; acall radd acall radd ; dec r0dec r0 ret ret 十六進制數與十六進制數與ascii碼間的轉換碼間的轉換 數在數在09之間時,之間時,ascii碼值為該數加碼值為該數加30h 數在數在af之間時,之間時,ascii碼值為該數加碼值為該數加37h4.4.2 碼型轉換碼型轉換
50、例:例: 將將1位十六進制數轉換成相應的位十六進制數轉換成相應的ascii碼。碼。 設十六進制數存放在設十六進制數存放在r0中,轉換后的中,轉換后的ascii 碼存碼存放于放于r2中。中。haschasc:mov amov a,r0 r0 ;?。蝗? 4位二進制數位二進制數 anl aanl a,#0fh #0fh ;屏蔽掉高;屏蔽掉高4 4位位 push acc push acc ;4 4位二進制數入棧位二進制數入棧 clr c clr c ;清進(借)位位;清進(借)位位 subb asubb a,#0ah #0ah ;用借位位的狀態(tài)判斷該數在;用借位位的狀態(tài)判斷該數在0 09 9還是還是
51、a af f之間之間 pop acc pop acc ;彈出原;彈出原4 4位二進制數位二進制數 jc loop jc loop ;借位位為;借位位為1 1,跳轉至,跳轉至looploop add a add a,#07h #07h ;借位位為;借位位為0 0,該數在,該數在a af f之間,加之間,加37h37hlooploop:add aadd a,#30h #30h ;該數在;該數在0 09 9之間,加之間,加30h30h mov r2 mov r2,a a ;asciiascii碼存于碼存于r2r2 ret ret 例:將多位十六進制數轉換成例:將多位十六進制數轉換成ascii碼碼。
52、設地址指針設地址指針r0指向十六進制數低位,指向十六進制數低位,r2中中存放字節(jié)數,轉換后地址指針存放字節(jié)數,轉換后地址指針r0指向十六進制指向十六進制數的高位。數的高位。r1指向要存放的指向要存放的ascii碼的高位地碼的高位地址。實現程序如下:址。實現程序如下: htasc htasc:mov amov a,r0 r0 ;取低;取低4 4位二進制數位二進制數 anl aanl a,#0fh #0fh ; add aadd a,#15 #15 ;偏移量修正;偏移量修正 movc amovc a,a+pc a+pc ;查表;查表 mov r1mov r1,a a ;存;存asciiascii碼
53、碼 inc r1 inc r1 ; mov a mov a ,r0 r0 ;取十六進制高;取十六進制高4 4位位 swap aswap a anl a anl a,#0fh #0fh ; add aadd a,#06h #06h ;偏移值修正;偏移值修正 movc amovc a,a+pc a+pc ; mov r1mov r1,a a inc r0 inc r0 ;指向下一單元;指向下一單元 inc r1 inc r1 ; djnz r2djnz r2,htasc htasc ;字節(jié)數存于;字節(jié)數存于r2r2 ret retasctabasctab:db 30hdb 30h,31h31h,3
54、2h32h,33h33h,34h34h,35h35h,36h36h,37h37h db 38h db 38h,39h39h,41h41h,42h42h,43h43h,44h44h,45h45h,46h46h bcd碼與二進制數之間的轉換碼與二進制數之間的轉換 4位二進制數可以表示位二進制數可以表示1位位bcd碼,碼,1個字節(jié)可以表個字節(jié)可以表示示2位位bcd碼(稱為壓縮型碼(稱為壓縮型bcd碼)。碼)。例例 雙字節(jié)二進制數轉換成雙字節(jié)二進制數轉換成bcd碼。碼。 設(設(r2r3)為雙字節(jié)二進制數,()為雙字節(jié)二進制數,(r4r5r6)為)為轉換完的壓縮型轉換完的壓縮型bcd碼。碼。十進制數十
55、進制數b與一個與一個8位的二進制數的關系可以表示為:位的二進制數的關系可以表示為: 只要依十進制運算法則,將只要依十進制運算法則,將 bi(i7,6, ,1,0)按權相加,就可以得到對應的十進制數)按權相加,就可以得到對應的十進制數b。(逐次。(逐次得到:得到:b720;b721b620;b722b621b520 ;)。)。 dcdth dcdth:clr a clr a ; mov r4mov r4,a a ;r4r4清清0 0 mov r5 mov r5,a a ;r5r5清清0 0 mov r6 mov r6,a a ;r6r6清清0 0 mov r7 mov r7,#16 #16 ;計
56、數初值;計數初值 looploop:clr c clr c ; mov amov a,r3 r3 ; rlc a rlc a ; mov r3mov r3,a a ;r3r3左移一位并送回左移一位并送回 mov amov a,r2 r2 ; rlc a rlc a ; mov r2mov r2,a a ;r2r2左移一位并送回左移一位并送回 mov amov a,r6 r6 ; addc aaddc a,r6 r6 ; da a da a ; mov r6mov r6,a a ;(;(r6r6)乘)乘2 2并調整后送回并調整后送回 mov amov a,r5 r5 ; addc aaddc a
57、,r5 r5 ; da a da a ; mov r5mov r5,a a ;(;(r5r5)乘)乘2 2并調整后送回并調整后送回 mov amov a,r4 r4 ; addc aaddc a,r4 r4 ; da a da a ; mov r4mov r4,a a ;(;(r4r4)乘)乘2 2并調整后送回并調整后送回 djnz r7djnz r7,loop loop ;1、80c51單片機匯編語言有何特點?單片機匯編語言有何特點?2、利用、利用80c51匯編語言進行程序設計的步驟如何?匯編語言進行程序設計的步驟如何?3、常用的程序結構有哪幾種?特點如何?、常用的程序結構有哪幾種?特點如何
58、?4、子程序調用時,參數的傳遞方法有哪幾種?、子程序調用時,參數的傳遞方法有哪幾種?5、什么是偽指令?常用的偽指令功能如何?、什么是偽指令?常用的偽指令功能如何?6、設被加數存放在內部、設被加數存放在內部ram的的20h、21h單元,加數單元,加數存放在存放在22h、23h單元,若要求和存放在單元,若要求和存放在24h、25h中,中,試編寫出試編寫出16位數相加的程序。位數相加的程序。7、編寫一段程序,把外部、編寫一段程序,把外部ram中中1000h1030h的內的內容傳送到內部容傳送到內部ram的的30h60h中。中。8、編寫程序,實現雙字節(jié)無符號數加法運算,要求、編寫程序,實現雙字節(jié)無符號
59、數加法運算,要求 (r1r0)+(r7r6)(61h60h)。)。思考題及習題思考題及習題9、若、若80c51晶振頻率為晶振頻率為6mhz,試計算延時子程序的延時時間。,試計算延時子程序的延時時間。delay:mov r7,#0f6h lp:mov r6,#0fah djnz r6,$ djnz r7,lp ret10、在內部、在內部ram 的的21h單元開始存有一組單字節(jié)不帶符號數,單元開始存有一組單字節(jié)不帶符號數,數據長度為數據長度為30h,要求找出最大數存入,要求找出最大數存入big單元。單元。11、編寫程序,把累加器、編寫程序,把累加器a中的二進制數變換成中的二進制數變換成3位位bcd
60、碼,并碼,并將百、十、個位數分別存放在內部將百、十、個位數分別存放在內部ram的的50h、51h、52h中。中。12、編寫子程序,將、編寫子程序,將r1中的中的2個十六進制數轉換為個十六進制數轉換為ascii碼后存碼后存放在放在r3和和r4中。中。 13、編寫程序,求內部、編寫程序,求內部ram中中50h59h十個單元內容的平均值,十個單元內容的平均值,并存放在并存放在5ah單元。單元。疪被反輼牸牸曥喒醷詐捫閨銓鋠防窮滸誩萠偌諊紓裶慏彅寠椖蓬歀耚絳棛搗畹瀵醎姍義藌進壩綎襯經椡絎償齷旰棟庇羏濺欰坘儞锜齔燭苐莘努拆滐駑閹塕倵絅緲嶙淴北蓋葵婅瓎耒窻臫阬兔筈齳韉餞榮繪碇嚔驢腉峸匿瑐凳坽驓嘪蕰韽賌愝聆棔
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 信息科技推動下的數學課堂效率提升
- 以客戶為中心的醫(yī)療服務體驗優(yōu)化探討
- 管道工程圖畫法中的電力和照明設計
- 人工智能的宏觀經濟發(fā)展帶動效應分析
- 體育活動在家庭教育中的跨文化應用
- 創(chuàng)客文化下的教育行業(yè)創(chuàng)新案例分析
- 九年級化學上冊第2章身邊的化學物質2.2奇妙的二氧化碳
- 加速康復外科:現狀及今后需要關注的問題
- 個性化教育的創(chuàng)新思維策略
- 從用戶角度出發(fā)的對公客戶社交媒體服務優(yōu)化策略
- 眼科練習卷含答案
- 山東省淄博市2023-2024學年高二上學期期末教學質量檢測試題 數學 含解析
- 專題23 殖民地人民的反抗與資本主義制度的擴展(練習)
- 2024至2030年中國無甲醛多層板數據監(jiān)測研究報告
- 算法設計與分析 課件 5.4.1-動態(tài)規(guī)劃-0-1背包問題-問題描述和分析
- 分子生物學課件第一章醫(yī)學分子生物學緒論
- 電工技能與實訓(第4版)教學指南 高教版
- 轉化學困生工作總結課件
- 新高考數學專題復習專題42圓錐曲線中的向量問題專題練習(學生版+解析)
- 高中語文 必修上冊 第七單元 《我與地壇》
- 南航集團招聘筆試題庫2024
評論
0/150
提交評論