最新程序編制的方法和技巧_第1頁(yè)
最新程序編制的方法和技巧_第2頁(yè)
最新程序編制的方法和技巧_第3頁(yè)
最新程序編制的方法和技巧_第4頁(yè)
最新程序編制的方法和技巧_第5頁(yè)
已閱讀5頁(yè),還剩77頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、4.1 程序編制的方法和技巧程序編制的方法和技巧本章內(nèi)容:本章內(nèi)容:4.3 基本程序結(jié)構(gòu)基本程序結(jié)構(gòu)4.2 源程序的編輯和匯編源程序的編輯和匯編 4.4 常用程序舉例常用程序舉例第第4 4章章 80c5180c51的程序設(shè)計(jì)的程序設(shè)計(jì) 4.1 程序編制的方法和技巧程序編制的方法和技巧 4.1.14.1.1程序編制的步驟程序編制的步驟一、預(yù)完成任務(wù)的分析一、預(yù)完成任務(wù)的分析 功能功能要求要求 技術(shù)技術(shù)指標(biāo)指標(biāo) 硬件資源和工作環(huán)境硬件資源和工作環(huán)境二、進(jìn)行算法的優(yōu)化二、進(jìn)行算法的優(yōu)化 速度速度 內(nèi)存內(nèi)存使用使用 清晰的流程圖是正確編制應(yīng)用程序的基礎(chǔ)清晰的流程圖是正確編制應(yīng)用程序的基礎(chǔ)和條件,是一個(gè)

2、良好的編程習(xí)慣和條件,是一個(gè)良好的編程習(xí)慣 總流程圖總流程圖:程序的程序的邏輯結(jié)構(gòu)邏輯結(jié)構(gòu),各程序各程序模塊間模塊間的相互關(guān)系。的相互關(guān)系。局部流程圖局部流程圖:程序模塊的具體實(shí)施程序模塊的具體實(shí)施細(xì)節(jié)細(xì)節(jié)。三、程序總體設(shè)計(jì)及流程圖繪制三、程序總體設(shè)計(jì)及流程圖繪制開(kāi)始、結(jié)束開(kāi)始、結(jié)束判斷分支判斷分支程序流向程序流向工作任務(wù)工作任務(wù)程序連接程序連接程序流向程序流向常用的流程圖符號(hào)常用的流程圖符號(hào)4.1.2 4.1.2 編制程序的方法和技巧編制程序的方法和技巧一、采用模塊化程序設(shè)計(jì)方法一、采用模塊化程序設(shè)計(jì)方法 主程序、子程序主程序、子程序,如:發(fā)送、接收、延時(shí)、,如:發(fā)送、接收、延時(shí)、打印和顯示

3、等。打印和顯示等。 模塊化的優(yōu)點(diǎn)模塊化的優(yōu)點(diǎn) 便于程序設(shè)計(jì)和調(diào)試便于程序設(shè)計(jì)和調(diào)試 便于程序優(yōu)化和分工便于程序優(yōu)化和分工 提高程序閱讀性和可靠性提高程序閱讀性和可靠性二、盡量采用循環(huán)結(jié)構(gòu)和子程序二、盡量采用循環(huán)結(jié)構(gòu)和子程序 長(zhǎng)度減少、內(nèi)存空間減少。長(zhǎng)度減少、內(nèi)存空間減少。 避免避免 “死循環(huán),注意循環(huán)死循環(huán),注意循環(huán)初值初值和和結(jié)束結(jié)束條條件件 子程序用到的子程序用到的寄存器內(nèi)容應(yīng)壓棧寄存器內(nèi)容應(yīng)壓棧保護(hù),并保護(hù),并注意堆棧操作的壓入和彈出的平衡;注意堆棧操作的壓入和彈出的平衡;中斷處理子程序中斷處理子程序除了要保護(hù)程序中用到的除了要保護(hù)程序中用到的寄存器外,寄存器外,還應(yīng)保護(hù)標(biāo)志寄存器還應(yīng)保

4、護(hù)標(biāo)志寄存器。4.1.3 4.1.3 匯編語(yǔ)言的語(yǔ)句格式匯編語(yǔ)言的語(yǔ)句格式 語(yǔ)句行組成語(yǔ)句行組成 : 標(biāo)號(hào):標(biāo)號(hào): 操作碼操作碼 操作數(shù)操作數(shù) ;注釋?zhuān)蛔⑨?字段間用分隔符分隔字段間用分隔符分隔: 空格、冒號(hào)、逗號(hào)、分號(hào)等。空格、冒號(hào)、逗號(hào)、分號(hào)等。 標(biāo)號(hào)標(biāo)號(hào) 語(yǔ)句地址的標(biāo)志符號(hào),幾項(xiàng)規(guī)定:語(yǔ)句地址的標(biāo)志符號(hào),幾項(xiàng)規(guī)定: 操作碼操作碼 規(guī)定語(yǔ)句執(zhí)行的操作。它是匯編語(yǔ)句中唯一不能空規(guī)定語(yǔ)句執(zhí)行的操作。它是匯編語(yǔ)句中唯一不能空缺的部分。缺的部分。 由由18個(gè)個(gè)ascii字符字符第第1個(gè)字符必須是字母?jìng)€(gè)字符必須是字母,其余為字母、數(shù)字或其他,其余為字母、數(shù)字或其他特定字符特定字符 不使用已定義的符號(hào)

5、不使用已定義的符號(hào) 后邊必須跟冒號(hào)后邊必須跟冒號(hào) 操作數(shù)操作數(shù) 給指令的操作提供給指令的操作提供數(shù)據(jù)數(shù)據(jù)或或地址地址。匯編語(yǔ)句中操作。匯編語(yǔ)句中操作數(shù)可能是空缺的,也可能包括一項(xiàng),還可能包括兩數(shù)可能是空缺的,也可能包括一項(xiàng),還可能包括兩項(xiàng)或三項(xiàng)。操作數(shù)字段可包括以下幾種情況:項(xiàng)或三項(xiàng)。操作數(shù)字段可包括以下幾種情況:工作寄存器名工作寄存器名特殊功能寄存器名特殊功能寄存器名標(biāo)號(hào)名標(biāo)號(hào)名常數(shù)常數(shù)符號(hào)符號(hào)“$”,表示,表示pc的當(dāng)前值的當(dāng)前值表達(dá)式表達(dá)式 注釋注釋 增加程序可讀性,該字段要以分號(hào)增加程序可讀性,該字段要以分號(hào)“;”開(kāi)頭,長(zhǎng)度不限。開(kāi)頭,長(zhǎng)度不限。 數(shù)據(jù)的表示形式數(shù)據(jù)的表示形式 二進(jìn)制數(shù)

6、,末尾以字母二進(jìn)制數(shù),末尾以字母 b 標(biāo)識(shí)標(biāo)識(shí) 十進(jìn)制數(shù),末尾以字母十進(jìn)制數(shù),末尾以字母 d 標(biāo)識(shí)或?qū)⒆帜笜?biāo)識(shí)或?qū)⒆帜竏省略。省略。 十六進(jìn)制數(shù)十六進(jìn)制數(shù),末尾以字母,末尾以字母 h 標(biāo)識(shí)。但應(yīng)注意以字標(biāo)識(shí)。但應(yīng)注意以字母母af開(kāi)頭時(shí)應(yīng)在其前面加上數(shù)字開(kāi)頭時(shí)應(yīng)在其前面加上數(shù)字“0”。 ascii碼,以單引號(hào)標(biāo)識(shí)。如:碼,以單引號(hào)標(biāo)識(shí)。如:ab,1245 4.2 源程序的編輯和匯編源程序的編輯和匯編 源程序的編輯源程序的編輯 據(jù)匯編語(yǔ)言規(guī)則,正確使用匯編命令(即據(jù)匯編語(yǔ)言規(guī)則,正確使用匯編命令(即偽指令偽指令):): org 0040h mov a,#7fh mov r1,#44h end 4.

7、2.1 4.2.1 源程序的編輯與匯編源程序的編輯與匯編 org和和end是兩條偽指令是兩條偽指令 以以“ . asm”擴(kuò)展名存盤(pán)。擴(kuò)展名存盤(pán)。 源程序的匯編源程序的匯編 匯編語(yǔ)言源程序轉(zhuǎn)換為單片機(jī)能執(zhí)行的機(jī)器碼形匯編語(yǔ)言源程序轉(zhuǎn)換為單片機(jī)能執(zhí)行的機(jī)器碼形式的目標(biāo)程序叫匯編。常用方法有兩種:式的目標(biāo)程序叫匯編。常用方法有兩種: 手工匯編手工匯編,通過(guò)手工方式查指令編碼表,逐個(gè),通過(guò)手工方式查指令編碼表,逐個(gè)把助記符指令翻譯成機(jī)器碼,然后把得到的機(jī)器把助記符指令翻譯成機(jī)器碼,然后把得到的機(jī)器碼程序(以十六進(jìn)制形式)鍵入到單片機(jī)開(kāi)發(fā)機(jī)碼程序(以十六進(jìn)制形式)鍵入到單片機(jī)開(kāi)發(fā)機(jī)中,并進(jìn)行調(diào)試。中,并

8、進(jìn)行調(diào)試。 機(jī)器匯編機(jī)器匯編,在,在pc上,用交叉匯編程序?qū)R編語(yǔ)上,用交叉匯編程序?qū)R編語(yǔ)言源程序轉(zhuǎn)換為機(jī)器碼形式的目標(biāo)程序。言源程序轉(zhuǎn)換為機(jī)器碼形式的目標(biāo)程序。 匯編形成兩個(gè)主要文件為:列表文件和目標(biāo)匯編形成兩個(gè)主要文件為:列表文件和目標(biāo)碼文件。例:碼文件。例:列表文件列表文件:地地 址址 目標(biāo)碼目標(biāo)碼 匯編程序匯編程序 org 0040h0040h 747f mov a,#7fh0042h 7944 mov r1,#44h end目標(biāo)碼文件目標(biāo)碼文件:首地址首地址 末地址末地址 目標(biāo)碼目標(biāo)碼0040h 0044h 747f7944 匯編程序能識(shí)別并對(duì)匯編過(guò)程進(jìn)行某種控匯編程序能識(shí)別并對(duì)匯

9、編過(guò)程進(jìn)行某種控制的制的匯編命令匯編命令。無(wú)對(duì)應(yīng)的可執(zhí)行目標(biāo)碼。無(wú)對(duì)應(yīng)的可執(zhí)行目標(biāo)碼4.2.2 4.2.2 偽指令偽指令 起始地址設(shè)定起始地址設(shè)定 org 表達(dá)式表達(dá)式 向匯編程序說(shuō)明下面緊接的程序段或數(shù)據(jù)段存向匯編程序說(shuō)明下面緊接的程序段或數(shù)據(jù)段存放的起始地址。放的起始地址。 表達(dá)式通常為表達(dá)式通常為16進(jìn)制地址,也可以是已定義的進(jìn)制地址,也可以是已定義的標(biāo)號(hào)地址。標(biāo)號(hào)地址。 源程序的開(kāi)始,要設(shè)置一條源程序的開(kāi)始,要設(shè)置一條org偽指令來(lái)指定該程偽指令來(lái)指定該程序在存儲(chǔ)器中存放的起始位置。序在存儲(chǔ)器中存放的起始位置。省略省略org,則該程序段從,則該程序段從0000h單元開(kāi)始存放。單元開(kāi)始存

10、放。可以多次使用可以多次使用org偽指令,但要求地址值由小到偽指令,但要求地址值由小到大依序排列,不允許空間重疊。大依序排列,不允許空間重疊。 匯編結(jié)束匯編結(jié)束 end 匯編程序遇到匯編程序遇到end偽指令后即結(jié)束匯編。偽指令后即結(jié)束匯編。 字節(jié)數(shù)據(jù)定義字節(jié)數(shù)據(jù)定義 標(biāo)號(hào):標(biāo)號(hào): db 字節(jié)數(shù)據(jù)表字節(jié)數(shù)據(jù)表 將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從左到右的順將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲(chǔ)單元中。一個(gè)數(shù)據(jù)序依次存放在指定的存儲(chǔ)單元中。一個(gè)數(shù)據(jù)占一個(gè)存儲(chǔ)單元。例:占一個(gè)存儲(chǔ)單元。例:db “how are you?”把字符串中的字符以把字符串中的字符以ascii碼的形式存放在連續(xù)的碼

11、的形式存放在連續(xù)的rom單元中。又如:?jiǎn)卧?。又如:db 2,4,6,8,10,18把把6個(gè)數(shù)轉(zhuǎn)換為十六進(jìn)制表示(個(gè)數(shù)轉(zhuǎn)換為十六進(jìn)制表示(feh,fch,fah,08h,0ah,12h),并連續(xù)地存放在),并連續(xù)地存放在6個(gè)個(gè)rom。 常用于存放數(shù)據(jù)表格。如存放顯示用的十常用于存放數(shù)據(jù)表格。如存放顯示用的十六進(jìn)制的字形碼:六進(jìn)制的字形碼: db 0c0h,0f9h,0a4h,0b0h db 99h,92h,82h,0f8h db 80h,90h,88h,83h db 0c6h,0a1h,86h,84h 字?jǐn)?shù)據(jù)定義字?jǐn)?shù)據(jù)定義 標(biāo)號(hào):標(biāo)號(hào): dw 字?jǐn)?shù)據(jù)表字?jǐn)?shù)據(jù)表 從標(biāo)號(hào)指定的地址單元開(kāi)始,在程序

12、存儲(chǔ)從標(biāo)號(hào)指定的地址單元開(kāi)始,在程序存儲(chǔ)器中定義器中定義字字?jǐn)?shù)據(jù)。應(yīng)注意:高數(shù)據(jù)。應(yīng)注意:高8位存放在低地位存放在低地址單元,低址單元,低8位存放在高地址單元。例:位存放在高地址單元。例: org 1400hdata:dw 324ah,3ch 匯編后,(匯編后,(1400h)=32h,(,(1401h)= 4ah,(1402h)=00h,(,(1403h)=3ch。 空間定義空間定義 標(biāo)號(hào):標(biāo)號(hào): ds 表達(dá)式表達(dá)式 從標(biāo)號(hào)指定的地址單元開(kāi)始,在程序存儲(chǔ)器中保從標(biāo)號(hào)指定的地址單元開(kāi)始,在程序存儲(chǔ)器中保留由表達(dá)式所指定的個(gè)數(shù)的存儲(chǔ)單元,并都填以零留由表達(dá)式所指定的個(gè)數(shù)的存儲(chǔ)單元,并都填以零值。例

13、如:值。例如: org 3000hbuf:ds 50 匯編后,從地址匯編后,從地址3000h開(kāi)始保留開(kāi)始保留50個(gè)存?zhèn)€存儲(chǔ)單元作為備用單元。儲(chǔ)單元作為備用單元。 賦值賦值符號(hào)名符號(hào)名 equ 表達(dá)式表達(dá)式 將表達(dá)式的值或特定的某個(gè)匯編符號(hào)定義將表達(dá)式的值或特定的某個(gè)匯編符號(hào)定義為一個(gè)指定的符號(hào)名。為一個(gè)指定的符號(hào)名。 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單元開(kāi)始存放的單元開(kāi)始存放的10個(gè)無(wú)個(gè)無(wú)符號(hào)數(shù)進(jìn)行求和,并將結(jié)果存入符號(hào)數(shù)進(jìn)行求和,并將結(jié)果存入sum單元中。單元中。 位地址符號(hào)定義位地址符號(hào)定義 符號(hào)名符號(hào)名 bit 位地址表達(dá)式位地址表達(dá)式 將位地址賦給指定的符號(hào)名。位地址表達(dá)式將位地址賦給指定的符號(hào)名。位地址表達(dá)式可以是絕對(duì)地址,也可以是符號(hào)地址??梢允墙^對(duì)地址,也可以是符號(hào)地址。例如:例如: st bit p1.0將將p1.0的位地址賦給符號(hào)

15、名的位地址賦給符號(hào)名st,在其后的編,在其后的編程中就可以用程中就可以用st來(lái)代替來(lái)代替p1.0。4.3 基本程序結(jié)構(gòu)基本程序結(jié)構(gòu) 4.3.1 順序程序順序程序 指無(wú)分支、無(wú)循環(huán)結(jié)構(gòu)的程序。指無(wú)分支、無(wú)循環(huán)結(jié)構(gòu)的程序。一、數(shù)據(jù)傳送一、數(shù)據(jù)傳送 例:內(nèi)部例:內(nèi)部ram的的2ah2eh單元中存儲(chǔ)的數(shù)據(jù)如單元中存儲(chǔ)的數(shù)據(jù)如圖所示。試編寫(xiě)程序?qū)崿F(xiàn)圖示的數(shù)據(jù)傳送結(jié)果。圖所示。試編寫(xiě)程序?qū)崿F(xiàn)圖示的數(shù)據(jù)傳送結(jié)果。方法一:方法一:mov a,2eh ;2字節(jié),字節(jié),1個(gè)機(jī)器周期個(gè)機(jī)器周期mov 2eh,2dh ;3字節(jié),字節(jié),2個(gè)機(jī)器周期個(gè)機(jī)器周期mov 2dh,2ch ;3字節(jié),字節(jié),2個(gè)機(jī)器周期個(gè)機(jī)器周期

16、mov 2ch,2bh ;3字節(jié),字節(jié),2個(gè)機(jī)器周期個(gè)機(jī)器周期mov 2bh,#00h ;3字節(jié),字節(jié),2個(gè)機(jī)器周期個(gè)機(jī)器周期方法二:方法二:clr a ;1字節(jié),字節(jié),1個(gè)機(jī)器周期個(gè)機(jī)器周期xch a,2bh ;2字節(jié),字節(jié),1個(gè)機(jī)器周期個(gè)機(jī)器周期xch a,2ch ;2字節(jié),字節(jié),1個(gè)機(jī)器周期個(gè)機(jī)器周期xch a,2dh ;2字節(jié),字節(jié),1個(gè)機(jī)器周期個(gè)機(jī)器周期xch a,2eh ;2字節(jié),字節(jié),1個(gè)機(jī)器周期個(gè)機(jī)器周期方法一:方法一:14個(gè)字節(jié),個(gè)字節(jié),9個(gè)機(jī)器周期;個(gè)機(jī)器周期;方法二:方法二: 9個(gè)字節(jié),個(gè)字節(jié),5個(gè)機(jī)器周期。個(gè)機(jī)器周期。 例例 有一變量在片內(nèi)有一變量在片內(nèi)ram的的20h

17、單單元,取值范圍:元,取值范圍:00h05h。編制一。編制一段程序,根據(jù)變量值求其平方值,段程序,根據(jù)變量值求其平方值,并存入片內(nèi)并存入片內(nèi)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開(kāi)始結(jié)束 movc a,a+ dptr,用,用dptr指向表指向表首址,則變量與首址,則變量與dptr之和的地址單元中的內(nèi)之和的地址單元中的內(nèi)容就是變量的平方值。容就是變量的平方值。 movc a,a+pc不破壞不破壞dptr的內(nèi)容,從而可以減少保護(hù)的內(nèi)容,從而可以減少保護(hù)dptr的內(nèi)容所需的開(kāi)銷(xiāo)。的內(nèi)容所需的開(kāi)銷(xiāo)。表格存放在表格存放在該該指令后的指令后的256字節(jié)內(nèi)字節(jié)內(nèi)。 三、簡(jiǎn)單運(yùn)算三、簡(jiǎn)單運(yùn)算 對(duì)于多字節(jié)的相加運(yùn)算必須從低位字節(jié)開(kāi)對(duì)于多字節(jié)的相加運(yùn)算必須從低位字節(jié)開(kāi)始分字節(jié)進(jìn)行。除最低字節(jié)可以使用始分字

19、節(jié)進(jìn)行。除最低字節(jié)可以使用add指指令外,其他字節(jié)相加時(shí)要使用令外,其他字節(jié)相加時(shí)要使用addc指令。指令。例例 雙字節(jié)無(wú)符號(hào)數(shù)加法。雙字節(jié)無(wú)符號(hào)數(shù)加法。 設(shè)被加數(shù)存放在內(nèi)部設(shè)被加數(shù)存放在內(nèi)部ram的的51h、50h單元,加單元,加數(shù)存放在內(nèi)部數(shù)存放在內(nèi)部ram的的61h、60h單元,相加的結(jié)果單元,相加的結(jié)果存放在內(nèi)部存放在內(nèi)部ram的的51h、50h單元,進(jìn)位存放在位單元,進(jìn)位存放在位尋址區(qū)的尋址區(qū)的00h位中。(程序見(jiàn)下頁(yè))位中。(程序見(jiàn)下頁(yè)) mov r0mov r0,50h 50h ;被加數(shù)的低字節(jié)地址;被加數(shù)的低字節(jié)地址mov r1mov r1,60h 60h ;加數(shù)的低字節(jié)地址;

20、加數(shù)的低字節(jié)地址mov amov a,r0 r0 ;取被加數(shù)低字節(jié);取被加數(shù)低字節(jié)add aadd a,r1 r1 ;加上加數(shù)低字節(jié);加上加數(shù)低字節(jié)mov r0mov r0,a a ;保存低字節(jié)相加結(jié)果;保存低字節(jié)相加結(jié)果inc r0 inc r0 ;指向被加數(shù)高字節(jié);指向被加數(shù)高字節(jié)inc r1 inc r1 ;指向加數(shù)高字節(jié);指向加數(shù)高字節(jié)mov amov a,r0 r0 ;取被加數(shù)高字節(jié);取被加數(shù)高字節(jié)addc aaddc a,r1 r1 ;加上加數(shù)高字節(jié)(帶進(jìn)位加);加上加數(shù)高字節(jié)(帶進(jìn)位加)mov r0mov r0,a a ;存高字節(jié)相加結(jié)果;存高字節(jié)相加結(jié)果mov 00hmov 0

21、0h,c c ;保存進(jìn)位;保存進(jìn)位 。 4.3.2 4.3.2 分支程序分支程序可分成單分支、雙分支和多分支幾種可分成單分支、雙分支和多分支幾種 :條件成立?條件成立?程序段程序段a下條指令下條指令條件成立?條件成立?程序段程序段a程序段程序段bk=0?k=1?k=2?y分支分支0y分支分支1y分支分支2nnn一、單分支程序一、單分支程序例例 求單字節(jié)有符號(hào)數(shù)的二進(jìn)制補(bǔ)碼。求單字節(jié)有符號(hào)數(shù)的二進(jìn)制補(bǔ)碼。設(shè)有一個(gè)單字節(jié)二進(jìn)制數(shù)存于設(shè)有一個(gè)單字節(jié)二進(jìn)制數(shù)存于a中中。start: jnb acc.7start: jnb acc.7,ok ok ;(;(a a)00,無(wú)需轉(zhuǎn)換,無(wú)需轉(zhuǎn)換 mov cmo

22、v c, acc.7 acc.7 ; mov amov a,r0 r0 ; cpl a cpl a ; 取補(bǔ)取補(bǔ) add aadd a,#1 #1 ; mov acc.7 mov acc.7 ,c c ; 存符號(hào)位存符號(hào)位 okok:ret ret 二、雙分支程序二、雙分支程序例例 設(shè)變量設(shè)變量 x 以補(bǔ)碼的形式存放在片內(nèi)以補(bǔ)碼的形式存放在片內(nèi)ram的的30h單元,變量單元,變量 y 與與 x 的關(guān)系是:當(dāng)?shù)年P(guān)系是:當(dāng) x 大于大于0時(shí),時(shí),y =x;當(dāng);當(dāng) x =0時(shí),時(shí),y =20h;當(dāng);當(dāng) x 小于小于0時(shí),時(shí),y =x+5。編制程序,根據(jù)。編制程序,根據(jù) x 的大小求的大小求y并送回原

23、單元。程序段如下:并送回原單元。程序段如下:startstart:mov amov a,30h 30h jz next jz next anl a anl a,#80h #80h ;判斷符號(hào)位;判斷符號(hào)位 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 $ 三、多分支程序三、多分支程序例例 根據(jù)根據(jù)r7的內(nèi)容轉(zhuǎn)向相應(yīng)的處理程序。的內(nèi)容轉(zhuǎn)向相應(yīng)的處理程序。設(shè)設(shè)r7

24、的內(nèi)容為的內(nèi)容為0n,對(duì)應(yīng)的處理程序的入口地址分別為,對(duì)應(yīng)的處理程序的入口地址分別為pp0ppn。 startstart:mov dptrmov dptr,#tab #tab ;置分支入口地址表首址;置分支入口地址表首址 mov amov a,r7 r7 ;分支轉(zhuǎn)移序號(hào)送;分支轉(zhuǎn)移序號(hào)送a a add a add a,r7 r7 ;分支轉(zhuǎn)移序號(hào)乘以;分支轉(zhuǎn)移序號(hào)乘以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í)行兩種結(jié)構(gòu)兩種結(jié)構(gòu) :一、先執(zhí)行后判斷一、先執(zhí)行后判斷例例 5

26、0ms延時(shí)程序。延時(shí)程序。若晶振頻率為若晶振頻率為12mhz,則一個(gè)機(jī)器周期為,則一個(gè)機(jī)器周期為1s。執(zhí)行一條。執(zhí)行一條djnz指令需要指令需要2個(gè)機(jī)器周期,即個(gè)機(jī)器周期,即 2s。采用循環(huán)計(jì)數(shù)法實(shí)。采用循環(huán)計(jì)數(shù)法實(shí)現(xiàn)延時(shí),循環(huán)次數(shù)可以通過(guò)計(jì)算獲得,并選擇先執(zhí)行后判現(xiàn)延時(shí),循環(huán)次數(shù)可以通過(guò)計(jì)算獲得,并選擇先執(zhí)行后判斷的循環(huán)結(jié)構(gòu)。程序段如下:斷的循環(huán)結(jié)構(gòu)。程序段如下: 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,計(jì)(,計(jì)(2 2123123)ss djnz r7 djnz r7,del1 del1 ;2s2s, ret ret 共計(jì)共計(jì) (2 21231232 2 2 2)200+1 s200+1 s,即,即50.001ms50.001ms 例例 無(wú)符號(hào)數(shù)排序程序。在片內(nèi)無(wú)符號(hào)數(shù)排序程序。在片內(nèi)ram中,起始地中,起始地址為址為30h的的8個(gè)單元中存放有個(gè)單元中存放有8個(gè)無(wú)符號(hào)數(shù)。試對(duì)這個(gè)無(wú)符號(hào)數(shù)。試對(duì)這些無(wú)符號(hào)數(shù)進(jìn)行升序排序。些無(wú)符號(hào)數(shù)進(jìn)行升序排序。冒泡排序法。從前向后進(jìn)行冒泡排序法。從前向后進(jìn)行相鄰數(shù)的比較相鄰數(shù)的比較,如數(shù),如數(shù)據(jù)的大小次序與要求的據(jù)的大小次序與

28、要求的順序不符順序不符就將這兩個(gè)數(shù)就將這兩個(gè)數(shù)互換互換,否則不互換。對(duì)于升序排序,通過(guò)這種相鄰數(shù)的互否則不互換。對(duì)于升序排序,通過(guò)這種相鄰數(shù)的互換,使小數(shù)向前移動(dòng),換,使小數(shù)向前移動(dòng),大數(shù)向后移動(dòng)大數(shù)向后移動(dòng)。一次冒泡。一次冒泡(相鄰數(shù)的互換),就會(huì)把(相鄰數(shù)的互換),就會(huì)把最大的數(shù)換到最后最大的數(shù)換到最后。再再進(jìn)行一次進(jìn)行一次冒泡,就會(huì)把冒泡,就會(huì)把次大的數(shù)次大的數(shù)排在排在倒數(shù)第二倒數(shù)第二的位的位置。置。設(shè)設(shè)r7為比較次數(shù)計(jì)數(shù)器,初始值為為比較次數(shù)計(jì)數(shù)器,初始值為07h,位地址,位地址00h為數(shù)據(jù)互換標(biāo)志位。為數(shù)據(jù)互換標(biāo)志位。 start start:clr 00h clr 00h ;互換標(biāo)

29、志清;互換標(biāo)志清0 0 mov r7 mov r7,#07h #07h ;各次冒泡比較次數(shù);各次冒泡比較次數(shù) mov r0mov r0,#30h #30h ;數(shù)據(jù)區(qū)首址;數(shù)據(jù)區(qū)首址 looploop:mov amov a,r0 r0 ;取前數(shù);取前數(shù) mov 2bhmov 2bh,a a ;暫存;暫存 inc r0 inc r0 mov 2ah mov 2ah,r0 r0 ;取后數(shù);取后數(shù) clr c clr c subb a subb a,r0 r0 ;前數(shù)減后數(shù);前數(shù)減后數(shù) jc next jc next ;前數(shù)小于后數(shù),不互換;前數(shù)小于后數(shù),不互換 mov r0mov r0,2bh 2b

30、h dec r0 dec r0 mov r0 mov r0,2ah 2ah ;兩數(shù)交換;兩數(shù)交換 inc r0 inc r0 ;準(zhǔn)備下一次比較;準(zhǔn)備下一次比較 setb 00h setb 00h ;置互換標(biāo)志;置互換標(biāo)志 nextnext:djnz r7djnz r7,loop loop ;進(jìn)行下一次比較;進(jìn)行下一次比較 jb 00hjb 00h,start start ;進(jìn)行下一輪冒泡;進(jìn)行下一輪冒泡 sjmp $ sjmp $ 二、先判斷后執(zhí)行二、先判斷后執(zhí)行 例例 將內(nèi)部將內(nèi)部ram中起始地址為中起始地址為data的數(shù)據(jù)串傳送到外部的數(shù)據(jù)串傳送到外部ram中起始地址為中起始地址為buff

31、er的存儲(chǔ)區(qū)域內(nèi),直到發(fā)現(xiàn)的存儲(chǔ)區(qū)域內(nèi),直到發(fā)現(xiàn)$ 字符字符停止傳送。由于循環(huán)次數(shù)事先不知道,但停止傳送。由于循環(huán)次數(shù)事先不知道,但循環(huán)條件可以測(cè)試循環(huán)條件可以測(cè)試到。所以,采用先判斷后執(zhí)行的結(jié)構(gòu)比較適宜。到。所以,采用先判斷后執(zhí)行的結(jié)構(gòu)比較適宜。 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、,轉(zhuǎn)結(jié)束字符,轉(zhuǎn)結(jié)束 loop1loop1:movx dptrmovx dptr,a a ;不是;不是 $ $ 字符,執(zhí)行傳送字符,執(zhí)行傳送 inc r0 inc r0 inc dptr inc dptr sjmp loop0 sjmp loop0 ;傳送下一數(shù)據(jù);傳送下一數(shù)據(jù) loop2loop2: 4.3.4 4.3.4 子程序及其調(diào)用子程序及其調(diào)用 子程序的調(diào)用子程序的調(diào)用 對(duì)于通用性的問(wèn)題,例如:數(shù)值轉(zhuǎn)換、數(shù)值計(jì)算對(duì)于通用性的問(wèn)題,例如:數(shù)值轉(zhuǎn)換、數(shù)值計(jì)算等,往往要進(jìn)行多次。宜將其設(shè)計(jì)成等,往往要進(jìn)行多次。宜將其設(shè)計(jì)成子程序。子程序。 子程序在執(zhí)行時(shí)需要由其它程序來(lái)調(diào)用子程序在執(zhí)行時(shí)需

33、要由其它程序來(lái)調(diào)用 執(zhí)行完后又需要把執(zhí)行流程返回到調(diào)用的主程序。執(zhí)行完后又需要把執(zhí)行流程返回到調(diào)用的主程序。 調(diào)用時(shí)注意:一是現(xiàn)場(chǎng)的保護(hù)和恢復(fù);二是主程調(diào)用時(shí)注意:一是現(xiàn)場(chǎng)的保護(hù)和恢復(fù);二是主程序與子程序的參數(shù)傳遞。序與子程序的參數(shù)傳遞。 現(xiàn)場(chǎng)保護(hù)與恢復(fù)現(xiàn)場(chǎng)保護(hù)與恢復(fù) 子程序經(jīng)常用到子程序經(jīng)常用到r0r7、a、dptr,以及,以及psw等。等。而這些單元中的內(nèi)容在調(diào)用結(jié)束后的主程序中仍有用,而這些單元中的內(nèi)容在調(diào)用結(jié)束后的主程序中仍有用,所以所以需要進(jìn)行保護(hù)需要進(jìn)行保護(hù)(即(即現(xiàn)場(chǎng)保護(hù)現(xiàn)場(chǎng)保護(hù))。)。 在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復(fù)其原在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復(fù)其原內(nèi)容

34、,稱(chēng)為內(nèi)容,稱(chēng)為現(xiàn)場(chǎng)恢復(fù)現(xiàn)場(chǎng)恢復(fù)。保護(hù)與恢復(fù)的方法有以下兩種:。保護(hù)與恢復(fù)的方法有以下兩種:在主程序中實(shí)現(xiàn);在主程序中實(shí)現(xiàn);在子程序中實(shí)現(xiàn)。在子程序中實(shí)現(xiàn)。 1、在主程序中實(shí)現(xiàn)、在主程序中實(shí)現(xiàn) push psw push psw ;保護(hù)現(xiàn)場(chǎng);保護(hù)現(xiàn)場(chǎng) push acc push acc ; push b push b ; mov pswmov psw,#10h #10h ;換當(dāng)前工作寄存器組;換當(dāng)前工作寄存器組 lcall addr16 lcall addr16 ;子程序調(diào)用;子程序調(diào)用 pop b pop b ;恢復(fù)現(xiàn)場(chǎng);恢復(fù)現(xiàn)場(chǎng) pop acc pop acc ; pop psw pop

35、psw ; 特點(diǎn)是結(jié)構(gòu)靈活特點(diǎn)是結(jié)構(gòu)靈活。 2、在子程序中實(shí)現(xiàn)、在子程序中實(shí)現(xiàn) sub1sub1:push psw push psw ;保護(hù)現(xiàn)場(chǎng);保護(hù)現(xiàn)場(chǎng) push acc push acc ; push b push b ; mov psw mov psw,#10h #10h ;換當(dāng)前工作寄存器組;換當(dāng)前工作寄存器組 pop b pop b ;恢復(fù)現(xiàn)場(chǎng);恢復(fù)現(xiàn)場(chǎng) pop acc pop acc ; pop psw pop psw ; retret程序規(guī)范、清晰。要注意保護(hù)與恢復(fù)的順序程序規(guī)范、清晰。要注意保護(hù)與恢復(fù)的順序。三、參數(shù)傳遞三、參數(shù)傳遞 傳遞參數(shù)的方法有三種:傳遞參數(shù)的方法有三種:

36、 利用累加器或寄存器利用累加器或寄存器 先把子程序需要的數(shù)據(jù)送入先把子程序需要的數(shù)據(jù)送入a或指定的或指定的工作工作寄存器寄存器中中 當(dāng)子程序執(zhí)行時(shí),可從指定的單元中取得當(dāng)子程序執(zhí)行時(shí),可從指定的單元中取得數(shù)據(jù),執(zhí)行運(yùn)算數(shù)據(jù),執(zhí)行運(yùn)算 子程序也可以用同樣的方法把結(jié)果傳送給子程序也可以用同樣的方法把結(jié)果傳送給主程序。主程序。 例例 編寫(xiě)程序,實(shí)現(xiàn)編寫(xiě)程序,實(shí)現(xiàn)c=a2+b2 。設(shè)。設(shè)a,b,c分別存于內(nèi)分別存于內(nèi)部部ram的的30h,31h,32h三個(gè)單元中。三個(gè)單元中。startstart:mov amov a,30h 30h ;??;取a a acall sqr acall sqr ;調(diào)用查平方

37、表;調(diào)用查平方表 mov r1mov r1,a a ;a2 a2 暫存于暫存于r1r1中中 mov amov a,31h 31h ;??;取b b acall sqr acall sqr ;調(diào)用查平方表;調(diào)用查平方表 add aadd a,r1 r1 ;a2+b2 a2+b2 存于存于a a中中 mov 32hmov 32h,a a ;存結(jié)果;存結(jié)果 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 利用存儲(chǔ)器利用存儲(chǔ)器 數(shù)據(jù)量比較大時(shí),利用存儲(chǔ)器實(shí)現(xiàn)參數(shù)的傳遞,數(shù)據(jù)量比較大時(shí),利用存儲(chǔ)器實(shí)現(xiàn)參數(shù)的傳遞,先建立一個(gè)參數(shù)表,用指針指示參數(shù)表所在位置。先建立一個(gè)參數(shù)表,用指針指示參數(shù)表所在位置。 參數(shù)表建立在內(nèi)部參數(shù)表建立在內(nèi)部ram時(shí),用時(shí),用r0或或r1作指針。作指針。 參數(shù)表建立在外部參數(shù)表建立在外部ram時(shí),用時(shí),用dptr作指針。作指針。 例例 將將r0和和r1指向的內(nèi)部指向的內(nèi)部ram 中兩個(gè)中兩個(gè)3字節(jié)無(wú)字節(jié)無(wú)符號(hào)整數(shù)相加,結(jié)果送到由符號(hào)整數(shù)相加,結(jié)果送到由r0指向的內(nèi)部指向的內(nèi)部ram中。中。入口時(shí),入口時(shí),r

39、0和和r1分別指向加數(shù)和被加數(shù)的低位字分別指向加數(shù)和被加數(shù)的低位字節(jié);出口時(shí),節(jié);出口時(shí),r0指向結(jié)果的高位字節(jié)。低字節(jié)在指向結(jié)果的高位字節(jié)。低字節(jié)在高地址,高字節(jié)在低地址。高地址,高字節(jié)在低地址。 實(shí)現(xiàn)程序:實(shí)現(xiàn)程序: naddnadd:mov r7mov r7,#3 #3 ;三字節(jié)加法;三字節(jié)加法 clr c clr c ;nadd1nadd1:mov amov a,r0 r0 ;取加數(shù)低字節(jié);取加數(shù)低字節(jié) addc aaddc a,r1 r1 ;被加數(shù)低字節(jié)加;被加數(shù)低字節(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 利用堆棧利用堆棧 堆棧傳遞參數(shù)是在子程序嵌套中常采用的堆棧傳遞參數(shù)是在子程序嵌套中常采用的一種方法。一種方法。 例例 把內(nèi)部把內(nèi)部ram中中20h單元中的單元中的1個(gè)字節(jié)十個(gè)字節(jié)十六進(jìn)制數(shù)轉(zhuǎn)換為六進(jìn)制數(shù)轉(zhuǎn)換為2位位ascii碼,存放在碼,存放在r0指指示的兩個(gè)單元中。示的兩個(gè)單元中。 mainmain:mov amov a,20h 20h ; swap aswap a push acc push acc ;參數(shù)入棧;參數(shù)入棧 acall heascacall heasc pop acc pop acc mov

41、 r0 mov r0,a a ;存高位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果;存高位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果 inc r0 inc r0 ;修改指針;修改指針 push 20h push 20h ;參數(shù)入棧;參數(shù)入棧 acall heascacall heasc pop acc pop acc mov r0 mov r0,a a ;存低位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果;存低位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果 sjmp $sjmp $ heascheasc:mov r1mov r1,sp sp ;借用;借用r1r1為堆棧指針為堆棧指針 dec r1dec r1 dec r1 dec r1 ;r1r1指向被轉(zhuǎn)換數(shù)據(jù)指向被轉(zhuǎn)換數(shù)據(jù) xch axch

42、a,r1 r1 ;取被轉(zhuǎn)換數(shù)據(jù);取被轉(zhuǎn)換數(shù)據(jù) anl aanl a,#0fh #0fh ;取一位十六進(jìn)制數(shù);取一位十六進(jìn)制數(shù) add aadd a,#2 #2 ; 所加值為所加值為movcmovc與與dbdb間字節(jié)間字節(jié)數(shù)數(shù) movc amovc a,a+pc a+pc ;查表;查表 xch axch a,r1 r1 ;1 1字節(jié)指令,存結(jié)果于堆棧字節(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 一般說(shuō)來(lái):一般說(shuō)來(lái): 數(shù)據(jù)較少數(shù)據(jù)較少時(shí),采用時(shí),采用寄存器寄存器傳遞方式可傳遞方式可以獲得較快的傳遞速度;以獲得較快的傳遞速度; 數(shù)據(jù)較多數(shù)據(jù)較多時(shí),宜采用時(shí),宜采用存儲(chǔ)器存儲(chǔ)器或或堆棧堆棧方方式傳遞;式傳遞; 若是若是子程序嵌套子程序嵌套,宜采用,宜采用堆棧堆棧方式。方式。4.4 常用程序舉例常用程序舉例4.4.1 算術(shù)運(yùn)算程序算術(shù)運(yùn)算程序 多字節(jié)多字節(jié)數(shù)的數(shù)的加、減加、減運(yùn)算運(yùn)算 合理地運(yùn)用進(jìn)位(借位)標(biāo)志合理地運(yùn)用進(jìn)位(借位)標(biāo)志 例例 多字節(jié)無(wú)符號(hào)數(shù)的加法。多字節(jié)無(wú)符號(hào)數(shù)的加法。設(shè)兩個(gè)設(shè)兩個(gè)n字

44、節(jié)的無(wú)符號(hào)數(shù)分別存放在內(nèi)部字節(jié)的無(wú)符號(hào)數(shù)分別存放在內(nèi)部ram中以中以data1和和data2開(kāi)始的單元中。相加后的結(jié)果要開(kāi)始的單元中。相加后的結(jié)果要求存放在求存放在data2數(shù)據(jù)區(qū)。數(shù)據(jù)區(qū)。 mov r0 mov r0,#data1 #data1 ; mov r1mov r1,#data2 #data2 ; mov r7mov r7,#n #n ;置字節(jié)數(shù);置字節(jié)數(shù) clr c clr c ; looploop:mov amov a,r0 r0 ; addc aaddc a,r1 r1 ;求和;求和 mov r1mov r1,a a ;存結(jié)果;存結(jié)果 inc r0 inc r0 ;修改指針;修

45、改指針 inc r1 inc r1 ; djnz r7djnz r7, loop loop ; 多字節(jié)數(shù)多字節(jié)數(shù)乘法乘法運(yùn)算運(yùn)算例例 設(shè)雙字節(jié)無(wú)符號(hào)被乘數(shù)存放在設(shè)雙字節(jié)無(wú)符號(hào)被乘數(shù)存放在r3、r2中,中,乘數(shù)存放在乘數(shù)存放在r5、r4中,中,r0指向積的高位。指向積的高位。 例例 多字節(jié)無(wú)符號(hào)數(shù)的多字節(jié)無(wú)符號(hào)數(shù)的減法減法。 設(shè)兩設(shè)兩n字節(jié)數(shù)分別放在內(nèi)部字節(jié)數(shù)分別放在內(nèi)部ram中以中以data1和和data2開(kāi)始的單元中。相減后的結(jié)果要求存放在開(kāi)始的單元中。相減后的結(jié)果要求存放在data2數(shù)據(jù)區(qū)數(shù)據(jù)區(qū)。 mov r0mov r0,#data1 #data1 ; mov r1mov r1,#dat

46、a2 #data2 ; mov r7mov r7,#n #n ;置字節(jié)數(shù);置字節(jié)數(shù) clr c clr c ; looploop:mov amov a,r0 r0 ; subb asubb a,r1 r1 ;求差;求差 mov r1mov r1,a a ;存結(jié)果;存結(jié)果 inc r0 inc r0 ;修改指針;修改指針 inc r1 inc r1 ; djnz r7djnz r7,loop loop ;主程序:主程序: multbmultb:mov r7mov r7,#04 #04 ;結(jié)果單元清;結(jié)果單元清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中被調(diào)用)中被調(diào)用)子程序段:子程序段: 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 ;加進(jìn)位;加進(jìn)位 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 十六進(jìn)制數(shù)與十六進(jìn)制數(shù)與ascii碼間的轉(zhuǎn)換碼間的轉(zhuǎn)換 數(shù)在數(shù)在09之間時(shí),之間時(shí),ascii碼值為該數(shù)加碼值為該數(shù)加30h 數(shù)在數(shù)在af之間時(shí),之間時(shí),ascii碼值為該數(shù)加碼值為該數(shù)加37h4.4.2 碼型轉(zhuǎn)換碼型轉(zhuǎn)換

50、例:例: 將將1位十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的位十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的ascii碼。碼。 設(shè)十六進(jìn)制數(shù)存放在設(shè)十六進(jìn)制數(shù)存放在r0中,轉(zhuǎn)換后的中,轉(zhuǎn)換后的ascii 碼存碼存放于放于r2中。中。haschasc:mov amov a,r0 r0 ;??;取4 4位二進(jìn)制數(shù)位二進(jìn)制數(shù) anl aanl a,#0fh #0fh ;屏蔽掉高;屏蔽掉高4 4位位 push acc push acc ;4 4位二進(jìn)制數(shù)入棧位二進(jìn)制數(shù)入棧 clr c clr c ;清進(jìn)(借)位位;清進(jìn)(借)位位 subb asubb a,#0ah #0ah ;用借位位的狀態(tài)判斷該數(shù)在;用借位位的狀態(tài)判斷該數(shù)在0 09 9還是還是

51、a af f之間之間 pop acc pop acc ;彈出原;彈出原4 4位二進(jìn)制數(shù)位二進(jìn)制數(shù) jc loop jc loop ;借位位為;借位位為1 1,跳轉(zhuǎn)至,跳轉(zhuǎn)至looploop add a add a,#07h #07h ;借位位為;借位位為0 0,該數(shù)在,該數(shù)在a af f之間,加之間,加37h37hlooploop:add aadd a,#30h #30h ;該數(shù)在;該數(shù)在0 09 9之間,加之間,加30h30h mov r2 mov r2,a a ;asciiascii碼存于碼存于r2r2 ret ret 例:將多位十六進(jìn)制數(shù)轉(zhuǎn)換成例:將多位十六進(jìn)制數(shù)轉(zhuǎn)換成ascii碼碼。

52、設(shè)地址指針設(shè)地址指針r0指向十六進(jìn)制數(shù)低位,指向十六進(jìn)制數(shù)低位,r2中中存放字節(jié)數(shù),轉(zhuǎn)換后地址指針存放字節(jié)數(shù),轉(zhuǎn)換后地址指針r0指向十六進(jìn)制指向十六進(jìn)制數(shù)的高位。數(shù)的高位。r1指向要存放的指向要存放的ascii碼的高位地碼的高位地址。實(shí)現(xiàn)程序如下:址。實(shí)現(xiàn)程序如下: htasc htasc:mov amov a,r0 r0 ;取低;取低4 4位二進(jìn)制數(shù)位二進(jìn)制數(shù) 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 ;取十六進(jìn)制高;取十六進(jìn)制高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é)數(shù)存于;字節(jié)數(shù)存于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碼與二進(jìn)制數(shù)之間的轉(zhuǎn)換碼與二進(jìn)制數(shù)之間的轉(zhuǎn)換 4位二進(jìn)制數(shù)可以表示位二進(jìn)制數(shù)可以表示1位位bcd碼,碼,1個(gè)字節(jié)可以表個(gè)字節(jié)可以表示示2位位bcd碼(稱(chēng)為壓縮型碼(稱(chēng)為壓縮型bcd碼)。碼)。例例 雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成bcd碼。碼。 設(shè)(設(shè)(r2r3)為雙字節(jié)二進(jìn)制數(shù),()為雙字節(jié)二進(jìn)制數(shù),(r4r5r6)為)為轉(zhuǎn)換完的壓縮型轉(zhuǎn)換完的壓縮型bcd碼。碼。十進(jìn)制數(shù)十

55、進(jìn)制數(shù)b與一個(gè)與一個(gè)8位的二進(jìn)制數(shù)的關(guān)系可以表示為:位的二進(jìn)制數(shù)的關(guān)系可以表示為: 只要依十進(jìn)制運(yùn)算法則,將只要依十進(jìn)制運(yùn)算法則,將 bi(i7,6, ,1,0)按權(quán)相加,就可以得到對(duì)應(yīng)的十進(jìn)制數(shù))按權(quán)相加,就可以得到對(duì)應(yīng)的十進(jìn)制數(shù)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 ;計(jì)

56、數(shù)初值;計(jì)數(shù)初值 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并調(diào)整后送回并調(diào)整后送回 mov amov a,r5 r5 ; addc aaddc a

57、,r5 r5 ; da a da a ; mov r5mov r5,a a ;(;(r5r5)乘)乘2 2并調(diào)整后送回并調(diào)整后送回 mov amov a,r4 r4 ; addc aaddc a,r4 r4 ; da a da a ; mov r4mov r4,a a ;(;(r4r4)乘)乘2 2并調(diào)整后送回并調(diào)整后送回 djnz r7djnz r7,loop loop ;1、80c51單片機(jī)匯編語(yǔ)言有何特點(diǎn)?單片機(jī)匯編語(yǔ)言有何特點(diǎn)?2、利用、利用80c51匯編語(yǔ)言進(jìn)行程序設(shè)計(jì)的步驟如何?匯編語(yǔ)言進(jìn)行程序設(shè)計(jì)的步驟如何?3、常用的程序結(jié)構(gòu)有哪幾種?特點(diǎn)如何?、常用的程序結(jié)構(gòu)有哪幾種?特點(diǎn)如何

58、?4、子程序調(diào)用時(shí),參數(shù)的傳遞方法有哪幾種?、子程序調(diào)用時(shí),參數(shù)的傳遞方法有哪幾種?5、什么是偽指令?常用的偽指令功能如何?、什么是偽指令?常用的偽指令功能如何?6、設(shè)被加數(shù)存放在內(nèi)部、設(shè)被加數(shù)存放在內(nèi)部ram的的20h、21h單元,加數(shù)單元,加數(shù)存放在存放在22h、23h單元,若要求和存放在單元,若要求和存放在24h、25h中,中,試編寫(xiě)出試編寫(xiě)出16位數(shù)相加的程序。位數(shù)相加的程序。7、編寫(xiě)一段程序,把外部、編寫(xiě)一段程序,把外部ram中中1000h1030h的內(nèi)的內(nèi)容傳送到內(nèi)部容傳送到內(nèi)部ram的的30h60h中。中。8、編寫(xiě)程序,實(shí)現(xiàn)雙字節(jié)無(wú)符號(hào)數(shù)加法運(yùn)算,要求、編寫(xiě)程序,實(shí)現(xiàn)雙字節(jié)無(wú)符號(hào)

59、數(shù)加法運(yùn)算,要求 (r1r0)+(r7r6)(61h60h)。)。思考題及習(xí)題思考題及習(xí)題9、若、若80c51晶振頻率為晶振頻率為6mhz,試計(jì)算延時(shí)子程序的延時(shí)時(shí)間。,試計(jì)算延時(shí)子程序的延時(shí)時(shí)間。delay:mov r7,#0f6h lp:mov r6,#0fah djnz r6,$ djnz r7,lp ret10、在內(nèi)部、在內(nèi)部ram 的的21h單元開(kāi)始存有一組單字節(jié)不帶符號(hào)數(shù),單元開(kāi)始存有一組單字節(jié)不帶符號(hào)數(shù),數(shù)據(jù)長(zhǎng)度為數(shù)據(jù)長(zhǎng)度為30h,要求找出最大數(shù)存入,要求找出最大數(shù)存入big單元。單元。11、編寫(xiě)程序,把累加器、編寫(xiě)程序,把累加器a中的二進(jìn)制數(shù)變換成中的二進(jìn)制數(shù)變換成3位位bcd

60、碼,并碼,并將百、十、個(gè)位數(shù)分別存放在內(nèi)部將百、十、個(gè)位數(shù)分別存放在內(nèi)部ram的的50h、51h、52h中。中。12、編寫(xiě)子程序,將、編寫(xiě)子程序,將r1中的中的2個(gè)十六進(jìn)制數(shù)轉(zhuǎn)換為個(gè)十六進(jìn)制數(shù)轉(zhuǎn)換為ascii碼后存碼后存放在放在r3和和r4中。中。 13、編寫(xiě)程序,求內(nèi)部、編寫(xiě)程序,求內(nèi)部ram中中50h59h十個(gè)單元內(nèi)容的平均值,十個(gè)單元內(nèi)容的平均值,并存放在并存放在5ah單元。單元。疪被反輼牸牸曥喒醷詐捫閨銓鋠防窮滸誩萠偌諊紓裶慏彅寠椖蓬歀耚絳棛搗畹瀵醎姍義藌進(jìn)壩綎襯經(jīng)椡絎償齷旰棟庇羏濺欰坘儞锜齔燭苐莘努拆滐駑閹塕倵絅緲嶙淴北蓋葵婅瓎耒窻臫阬兔筈齳韉餞榮繪碇嚔驢腉峸匿瑐凳坽驓嘪蕰韽賌愝聆棔

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論