MCS-51系列單片機(jī)指令系統(tǒng)及匯編語言程序設(shè)計.ppt
-
資源ID:6381115
資源大?。?span id="re0a2cy" class="font-tahoma">1.04MB
全文頁數(shù):52頁
- 資源格式: PPT
下載積分:14.9積分
快捷下載
會員登錄下載
微信登錄下載
微信掃一掃登錄
友情提示
2、PDF文件下載后,可能會被瀏覽器默認(rèn)打開,此種情況可以點(diǎn)擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請知曉。
|
MCS-51系列單片機(jī)指令系統(tǒng)及匯編語言程序設(shè)計.ppt
第3章MCS 51系列單片機(jī)指令系統(tǒng)及匯編語言程序設(shè)計 MCS 51單片機(jī)的尋址方式MCS 51單片機(jī)分類指令MCS 51單片機(jī)匯編語言程序設(shè)計基礎(chǔ) 3 1MCS 51單片機(jī)的尋址方式 MCS 51單片機(jī)共有7種尋址方式 立即尋址直接尋址寄存器尋址寄存器間接尋址變址尋址相對尋址位尋址 1 立即尋址 立即尋址就是把操作數(shù)直接在指令中給出 即操作數(shù)包含在指令中 立即操作數(shù)有8位和16位兩種形式 前面加 來表示 例如 MOVA 0FFH 將立即數(shù)FFH傳送到累加器A中MOVDPTR 2000H 將16位立即數(shù)2000H傳送到數(shù)據(jù)指針DPTR中MOV40H 60H 將立即數(shù)60H傳送到40H內(nèi)部RAM單元中 2 直接尋址 指令中直接給出操作數(shù)地址的尋址方式 例如 MOVA 30H 內(nèi)部RAM中的30H單元中的數(shù)據(jù)內(nèi)容傳送到累加器A中 3 寄存器尋址 以通用寄存器的內(nèi)容為操作數(shù)的尋址方式 通用寄存器包括 A B DPTR R0 R7 其中 R0 R7必須在工作寄存器組之中 例如 INCR0 R0 1 R0需要注意的是 A和B既是通用寄存器 又是具有直接地址的特殊功能寄存器 4 寄存器間接尋址 以寄存器中的內(nèi)容為地址 該地址中的內(nèi)容為操作數(shù)的尋址方式 能夠用于寄存器間接尋址的寄存器有 R0 R1 DPTR SP 其中 R0 R1必須在工作寄存器組之中 SP僅用于堆棧操作 例如 MOVXA R1 外部數(shù)據(jù)RAM中地址為P2R1的單元內(nèi)容 AMOVX DPTR A A 外部數(shù)據(jù)RAM中DPTR為地址的單元寄存器間接尋址的存儲器空間包括 內(nèi)部數(shù)據(jù)RAM和外部數(shù)據(jù)RAM 內(nèi)部數(shù)據(jù)RAM共用128字節(jié) 用一個字節(jié)的R0或R1可尋址整個空間 外部數(shù)據(jù)RAM最大可達(dá)64K字節(jié) 僅用R0或R1無法尋址整個空間 在MCS 51系列單片機(jī)指令中 對外部數(shù)據(jù)RAM作間接尋址有兩種方法 第一種由P2口提供高8位外部數(shù)據(jù)RAM地址 由R0或R1提供低8位地址 由此共同尋址64K空間 第二種是用16位的DPTR作寄存器間接尋址 5 變址尋址 由程序計數(shù)器PC或DPTR加上偏移量寄存器A中內(nèi)容之和形成操作數(shù)地址的尋址方式 變址尋址只能對程序存儲器中的數(shù)據(jù)作尋址操作 由于程序存儲器是只讀存儲器 因此變址尋址操作只有讀操作而無寫操作 例如 MOVCA A DPTR A DPTR為地址的存儲器單元內(nèi)容 AMOVCA A PC A PC為地址的存儲器單元內(nèi)容 A 6 相對尋址 以當(dāng)前程序計數(shù)器PC的內(nèi)容為基址 加上指令給出的一字節(jié)補(bǔ)碼數(shù)形成新的PC值的尋址方式 PC中的當(dāng)前值稱為基地址 一字節(jié)補(bǔ)碼數(shù)稱為偏移量 新的PC值稱為轉(zhuǎn)移目的地址 例如 JC80H C 1跳轉(zhuǎn)表示進(jìn)位位C為0 則程序計數(shù)器PC中的內(nèi)容不改變 即不轉(zhuǎn)移 若進(jìn)位位C為1 則PC中的當(dāng)前值為基地址加上偏移量80H后所得到的結(jié)果作為該轉(zhuǎn)移指令的目的地址 7 位尋址 對位地址中的內(nèi)容作位操作的尋址方式 單片機(jī)中只有內(nèi)部RAM和特殊功能寄存器的部分單元有位地址 兩者統(tǒng)一編址 地址空間為00H FFH 因此 位尋址只能對有位地址的這兩個空間作尋址操作 例如SETB20H 1 20H位MOV32H C 進(jìn)位位C 32H位 3 2分類指令 MCS 51單片機(jī)共有111條指令 按功能分類 MCS 51指令系統(tǒng)可分為5大類 數(shù)據(jù)傳送類指令 共29條 算術(shù)操作類指令 共24條 邏輯操作類指令 共24條 控制轉(zhuǎn)移類指令 共17條 布爾變量操作類指令 共17條 1 數(shù)據(jù)傳送類指令 共29條 以累加器A為目的操作數(shù)類指令 4條 MOVA dirMOVA dataMOVA RnMOVA Ri例 R1 20H 20H 55H 指令MOVA R1執(zhí)行后 A 55H 以寄存器Rn為目的操作數(shù)的指令 3條 MOVRn dirMOVRn dataMOVRn A例 40H 30H 指令MOVR7 40H執(zhí)行后 R7 30H 以直接地址為目的操作數(shù)的指令 5條 MOVdir dirMOVdir dataMOVdir AMOVdir RnMOVdir Ri例 R0 50H 50H 10H 指令MOV35H R0執(zhí)行后 35H 10H 以間接地址為目的操作數(shù)的指令 3條 MOV Ri dirMOV Ri dataMOV Ri A查表指令 2條 MOVCA A DPTRMOVCA A PC例 A 20H DPTR 2000H 指令MOVCA A DPTR執(zhí)行后 程序存儲器2020H單元中的內(nèi)容送入A 累加器A與片外數(shù)據(jù)存儲器RAM傳送指令 4條 MOVX DPTR AMOVXA DPTRMOVXA RiMOVX Ri A例 DPTR 2000H 外部RAM中 2000H 18H 指令MOVXA DPTR執(zhí)行后 A 18H 例 P2 10H R1 50H A 64H 指令MOVX R1 A執(zhí)行后 外部RAM中 1050H 64H 堆棧操作類指令 2條 PUSHdirPOPdir例 SP 07H 35H 55H 指令PUSH35H執(zhí)行后 55H送入08H地址單元 SP 08H 交換指令 5條 XCHA RnXCHA RiXCHA dirXCHDA RiSWAPA例 A 80H R0 32H 32H FFH 指令XCHDA R0執(zhí)行后 A 8FH 32H F0H 16位數(shù)據(jù)傳送指令 1條 MOVDPTR data16 2 算術(shù)操作類指令 共24條 算術(shù)運(yùn)算指令共有24條 算術(shù)運(yùn)算主要是執(zhí)行加 減 乘 除 增量 減量和十進(jìn)制調(diào)整等指令 加法指令 4條 ADDA dataADDA dirADDA RnADDA Ri帶進(jìn)位加法指令 4條 ADDCA dirADDCA dataADDCA RnADDCA Ri帶借位減法指令 4條 SUBBA dirSUBBA dataSUBBA RnSUBBA Ri例 A 38H R1 20H 20H 23H C 1 指令SUBBA R1執(zhí)行后 A 14H 乘法指令 1條 MULA B例 A 50H B A0H 指令MULA B執(zhí)行后 A 00H B 32H除法指令 1條 DIVA B例 A 28H B 12H 指令DIVA B執(zhí)行后 A 02H B 04H加1指令 5條 INCAINCdirINC RiINCRnINCDPTR 減1指令 4條 DECADECdirDEC RiDECRn十進(jìn)制調(diào)整指令 1條 DAA 把A中按二進(jìn)制相加后的結(jié)果調(diào)整成按BCD數(shù)相加的結(jié)果 3 邏輯操作類指令 共24條 邏輯操作類指令共有24條 主要包括 與 或 異或 求反 清0 左右移位等邏輯操作 與 操作指令 6條 ANLA dirANLA dataANLA RnANLA RiANLdir AANLdir data 或 操作指令 6條 ORLA dirORLA dataORLA RnORLA RiORLdir AORLdir data例 21H 3AH A 14H 指令ORL21H A執(zhí)行后 21H 3EH 異或 操作指令 6條 XRLA dirXRLA dataXRLA RnXRLA RiXRLdir AXRLdir data例 R0 23H 23H 32H A 53H 指令XRLA R0執(zhí)行后 A 61H求反指令 1條 CPLA 累加器A中的內(nèi)容按位取反清零指令 1條 CLRA 0 A 累加器A中的內(nèi)容清零循環(huán)移位指令 4條 RLA 累加器A中的內(nèi)容左移一位RRA 累加器A中的內(nèi)容右移一位RLCA 累加器A中的內(nèi)容連同進(jìn)位位C左移一位RRCA 累加器A中的內(nèi)容連同進(jìn)位位C右移一位例 A 16H 指令RRA執(zhí)行后 A 0BH 4 控制轉(zhuǎn)移類指令 共17條 控制轉(zhuǎn)移類指令共有17條 用于控制程序的流向 所控制的范圍即為程序存儲器區(qū)間 子程序調(diào)用指令 4條 絕對調(diào)用指令A(yù)CALLaddr11絕對調(diào)用指令實(shí)現(xiàn)在2K地址范圍內(nèi)的子程序調(diào)用 本指令實(shí)現(xiàn)的操作將不改變原PC的高5位 僅把11位地址addr11送入PC的低11位 以此確定子程序的入口地址 由于整個64K程序存儲器空間被分成32個基本2K地址范圍 見表3 4 編程時 必須保證緊接ACALL指令后面的那一條指令的第一字節(jié)與被調(diào)用子程序的入口地址在同一2K范圍內(nèi) 否則將不能使用ACALL指令實(shí)現(xiàn)這種調(diào)用 表3 4程序存儲器空間中的32個基本2K地址范圍 長調(diào)用指令LCALLaddr16長調(diào)用指令為64K程序存儲器空間中的全范圍子程序調(diào)用指令 子程序的入口地址可在64K地址空間中的任一處 子程序返回指令RET從被調(diào)用子程序返回 與LCALL與ACALL指令配合使用 中斷返回指令RETI從中斷服務(wù)程序中返回 除具有RET功能外 還具有恢復(fù)中斷邏輯的功能 需注意的是 RETI指令不能用RET代替 轉(zhuǎn)移類指令 12條 轉(zhuǎn)移類指令分為無條件轉(zhuǎn)移指令和條件轉(zhuǎn)移指令兩組 無條件轉(zhuǎn)移指令包括絕對轉(zhuǎn)移 長轉(zhuǎn)移 短轉(zhuǎn)移和間接轉(zhuǎn)移 條件轉(zhuǎn)移指令包括結(jié)果為零 結(jié)果為非零 減 1 后結(jié)果為非零以及兩數(shù)不相等的轉(zhuǎn)移條件等 它們?nèi)坎捎孟鄬D(zhuǎn)移的方式 無條件轉(zhuǎn)移指令 4條 1 長轉(zhuǎn)移指令LJMPaddr16長轉(zhuǎn)移指令為64K程序存儲器空間的全范圍轉(zhuǎn)移指令 轉(zhuǎn)移地址可為16位地址值中的任一值 2 絕對轉(zhuǎn)移指令A(yù)JMPaddr11絕對轉(zhuǎn)移指令為2K地址范圍內(nèi)的轉(zhuǎn)移指令 對轉(zhuǎn)移目的地址的要求與ACALL指令中對子程序入口地址的要求相同 3 短轉(zhuǎn)移指令SJMPrel PC 2 rel PC短轉(zhuǎn)移指令為一頁地址范圍內(nèi)的相對轉(zhuǎn)移指令 因?yàn)閞el為1字節(jié)補(bǔ)碼偏移量 且SJMPrel指令為2字節(jié)指令 所以轉(zhuǎn)移范圍為 126D 129D 4 間接轉(zhuǎn)移指令JMP A DPTR 條件轉(zhuǎn)移指令 8條 1 累加器為零 非零轉(zhuǎn)移指令JZrel若A 0 則PC 2 rel PC 程序轉(zhuǎn)移到偏移量所指向的地址若A 0 程序順序執(zhí)行JNZrel若A 0 則PC 2 rel PC 程序轉(zhuǎn)移到偏移量所指向的地址若A 0 程序順序執(zhí)行 2 兩數(shù)不等轉(zhuǎn)移指令CJNEA dir rel若A dir 則PC 3 rel PC 程序轉(zhuǎn)移 若A dir 則程序順序執(zhí)行CJNEA data rel若A data 則PC 3 rel PC 程序轉(zhuǎn)移 若A data 則程序順序執(zhí)行CJNERn data rel若Rn data 則PC 3 rel PC 程序轉(zhuǎn)移 若Rn data 則程序順序執(zhí)行CJNE Ri data rel若 Ri data 則PC 3 rel PC 程序轉(zhuǎn)移 若 Ri data 則程序順序執(zhí)行 3 減 1 非零轉(zhuǎn)移指令DJNZRn relRn 1 Rn 若Rn 0 則PC 2 rel PC 程序轉(zhuǎn)移 若Rn 0 則程序順序執(zhí)行DJNZdir rel dir 1 dir 若 dir 0 則PC 3 rel PC 程序轉(zhuǎn)移 若 dir 0 則程序順序執(zhí)行需要注意的是 DJNZRn rel是2字節(jié)指令 而DJNZdir rel是3字節(jié)指令 所以在滿足轉(zhuǎn)移條件后 前者是PC 2 rel PC 而后者是PC 3 rel PC 例 說明下面一段程序運(yùn)行后累加器A中的結(jié)果 MOV23H 0AHCLRALOOP ADDA 23HDJNZ23H LOOPSJMP 解 根據(jù)程序可知 運(yùn)算結(jié)果A 10 9 8 7 6 5 4 3 2 1 55D 37H空操作指令 1條 NOP 5 布爾變量操作類指令 共17條 布爾變量操作類指令共有17條 其共同特點(diǎn)是對進(jìn)位位C和直接位地址bit的操作 包括清零 置位 求反 邏輯與 邏輯或 位傳送以及判斷轉(zhuǎn)移指令 清位指令 2條 CLRC 0 CCLRbit 0 bit置位指令 2條 SETBC 1 CSETBbit 1 bit位求反指令 2條 CPLCCPLbit位邏輯 與 指令 2條 ANLC bitANLC 位邏輯 或 指令 2條 ORLC bitORLC 位傳送指令 2條 MOVC bit bit CMOVbit C C bit位控制轉(zhuǎn)移指令 5條 位控制轉(zhuǎn)移指令是以位的狀態(tài)作為實(shí)現(xiàn)程序轉(zhuǎn)移的判斷條件 介紹如下 JCrel若C 1 則PC 2 rel PC 程序轉(zhuǎn)移 否則程序順序執(zhí)行JNCrel若C 0 則PC 2 rel PC 程序轉(zhuǎn)移 否則程序順序執(zhí)行JBbit rel若 bit 1 則PC 3 rel PC 程序轉(zhuǎn)移 否則程序順序執(zhí)行JNBbit rel若 bit 0 則PC 3 rel PC 程序轉(zhuǎn)移 否則程序順序執(zhí)行JBCbit rel若 bit 1 則PC 3 rel PC 程序轉(zhuǎn)移 且該位清零 否則程序順序執(zhí)行 3 3MCS 51單片機(jī)匯編語言程序設(shè)計 匯編語言概述順序程序分支程序循環(huán)程序子程序 1 匯編語言概述 結(jié)構(gòu)化程序的概念 順序結(jié)構(gòu)順序結(jié)構(gòu)是按照語句實(shí)現(xiàn)的先后次序執(zhí)行一系列的操作 它沒有分支 循環(huán)和轉(zhuǎn)移 分支結(jié)構(gòu)分支結(jié)構(gòu)又叫條件選擇結(jié)構(gòu) 根據(jù)不同情況做出判斷和選擇 以便執(zhí)行不同的程序段 分支的意思是在兩個或多個不同的操作中選擇其中的一個 循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)是重復(fù)執(zhí)行一系列操作 直到某個條件出現(xiàn)為止 循環(huán)實(shí)際上是分支結(jié)構(gòu)的一種擴(kuò)展 循環(huán)是否繼續(xù)是依靠條件判斷語句來完成的 按照條件判斷的位置 可以把循環(huán)分為 當(dāng)型循環(huán) 和 直到型循環(huán) 第一種情況是先作條件判斷 第二種情況是先執(zhí)行一次循環(huán) 然后判斷是否繼續(xù)循環(huán) 匯編語言程序設(shè)計的一般步驟 分析問題 抽象出描述問題的數(shù)學(xué)模型 確定解決問題的算法或解題思想 繪制流程圖和結(jié)構(gòu)圖 分配存儲空間和工作單元 編制程序 程序靜態(tài)檢查 上機(jī)調(diào)試 編寫相關(guān)說明 匯編語言的語句格式MCS 51匯編語言的語句格式應(yīng)符合下列結(jié)構(gòu) 標(biāo)號 操作碼 操作數(shù) 注釋 匯編語言語句由標(biāo)號 操作碼 操作數(shù)和注釋4部分組成 其中 標(biāo)號和注釋部分可以沒有 甚至某些指令的操作數(shù)也可以沒有 如NOP RET指令等 標(biāo)號位于語句的開始 由以字母開頭的字母和數(shù)字組成 它代表該語句的地址 標(biāo)號與操作碼之間要用 隔開 標(biāo)號與 之間不能有空格 與操作碼之間可以有空格 操作碼是指令的助記符 操作數(shù)在操作碼之后 二者用空格分開 操作數(shù)可以是數(shù)據(jù) 也可以是地址 有多個操作數(shù)時 操作數(shù)之間用逗號分開 注釋在語句的最后 以 開始 是說明性的文字 與語句的具體功能無關(guān) 指令中的數(shù)據(jù)可以是十進(jìn)制 十六進(jìn)制 二進(jìn)制 八進(jìn)制數(shù)和字符串 具體格式如下 十進(jìn)制數(shù)以D結(jié)尾 也可以省略 如55D或55 十六進(jìn)制數(shù)以H結(jié)尾 如55H 如果數(shù)據(jù)以A F開頭 其前必須加數(shù)字0 如 0FFH 二進(jìn)制數(shù)以B結(jié)尾 如00110011B 八進(jìn)制數(shù)以O(shè)或Q結(jié)尾 如55O或55Q 字符串用 或 表示 如 M 表示字符M的ASCII碼 例 MAIN MOVA 00H 將A清零在這條指令中 MAIN為標(biāo)號 表示該指令的地址 MOV為操作碼 表示指令的功能為數(shù)據(jù)傳送 A和 00H為操作數(shù) 將A清零為注釋 用于說明這條語句的功能 注釋內(nèi)容不參與程序的匯編 偽指令 ORG 匯編程序起始地址ORG用來說明其后程序段在存儲器中存放的起始地址 例 ORG0030HMAIN MOV20H 0FFHMOV30H 0FEHORG0030H表明從MAIN開始的程序從存儲器的0030H地址單元開始存放 并且MAIN 0030H EQU 賦值指令EQU用來給變量標(biāo)號賦予一個確定的數(shù)值 例 DATAEQU0AHMAINEQU1000H這段程序使DATA 0AH MAIN 1000H DB 定義數(shù)據(jù)字節(jié)DB指令按字節(jié)數(shù)的形式把數(shù)據(jù)存放在存儲單元中 例 TAB DB0C0H 0F9H 0A4H 0B0H 99H92H 82H 0F8H 80H 90H這段程序從表頭TAB起 連續(xù)存放了十個字節(jié)的數(shù)值 0C0H 0F9H 0A4H 0B0H 99H 92H 82H 0F8H 80H 90H DW 定義數(shù)據(jù)字DW指令按字 雙字節(jié) 的形式把數(shù)據(jù)存放在存儲單元中 例 ORG1020HDW30H 31H 1020H這段程序把數(shù)據(jù)30H 31H 1020H以字 雙字節(jié) 的形式存放在從1020H開始的一片存儲單元中 DS 定義存儲區(qū)DS從指定的地址單元開始 保留一定數(shù)量的存儲單元 例 ORG0100HDS5從0100H地址開始 空出5個字節(jié)的存儲單元來 為程序所用 BIT 位定義其功能是把位地址賦給字符名稱 例 LEDBITP1 0是將位地址P1 0賦給變量LED END 匯編結(jié)束END命令表明匯編語言程序結(jié)束 2 順序程序 順序程序是指程序中沒有使用轉(zhuǎn)移類指令的程序段 機(jī)器執(zhí)行這類程序時也只需按照先后順序依次執(zhí)行 中間不會有任何分支 循環(huán) 也不需要調(diào)用子程序 例 將一個單字節(jié)十六進(jìn)制數(shù)轉(zhuǎn)換成BCD碼 解 算法分析 單字節(jié)十六進(jìn)制數(shù)在0 255之間 將其除以100后 商為百位數(shù) 余數(shù)除以10 商為十位數(shù) 余數(shù)為個位數(shù) 設(shè)單字節(jié)數(shù)存放在40H 轉(zhuǎn)換后 百位數(shù)存放在R0中 十位數(shù)存放在R1中 個位數(shù)存放在R2中 具體程序如下 ORG0030HMOVA 40H 將單字節(jié)十六進(jìn)制數(shù)送入A中MOVB 64H 將100送入B中DIVABMOVR0 A 百位數(shù)送R0 余數(shù)在B中XCHA B 余數(shù)送入A中MOVB 0AHDIVAB 商為十位數(shù) 余數(shù)為個位數(shù)MOVR1 AMOVR2 BSJMP 例 設(shè)變量放在片內(nèi)RAM20H單元 其取值范圍為00H 01H 02H 03H 04H 05H 要求編制一段查表程序 查出變量的平方值 并放入片內(nèi)RAM21H單元 解 在程序存儲器的一片指定的地址單元中 建立各個變量的平方值表 用數(shù)據(jù)指針指向表的首地址 則變量與數(shù)據(jù)指針之和的地址單元中的內(nèi)容就是變量的平方值 程序如下 ORG0030HMAIN MOVDPTR 0500H 將表的首地址送給數(shù)據(jù)指針MOVA 20H 將變量送入A中MOVCA DPTR A 查表得到變量的平方值MOV21H A 將平方值送到指定的地址單元SJMP TABEQU0500H 給表賦首地址TABDB00H 01H 04H 09H 10H 19H 建立平方值表END 3 分支程序 例 將一位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼 設(shè)十六進(jìn)制數(shù)在A中 A的高4位為0 轉(zhuǎn)換結(jié)果仍存放在A中 解 十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼的原則是 十六進(jìn)制的0 9 加30H即轉(zhuǎn)換為ASCII碼 0AH 0FH要加37H才能轉(zhuǎn)換為ASCII碼 具體程序如下 ORG0030HCJNEA 0AH NO10 判斷十六進(jìn)制數(shù)是否為10NO10 JCLT10 C 1 即十六進(jìn)制數(shù)小于10則轉(zhuǎn)移ADDA 07H 十六進(jìn)制數(shù)大于或等于10 則先加07HLT10 ADDA 30HSJMP 例 設(shè)變量X以補(bǔ)碼的形式存放在片內(nèi)RAM30H單元 函數(shù)Y與X有如下的關(guān)系 試編制程序 根據(jù)X的大小求出Y 并放回原單元 解 取出變量后 先對變量X作取值范圍的判斷 再按照函數(shù)表達(dá)式求出Y的值 對符號的判斷可以用位操作類指令 也可以用邏輯運(yùn)算類指令 此處用邏輯運(yùn)算指令 程序流程圖如圖3 1所示 程序如下 ORG0030HMAIN MOVA 30HJZNEXT 判斷X是否為零ANLA 80H 判斷符號位JZED 若X大于0 Y XMOVA 05HADDA 30HMOV30H ASJMPEDNEXT MOV30H 20HED SJMP 圖3 1 4 循環(huán)程序 例 將內(nèi)部數(shù)據(jù)RAM中20H 3FH單元的內(nèi)容傳送到外部數(shù)據(jù)存儲器 起始單元地址為2000H 解 20H 3FH共計32個單元 需傳送32次數(shù)據(jù) 將R1作為循環(huán)計數(shù)器 程序流程圖如圖3 2所示 具體程序如下 所謂循環(huán)程序是指單片機(jī)反復(fù)執(zhí)行某一段程序 這個程序段通常稱為循環(huán)體 循環(huán)是在一定條件控制下進(jìn)行的 以決定是繼續(xù)循環(huán)執(zhí)行或是結(jié)束循環(huán) 程序循環(huán)是通過條件轉(zhuǎn)移指令進(jìn)行控制的 MAIN MOVR0 20H 將數(shù)據(jù)首地址賦給R0MOVDPTR 2000H 設(shè)置外部RAM首地址MOVR1 20H 設(shè)置循環(huán)計數(shù)器LOOP MOVA R0 取內(nèi)部RAM數(shù)據(jù)MOVX DPTR A 將數(shù)據(jù)送往外部RAMINCR0 調(diào)整內(nèi)部數(shù)據(jù)RAM 指針 指向下一個數(shù)據(jù)INCDPTR 調(diào)整外部RAM指針DJNZR1 LOOPSJMP 例 把片內(nèi)數(shù)據(jù)RAM30H 39H單元中的10個無符號數(shù)逐一比較 按從小到大的順序依次排列在這片單元中 解 為了把10個單元中的數(shù)按從小到大的順序排列 可以從30H單元開始 取前數(shù)與后數(shù)比較 如果前數(shù)小于后數(shù) 則順序繼續(xù)比較下去 如果前數(shù)大于后數(shù) 則前數(shù)和后數(shù)交換后再繼續(xù)比較下去 第一次循環(huán)將在最后單元中得到最大的數(shù) 要得到所有數(shù)據(jù)從小到大的排列需要進(jìn)行多重循環(huán) 程序流程圖如圖3 3所示 具體程序如下 MAIN CLR00H 清除交換標(biāo)志位MOVR7 0AHMOVR0 30H 數(shù)據(jù)區(qū)首地址MOVA R0LOOP INCR0MOVR2 A 保存前數(shù)SUBBA R0MOVA R2 恢復(fù)前數(shù)JCNEXT 判斷前后兩數(shù)大小SETB00HXCHA R0 前后兩數(shù)交換DECR0XCHA R0INCR0NEXT MOVA R0 取下一個數(shù)DJNZR7 LOOPJB00H MAIN 交換后重新比較SJMP 5 子程序 在調(diào)用子程序時 要注意以下幾個問題 子程序占用的存儲單元和寄存器 如果在調(diào)用子程序之前 主程序已經(jīng)使用了這些存儲單元或寄存器 在調(diào)用后 這些存儲單元或寄存器又被子程序使用 就應(yīng)當(dāng)先把這些存儲單元或寄存器中的內(nèi)容壓入堆棧保護(hù)起來 調(diào)用完后再從堆棧中彈出 加以恢復(fù) 入口參數(shù)和出口參數(shù) 調(diào)用之前要按照子程序的要求設(shè)置好入口參數(shù) 只有這樣才能在調(diào)用后 從出口參數(shù)處得到調(diào)用后的正確結(jié)果 參數(shù)的傳遞 子程序可以從指定的地址單元或寄存器獲得調(diào)用程序的數(shù)據(jù)參數(shù) 經(jīng)過調(diào)用后得到的數(shù)據(jù)可輸出到指定的地址單元或寄存器 從而實(shí)現(xiàn)兩者之間的參數(shù)傳遞 可遞歸性與可重入性 可遞歸性是指子程序可以調(diào)用自己 可重入性是指一個子程序可以同時被多個程序調(diào)用 這兩個特性主要是對大規(guī)模復(fù)雜系統(tǒng)程序的要求 對一般應(yīng)用程序可不作要求 例 通過調(diào)用子程序?qū)崿F(xiàn)延時100ms 設(shè)單片機(jī)晶振頻率為12MHz 解 子程序名稱為DELAY 可實(shí)現(xiàn)1 256ms的延時功能 具體延時時長可以通過設(shè)置入口參數(shù)獲得 入口參數(shù)放在R3中 具體程序如下 MAIN PUSHPSWMOVPSW 08HMOVR3 64H 入口參數(shù)為100LCALLDELAY 調(diào)用子程序POPPSWSJMP DELAY MOVR2 0FAHLOOP NOP 內(nèi)層循環(huán)為1msNOPDJNZR2 LOOPDJNZR3 DELAYRET 例 將存于R0中的一位十六進(jìn)制數(shù) R0的高4位為0 轉(zhuǎn)換為七段顯示碼 并將結(jié)果送P1口顯示 設(shè)七段顯示器為共陰極接法 解 顯示子程序?yàn)镈IR 具體程序如下 ORG0000HLJMPMAINORG0030HMAIN LCALLDELAYMOVP1 00HLCALLDIRDIR PUSHACCMOVA R0 取R0中的數(shù)MOVDPTR TABLEMOVCA A DPTR 查表 取出七段顯示碼MOVP1 APOPACCRET DELAY MOVR7 0FAHLOOP MOVR6 0FAHLOOP1 DJNZR6 LOOP1DJNZR7 LOOPRETTABLE DB40H 79H 24H 30HDB19H 12H 02H 78HDB00H 18H 08H 03HDB46H 21H 06H 0EHEND 習(xí)題解答 1 什么是尋址方式 MCS 51單片機(jī)有哪幾種尋址方式 答案 指令的一個重要的組成部分是操作數(shù) 指令給出參與運(yùn)算的數(shù)據(jù)的方式稱為尋址方式 換句話說 尋址方式就是尋找確定參與操作的數(shù)的真正地址 MCS 51系列單片機(jī)共有7種尋址方式 立即尋址 直接尋址 寄存器尋址 寄存器間接尋址 變址尋址 相對尋址和位尋址 2 什么是指令系統(tǒng) MCS 51單片機(jī)共有多少種指令 答案 CPU所能執(zhí)行的各種指令的集合稱為指令系統(tǒng) MCS 51系列單片機(jī)的指令系統(tǒng)是一種簡明易掌握 效率較高的指令系統(tǒng) 在MCS 51系列單片機(jī)的指令系統(tǒng)中共使用了7種尋址方式 42種助記符 這些助記符與尋址方式組合起來 共形成111條指令 完成數(shù)據(jù)傳送 算數(shù)運(yùn)算 邏輯運(yùn)算 控制轉(zhuǎn)移以及位操作等方面的工作 3 匯編語言的語句格式是什么 使用標(biāo)號有什么限制 注釋段起什么作用 答案 MCS 51匯編語言的語句格式應(yīng)符合下列結(jié)構(gòu) 標(biāo)號 操作碼 操作數(shù) 注釋 標(biāo)號位于語句的開始 由以字母開頭的字母和數(shù)字組成 它代表該語句的地址 標(biāo)號與操作碼之間要用 隔開 標(biāo)號與 之間不能有空格 與操作碼之間可以有空格 注釋在語句的最后 以 開始 是說明性的文字 與語句的具體功能無關(guān) 4 MCS 51匯編語言有哪幾條常用偽指令 各起什么作用 答案 ORG 匯編程序起始地址 用來說明其后程序段在存儲器中存放的起始地址 EQU 賦值指令 用來給變量標(biāo)號賦予一個確定的數(shù)值 DB 定義數(shù)據(jù)字節(jié) 指令按字節(jié)數(shù)的形式把數(shù)據(jù)存放在存儲單元中 DW 定義數(shù)據(jù)字 按字 雙字節(jié) 的形式把數(shù)據(jù)存放在存儲單元中 DS 定義存儲區(qū) 從指定的地址單元開始 保留一定數(shù)量的存儲單元 BIT 位定義 其功能是把位地址賦給字符名稱 END 匯編結(jié)束 表明匯編語言程序結(jié)束 5 匯編語言程序設(shè)計分哪幾步 各步驟的任務(wù)是什么 答案 分析問題 抽象出描述問題的數(shù)學(xué)模型 確定解決問題的算法或解題思想 繪制流程圖和結(jié)構(gòu)圖 分配存儲空間和工作單元 編制程序 程序靜態(tài)檢查 上機(jī)調(diào)試 編寫相關(guān)說明 6 將累加器A中的壓縮BCD碼分為兩個字節(jié) 形成非壓縮BCD碼 放入20H和21H單元中 寫出源程序 解 由題意 將累加器A中的低4位保留 高4位清零放入20H 高4位保留 低4位清零 半字節(jié)交換后存入21H單元中 程序如下 MOVR0 AANLA 0FHMOV20H AMOVA R0ANLA 0F0HSWAPAMOV21H A 7 已知內(nèi)部RAM的20H和21H單元中各有一個無符號8位二進(jìn)制數(shù) 試編程比較它們的大小 并把大數(shù)送到30H單元 解 MOVA 20HCJNEA 21H LOOPLOOP JNCLOOP1MOVA 21HLOOP1 MOV30H ARET 8 編制一段程序 要求在端口線P1 0和P1 1上分別產(chǎn)生周期為200us和400us的方波 設(shè)單片機(jī)的晶振頻率為12MHz 解 ORG0000HAJMPSTARTORG000BHAJMPIT0ORG001BHAJMPIT1ORG0100HSTART MOVTMOD 03HMOVTL0 9CHMOVTH0 38HMOVTCON 50HMOVIE 8AHSJMP ORG0130HIT0 MOVTL0 9CHCPLP1 0RETIIT1 MOVTH0 38HCPLP1 1RETIEND 9 試編寫一段程序 將外部數(shù)據(jù)RAM中從地址2000H開始的100個補(bǔ)碼數(shù)逐一取出 若為正數(shù)則放回原單元 若為負(fù)數(shù)則求反后放回原單元 解 START MOVDPTR 2000HMOVR0 64HLOOP MOVXA DPTRMOV20H AJNBACC 7 NEXTMOVA 20HCPLAMOVX DPTR ANEXT INCDPTRDJNZR0 LOOPSJMP