單片機(jī)和接口技術(shù)2ppt課件_第1頁(yè)
單片機(jī)和接口技術(shù)2ppt課件_第2頁(yè)
單片機(jī)和接口技術(shù)2ppt課件_第3頁(yè)
單片機(jī)和接口技術(shù)2ppt課件_第4頁(yè)
單片機(jī)和接口技術(shù)2ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩175頁(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ù)指標(biāo)技術(shù)指標(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í)施細(xì)節(jié)。程序模塊的具體實(shí)施細(xì)節(jié)。三、程序總體設(shè)計(jì)及流程圖繪制三、程序總體設(shè)計(jì)及流程圖繪制開(kāi)場(chǎng)、終了開(kāi)場(chǎng)、終了判斷分支判斷分支程序流向程序流向工作任務(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)初值和結(jié)束條件死循環(huán),注意循環(huán)初值和結(jié)束條件 子程序用到的寄存器內(nèi)容應(yīng)壓棧保護(hù),并注意堆子程序用到的寄存器內(nèi)容應(yīng)壓棧保護(hù),并注意堆棧操作的壓入和彈出的平衡;棧操作的壓入和彈出的平衡;中斷處理子程序除了要保護(hù)程序中用到的中斷處理子程序除了要保護(hù)程序中用到的寄存器外,還應(yīng)保護(hù)標(biāo)志寄存器。寄存器外,還

4、應(yīng)保護(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è)字符必須是字母,其余為字母、數(shù)字或其他特個(gè)字符必須是字母,其余為字母、數(shù)字或其他特定字符定字符 不使用已定義

5、的符號(hào)不使用已定義的符號(hào) 后邊必須跟冒號(hào)后邊必須跟冒號(hào) 操作數(shù)操作數(shù) 給指令的操作提供數(shù)據(jù)或地址。匯編語(yǔ)句中操作給指令的操作提供數(shù)據(jù)或地址。匯編語(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ù)的表示形式 二

6、進(jìn)制數(shù),末尾以字母二進(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)試。中,并進(jìn)行調(diào)試

8、。 機(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ì)匯編過(guò)程進(jìn)行某

9、種控制的匯編命令。無(wú)對(duì)應(yīng)的行某種控制的匯編命令。無(wú)對(duì)應(yīng)的可執(zhí)行目標(biāo)碼可執(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ǔ)器中存放的起始位置。省略省略O(shè)RG,則該程序段從,則該程序段從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ǔ)單元中。右的順序依次存放在指定的存儲(chǔ)單元中。一個(gè)數(shù)據(jù)占一個(gè)存儲(chǔ)單元。例:一個(gè)數(shù)據(jù)占一個(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,F(xiàn)CH,F(xiàn)AH,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)始,在程序從標(biāo)號(hào)指

12、定的地址單元開(kāi)始,在程序存儲(chǔ)器中定義字?jǐn)?shù)據(jù)。應(yīng)注意:高存儲(chǔ)器中定義字?jǐn)?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 10 SUM EQU 21H BLOCK EQU 22H CLR A MOV R7,LEN MOV R0,BLOCK LOOP:ADD A,R0 INC R0 DJNZ R7,LOOP MOV SUM,A END 功能:把BLOCK單元開(kāi)始存放的10個(gè)無(wú)符號(hào)數(shù)進(jìn)行求和,并

14、將結(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)名的位地址賦給符號(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單元中

15、存儲(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ī)器周期期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

16、個(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單單元,取值范圍:元,取值范圍:00H05H。編制一。編制一段程序,根據(jù)變量值求其平方值,段程序,根據(jù)變量值求其平方值,并存入片內(nèi)并存入片內(nèi)RAM的的21H單元。程序單元。程序如下:如下: ORG 1000HSTART:MOV DPTR,#2000H MOV A,20H MOVC A,A

17、+DPTR MOV 21H,A SJMP $ ORG 2000HTABLE:DB 00,01,04,09,16,25 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)算

18、對(duì)于多字節(jié)的相加運(yùn)算必須從低位字節(jié)開(kāi)對(duì)于多字節(jié)的相加運(yùn)算必須從低位字節(jié)開(kāi)始分字節(jié)進(jìn)行。除最低字節(jié)可以使用始分字節(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

19、50H ;被加數(shù)的低字節(jié)地址;被加數(shù)的低字節(jié)地址MOV R1MOV R1,60H 60H ;加數(shù)的低字節(jié)地址;加數(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ù)高字

20、節(jié)帶進(jìn)位加)MOV R0MOV R0,A A ;存高字節(jié)相加結(jié)果;存高字節(jié)相加結(jié)果MOV 00HMOV 00H,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 AC

21、C.7START: JNB ACC.7,OK OK ;(;(A A)00,無(wú)需轉(zhuǎn)換,無(wú)需轉(zhuǎn)換 MOV CMOV 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

22、;當(dāng);當(dāng) x 小于小于0時(shí),時(shí),y =x+5。編制程序,根據(jù)編制程序,根據(jù) x 的大小求的大小求y并送回原單元。程序并送回原單元。程序段如下:段如下:START:MOV A,30H JZ NEXT ANL A,#80H ;判斷符號(hào)位;判斷符號(hào)位 JZ LP MOV A,#05H ADD A,30H MOV 30H,A SJMP LP NEXT:MOV 30H,#20H LP:SJMP $ 三、多分支程序三、多分支程序例例 根據(jù)根據(jù)R7的內(nèi)容轉(zhuǎn)向相應(yīng)的處理程序。的內(nèi)容轉(zhuǎn)向相應(yīng)的處理程序。設(shè)設(shè)R7的內(nèi)容為的內(nèi)容為0N,對(duì)應(yīng)的處理程序的入口地址分,對(duì)應(yīng)的處理程序的入口地址分別為別為PP0PPN。 S

23、TART:MOV DPTR,#TAB ;置分支入口地;置分支入口地址表首址址表首址 MOV A,R7 ;分支轉(zhuǎn)移序號(hào)送;分支轉(zhuǎn)移序號(hào)送A ADD A,R7 ;分支轉(zhuǎn)移序號(hào)乘以;分支轉(zhuǎn)移序號(hào)乘以2 MOV R3,A ;暫存于;暫存于R3 MOVC A,A+DPTR ;取高位地址;取高位地址 XCH A,R3 INC A MOVC A,A+DPTR ;取低位地址;取低位地址 MOV DPL,A ;處理程序入口地址低;處理程序入口地址低8位送位送DPL MOV DPH,R3 ;處理程序入口地址高;處理程序入口地址高8位送位送DPH CLR A JMP A+DPTR TAB:DW PP0 DW PP1

24、 DW PPN 4.3.3 4.3.3 循環(huán)程序循環(huán)程序有先執(zhí)行后判斷和先判斷后執(zhí)行兩種結(jié)構(gòu)有先執(zhí)行后判斷和先判斷后執(zhí)行兩種結(jié)構(gòu) :一、先執(zhí)行后判斷一、先執(zhí)行后判斷例例 50ms延時(shí)程序。延時(shí)程序。若晶振頻率為若晶振頻率為12MHz,則一個(gè)機(jī)器周期為,則一個(gè)機(jī)器周期為1s。執(zhí)。執(zhí)行一條行一條DJNZ指令需要指令需要2個(gè)機(jī)器周期,即個(gè)機(jī)器周期,即 2s。采。采用循環(huán)計(jì)數(shù)法實(shí)現(xiàn)延時(shí),循環(huán)次數(shù)可以通過(guò)計(jì)算獲用循環(huán)計(jì)數(shù)法實(shí)現(xiàn)延時(shí),循環(huán)次數(shù)可以通過(guò)計(jì)算獲得,并選擇先執(zhí)行后判斷的循環(huán)結(jié)構(gòu)。程序段如下:得,并選擇先執(zhí)行后判斷的循環(huán)結(jié)構(gòu)。程序段如下: DEL:MOV R7,#200 ;1 sDEL1:MOV

25、R6,#123 ;1 s NOP ;1 sDEL2:DJNZ R6,DEL2 ;2s,計(jì),計(jì)2123s DJNZ R7,DEL1 ;2s, RET 合計(jì)合計(jì) (21232 2)200+1 s,即,即50.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)行相鄰數(shù)的比較,如數(shù)據(jù)冒泡排序法。從前向后進(jìn)行相鄰數(shù)的比較,如數(shù)據(jù)的大小次序與要求的順序不符就將這兩個(gè)數(shù)互換,的大小次序與要求的順序不符就將這兩個(gè)數(shù)

26、互換,否則不互換。對(duì)于升序排序,通過(guò)這種相鄰數(shù)的互否則不互換。對(duì)于升序排序,通過(guò)這種相鄰數(shù)的互換,使小數(shù)向前移動(dòng),大數(shù)向后移動(dòng)。一次冒泡換,使小數(shù)向前移動(dòng),大數(shù)向后移動(dòng)。一次冒泡相鄰數(shù)的互換),就會(huì)把最大的數(shù)換到最后。再相鄰數(shù)的互換),就會(huì)把最大的數(shù)換到最后。再進(jìn)行一次冒泡,就會(huì)把次大的數(shù)排在倒數(shù)第二的位進(jìn)行一次冒泡,就會(huì)把次大的數(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)志清;互換標(biāo)志清0 0 MOV R7 MOV R7,

27、#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 2BH DEC R0 DEC R0 MOV R0 MOV

28、 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中起始地址為中起始地址為buffer的存儲(chǔ)區(qū)域內(nèi),直的存儲(chǔ)區(qū)域內(nèi),直到發(fā)現(xiàn)到發(fā)現(xiàn)$

29、字符停止傳送。由于循環(huán)次數(shù)事先不知字符停止傳送。由于循環(huán)次數(shù)事先不知道,但循環(huán)條件可以測(cè)試到。所以,采用先判斷后執(zhí)道,但循環(huán)條件可以測(cè)試到。所以,采用先判斷后執(zhí)行的結(jié)構(gòu)比較適宜。行的結(jié)構(gòu)比較適宜。 MOV R0,#data MOV DPTR,#buffer LOOP0:MOV A,R0 CJNE A,#24H,LOOP1 ;判是否為;判是否為 $ 字符字符 SJMP LOOP2 ;是;是 $ 字符,轉(zhuǎn)結(jié)字符,轉(zhuǎn)結(jié)束束 LOOP1:MOVX DPTR,A ;不是;不是 $ 字符,字符,執(zhí)行傳送執(zhí)行傳送 INC R0 INC DPTR SJMP LOOP0 ;傳送下一數(shù)據(jù);傳送下一數(shù)據(jù) LOOP2

30、: 4.3.4 4.3.4 子程序及其調(diào)用子程序及其調(diào)用 子程序的調(diào)用子程序的調(diào)用 對(duì)于通用性的問(wèn)題,例如:數(shù)值轉(zhuǎn)換、數(shù)對(duì)于通用性的問(wèn)題,例如:數(shù)值轉(zhuǎn)換、數(shù)值計(jì)算等,往往要進(jìn)行多次。宜將其設(shè)計(jì)成值計(jì)算等,往往要進(jìn)行多次。宜將其設(shè)計(jì)成子程序。子程序。 子程序在執(zhí)行時(shí)需要由其它程序來(lái)調(diào)用子程序在執(zhí)行時(shí)需要由其它程序來(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)常用到R

31、0R7、A、DPTR,以及,以及PSW等。而這些單元中的內(nèi)容在調(diào)用結(jié)束后的等。而這些單元中的內(nèi)容在調(diào)用結(jié)束后的主程序中仍有用,所以需要進(jìn)行保護(hù)即現(xiàn)場(chǎng)主程序中仍有用,所以需要進(jìn)行保護(hù)即現(xiàn)場(chǎng)保護(hù))。保護(hù))。 在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復(fù)其原在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復(fù)其原內(nèi)容,稱(chēng)為現(xiàn)場(chǎng)恢復(fù)。保護(hù)與恢復(fù)的方法有以下兩種:內(nèi)容,稱(chēng)為現(xiàn)場(chǎng)恢復(fù)。保護(hù)與恢復(fù)的方法有以下兩種:在主程序中實(shí)現(xiàn);在主程序中實(shí)現(xiàn);在子程序中實(shí)現(xiàn)。在子程序中實(shí)現(xiàn)。 1、在主程序中實(shí)現(xiàn)、在主程序中實(shí)現(xiàn) PUSH PSW ;保護(hù)現(xiàn)場(chǎng);保護(hù)現(xiàn)場(chǎng) PUSH ACC ; PUSH B ; MOV PSW,#10H ;換

32、當(dāng)前工作寄存器組;換當(dāng)前工作寄存器組 LCALL addr16 ;子程序調(diào)用;子程序調(diào)用 POP B ;恢復(fù)現(xiàn)場(chǎng);恢復(fù)現(xiàn)場(chǎng) POP ACC ; POP PSW ; 特點(diǎn)是結(jié)構(gòu)靈活。特點(diǎn)是結(jié)構(gòu)靈活。 2、在子程序中實(shí)現(xiàn)、在子程序中實(shí)現(xiàn) SUB1:PUSH PSW ;保護(hù)現(xiàn)場(chǎng);保護(hù)現(xiàn)場(chǎng) PUSH ACC ; PUSH B ; MOV PSW,#10H ;換當(dāng)前工作寄;換當(dāng)前工作寄存器組存器組 POP B ;恢復(fù)現(xiàn)場(chǎng);恢復(fù)現(xiàn)場(chǎng) POP ACC ; POP PSW ; RET程序規(guī)范、明晰。要注意保護(hù)與恢復(fù)的順序。程序規(guī)范、明晰。要注意保護(hù)與恢復(fù)的順序。三、參數(shù)傳遞三、參數(shù)傳遞 傳遞參數(shù)的方法有三種:

33、傳遞參數(shù)的方法有三種: 利用累加器或寄存器利用累加器或寄存器 先把子程序需要的數(shù)據(jù)送入先把子程序需要的數(shù)據(jù)送入A或指定的工作或指定的工作寄存器中寄存器中 當(dāng)子程序執(zhí)行時(shí),可從指定的單元中取得數(shù)當(dāng)子程序執(zhí)行時(shí),可從指定的單元中取得數(shù)據(jù),執(zhí)行運(yùn)算據(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è)單元中。START:MOV A,30H ;??;取a ACALL SQR ;調(diào)用查平方表;調(diào)用查平方表 MOV R1

34、,A ;a2 暫存于暫存于R1中中 MOV A,31H ;??;取b ACALL SQR ;調(diào)用查平方表;調(diào)用查平方表 ADD A,R1 ;a2+b2 存于存于A中中 MOV 32H,A ;存結(jié)果;存結(jié)果 SJMP $ SQR :MOV DPTR,#TAB ;子程序;子程序 MOVC A,A+DPTR ; RET TAB :DB 0,1,4,9,16 ,25,36,49,64,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ù)

35、表建立在內(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í),R0和和R1分別指向加數(shù)和被加數(shù)的低位字分別指向加數(shù)和被加數(shù)的低位字節(jié);出口時(shí),節(jié);出口時(shí),R0指向結(jié)果的高位字節(jié)。低字節(jié)在指向結(jié)果的高位字節(jié)。低字節(jié)在高地址,高字節(jié)在低地址。高地址,高字節(jié)在低地址。 實(shí)現(xiàn)程序:實(shí)現(xiàn)程序: NADD:MOV R7,#3 ;三字節(jié)加法;三字節(jié)加法 CLR

36、 C ;NADD1:MOV A,R0 ;取加數(shù)低字節(jié);取加數(shù)低字節(jié) ADDC A,R1 ;被加數(shù)低字節(jié)加;被加數(shù)低字節(jié)加A MOV R0,A ; DEC R0 DEC R1 DJNZ R7,NADD1 INC R0 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è)單元中。 MAIN:MOV A,20H ; SWAP A PUSH ACC ;參數(shù)入棧 ACALL

37、HEASC POP ACC MOV R0,A ;存高位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果 INC R0 ;修改指針 PUSH 20H ;參數(shù)入棧 ACALL HEASC POP ACC MOV R0,A ;存低位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果 SJMP $ HEASC HEASC:MOV R1MOV R1,SP SP ;借用;借用R1R1為堆棧指針為堆棧指針 DEC R1DEC R1 DEC R1 DEC R1 ;R1R1指向被轉(zhuǎn)換數(shù)據(jù)指向被轉(zhuǎn)換數(shù)據(jù) XCH AXCH 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

38、#2 ; 所加值為所加值為MOVCMOVC與與DBDB間字節(jié)數(shù)間字節(jié)數(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é)指令A(yù)SCTABASCTAB:DB 30HDB 30H,31H31H,32H32H,33H33H,34H34H,35H35H,36H36H,37H37H DB 38H DB 38H,39H39H,41H41H,42H42H,43H43H,44H44H,45H45H,46H 46H 一般說(shuō)來(lái):一般說(shuō)來(lái): 數(shù)據(jù)較少時(shí),采用寄存器傳遞方式數(shù)據(jù)較少時(shí)

39、,采用寄存器傳遞方式可以獲得較快的傳遞速度;可以獲得較快的傳遞速度; 數(shù)據(jù)較多時(shí),宜采用存儲(chǔ)器或堆棧數(shù)據(jù)較多時(shí),宜采用存儲(chǔ)器或堆棧方式傳遞;方式傳遞; 若是子程序嵌套,宜采用堆棧方式。若是子程序嵌套,宜采用堆棧方式。4.4 常用程序舉例常用程序舉例4.4.1 算術(shù)運(yùn)算程序算術(shù)運(yùn)算程序 多字節(jié)數(shù)的加、減運(yùn)算多字節(jié)數(shù)的加、減運(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字節(jié)的無(wú)符號(hào)數(shù)分別存放在內(nèi)部字節(jié)的無(wú)符號(hào)數(shù)分別存放在內(nèi)部RAM中以中以DATA1和和DATA2開(kāi)始的單元中。相加后的結(jié)果要開(kāi)始的單元中。相加后的結(jié)果要求存放在求存

40、放在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 ;修改指針;修改指針 INC R1 INC R1 ; DJNZ R7DJNZ R7, LOOP LOOP ; 多字節(jié)數(shù)乘法運(yùn)算多字節(jié)數(shù)乘法運(yùn)算例例 設(shè)雙字節(jié)無(wú)符號(hào)被乘數(shù)存放在

41、設(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)始的單元中。相減后的開(kāi)始的單元中。相減后的結(jié)果要求存放在結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。數(shù)據(jù)區(qū)。 MOV R0,#DATA1 ; MOV R1,#DATA2 ; MOV R7,#N ;置字節(jié)數(shù);置字節(jié)數(shù) CLR C ; LOOP:MOV A,R0 ; SUBB A,R1 ;求差;求差 MOV R1,A ;存結(jié)果;存結(jié)果 INC R0 ;修改指針

42、;修改指針 INC R1 ; DJNZ R7,LOOP ;主程序:主程序: MULTB:MOV R7,#04 ;結(jié)果;結(jié)果單元清單元清0 LOOP:MOV R0,#00H ; DJNZ R7,LOOP ; DEC R0 ACALL BMUL ; SJMP $另有另有2段子程序:段子程序: BMUL RADD在在BMUL中被調(diào)用)中被調(diào)用)子程序段:子程序段: RADD:ADD A,R0 ; MOV R0,A ; MOV A,B ; INC R0 ; ADDC A,R0 ; MOV R0,A ; INC R0 ; MOV A,R0 ; ADDC A,#00H ;加進(jìn)位;加進(jìn)位 MOV R0,A

43、; RET 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 ;交叉乘;交叉乘 DEC R0 DEC R0 ; DEC R0 DEC R0 ; ACALL

44、 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)換 例:例: 將將1位十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的位十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的ASCII碼。碼。 設(shè)十六

45、進(jìn)制數(shù)存放在設(shè)十六進(jìn)制數(shù)存放在R0中,轉(zhuǎn)換后的中,轉(zhuǎn)換后的ASCII 碼存放于碼存放于R2中。中。HASC:MOV A,R0 ;??;取4位二進(jìn)制數(shù)位二進(jìn)制數(shù) ANL A,#0FH ;屏蔽掉高;屏蔽掉高4位位 PUSH ACC ;4位二進(jìn)制數(shù)入棧位二進(jìn)制數(shù)入棧 CLR C ;清進(jìn)借位位;清進(jìn)借位位 SUBB A,#0AH ;用借位位的狀態(tài)判斷;用借位位的狀態(tài)判斷該數(shù)在該數(shù)在09還是還是AF之間之間 POP ACC ;彈出原;彈出原4位二進(jìn)制數(shù)位二進(jìn)制數(shù) JC LOOP ;借位位為;借位位為1,跳轉(zhuǎn)至,跳轉(zhuǎn)至LOOP ADD A,#07H ;借位位為;借位位為0,該數(shù)在,該數(shù)在AF之間,加之間,加

46、37HLOOP:ADD A,#30H ;該數(shù)在;該數(shù)在09之間,之間,加加30H MOV R2,A ;ASCII碼存于碼存于R2 RET 例:將多位十六進(jìn)制數(shù)轉(zhuǎn)換成例:將多位十六進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼。碼。 設(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,#

47、0FH #0FH ; ADD AADD A,#15 #15 ;偏移量修正;偏移量修正 MOVC AMOVC A,A+PC A+PC ;查表;查表 MOV R1MOV R1,A A ;存;存ASCIIASCII碼碼 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 ;指向下一單元;指向下

48、一單元 INC R1 INC R1 ; DJNZ R2DJNZ R2,HTASC HTASC ;字節(jié)數(shù)存于;字節(jié)數(shù)存于R2R2 RET RETASCTABASCTAB:DB 30HDB 30H,31H31H,32H32H,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

49、碼)。碼)。例例 雙字節(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ù)十進(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)算法則,將 bii7,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

50、 ;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ì)數(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

51、 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,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ī)匯

52、編語(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)如何?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ě)一段程

53、序,把外部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)數(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ù)

54、據(jù)長(zhǎng)度為數(shù)據(jù)長(zhǎng)度為30H,要求找出最大數(shù)存入,要求找出最大數(shù)存入BIG單元。單元。11、編寫(xiě)程序,把累加器、編寫(xiě)程序,把累加器A中的二進(jìn)制數(shù)變換成中的二進(jìn)制數(shù)變換成3位位BCD碼,并碼,并將百、十、個(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單元。單元。5.1 80C51的中斷系統(tǒng)的中斷

55、系統(tǒng)5.2 80C51的中斷處理過(guò)程的中斷處理過(guò)程5.3 80C51的定時(shí)的定時(shí)/計(jì)數(shù)器計(jì)數(shù)器第第5 5章章 80C5180C51的中斷系統(tǒng)及定時(shí)的中斷系統(tǒng)及定時(shí)/ /計(jì)數(shù)器計(jì)數(shù)器 本章內(nèi)容:本章內(nèi)容:5.1 80C51的中斷系統(tǒng)的中斷系統(tǒng) 5.1.1 80C515.1.1 80C51的中斷系統(tǒng)結(jié)構(gòu)的中斷系統(tǒng)結(jié)構(gòu) 中斷的概念中斷的概念 看電視看電視中斷處理中斷處理中斷請(qǐng)求中斷請(qǐng)求實(shí)際生活實(shí)際生活中斷返回中斷返回電話(huà)鈴響電話(huà)鈴響接聽(tīng)電話(huà)接聽(tīng)電話(huà)看電視看電視主程序主程序計(jì)算機(jī)計(jì)算機(jī)事件發(fā)生事件發(fā)生事件處理事件處理主程序主程序中斷解決了快速主機(jī)與慢速中斷解決了快速主機(jī)與慢速I(mǎi)/O設(shè)備的數(shù)據(jù)傳設(shè)備的數(shù)

56、據(jù)傳送,還具有如下優(yōu)點(diǎn):送,還具有如下優(yōu)點(diǎn): 分時(shí)操作。CPU可以分時(shí)為多個(gè)I/O設(shè)備服務(wù),提高了計(jì)算機(jī)的利用率; 實(shí)時(shí)響應(yīng)。實(shí)時(shí)響應(yīng)。CPU能夠及時(shí)處理應(yīng)用系統(tǒng)的能夠及時(shí)處理應(yīng)用系統(tǒng)的隨機(jī)事件,系統(tǒng)的實(shí)時(shí)性大大增強(qiáng);隨機(jī)事件,系統(tǒng)的實(shí)時(shí)性大大增強(qiáng); 可靠性高??煽啃愿摺PU具有處理設(shè)備故障及掉電具有處理設(shè)備故障及掉電等突發(fā)性事件能力,從而使系統(tǒng)可靠性提高。等突發(fā)性事件能力,從而使系統(tǒng)可靠性提高。 80C51中斷系統(tǒng)的結(jié)構(gòu)中斷系統(tǒng)的結(jié)構(gòu) IE0IE0EX0EX0TF0TF0IE1IE1TF1TF1TITIESESET1ET1EX1EX1ET0ET0RIRIIPIP硬件查詢(xún)硬件查詢(xún)高級(jí)高級(jí)低級(jí)

57、低級(jí)中斷入口中斷入口中斷源中斷源INT0INT0INT1INT1中斷入口中斷入口中斷源中斷源1 10 0IEIEPX0PX0PSPSPT1PT1PX1PX1PT0PT01 11 11 11 11 11 11 11 11 11 10 00 00 00 00 0EAEA1 111SCONSCON1 11 1T0T0T1T1RXRXTXTXIT0IT0IT1IT10 00 0TCONTCON5.1.2 80C51的中斷源的中斷源 INT1, INT1,由由IT1IT1選擇為低電平有效還是下降沿有效。選擇為低電平有效還是下降沿有效。此引腳上出現(xiàn)有效的中斷信號(hào)時(shí),中斷標(biāo)志此引腳上出現(xiàn)有效的中斷信號(hào)時(shí),中

58、斷標(biāo)志IE1IE1置置1,1,申請(qǐng)中斷。申請(qǐng)中斷。 INT0, INT0,由由IT0IT0選擇為低電平有效還是下降沿有效。選擇為低電平有效還是下降沿有效。此引腳上出現(xiàn)有效的中斷信號(hào)時(shí),中斷標(biāo)志此引腳上出現(xiàn)有效的中斷信號(hào)時(shí),中斷標(biāo)志IE0IE0置置1 1,申請(qǐng)中斷。,申請(qǐng)中斷。 中斷源中斷源 TF0 TF0,T0T0溢出中斷請(qǐng)求標(biāo)志。當(dāng)溢出中斷請(qǐng)求標(biāo)志。當(dāng)T0T0發(fā)生溢出時(shí),發(fā)生溢出時(shí),置位置位TF0TF0,并向,并向CPUCPU申請(qǐng)中斷。申請(qǐng)中斷。 TF1 TF1,T1T1溢出中斷請(qǐng)求標(biāo)志。當(dāng)溢出中斷請(qǐng)求標(biāo)志。當(dāng)T1T1發(fā)生溢出時(shí),置位發(fā)生溢出時(shí),置位TF1TF1,并向并向CPUCPU申請(qǐng)中斷

59、。申請(qǐng)中斷。 RI RI、TITI,串行口中斷請(qǐng)求標(biāo)志。當(dāng)串行口接收完一幀數(shù)據(jù),串行口中斷請(qǐng)求標(biāo)志。當(dāng)串行口接收完一幀數(shù)據(jù)時(shí)置位時(shí)置位RIRI或當(dāng)串行口發(fā)送完一幀數(shù)據(jù)時(shí)置位或當(dāng)串行口發(fā)送完一幀數(shù)據(jù)時(shí)置位TITI,向,向CPUCPU申請(qǐng)申請(qǐng)中斷。中斷。 中斷請(qǐng)求標(biāo)志中斷請(qǐng)求標(biāo)志 IT0,外中斷,外中斷0觸發(fā)方式控制位。觸發(fā)方式控制位。 =0,電平觸發(fā)方式。,電平觸發(fā)方式。 =1,邊沿觸發(fā)方式下降沿有效)。,邊沿觸發(fā)方式下降沿有效)。 IE0,外中斷,外中斷0中斷請(qǐng)求標(biāo)志位。中斷請(qǐng)求標(biāo)志位。 TF0,T0溢出中斷請(qǐng)求標(biāo)志位。溢出中斷請(qǐng)求標(biāo)志位。 TF1 TR1 TF0 TR0 IE1 IT1 IE

60、0 IT0TCON TCON (88H)(88H) TCON的中斷標(biāo)志的中斷標(biāo)志 SCON的中斷標(biāo)志的中斷標(biāo)志 RI,接收中斷標(biāo)志位。,接收中斷標(biāo)志位。 TI,發(fā)送中斷標(biāo)志位。,發(fā)送中斷標(biāo)志位。 TI RISCON SCON (98H)(98H)留意:留意:RI和和TI由硬件置位、由軟件清除。由硬件置位、由軟件清除。 中斷允許控制中斷允許控制 5.1.3 80C515.1.3 80C51中斷的控制中斷的控制 EX0,外中斷,外中斷0允許位;允許位;ET0,T0中斷允許位;中斷允許位; EX1,外中斷,外中斷0允許位;允許位;ET1,T1中斷允許位;中斷允許位;ES ,串口中斷允許位;,串口中斷

溫馨提示

  • 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)論