1.2單片機(jī)程序設(shè)計(jì)ppt課件_第1頁(yè)
1.2單片機(jī)程序設(shè)計(jì)ppt課件_第2頁(yè)
1.2單片機(jī)程序設(shè)計(jì)ppt課件_第3頁(yè)
1.2單片機(jī)程序設(shè)計(jì)ppt課件_第4頁(yè)
1.2單片機(jī)程序設(shè)計(jì)ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩64頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第4章章 匯編語(yǔ)言程序設(shè)計(jì)簡(jiǎn)介匯編語(yǔ)言程序設(shè)計(jì)簡(jiǎn)介 4.1 偽指令偽指令 4.2 匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì) 4.1 偽偽 指指 令令 偽指令偽指令 是是 對(duì)匯編過(guò)程對(duì)匯編過(guò)程 起控制作起控制作用,但本身并沒(méi)有對(duì)應(yīng)的機(jī)器代碼的用,但本身并沒(méi)有對(duì)應(yīng)的機(jī)器代碼的指令。指令。 一、一、 匯編起始指令匯編起始指令 ORG 指令格式為指令格式為: ORG nn 該指令的作用是指明后面的程序或數(shù)據(jù)塊的起始地址該指令的作用是指明后面的程序或數(shù)據(jù)塊的起始地址, 它總是出現(xiàn)在每段源程序或數(shù)據(jù)塊的開(kāi)始。它總是出現(xiàn)在每段源程序或數(shù)據(jù)塊的開(kāi)始。 式中式中, nn為為 16 位地址位地址, 匯編時(shí)匯編時(shí)nn確定

2、了此語(yǔ)句后面第一條指令或第一個(gè)數(shù)確定了此語(yǔ)句后面第一條指令或第一個(gè)數(shù)據(jù)的地址據(jù)的地址,此后的源程序或數(shù)據(jù)塊就依次連續(xù)存放在以后的地此后的源程序或數(shù)據(jù)塊就依次連續(xù)存放在以后的地址內(nèi)址內(nèi), 直到遇到另一個(gè)直到遇到另一個(gè)ORG指令為止。指令為止。 例: ORG 2000H MOV SP, 60H MOV R0, 2FH MOV R2, 0FFH ORG偽指令說(shuō)明其后面程序的目標(biāo)代碼在存儲(chǔ)器中存放的起始地址是2000H, 即 存儲(chǔ)器地址 目標(biāo)程序 2000H 75 81 60 2019H 78 2F 2019H 7A FF 二、等值指令二、等值指令EQU 指令格式指令格式: 字符名稱字符名稱 EQU

3、數(shù)字或匯編符號(hào)數(shù)字或匯編符號(hào) 例例: PA8155 EQU 8001H ;即給標(biāo)號(hào);即給標(biāo)號(hào)PA8155賦值為賦值為8001H。 功能功能: 使指令中的字符名稱等價(jià)于給定的數(shù)使指令中的字符名稱等價(jià)于給定的數(shù)字或匯編符號(hào)。字或匯編符號(hào)。 使用等值指令可給程序的編制、調(diào)試、修使用等值指令可給程序的編制、調(diào)試、修改帶來(lái)方便改帶來(lái)方便, 如果在程序中要多次使用到某一如果在程序中要多次使用到某一地址地址,由由EQU指令將其賦值給一個(gè)字符名稱指令將其賦值給一個(gè)字符名稱, 一一旦需要對(duì)其進(jìn)行變動(dòng)旦需要對(duì)其進(jìn)行變動(dòng), 只要改變只要改變EQU命令后面命令后面的數(shù)字即可的數(shù)字即可, 而不需要對(duì)程序中涉及到該地址而

4、不需要對(duì)程序中涉及到該地址的所有指令逐句進(jìn)行修改。的所有指令逐句進(jìn)行修改。 但要注意但要注意, 由由 EQU等值的字符名稱必須先賦值后使用等值的字符名稱必須先賦值后使用, 且在同一且在同一個(gè)源程序中個(gè)源程序中, 同一個(gè)標(biāo)號(hào)只能賦值一次。同一個(gè)標(biāo)號(hào)只能賦值一次。 三、三、 定義字節(jié)指令定義字節(jié)指令DB 指令格式指令格式: 標(biāo)號(hào)標(biāo)號(hào): DB 8位二進(jìn)制數(shù)表位二進(jìn)制數(shù)表 功能功能: 把把 8 位二進(jìn)制數(shù)表依次存入從標(biāo)號(hào)開(kāi)始的連續(xù)的位二進(jìn)制數(shù)表依次存入從標(biāo)號(hào)開(kāi)始的連續(xù)的存儲(chǔ)單元中。存儲(chǔ)單元中。 格式中格式中, 標(biāo)號(hào)區(qū)段可有可無(wú)標(biāo)號(hào)區(qū)段可有可無(wú), DB指令之后的指令之后的 8 位二進(jìn)制位二進(jìn)制數(shù)表是字節(jié)

5、常數(shù)或用逗號(hào)隔開(kāi)的字節(jié)串?dāng)?shù)表是字節(jié)常數(shù)或用逗號(hào)隔開(kāi)的字節(jié)串, 也可以是用引號(hào)括也可以是用引號(hào)括起來(lái)的起來(lái)的ASCII碼字符串碼字符串 (一個(gè)一個(gè) ASCII字符相當(dāng)于一個(gè)字節(jié)字符相當(dāng)于一個(gè)字節(jié))。 例例: ORG 1000HBUF1: DB 38H, 7FH, 80HBUF2: DB 45H, 66H ORG偽指令指定了標(biāo)號(hào)偽指令指定了標(biāo)號(hào)BUF1的地址為的地址為1000H, 而而DB偽指令是將其后的二進(jìn)制數(shù)表偽指令是將其后的二進(jìn)制數(shù)表38H, 7FH, 80H依次存放在依次存放在1000H, 1001H, 1002H 3 個(gè)連續(xù)單元之中個(gè)連續(xù)單元之中, BUF2也是一個(gè)標(biāo)也是一個(gè)標(biāo)號(hào)號(hào), 其

6、地址與前一條偽指令連續(xù)其地址與前一條偽指令連續(xù), 即即1003H, 1004H地址單元中依次存放地址單元中依次存放 45H, 66H。 四、四、 定義字指令定義字指令DW 指令格式指令格式: 標(biāo)號(hào)標(biāo)號(hào): DW 16 位數(shù)據(jù)表位數(shù)據(jù)表 該指令的功能與該指令的功能與DB相似相似, 區(qū)別僅在于從指定地址開(kāi)始存區(qū)別僅在于從指定地址開(kāi)始存放的是指令中的放的是指令中的 16 位數(shù)據(jù)位數(shù)據(jù), 而不是字節(jié)串。每個(gè)而不是字節(jié)串。每個(gè) 16 位數(shù)據(jù)位數(shù)據(jù)要占兩個(gè)存儲(chǔ)單元要占兩個(gè)存儲(chǔ)單元, 高高8 位先存位先存, 低低 8 位后存位后存, 這和這和MCS -51指指令中的令中的16位數(shù)據(jù)存放順序是一致的。位數(shù)據(jù)存放

7、順序是一致的。 五、五、 匯編結(jié)束指令匯編結(jié)束指令END 指令格式指令格式: 標(biāo)號(hào)標(biāo)號(hào): END 地址或標(biāo)號(hào)地址或標(biāo)號(hào) 格式中標(biāo)號(hào)以及格式中標(biāo)號(hào)以及END后面的地址或標(biāo)號(hào)可有可無(wú)。后面的地址或標(biāo)號(hào)可有可無(wú)。 功能功能: 提供匯編結(jié)束標(biāo)志。匯編程序遇到提供匯編結(jié)束標(biāo)志。匯編程序遇到 END后就停止匯編后就停止匯編, 對(duì)對(duì) END以后的語(yǔ)句不予處理以后的語(yǔ)句不予處理, 故故 END應(yīng)放在程序的結(jié)束處。應(yīng)放在程序的結(jié)束處。 4.2 匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì) 4.2.1 簡(jiǎn)單程序設(shè)計(jì)簡(jiǎn)單程序設(shè)計(jì) 例例 1 兩個(gè)無(wú)符號(hào)雙字節(jié)數(shù)相加。兩個(gè)無(wú)符號(hào)雙字節(jié)數(shù)相加。 設(shè)被加數(shù)存放于內(nèi)部設(shè)被加數(shù)存放于內(nèi)部R

8、AM的的40H高位字節(jié))高位字節(jié)), 41H低位字節(jié))低位字節(jié)), 加數(shù)存放于加數(shù)存放于50H高位字節(jié))高位字節(jié)), 51H低位字節(jié))低位字節(jié)), 和數(shù)存入和數(shù)存入 40H和和41H單元中。單元中。 程序如下: START: CLR C ; 將Cy清零 MOV R0, 41H ; 將被加數(shù)地址送數(shù)據(jù)指針R0 MOV R1, 51H ; 將加數(shù)地址送數(shù)據(jù)指針R1 AD1: MOV A, R0 ; 被加數(shù)低字節(jié)的內(nèi)容送入AADD A,R1 ; 兩個(gè)低字節(jié)相加MOV R0, A ; 低字節(jié)的和存入被加數(shù)低字節(jié)中 DEC R0 ; 指向被加數(shù)高位字節(jié) DEC R1 ; 指向加數(shù)高位字節(jié) MOV A,

9、R0 ; 被加數(shù)高位字節(jié)送入AADDC A, R1 ; 兩個(gè)高位字節(jié)帶Cy相加 MOV R0, A ; 高位字節(jié)的和送被加數(shù)高位字節(jié) RET 例例 2 將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。 設(shè)內(nèi)部設(shè)內(nèi)部RAM 40H#, 41H單元中分別存放著單元中分別存放著 8 位二進(jìn)制位二進(jìn)制數(shù)數(shù), 要求取出兩個(gè)單元中的低半字節(jié)要求取出兩個(gè)單元中的低半字節(jié), 并成一個(gè)字節(jié)后并成一個(gè)字節(jié)后, 存入存入 50H單元中。單元中。 程序如下程序如下: START: MOV R1, 40H ; 設(shè)置設(shè)置R1為數(shù)據(jù)指針為數(shù)據(jù)指針MOV A, R1 ; 取出第一個(gè)單元中的內(nèi)容取出第一個(gè)單

10、元中的內(nèi)容ANL A, 0FH ; 取第一個(gè)數(shù)的低半字節(jié)取第一個(gè)數(shù)的低半字節(jié)SWAP A ; 移至高半字節(jié)移至高半字節(jié)INC R1 ; 修改數(shù)據(jù)指針修改數(shù)據(jù)指針MOV A, R1 ; 取第二個(gè)單元中的內(nèi)容取第二個(gè)單元中的內(nèi)容ANL A, 0FH ; 取第二個(gè)數(shù)的低半字節(jié)取第二個(gè)數(shù)的低半字節(jié)ORL A, R1 ; 拼字拼字MOV 50H, A ; 存放結(jié)果存放結(jié)果RET 4.2.2 分支程序設(shè)計(jì)分支程序設(shè)計(jì) 圖圖 4.1 分支結(jié)構(gòu)框圖分支結(jié)構(gòu)框圖(a) 單分支流程單分支流程; (b) 多分支流程多分支流程 例例 3 x, y均為均為8位二進(jìn)制數(shù)位二進(jìn)制數(shù), 設(shè)設(shè) x存入存入R0, y存入存入R1

11、, 求解求解: y=syn(x)程序如下程序如下: START: CJNE R0, 00H, SUL1 ; R0中的數(shù)與中的數(shù)與00比較不等轉(zhuǎn)移比較不等轉(zhuǎn)移 MOV R1, 00H; 相等相等, R1 0 SJMP SUL2 SUL1: JC NEG ; 兩數(shù)不等兩數(shù)不等, 假設(shè)假設(shè)R0)0, 那么那么 R101H SJMP SUL2 NEG : MOV R1, 0FFH ; (R0)0, 那么那么 R10FFH SUL2 : RET 正確程序如下正確程序如下: SUBF : MOV A,R0 JZ ZERO JB ACC.7 , NEG MOV R1, #1 ZERO : MOV R1 ,

12、#0 SJMP ENDF NEG : MOV R1 , #0FFH ENDF : RET 例 4 比較兩個(gè)無(wú)符號(hào)數(shù)的大小。 設(shè)外部 RAM 的存儲(chǔ)單元 ST1和 ST2中存放兩個(gè)不帶符號(hào)的二進(jìn)制數(shù), 找出其中的大數(shù)存入外部 RAM 中的 ST3單元中。 圖 4.3 程序如下:程序如下: ORG 1000H ST1 EQU 2000H ST2 EQU 2100H ST3 EQU 2200H START: CLR C ; 清零清零Cy MOV DPTR, ST1 ; 第一個(gè)數(shù)的指針第一個(gè)數(shù)的指針 MOVX A, DPTR ; 取第一個(gè)數(shù)取第一個(gè)數(shù) MOV R2, A ; 保管保管 MOV DPTR

13、, ST2 ; 第二個(gè)數(shù)的指針第二個(gè)數(shù)的指針 MOVX A, DPTR ; 取第二個(gè)數(shù)取第二個(gè)數(shù) CLR C SUBB A, R2; 兩數(shù)比較兩數(shù)比較JNC BIG2 ; 若第二個(gè)數(shù)大若第二個(gè)數(shù)大, 則轉(zhuǎn)則轉(zhuǎn)XCH A, R2; 第一個(gè)數(shù)大第一個(gè)數(shù)大BIG1: MOV DPTR, ST3 MOVX DPTR, A ; 存大數(shù)存大數(shù)RETBIG2: MOVX A, DPTR; 第二個(gè)數(shù)大第二個(gè)數(shù)大SJMP BIG1RET 4.2.3 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 一、一、 循環(huán)程序循環(huán)程序 圖 4.4 循環(huán)程序一般由四個(gè)主要部分組成: (1) 初始化部分: 為循環(huán)程序做準(zhǔn)備, 如規(guī)定循環(huán)次數(shù)、 給各

14、變量和地址指針預(yù)置初值。 (2) 處理部分: 為反復(fù)執(zhí)行的程序段, 是循環(huán)程序的實(shí)體, 也是循環(huán)程序的主體。 (3) 循環(huán)控制部分: 這部分的作用是修改循環(huán)變量和控制變量, 并判斷循環(huán)是否結(jié)束, 直到符合結(jié)束條件時(shí), 跳出循環(huán)為止。 (4) 結(jié)束部分: 這部分主要是對(duì)循環(huán)程序的結(jié)果進(jìn)行分析、 處理和存放。 例 5 工作單元清零。 在應(yīng)用系統(tǒng)程序設(shè)計(jì)時(shí), 有時(shí)經(jīng)常需要將存儲(chǔ)器中各部分地址單元作為工作單元, 存放程序執(zhí)行的中間值或執(zhí)行結(jié)果, 工作單元清零工作常常放在程序的初始化部分中。 設(shè)有50個(gè)工作單元, 其首址為外部存儲(chǔ)器8000H單元, 則其工作單元清零程序如下: CLEAR: CLR A

15、MOV DPTR, 8000H ; 工作單元首址送指針 MOV R2, #50 ; 置循環(huán)次數(shù)CLEAR1: MOVX DPTR, A INC DPTR ; 修改指針 DJNZ R2, CLEAR1; 控制循環(huán) RET 例例 6 設(shè)在內(nèi)部設(shè)在內(nèi)部 RAM的的BLOCK單元開(kāi)始處有長(zhǎng)度為單元開(kāi)始處有長(zhǎng)度為 LEN個(gè)的無(wú)符號(hào)數(shù)據(jù)塊個(gè)的無(wú)符號(hào)數(shù)據(jù)塊, 試編一個(gè)求和程序試編一個(gè)求和程序, 并將和存入內(nèi)并將和存入內(nèi)部部 RAM的的 SUM單元設(shè)和不超過(guò)單元設(shè)和不超過(guò) 8 位)。位)。 BLOCK EQU 20H LENEQU 30H SUM EQU 40HSTART: CLR A ; 清累加器A MOV

16、 R2, LEN; 數(shù)據(jù)塊長(zhǎng)度送R2 MOV R1, BLOCK ; 數(shù)據(jù)塊首址送R1 LOOP: ADD A, R1 ; 循環(huán)加法 INC R1; 修改地址指針 DJNZ R2, LOOP ; 修改計(jì)數(shù)器并判斷 MOV SUM, A; 存和 RET 二、二、 多重循環(huán)多重循環(huán) 例例 7 10 秒延時(shí)程序。秒延時(shí)程序。 延時(shí)程序與延時(shí)程序與 MCS - 51 執(zhí)行指令的時(shí)間有關(guān)執(zhí)行指令的時(shí)間有關(guān), 如果使用如果使用 6 MHz晶振晶振, 一個(gè)機(jī)器周期為一個(gè)機(jī)器周期為 2 s, 計(jì)算出一條指令以至一個(gè)循計(jì)算出一條指令以至一個(gè)循環(huán)所需要的執(zhí)行時(shí)間環(huán)所需要的執(zhí)行時(shí)間, 給出相應(yīng)的循環(huán)次數(shù)給出相應(yīng)的循

17、環(huán)次數(shù), 便能達(dá)到延時(shí)的便能達(dá)到延時(shí)的目的。目的。10 秒延時(shí)程序如下秒延時(shí)程序如下: DELAY: MOV R5, 100 DEL0: MOV R6, 200 DEL1: MOV R7, 248 DEL2: DJNZ R7, DEL2 DJNZ R6, DEL1 DJNZ R5, DEL0 RET 上例程序中采用了多重循環(huán)程序, 即在一個(gè)循環(huán)體中又包含了其它的循環(huán)程序, 這種方式是實(shí)現(xiàn)延時(shí)程序的常用方法。 使用多重循環(huán)時(shí), 必須注意: (1) 循環(huán)嵌套, 必須層次分明, 不允許產(chǎn)生內(nèi)外層循環(huán)交叉。 (2) 外循環(huán)可以一層層向內(nèi)循環(huán)進(jìn)入, 結(jié)束時(shí)由里往外一層層退出。 (3) 內(nèi)循環(huán)可以直接轉(zhuǎn)入

18、外循環(huán), 實(shí)現(xiàn)一個(gè)循環(huán)由多個(gè)條件控制的循環(huán)結(jié)構(gòu)方式。 4.2.8 運(yùn)算程序運(yùn)算程序 一、一、 加、加、 減法程序減法程序 例 18 將40H開(kāi)始存放的 10 個(gè)字節(jié)的數(shù)與 50H開(kāi)始存放的10 個(gè)字節(jié)的數(shù)相減假設(shè)被減數(shù)大于減數(shù))。 設(shè)被減數(shù)指針為 R0, 減數(shù)指針為 R1, 差數(shù)放回被減數(shù)單元, R5 存放字節(jié)個(gè)數(shù), 則程序如下: SUB: MOV R0, 40HMOV R1, 50HMOV R5, 10CLR CSUB1: MOV A, R0SUBB A, R1MOV R0, AINC R0INC R1DJNZ R5, SUB1RET 二、 乘法運(yùn)算程序 在計(jì)算機(jī)中, 常將乘法采用移位和加法

19、來(lái)實(shí)現(xiàn)。 例19 將R2R3和R6R7中雙字節(jié)無(wú)符號(hào)數(shù)相乘, 結(jié)果存入 R4R5R6R7。 此乘法可以采用部分積右移的方法來(lái)實(shí)現(xiàn), 其程序框圖如圖 4.6 所示, 程序如下: NMUL: MOV R4, 0 ; 初始化初始化 MOV R5, 0 CLR C MOV R0, 16NMUL1: MOV A, R4 ; CyR4R5R6R7右移一位右移一位 RRC A MOV R4, A MOV A, R5 RRC A MOV R5, A MOV A, R6 RRC A MOV R6, A MOV A, R7 RRC MOV R7, A JNC NMUL2; C為移出乘數(shù)的最低位為移出乘數(shù)的最低位

20、MOV A, R5 ; (R4R5)+(R6F7)(R4R5) ADD A, R3 MOV R5, A MOV A, R4 ADDC A, R2 MOV R4, A NMUL2: DJNZR0, NMUL1; 循環(huán)16位 MOV A, R4; 最后結(jié)果再移一位 RRC A MOV R4, A MOV A, R5 RRC A MOV R5, A MOV A, R6 RRC A MOV R6, A MOV A, R7 RRC A MOV R7, A RET 圖圖4.6 NMUL程序框圖程序框圖 例 20 假定被乘數(shù)在R4R3中, 乘數(shù)放在R2中, 乘積放在R7R6和R5中。 MCS - 51 中有

21、 8 位數(shù)的乘法指令MUL, 用它來(lái)實(shí)現(xiàn)多字節(jié)乘法時(shí), 可表示為 (R4R3)(R2) =(R4)28+(R3)(R2)=(R4)(R2)28+(R3)(R2)其中R4)(R2和R3)(R2都是可直接用MUL指令來(lái)實(shí)現(xiàn), 而乘以28意味著左移 8 位。由此可編寫(xiě)如下程序: NMUL1: MOV A, R2 MOV B, R3 MUL AB ; (R3)(R2) MOV R5, A ; 積的低位送積的低位送R5 MOV R6, B ; 積的高位送積的高位送R6 MOV A, R2 MOV B, R4 MUL AB ; (R4)(R2) ADD A, R6 ; (R3)(R2的高位加的高位加(R4

22、)(R2)的低位的低位MOV A, B ADDC A, 00H ; (R4)(R2的高位加的高位加Cy MOV R7, A ; 結(jié)果送結(jié)果送R7 RET 三、三、 除法運(yùn)算程序除法運(yùn)算程序 除法是乘法的逆運(yùn)算除法是乘法的逆運(yùn)算, 用移位、用移位、 相減的方法來(lái)完成。相減的方法來(lái)完成。 首首先比較被除數(shù)的高位字與除數(shù)先比較被除數(shù)的高位字與除數(shù), 如被除數(shù)高位大于除數(shù)如被除數(shù)高位大于除數(shù), 則商則商為為1, 并從被除數(shù)中減去除數(shù)并從被除數(shù)中減去除數(shù), 形成一個(gè)部分余數(shù)形成一個(gè)部分余數(shù); 否則商位為否則商位為 0, 不執(zhí)行減法。不執(zhí)行減法。 然后把新的部分余數(shù)左移一位然后把新的部分余數(shù)左移一位, 并

23、與除數(shù)再次并與除數(shù)再次進(jìn)行比較。循環(huán)此步驟進(jìn)行比較。循環(huán)此步驟, 直到被除數(shù)的所有位都處理完為止直到被除數(shù)的所有位都處理完為止,一一般商的字長(zhǎng)為般商的字長(zhǎng)為 n, 則需循環(huán)則需循環(huán)n次。次。 一般計(jì)算機(jī)中一般計(jì)算機(jī)中, 被除數(shù)均為被除數(shù)均為雙倍位雙倍位, 即如果除數(shù)和商為雙字節(jié)即如果除數(shù)和商為雙字節(jié), 則被除數(shù)為四字節(jié)。如果則被除數(shù)為四字節(jié)。如果在除法中發(fā)生商大于規(guī)定字節(jié)在除法中發(fā)生商大于規(guī)定字節(jié), 稱為溢出。稱為溢出。 在進(jìn)行除法前在進(jìn)行除法前, 應(yīng)應(yīng)該檢查是否會(huì)產(chǎn)生溢出。一般可在進(jìn)行除法前該檢查是否會(huì)產(chǎn)生溢出。一般可在進(jìn)行除法前, 先比較被除數(shù)先比較被除數(shù)的高位與除數(shù)的高位與除數(shù), 如被除

24、數(shù)高位大于除數(shù)如被除數(shù)高位大于除數(shù), 則溢出則溢出, 置溢出標(biāo)志置溢出標(biāo)志, 不執(zhí)行除法。不執(zhí)行除法。 圖圖 4.7 除除法法程程序序的的流流程程 例例 21 將將R4R5R6R7除以除以R2R3), 商放在商放在R6R7中中, 余數(shù)放在余數(shù)放在R4R5中。中。 NDIV: MOV A, R5 ; 判商是否產(chǎn)生溢出 CLR C SUBB A, R3 MOV A, R4 SUBB A, R2 JNC NDIV1 ; 溢出, 轉(zhuǎn)溢出處理 MOV B, 16; 無(wú)溢出, 執(zhí)行除法 NDIV2: CLR C ; 被除數(shù)左移一位被除數(shù)左移一位, 低位送低位送 0 MOV A, R7 RLC A MOV

25、R7, A MOV A, R6 RLC A MOV R6, A MOV A, R5 RLC A MOV R5, A XCH A, R4 RLC A XCH A, R4 MOV F0, C ; 保護(hù)移出的最高位 CLR C SUBB A, R3 ; 部分余數(shù)與除數(shù)比較 MOV R1, A MOV A, R4 SUBB A, R2 JB F0, NDIV3; 移出的高位為 1, 肯定夠減 JC NDIV4 ; 否則, (Cy) = 0才夠減 NDIV3: MOV R4, A ; 回送減法結(jié)果 MOV A, R1 MOV R5, A INC R7 ; 商上1 NDIV4: DJNZ B, NDIV2

26、; 循環(huán)次數(shù)減 1 ,若不為零則循環(huán) CLR F0 ; 正常執(zhí)行無(wú)溢出 F0 = 0 RET NDIV1: SETB F0 ; 溢出F0=1 RET 4.2.7 數(shù)制轉(zhuǎn)換數(shù)制轉(zhuǎn)換 例例 16 將一個(gè)字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成將一個(gè)字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成 3 位非壓縮型位非壓縮型BCD碼。碼。 設(shè)一個(gè)字節(jié)二進(jìn)制數(shù)在內(nèi)部設(shè)一個(gè)字節(jié)二進(jìn)制數(shù)在內(nèi)部RAM 40H單元單元, 轉(zhuǎn)換結(jié)果放轉(zhuǎn)換結(jié)果放入內(nèi)部入內(nèi)部 RAM 50H#, 51H, 52H單元中高位在前)單元中高位在前), 程序如程序如下下: HEXBCD: MOV A, 40H MOV B, 100 DIV AB MOV 50H, A MOV A, 10 X

27、CH A, B DIV AB MOV 51H, A MOV 52H, B RET 例例 17 設(shè)設(shè) 4 位位BCD碼依次存放在內(nèi)存碼依次存放在內(nèi)存 RAM中中 40H43H單元的低單元的低4 位位, 高高 4 位都為位都為 0, 要求將其轉(zhuǎn)換為二進(jìn)制數(shù)要求將其轉(zhuǎn)換為二進(jìn)制數(shù), 結(jié)結(jié)果存入果存入 R2R3 中。中。 一個(gè)十進(jìn)制數(shù)可表示為一個(gè)十進(jìn)制數(shù)可表示為: Dn10n +Dn-110n-1 + + D0100 =(Dn10+Dn-1)10+Dn-2)10+)+D0當(dāng)當(dāng)n=3時(shí)時(shí), 上式可表示為上式可表示為: (D310+D2)10+D1)10+D0 BCDHEX: MOV R0, 40H ;

28、R0指向最高位地址指向最高位地址MOV R1, 03 ; 計(jì)數(shù)值送計(jì)數(shù)值送R1MOV R2, 0 ; 存放結(jié)果的高位清零存放結(jié)果的高位清零MOV A, R0MOV R3, A LOOP: MOV A, R3MOV B, 10MUL ABMOV R3, A ; (R3)10 的低的低 8 位送位送R3MOV A, BXCH A, R2 ; (R3)10的高的高 8 位暫存位暫存R2MOV B, 10 MUL AB ADD A, R2 MOV R2, A ; R210+( R310高 8 位送R2 INC R0 ; 取下一個(gè) BCD數(shù) MOV A, R3 ADD A, R0 MOV R3, A M

29、OV A, R2 ADDC A, 0 ; 加低字節(jié)來(lái)的進(jìn)位 MOV R2, A DJNZ R1, LOOP RET 排序程序設(shè)計(jì)排序程序設(shè)計(jì)例例 8 在外部在外部 RAM中中, BLOCK開(kāi)始的單元中有一無(wú)符號(hào)數(shù)據(jù)開(kāi)始的單元中有一無(wú)符號(hào)數(shù)據(jù)塊塊, 其個(gè)數(shù)為其個(gè)數(shù)為 LEN個(gè)字節(jié)。試將這些無(wú)符號(hào)數(shù)按遞減次序重個(gè)字節(jié)。試將這些無(wú)符號(hào)數(shù)按遞減次序重新排列新排列, 并存入原存儲(chǔ)區(qū)。并存入原存儲(chǔ)區(qū)。 ORG 1000H START: MOV DPTR, BLOCK; 置地址指針 MOV P2, DPH ; P2作地址指針高字節(jié) MOV R7, LEN ; 置外循環(huán)計(jì)數(shù)初值 DEC R7 ; 比較與交換

30、n-1次 LOOP0: CLR F0 ; 交換標(biāo)志清 0 MOV R0, DPL; MOV R1, DPL ; 置相鄰兩數(shù)地址指針低字節(jié) INC R1 MOV R6, R7 ; 置內(nèi)循環(huán)計(jì)數(shù)器初值 LOOP1: MOVX A, R0 ; 取數(shù) MOV B, A ; 暫存 MOVX A, R1 ; 取下一個(gè)數(shù) CJNE A, B, NEXT; 相鄰兩數(shù)比較, 不等轉(zhuǎn) SJMP NOCHA ; 相等不交換 NEXT: JC NOCHA; Cy =1, 則前者大于后者, 不必交換 SETB F0 ; 否則, 置交換標(biāo)志 MOVX R0, A ; XCH A, B ; 兩數(shù)交換, 大者在前, 小者在后

31、 MOVX R1, A ; NOCHA: INC R0 INC R1; 修改指針 DJNZ R6, LOOP1 ; 內(nèi)循環(huán)未完, 則繼續(xù) JNB F0, EXIT ; 若從未交換, 則結(jié)束 DJNZ R7, LOOP0; 外循環(huán)未完, 則繼續(xù) EXIT: RET 圖 4.5 例例 9 設(shè)某系統(tǒng)的模數(shù)轉(zhuǎn)換器是設(shè)某系統(tǒng)的模數(shù)轉(zhuǎn)換器是ADC0809, 它的轉(zhuǎn)換結(jié)它的轉(zhuǎn)換結(jié)束信號(hào)束信號(hào) EOC連接到連接到8031 的的P1.7端端, 當(dāng)當(dāng) EOC的狀態(tài)由低變的狀態(tài)由低變高時(shí)高時(shí), 則結(jié)束循環(huán)等待則結(jié)束循環(huán)等待, 并讀取轉(zhuǎn)換值并讀取轉(zhuǎn)換值, 其程序如下其程序如下: START: MOV DPTR, ad

32、dr ; 0809端口地址送端口地址送DPTR MOV A, 00H ; 啟動(dòng)啟動(dòng)0809轉(zhuǎn)換轉(zhuǎn)換 MOVX DPTR, A LOOP: JNB P1.7, LOOP; 檢測(cè)檢測(cè)P1.7狀態(tài)狀態(tài), 判是否轉(zhuǎn)換判是否轉(zhuǎn)換結(jié)束結(jié)束 MOVX A, DPTR; 讀取轉(zhuǎn)換結(jié)果讀取轉(zhuǎn)換結(jié)果 例10 在內(nèi)部 RAM中從 50H單元開(kāi)始的連續(xù)單元依次存放了一串字符, 該字符串以回車符為結(jié)束標(biāo)志, 要求測(cè)試該字符串的長(zhǎng)度。 程序如下程序如下: START: MOV R2, 0FFH MOV R0, 4FH ; 數(shù)據(jù)指針數(shù)據(jù)指針R0置初值置初值 LOOP: INC R0 INC R2 CJNE R0, 0DH,

33、 LOOP RET 4.2.6 查表程序設(shè)計(jì)查表程序設(shè)計(jì) 查表程序是一種常用程序, 它廣泛使用于 LED顯示控制、 打印機(jī)打印控制、數(shù)據(jù)補(bǔ)償、數(shù)值計(jì)算、轉(zhuǎn)換等功能程序中, 這類程序具有簡(jiǎn)單、執(zhí)行速度快等特點(diǎn)。 所謂查表法, 就是預(yù)先將滿足一定精度要求的表示變量與函數(shù)值之間關(guān)系的一張表求出, 然后把這張表存于單片機(jī)的程序存儲(chǔ)器中, 這時(shí)自變量值為單元地址, 相應(yīng)的函數(shù)值為該地址單元中的內(nèi)容。查表, 就是根據(jù)變量 X在表格中查找對(duì)應(yīng)的函數(shù)值 Y, 使 Y=f(X)。 MCS - 51指令系統(tǒng)中指令系統(tǒng)中, 有兩條查表指令有兩條查表指令: MOVC A, A+PC MOVC A, A+DPTR 例例

34、 13 一個(gè)十六進(jìn)制數(shù)存放在內(nèi)部一個(gè)十六進(jìn)制數(shù)存放在內(nèi)部 RAM 的的 HEX單元的單元的低低 4 位中位中, 將其轉(zhuǎn)換成將其轉(zhuǎn)換成ASCII碼并送回碼并送回 HEX單元。單元。 十六進(jìn)制十六進(jìn)制 09的的ASCII碼為碼為 30H39H, AF的的ASCII碼為碼為41H46H, ASCII碼表格的首地址為碼表格的首地址為ASCTAB。編。編程如下程如下: ORG 1000H HEXASC: MOV A, HEX ANL A, 0FH ADD A, 3; 修改指針 MOVC A, A+PC MOV HEX, A RET ASCTAB: DB 30H, 31H, 32H, 33H, 34H D

35、B 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H DB 46H 在這個(gè)程序中在這個(gè)程序中, 查表指令查表指令MOVC A, A+PC到表格首地到表格首地址有兩條指令址有兩條指令, 占用占用 3 個(gè)字節(jié)地址空間個(gè)字節(jié)地址空間, 故修改指針應(yīng)加故修改指針應(yīng)加 3。 例例 14 設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置, 需對(duì)需對(duì) 96 路輸入進(jìn)行路輸入進(jìn)行控制控制, 每路有一個(gè)額定的最大值每路有一個(gè)額定的最大值, 是雙字節(jié)數(shù)。當(dāng)檢測(cè)量大于是雙字節(jié)數(shù)。當(dāng)檢測(cè)量大于該路對(duì)應(yīng)的最大值時(shí)該路對(duì)應(yīng)的最大值時(shí), 就越限報(bào)警。假設(shè)就越限報(bào)警。假設(shè)R

36、2 為保存檢測(cè)路數(shù)為保存檢測(cè)路數(shù)的寄存器的寄存器, 其對(duì)應(yīng)的最大額定值存放于其對(duì)應(yīng)的最大額定值存放于 31H和和 32H單元中。單元中。 查找最大額定值的程序如下查找最大額定值的程序如下: FMAX: MOV A, R2 ADD A, R2 ; 表中一個(gè)額定值為2個(gè)字節(jié) MOV 31H, A MOV DPTR, TAB ; 表首址 MOVC A, A+DPTR; 查表讀取第一個(gè)字節(jié) XCH A, 31H ; 第一個(gè)字節(jié)內(nèi)容存入31H INC DPTR MOVC A, A+DPTR; 查表讀取第二個(gè)字節(jié) MOV 32H, A ; 第二字節(jié)的內(nèi)容存入32H TAB: DW 1230H, 1450H

37、, . DW 2230H, 2440H, . DW 3120H, 3300H, . 例 15 在一個(gè)溫度檢測(cè)系統(tǒng)中, 溫度模擬信號(hào)由 10 位A/D輸入。將A/D結(jié)果轉(zhuǎn)換為對(duì)應(yīng)溫度值, 可采用查表方法實(shí)現(xiàn)。 先由實(shí)驗(yàn)測(cè)試出整個(gè)溫度量程范圍內(nèi)的A/D轉(zhuǎn)換結(jié)果, 把A/D轉(zhuǎn)換結(jié)果000H3FFH所對(duì)應(yīng)的溫度值組織為一個(gè)表存儲(chǔ)在程序存儲(chǔ)器中, 那么就可以根據(jù)檢測(cè)到的模擬量的 A/D轉(zhuǎn)換值查找出相應(yīng)的溫度值。 設(shè)測(cè)得的A/D轉(zhuǎn)換結(jié)果已存入 20H#, 21H單元中高位字節(jié)在20H中, 低位字節(jié)在21H中), 查表得到的溫度值存放在22H#,23H單元高位字節(jié)在 22H中, 低位字節(jié)在23H中)。 程序

38、如下程序如下: FTMP: MOV DPTR, TAB ; DPTR表首地址表首地址 MOVA, 21H ; (20H)()(21H)2CLRCRLCAMOV21H, AMOVA, 20HRLCAMOV20H, AMOVA, 21H ; 表首地址表首地址+偏移量偏移量 ADDC A, DPLMOVDPL, AMOVA, 20HADDC A, DPHMOVDPH, ACLR AMOVC A, A+DPTR; 查表得溫度值高位字節(jié)查表得溫度值高位字節(jié)MOV22H, ACLRAINCDPTRMOVC A, A+DPTR; 查表得溫度值低位字節(jié)查表得溫度值低位字節(jié)MOV23H, ARETTAB: DW

39、 4.2.4 散轉(zhuǎn)程序設(shè)計(jì)散轉(zhuǎn)程序設(shè)計(jì) 散轉(zhuǎn)程序是分支程序的一種, 它可根據(jù)運(yùn)算結(jié)果或輸入數(shù)據(jù)將程序轉(zhuǎn)入不同的分支。MCS - 51 指令系統(tǒng)中有一條跳轉(zhuǎn)指令JMPA+DPTR, 用它可以很容易地實(shí)現(xiàn)散轉(zhuǎn)功能。該指令把累加器的 8 位無(wú)符號(hào)數(shù)與 16 位數(shù)據(jù)指針的內(nèi)容相加, 并把相加的結(jié)果裝入程序計(jì)數(shù)器PC, 控制程序轉(zhuǎn)向目標(biāo)地址去執(zhí)行。此指令的特點(diǎn)在于, 轉(zhuǎn)移的目標(biāo)地址不是在編程或匯編時(shí)預(yù)先確定的, 而是在程序運(yùn)行過(guò)程中動(dòng)態(tài)地確定的。目標(biāo)地址是以數(shù)據(jù)指針 DPTR的內(nèi)容為起始的 256 字節(jié)范圍內(nèi)的指定地址, 即由 DPTR的內(nèi)容決定分支轉(zhuǎn)移程序的首地址, 由累加器 A的內(nèi)容來(lái)動(dòng)態(tài)選擇其中的

40、某一個(gè)分支轉(zhuǎn)移程序。 例例 11 根據(jù)工作寄存器根據(jù)工作寄存器R0 內(nèi)容的不同內(nèi)容的不同, 使程序轉(zhuǎn)入相使程序轉(zhuǎn)入相應(yīng)的分支。應(yīng)的分支。 (R0)=0 對(duì)應(yīng)的分支程序標(biāo)號(hào)為對(duì)應(yīng)的分支程序標(biāo)號(hào)為PR0; (R0)=1 對(duì)應(yīng)的分支程序標(biāo)號(hào)為對(duì)應(yīng)的分支程序標(biāo)號(hào)為PR1; (R0)=N 對(duì)應(yīng)的分支程序標(biāo)號(hào)為對(duì)應(yīng)的分支程序標(biāo)號(hào)為PRN。 程序如下程序如下: LP0: MOV DPTR, TAB ; 取表頭地址取表頭地址 MOV A, R0 ADD A, R0 ; R0內(nèi)容乘以內(nèi)容乘以2 JNC LP1 ; 無(wú)進(jìn)位轉(zhuǎn)移無(wú)進(jìn)位轉(zhuǎn)移 INC DPH ; 加進(jìn)位位加進(jìn)位位LP1: JMP A+DPTR; 跳至散轉(zhuǎn)表中相應(yīng)位置跳至散轉(zhuǎn)表中相應(yīng)位置 TAB: AJMP PR0 AJMP PR1 AJMP PRN 本例程序僅適用于散轉(zhuǎn)表首地址 TAB和處理程序入口地址 PR0, PR1, , PRN在同一個(gè) 2 KB范圍的存儲(chǔ)區(qū)內(nèi)的情形。若超出 2 KB范圍可在分支程序入口處安排一條長(zhǎng)跳轉(zhuǎn)指令, 可采用如下程序: MOV DPTR, TAB

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論