MCS-51單片機(jī)指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì).ppt_第1頁(yè)
MCS-51單片機(jī)指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì).ppt_第2頁(yè)
MCS-51單片機(jī)指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì).ppt_第3頁(yè)
MCS-51單片機(jī)指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì).ppt_第4頁(yè)
MCS-51單片機(jī)指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì).ppt_第5頁(yè)
已閱讀5頁(yè),還剩110頁(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)介

第2章MCS 51單片機(jī)指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì) 主要內(nèi)容 MCS 51單片機(jī)的尋址方式 指令系統(tǒng) 基本程序結(jié)構(gòu)及匯編語(yǔ)言的開(kāi)發(fā)和調(diào)試 重點(diǎn)在于尋址方式 各種指令的應(yīng)用 程序設(shè)計(jì)的規(guī)范 程序設(shè)計(jì)的思想及典型程序的理解和掌握 難點(diǎn)在于控制轉(zhuǎn)移 位操作指令的理解及各種指令的靈活應(yīng)用 以及程序設(shè)計(jì)的基本方法和針對(duì)具體的硬件設(shè)計(jì)出最合理的軟件 指令系統(tǒng) 一臺(tái)計(jì)算機(jī)所能識(shí)別 執(zhí)行的指令的集合就是它的指令系統(tǒng) 機(jī)器語(yǔ)言 指令系統(tǒng)是一套控制計(jì)算機(jī)執(zhí)行操作的二進(jìn)制編碼 稱(chēng)為機(jī)器語(yǔ)言 機(jī)器語(yǔ)言指令是計(jì)算機(jī)惟一能識(shí)別和執(zhí)行的指令 匯編語(yǔ)言 指令系統(tǒng)是利用指令助記符來(lái)描述的 稱(chēng)為匯編語(yǔ)言 計(jì)算機(jī)的指令系統(tǒng)一般都是利用匯編語(yǔ)言描述的 是由計(jì)算機(jī)硬件設(shè)計(jì)所決定的 指令系統(tǒng)沒(méi)有通用性 單片機(jī)一般是空機(jī) 未含任何系統(tǒng)軟件 因此在第一次使用前 必須對(duì)其進(jìn)行編程 2 1概述 2 1 1匯編語(yǔ)言指令格式與偽指令 1 常用單位與術(shù)語(yǔ)位 bit 位是計(jì)算機(jī)所能表示的最小的 最基本的數(shù)據(jù)單位 位通常是指一個(gè)二進(jìn)制位 字節(jié) Byte 一個(gè)連續(xù)的8位二進(jìn)制數(shù)碼稱(chēng)為一個(gè)字節(jié) 即1Byte 8bit 字 Word 通常由16位二進(jìn)制數(shù)碼組成 即1Word 2Byte 字長(zhǎng) 字長(zhǎng)是指計(jì)算機(jī)一次處理二進(jìn)制數(shù)碼位的多少 MCS 51型單片機(jī)是8位機(jī) 所以說(shuō)它的字長(zhǎng)為8位 MCS 51系列單片機(jī)都是以Intel公司最早的典型產(chǎn)品8051為核心 增加了一定的功能部件后構(gòu)成的 本章以8051為主介紹MCS 51系列單片機(jī) 2 匯編語(yǔ)言指令格式 指令格式 指令的表示方式稱(chēng)為指令格式 它規(guī)定了指令的長(zhǎng)度和內(nèi)部信息的安排 完整的指令格式如下 標(biāo)號(hào) 操作碼 操作數(shù) 操作數(shù) 注釋 其中 項(xiàng)是可選項(xiàng) 標(biāo)號(hào) 指本條指令起始地址的符號(hào) 也稱(chēng)為指令的符號(hào)地址 代表該條指令在程序編譯時(shí)的具體地址 操作碼 又稱(chēng)助記符 它是由對(duì)應(yīng)的英文縮寫(xiě)構(gòu)成的 是指令語(yǔ)句的關(guān)鍵 它規(guī)定了指令具體的操作功能 描述指令的操作性質(zhì) 是一條指令中不可缺少的內(nèi)容 操作數(shù) 它既可以是一個(gè)具體的數(shù)據(jù) 也可以是存放數(shù)據(jù)的地址 注釋 注釋也是指令語(yǔ)句的可選項(xiàng) 它是為增加程序的可讀性而設(shè)置的 是針對(duì)某指令而添加的說(shuō)明性文字 不產(chǎn)生可執(zhí)行的目標(biāo)代碼 偽指令 也稱(chēng)為匯編程序的控制命令 是程序員發(fā)給匯編程序的命令 用來(lái)設(shè)置符號(hào)值 保留和初始化存儲(chǔ)空間 控制用戶(hù)程序代碼的位置 偽指令只出現(xiàn)在匯編前的源程序中 僅提供匯編用的某些控制信息 不產(chǎn)生可執(zhí)行的目標(biāo)代碼 是CPU不能執(zhí)行的指令 1 定位偽指令ORG格式 ORGn其中 n通常為絕對(duì)地址 可以是十六進(jìn)制數(shù) 標(biāo)號(hào)或表達(dá)式 功能 規(guī)定編譯后的機(jī)器代碼存放的起始位置 在一個(gè)匯編語(yǔ)言源程序中允許存在多條定位偽指令 但每一個(gè)n值都應(yīng)和前面生成的機(jī)器指令存放地址不重疊 例如程序 ORG1000HSTART MOVA 20HMOVB 30H 3 偽指令 2 結(jié)束匯編偽指令END格式 標(biāo)號(hào) END 表達(dá)式 功能 放在匯編語(yǔ)言源程序的末尾 表明源程序的匯編到此結(jié)束 其后的任何內(nèi)容不予理睬 3 賦值偽指令EQU格式 字符名稱(chēng)xEQU賦值項(xiàng)n功能 將賦值項(xiàng)n的值賦予字符名稱(chēng)x 程序中凡出現(xiàn)該字符名稱(chēng)x就等同于該賦值項(xiàng)n 其值在整個(gè)程序中有效 賦值項(xiàng)n可以是常數(shù) 地址 標(biāo)號(hào)或表達(dá)式 在使用時(shí) 必須先賦值后使用 字符名稱(chēng) 與 標(biāo)號(hào) 的區(qū)別是 字符名稱(chēng) 后無(wú)冒號(hào) 而 標(biāo)號(hào) 后面有冒號(hào) 4 定義字節(jié)偽指令DB格式 標(biāo)號(hào) DBx1 x2 xn功能 將8位數(shù)據(jù) 或8位數(shù)據(jù)組 x1 x2 xn順序存放在從當(dāng)前程序存儲(chǔ)器地址開(kāi)始的存儲(chǔ)單元中 xi可以是8位數(shù)據(jù) ASCII碼 表達(dá)式 也可以是括在單引號(hào)內(nèi)的字符串 兩個(gè)數(shù)據(jù)之間用逗號(hào) 分隔 xi為數(shù)值常數(shù)時(shí) 取值范圍為00H FFH xi為ASCII碼時(shí) 要使用單引號(hào) 以示區(qū)別 xi為字符串常數(shù)時(shí) 其長(zhǎng)度不應(yīng)超過(guò)80個(gè)字符 5 定義雙字節(jié)偽指令DW格式 標(biāo)號(hào) DWx1 x2 xn功能 將雙字節(jié)數(shù)據(jù) 或雙字節(jié)數(shù)據(jù)組 順序存放在從標(biāo)號(hào)指定地址單元開(kāi)始的存儲(chǔ)單元中 其中 xi為16位數(shù)值常數(shù) 占兩個(gè)存儲(chǔ)單元 先存高8位 存入低位地址單元中 后存低8位 存入高位地址單元中 6 預(yù)留存儲(chǔ)空間偽指令DS格式 標(biāo)號(hào) DSn功能 從標(biāo)號(hào)指定地址單元開(kāi)始 預(yù)留n個(gè)存儲(chǔ)單元 匯編時(shí)不對(duì)這些存儲(chǔ)單元賦值 n可以是數(shù)據(jù) 也可以是表達(dá)式 7 定義位地址符號(hào)偽指令BIT格式 字符名稱(chēng)xBIT位地址n功能 將位地址n的值賦予字符名稱(chēng)x 程序中凡出現(xiàn)該字符名稱(chēng)x就代表該位地址 位地址n可以是絕對(duì)地址 也可以是符號(hào)地址 8 數(shù)據(jù)地址賦值偽指令DATA格式 字符名稱(chēng)xDATA表達(dá)式n功能 把表達(dá)式n的值賦值給左邊的字符名稱(chēng)x n可以是數(shù)據(jù)或地址 也可以是包含所定義的 字符名稱(chēng)x 在內(nèi)的表達(dá)式 但不能是匯編符號(hào) DATA與EQU的主要區(qū)別是 EQU定義的 字符名稱(chēng) 必須先定義后使用 而DATA定義的 字符名稱(chēng) 沒(méi)有這種限制 所以 DATA偽指令通常用在源程序的開(kāi)頭或末尾 2 1 2指令的分類(lèi) MCS 51指令系統(tǒng)有111條指令 可按下列幾種方式分類(lèi) 按指令字節(jié)數(shù)分類(lèi)單字節(jié)指令 49條 雙字節(jié)指令 46條 和三字節(jié)指令 16條 2 按指令執(zhí)行時(shí)間分類(lèi)單機(jī)器周期指令 65條 雙機(jī)器周期指令 44條 和四機(jī)器周期指令 2條 3 按功能分類(lèi)數(shù)據(jù)傳送指令 29條 算術(shù)操作指令 24條 邏輯操作指令 24條 控制轉(zhuǎn)移指令 17條 和位操作指令 17條 2 1 3指令中的常用符號(hào) Rn n 0 7 表示當(dāng)前工作寄存器R0 R7中的任一個(gè)寄存器 Ri i 0或1 表示通用寄存器組中用于間接尋址的兩個(gè)寄存器R0 R1 data 表示8位直接參與操作的立即數(shù) data16 表示16位直接參與操作的立即數(shù) direct 表示片內(nèi)RAM的8位單元地址 addr11 表示11位目的地址 主要用于ACALL和AJMP指令中 addr16 表示16位目的地址 主要用于LCALL和LJMP指令中 rel 用補(bǔ)碼形式表示的8位二進(jìn)制地址偏移量 取值范圍為 128 127 主要用于相對(duì)轉(zhuǎn)移指令 以形成轉(zhuǎn)移的目的地址 DPTR 數(shù)據(jù)指針 用于寄存器間接尋址方式和變址尋址方式 2 1 3指令中的常用符號(hào) bit 表示片內(nèi)RAM的位尋址區(qū) 或者是可以位尋址的SFR的位地址 A 或ACC B 表示累加器 B寄存器 C 表示PSW中的進(jìn)位標(biāo)志位Cy 在間接尋址方式中 表示間接尋址寄存器指針的前綴標(biāo)志 表示當(dāng)前的指令地址 在位操作指令中 表示對(duì)該位先求反后再參與操作 X 表示由X所指定的某寄存器或某單元中的內(nèi)容 X 表示由X間接尋址單元中的內(nèi)容 表示指令的操作結(jié)果是將箭頭右邊的內(nèi)容傳送到左邊 表示指令的操作結(jié)果是將箭頭左邊的內(nèi)容傳送到右邊 表示邏輯或 與 異或 尋址方式 在計(jì)算機(jī)中 說(shuō)明操作數(shù)所在地址的方法稱(chēng)為指令的尋址方式 計(jì)算機(jī)執(zhí)行程序?qū)嶋H上是在不斷尋找操作數(shù)并進(jìn)行操作的過(guò)程 每種計(jì)算機(jī)在設(shè)計(jì)時(shí)已決定了它具有哪些尋址方式 尋址方式越多 計(jì)算機(jī)的靈活性越強(qiáng) 指令系統(tǒng)也就越復(fù)雜 MCS 51單片機(jī)的指令系統(tǒng)提供了7種尋址方式 分別為立即尋址 直接尋址 寄存器尋址 寄存器間接尋址 變址尋址 相對(duì)尋址和位尋址 一條指令可能含多種尋址方式 2 2MCS 51單片機(jī)的尋址方式 2 2 1立即尋址 定義 將立即參與操作的數(shù)據(jù)直接寫(xiě)在指令中 這種尋址方式稱(chēng)為立即尋址 特點(diǎn) 指令中直接含有所需的操作數(shù) 該操作數(shù)可以是8位的 也可以是16位的 常常處在指令的第二字節(jié)和第三字節(jié)的位置上 立即數(shù)通常使用 data或 data16表示 在立即數(shù)前面加 標(biāo)志 用以和直接尋址中的直接地址 direc或bit 相區(qū)別 2 2 2直接尋址 定義 將操作數(shù)的地址直接存放在指令中 這種尋址方式稱(chēng)為直接尋址 特點(diǎn) 指令中含有操作數(shù)的地址 該地址指出了參與操作的數(shù)據(jù)所在的字節(jié)單元地址或位地址 計(jì)算機(jī)執(zhí)行它們時(shí)便可根據(jù)直接地址找到所需要的操作數(shù) 尋址范圍 ROM 片內(nèi)RAM區(qū) SFR和位地址空間 2 2 3寄存器尋址定義 操作數(shù)存放在MCS 51內(nèi)部的某個(gè)工作寄存器Rn R0 R7 或部分專(zhuān)用寄存器中 這種尋址方式稱(chēng)為寄存器尋址 特點(diǎn) 由指令指出某一個(gè)寄存器的內(nèi)容作為操作數(shù) 存放操作數(shù)的寄存器在指令代碼中不占據(jù)單獨(dú)的一個(gè)字節(jié) 而是嵌入 隱含 到操作碼字節(jié)中 尋址范圍 四組通用寄存器Rn R0 R7 部分專(zhuān)用寄存器 A B DPTR Cy 2 2 4寄存器間接尋址定義 指令給出的寄存器中存放的是操作數(shù)據(jù)的單元地址 這種尋址方式稱(chēng)為寄存器間接尋址 簡(jiǎn)稱(chēng)為寄存器間址 特點(diǎn) 指令給出的寄存器中存放的是操作數(shù)地址 寄存器間接尋址是一種二次尋找操作數(shù)地址的尋址方式 寄存器前邊必須加前綴符號(hào) 不能用于尋址特殊功能寄存器SFR 尋址范圍 內(nèi)部RAM低128B 只能使用R0或R1作間址寄存器 外部RAM 只能使用DPTR作間址寄存器 對(duì)于外部低256單元RAM的訪問(wèn) 除可以使用DPTR外 還可以使用R0或R1作間址寄存器 2 2 5變址尋址定義 操作數(shù)存放在變址寄存器 累加器A 和基址寄存器 DPTR或PC 相加形成的16位地址單元中 這種尋址方式稱(chēng)為基址加變址寄存器間接尋址 簡(jiǎn)稱(chēng)為變址尋址 特點(diǎn) 指令操作碼中隱含作為基址寄存器用的DPTR 或PC 和作為變址用的累加器A 在執(zhí)行變址尋址指令時(shí) MCS 51單片機(jī)先把基地址 DPTR或PC的內(nèi)容 和地址偏移量 A的內(nèi)容 相加 以形成操作數(shù)地址 再由操作數(shù)地址找到操作數(shù) 并完成相應(yīng)的操作 變址尋址方式是單字節(jié)指令 尋址范圍 只能對(duì)程序存儲(chǔ)器ROM進(jìn)行尋址 主要用于查表性質(zhì)的訪問(wèn) 注意 累加器A中存放的操作數(shù)地址相對(duì)基地址的偏移量的范圍為00H FFH 無(wú)符號(hào)數(shù) MCS 51單片機(jī)共有以下三條變址尋址指令 MOVCA A PC A A PC 1MOVCA A DPTR A A DPTR JMP A DPTR PC A DPTR 2 2 6相對(duì)尋址定義 將程序計(jì)數(shù)器PC的當(dāng)前值 取出本條指令后的PC值 與指令第二個(gè)字節(jié)給出的偏移量 rel 相加 形成新的轉(zhuǎn)移目標(biāo)地址 稱(chēng)為相對(duì)尋址方式 特點(diǎn) 相對(duì)尋址方式是為實(shí)現(xiàn)程序的相對(duì)轉(zhuǎn)移而設(shè)計(jì)的 為相對(duì)轉(zhuǎn)移指令所使用 其指令碼中含有相對(duì)地址偏移量 能生成浮動(dòng)代碼 如 SJMPrel PC PC 2 rel相對(duì)轉(zhuǎn)移指令的目的地址 指令地址 指令字節(jié)數(shù) 偏移量尋址范圍 只能對(duì)程序存儲(chǔ)器ROM進(jìn)行尋址 相對(duì)地址偏移量 rel 是一個(gè)帶符號(hào)的8位二進(jìn)制補(bǔ)碼 其取值范圍為 128 127 以PC為中間的256個(gè)字節(jié)范圍 2 2 7位尋址定義 指令中給出的操作數(shù)是一個(gè)可單獨(dú)尋址的位地址 這種尋址方式稱(chēng)為位尋址方式 特點(diǎn) 位尋址是直接尋址方式的一種 其特點(diǎn)是對(duì)8位二進(jìn)制數(shù)中的某一位的地址進(jìn)行操作 尋址范圍 片內(nèi)RAM低128B中位尋址區(qū) 部分SFR 其中有83位可以位尋址 可位尋址的位地址的表示形式如下 1 直接使用位地址形式 如 MOV00H C 00H Cy 其中 00H是片內(nèi)RAM中20H地址單元的第0位 2 字節(jié)地址加位序號(hào)的形式 如 MOV20H 0 C 20H 0 Cy 其中 20H 0是片內(nèi)RAM中20H地址單元的第0位 3 位的符號(hào)地址 位名稱(chēng) 的形式 對(duì)于部分特殊功能寄存器 其各位均有一個(gè)特定的名字 所以可以用它們的位名稱(chēng)來(lái)訪問(wèn)該位 如 ANLC P C C P 其中 P是PSW的第0位 C是PSW的第7位 4 字節(jié)符號(hào)地址 字節(jié)名稱(chēng) 加位序號(hào)的形式 對(duì)于部分特殊功能寄存器 如狀態(tài)標(biāo)志寄存器PSW 還可以用其字節(jié)名稱(chēng)加位序號(hào)形式來(lái)訪問(wèn)某一位 如 CPLPSW 6 AC 其中 PSW 6表示該位是PSW的第6位 例題1 指出下列指令的尋址方式MOVA R1 A R1 寄存器尋址ADDA 05H A A 立即數(shù)05H立即尋址MOVA R1 A R1 寄存器間接尋址MOV30H 4AH 30H 4AH 直接尋址MOVCA A DPTR A A DPTR 變址尋址SJMPLP PC PC 2 偏移量相對(duì)尋址MOV65H C 65H Cy 位尋址 2 3MCS 51單片機(jī)的指令系統(tǒng) MCS 51指令系統(tǒng)使用44種助記符 它們代表著33種功能 可以實(shí)現(xiàn)51種操作 指令助記符與操作數(shù)的各種可能的尋址方式的結(jié)合一共可構(gòu)造出111條指令 MCS 51單片機(jī)指令系統(tǒng)按其功能可分為數(shù)據(jù)傳送類(lèi)指令 算術(shù)運(yùn)算類(lèi)指令 邏輯運(yùn)算和移位類(lèi)指令 控制轉(zhuǎn)移類(lèi)指令和位操作類(lèi)指令五大類(lèi) 學(xué)習(xí)指令系統(tǒng)時(shí) 應(yīng)注意 1 指令的格式 功能 2 操作碼的含義 操作數(shù)的表示方法 3 尋址方式 源 目的操作數(shù)的范圍 4 對(duì)標(biāo)志位的影響 5 指令的適用范圍 6 正確估算指令的字節(jié)數(shù) 一般地 操作碼占1字節(jié) 操作數(shù)中 直接地址derict占1字節(jié) data占1字節(jié) data16占兩字節(jié) 操作數(shù)中的A B R0 R7 Ri DPTR A DPTR A PC等均隱含在操作碼中 2 3 1數(shù)據(jù)傳送指令 CPU在進(jìn)行算術(shù)和邏輯操作時(shí) 絕大多數(shù)指令都有操作數(shù) 所以數(shù)據(jù)傳送是一種最基本 最主要的操作 數(shù)據(jù)傳送指令共29條 可分為內(nèi)部RAM數(shù)據(jù)傳送 外部RAM數(shù)據(jù)傳送 程序存儲(chǔ)器數(shù)據(jù)傳送 數(shù)據(jù)交換和堆棧操作等五類(lèi) 尋址范圍 累加器A 片內(nèi)RAM SFR 片外RAM 功能 目的地址 源地址 可表示為 源地址單元的內(nèi)容不變 對(duì)標(biāo)志位的影響 除以累加器A為目的操作數(shù)的數(shù)據(jù)傳送指令對(duì)P標(biāo)志位有影響外 其余均不影響標(biāo)志位 1 內(nèi)部RAM數(shù)據(jù)傳送指令 16條 格式 MOV 其中 表示目的操作數(shù) 表示源操作數(shù) 范圍 源 目的操作數(shù)均在片內(nèi)RAM SFR中 指令形式 按目的操作數(shù)可將內(nèi)部數(shù)據(jù)傳送指令分為以下幾類(lèi) 1 以累加器A為目的操作數(shù) 4條 MOVA 其中 包括Rn Ri direct data 各個(gè)符號(hào)的意義見(jiàn)2 1 3節(jié)指令中的常用符號(hào) 以下同 只影響PSW中的P標(biāo)志位 不影響其他標(biāo)志位 2 以工作寄存器Rn為目的操作數(shù) 3條 MOVRn 其中 包括A direct data 3 以直接地址單元為目的操作數(shù) 5條 MOVdirect 其中 包括A Rn Ri direct data 4 以間址寄存器 Ri為目的操作數(shù) 3條 MOV Ri 其中 包括A direct data 5 16位數(shù)據(jù)傳送指令 1條 MOVDPTR data16 注 2 3 4 5 均不影響標(biāo)志位 內(nèi)部數(shù)據(jù)傳送指令的傳送關(guān)系如右圖所示 2 外部RAM數(shù)據(jù)傳送指令 4條 CPU與外部數(shù)據(jù)存儲(chǔ)器之間進(jìn)行數(shù)據(jù)傳送時(shí) 必須使用外部傳送指令 只能通過(guò)累加器A 采用寄存器間接尋址 用R0 R1和DPTR三個(gè)間接尋址的寄存器 方式完成 指令格式 MOVXA MOVX A其中 包括 DPTR Ri Ri R0 R1 只能訪問(wèn)片外RAM的低256個(gè)單元 DPTR可以訪問(wèn)片外RAM的全部64KB的空間 對(duì)標(biāo)志位的影響 MOVXA 指令只影響PSW中的P標(biāo)志位 不影響其他標(biāo)志位 MOVX A指令不影響標(biāo)志位 3 程序存儲(chǔ)器 ROM 數(shù)據(jù)傳送指令 查表指令 2條 程序存儲(chǔ)器的數(shù)據(jù)傳送是單向的 并且只能讀到累加器A中 這類(lèi)指令專(zhuān)門(mén)用于查表 又稱(chēng)為查表指令 指令格式 MOVCA A DPTP A A DPTR MOVCA A PC PC PC 1 A A PC 兩條指令的異同 其功能完全相同 但使用中存在著差異 1 查表的位置要求不同采用DPTR作為基地址寄存器 表可以放在64KB程序存儲(chǔ)器空間的任何地址 使用方便 故稱(chēng)為遠(yuǎn)程查表 采用PC作為基地址寄存器 具體的表在程序存儲(chǔ)器中只能在查表指令后的256B的地址空間中 使用有限制 故稱(chēng)為近程查表 2 偏移量的計(jì)算方法不同采用DPTR作為基地址寄存器 查表地址為 A DPTR 采用PC作為基地址寄存器 查表地址為 A PC 1 因此偏移量的計(jì)算方法不同 采用DPTR作為基地址寄存器 A為欲查數(shù)值距離表首地址的值 采用PC作為基地址寄存器 A的值必須預(yù)先設(shè)置為 A的值 表首地址 當(dāng)前指令的PC值 14 數(shù)據(jù)交換指令 5條 數(shù)據(jù)傳輸時(shí) 若需要保存目的操作數(shù) 則經(jīng)常采用數(shù)據(jù)交換指令 1 半字節(jié)數(shù)據(jù)交換指令 2條 指令格式 SWAPA A 3 0 A 7 4XCHDA Ri A 3 0 Ri 3 0 2 字節(jié)交換指令 3條 指令格式 XCHA 其中 包括Rn Ri direct 5 堆棧操作指令 2條 指令格式 PUSHdirect SP SP 1 SP direct POPderect direct SP SP SP 1特點(diǎn) 堆棧操作指令是一種特殊的數(shù)據(jù)傳送指令 是根據(jù)棧指針SP中的棧頂?shù)刂愤M(jìn)行數(shù)據(jù)操作 堆棧操作指令的實(shí)質(zhì)是以棧指針SP為間址寄存器的間址尋址方式 堆棧區(qū)應(yīng)避開(kāi)使用的工作寄存器區(qū)和其他需要使用的數(shù)據(jù)區(qū) 系統(tǒng)復(fù)位后 SP的初始值為07H 為了避免重疊 一般初始化時(shí)要重新設(shè)置SP 功能 實(shí)現(xiàn)RAM單元數(shù)據(jù)送入棧頂或由棧頂取出數(shù)據(jù)送至RAM單元 適用場(chǎng)合 用于執(zhí)行中斷 子程序調(diào)用 參數(shù)傳遞等程序的斷點(diǎn)保護(hù)和現(xiàn)場(chǎng)保護(hù) 書(shū)寫(xiě)方式 堆棧操作指令是直接尋址指令 直接地址不能是寄存器名 因此應(yīng)注意指令的書(shū)寫(xiě)格式 例如 PUSHACC 不能寫(xiě)成PUSHA POP00H 不能寫(xiě)成POPR0 2 3 2算術(shù)運(yùn)算指令 算術(shù)運(yùn)算指令的兩個(gè)參與運(yùn)算的操作數(shù) 一個(gè)存放在累加器A中 此操作數(shù)也為目的操作數(shù) 一個(gè)存放在R0 R7或 Ri 片內(nèi)RAM 中 或是 data 立即數(shù) 算術(shù)運(yùn)算指令可以分為加法指令 帶進(jìn)位的加法指令 帶借位的減法指令 十進(jìn)制調(diào)整指令 加1指令 減1指令 乘除指令 1 加法指令 4條 指令格式 ADDA A A 其中 包括Rn Ri direct data 對(duì)標(biāo)志位的影響 ADD對(duì)PSW中的所有標(biāo)志位均產(chǎn)生影響 2 帶進(jìn)位的加法指令 4條 指令格式 ADDCA A A Cy 其中 包括Rn Ri direct data 對(duì)標(biāo)志位的影響 ADDC對(duì)PSW中的所有標(biāo)志位均產(chǎn)生影響 3 帶借位的減法指令 4條 指令格式 SUBBA A A Cy 其中 包括Rn Ri direct data 對(duì)標(biāo)志位的影響 SUBB對(duì)PSW中的所有標(biāo)志位均產(chǎn)生影響 注意 MCS 51指令系統(tǒng)中沒(méi)有不帶借位的減法指令 欲實(shí)現(xiàn)不帶借位的減法計(jì)算 應(yīng)預(yù)先置Cy 0 利用CLRC指令 然后利用帶借位的減法指令SUBB實(shí)現(xiàn)計(jì)算 4 十進(jìn)制調(diào)整指令 1條 功能 跟在加法指令A(yù)DD或ADDC后面 對(duì)運(yùn)算結(jié)果的十進(jìn)制數(shù)進(jìn)行BCD碼修正 使它調(diào)整為壓縮的BCD碼數(shù) 以完成十進(jìn)制加法運(yùn)算功能 特點(diǎn) 十進(jìn)制調(diào)整指令也稱(chēng)為BCD碼修正指令 這是一條專(zhuān)用指令 兩個(gè)壓縮的BCD碼按二進(jìn)制數(shù)相加后必須經(jīng)本指令調(diào)整才能得到壓縮的BCD碼的和 源操作數(shù)只能在累加器A中 結(jié)果存入A中 指令格式 DAA注意 十進(jìn)制調(diào)整指令不能對(duì)減法指令進(jìn)行修正 BCD碼減法必須采用BCD補(bǔ)碼運(yùn)算法則 變減法為補(bǔ)碼加法 被減數(shù) 減數(shù)的補(bǔ)碼 減數(shù)的補(bǔ)碼 9AH 減數(shù) 然后對(duì)其進(jìn)行十進(jìn)制調(diào)整來(lái)實(shí)現(xiàn) 5 加1指令 5條 功能 加1指令又稱(chēng)為增量指令 其功能是使操作數(shù)所指定的單元的內(nèi)容加1 指令格式 INC 1其中 即是源操作數(shù)又是目的操作數(shù) 即只有一個(gè)操作數(shù) 包括A Rn direct Ri DPTR 對(duì)標(biāo)志位的影響 除對(duì)累加器A操作影響P標(biāo)志位外 其他操作均不影響PSW的各標(biāo)志位 6 減1指令 4條 功能 減1指令又稱(chēng)為減量指令 其功能是使操作數(shù)所指定的單元的內(nèi)容減1 指令格式 DEC 1其中 即是源操作數(shù)又是目的操作數(shù) 即只有一個(gè)操作數(shù) 包括A Rn direct Ri 對(duì)標(biāo)志位的影響 同加1指令 7 乘除指令 2條 功能 實(shí)現(xiàn)乘法或除法操作 特點(diǎn) 乘除指令在MCS 51指令系統(tǒng)中執(zhí)行時(shí)間最長(zhǎng) 均為四周期指令 指令格式 MULAB B A A B DIVAB A A B B 對(duì)標(biāo)志位的影響 乘除指令影響PSW中的Cy OV P標(biāo)志位 其中 Cy位總是被清0的 P是由累加器A中1的個(gè)數(shù)的奇偶性決定的 乘法運(yùn)算中 若乘積大于FFH 則OV標(biāo)志位置1 否則清0 除法運(yùn)算中 若除數(shù)為0 則OV標(biāo)志位置1 否則清0 2 3 3邏輯運(yùn)算和移位指令 對(duì)標(biāo)志位的影響 邏輯運(yùn)算和移位指令中除了兩條帶進(jìn)位的循環(huán)移位指令外 其余均不影響PSW中的各標(biāo)志位 但當(dāng)目的操作數(shù)是累加器A時(shí) 影響PSW中的奇偶校驗(yàn)位P 常用的邏輯運(yùn)算和移位類(lèi)指令有 邏輯與 邏輯或 邏輯異或 循環(huán)移位 清0 求反 非 等24條指令 它們的操作數(shù)都是8位的 邏輯運(yùn)算都是按位進(jìn)行的 除用于邏輯運(yùn)算外 還可用于模擬各種數(shù)字邏輯電路的功能 進(jìn)行邏輯電路的設(shè)計(jì) 1 邏輯與運(yùn)算指令 6條 功能 實(shí)現(xiàn)兩個(gè)操作數(shù)的邏輯與 指令格式 ANLA 其中 包括Rn Ri direct data ANLdirest 其中 包括A data 適用場(chǎng)合 實(shí)現(xiàn)邏輯與 主要用于操作數(shù)的某些位不變 這些位與 1 某些位置0 這些位與 0 2 邏輯或運(yùn)算指令 6條 功能 實(shí)現(xiàn)兩個(gè)操作數(shù)的邏輯或 指令格式 ORLA 其中 包括Rn Ri direct data ORLdirest 其中 包括A data 適用場(chǎng)合 實(shí)現(xiàn)邏輯或 主要用于操作數(shù)的某些位不變 這些位或 0 某些位置1 這些位或 1 3 邏輯異或運(yùn)算指令 6條 功能 實(shí)現(xiàn)兩個(gè)操作數(shù)的邏輯異或 指令格式 XRLA 其中 包括Rn Ri direct data XRLdirest 其中 包括A data 適用場(chǎng)合 實(shí)現(xiàn)邏輯異或 主要用于操作數(shù)的某些位不變 這些位異或 0 某些位取反 這些位異或 1 4 循環(huán)移位指令 4條 MCS 51單片機(jī)的循環(huán)移位指令共有不帶進(jìn)位的循環(huán)左 右移位 操作碼為RL RR 和帶進(jìn)位的循環(huán)左 右移位 操作碼為RLC RRC 指令4條 特點(diǎn) 只能對(duì)累加器A進(jìn)行循環(huán)移位 指令格式 操作碼A 功能 累加器A中的數(shù)據(jù)逐位左移一位相當(dāng)于原內(nèi)容乘2 而逐位右移一位相當(dāng)于原內(nèi)容除以2 循環(huán)移位指令示意圖如右圖所示 5 累加器清0與取反指令 2條 指令格式 CLRA A 00HCPLA A 特點(diǎn) 可以節(jié)省存儲(chǔ)空間 提高程序執(zhí)行效率 對(duì)標(biāo)志位的影響 CLRA指令只影響PSW的P標(biāo)志位 CPLA指令不影響PSW各標(biāo)志位 2 3 4控制轉(zhuǎn)移指令 功能 改變程序計(jì)數(shù)器PC中的內(nèi)容 控制程序執(zhí)行的流向 實(shí)現(xiàn)程序分支轉(zhuǎn)向 為了控制程序的執(zhí)行方向 MCS 51單片機(jī)提供了17條控制轉(zhuǎn)移指令 對(duì)標(biāo)志位的影響 除了CJNE影響PSW的進(jìn)位標(biāo)志位Cy外 其余均不影響PSW的各標(biāo)志位 1 無(wú)條件轉(zhuǎn)移指令 4條 定義 不規(guī)定條件的程序轉(zhuǎn)移稱(chēng)為無(wú)條件轉(zhuǎn)移指令 指令格式 長(zhǎng)轉(zhuǎn)移指令 LJMPaddr16 PC addr15 0絕對(duì)轉(zhuǎn)移指令 AJMPaddr11 PC PC 2 PC10 0 addr11相對(duì) 短 轉(zhuǎn)移指令 SJMPrel PC PC 2 rel間接 散 轉(zhuǎn)移指令 JMP A DPTR PC DPTR A 注意 1 使用轉(zhuǎn)移指令時(shí) 指令中的地址或偏移量均可采用標(biāo)號(hào) 只有在執(zhí)行前才被匯編成實(shí)際的二進(jìn)制地址 2 指令的轉(zhuǎn)移范圍 在執(zhí)行當(dāng)前轉(zhuǎn)移指令后的PC值的基礎(chǔ)上 長(zhǎng)轉(zhuǎn)移指令LJMP 64KB絕對(duì)轉(zhuǎn)移指令A(yù)JMP 2KB相對(duì) 短 轉(zhuǎn)移指令SJMP 128 127 用補(bǔ)碼表示 間接 散 轉(zhuǎn)移指令JMP 64KB 3 相對(duì) 短 轉(zhuǎn)移指令SJMPrel中地址偏移量的計(jì)算 rel 轉(zhuǎn)移目標(biāo)地址 轉(zhuǎn)移指令地址 當(dāng)前PC值 2 4 原地踏步 暫停當(dāng)前的程序 并不是真的停機(jī) 的實(shí)現(xiàn)SJMP 或HERE SJMPHERE 5 間接 散 轉(zhuǎn)移指令 JMP A DPTR常用于實(shí)現(xiàn)程序的分支轉(zhuǎn)移 散轉(zhuǎn) DPTR為轉(zhuǎn)移目的的起始地址 A為轉(zhuǎn)移目的的偏移量 6 在編程中 經(jīng)常使用短轉(zhuǎn)移指令SJMP和相對(duì)轉(zhuǎn)移指令A(yù)JMP 以便生成浮動(dòng)代碼 并不經(jīng)常使用長(zhǎng)轉(zhuǎn)移指令LJMP 2 條件轉(zhuǎn)移指令 2條 功能 在規(guī)定的條件滿(mǎn)足時(shí)進(jìn)行程序轉(zhuǎn)移 否則程序往下順序執(zhí)行 MCS 51單片機(jī)中 條件轉(zhuǎn)移指令實(shí)質(zhì)上是累加器A判零指令 指令格式 JZrel 若 A 0 則轉(zhuǎn)移 PC PC 2 rel若 A 0 則順序執(zhí)行 PC PC 2JNZrel 若 A 0 則轉(zhuǎn)移 PC PC 2 rel若 A 0 則順序執(zhí)行 PC PC 2指令的轉(zhuǎn)移范圍 rel的取值范圍是在執(zhí)行當(dāng)前轉(zhuǎn)移指令后的PC值基礎(chǔ)上的 128 127 用補(bǔ)碼表示 可以采用符號(hào)地址表示 偏移量rel的計(jì)算方法 rel 轉(zhuǎn)移目標(biāo)地址 轉(zhuǎn)移指令地址 當(dāng)前PC值 2 3 比較轉(zhuǎn)移指令 4條 指令格式 CJNE目的操作數(shù) 源操作數(shù) rel當(dāng)目的操作數(shù)為A時(shí) 源操作數(shù)為 data direct 當(dāng)目的操作數(shù)為Rn Ri時(shí) 源操作數(shù)為 data 即 CJNEA direct relCJNEA data relCJNERn data relCJNE Ri data rel功能 把兩個(gè)操作數(shù)進(jìn)行比較 以比較的結(jié)果作為條件來(lái)控制程序的轉(zhuǎn)移 若 目的操作數(shù) 源操作數(shù) 則程序繼續(xù)執(zhí)行 PC PC 3若 目的操作數(shù) 源操作數(shù) 則程序轉(zhuǎn)移 PC PC rel 3 Cy 0若 目的操作數(shù) 源操作數(shù) 則程序轉(zhuǎn)移 PC PC rel 3 Cy 1 功能 比較兩個(gè)操作數(shù)的大小 對(duì)標(biāo)志位影響 影響Cy標(biāo)志位 不影響其他標(biāo)志位 指令的轉(zhuǎn)移范圍 rel的取值范圍是在執(zhí)行當(dāng)前轉(zhuǎn)移指令后的PC值基礎(chǔ)上的 128 127 用補(bǔ)碼表示 可以采用符號(hào)地址表示 注意 比較轉(zhuǎn)移指令的比較是通過(guò)兩操作數(shù)的減法實(shí)現(xiàn)的 影響Cy標(biāo)志位 不保存最后的差值 兩個(gè)操作數(shù)的內(nèi)容不變 4 循環(huán) 減1條件 轉(zhuǎn)移指令 2條 功能 具有減1判非0則轉(zhuǎn)移的功能 主要用于控制程序循環(huán) 實(shí)現(xiàn)按循環(huán)次數(shù)控制循環(huán)的目的 特點(diǎn) 循環(huán)轉(zhuǎn)移指令是一組把減1與條件轉(zhuǎn)移兩種功能結(jié)合在一起的指令 指令格式 DJNZ rel 1若 0 則轉(zhuǎn)移 PC PC 2 rel若 0 則不轉(zhuǎn)移 PC PC 2注意 條件轉(zhuǎn)移指令均為相對(duì)轉(zhuǎn)移指令 因此指令的轉(zhuǎn)移范圍十分有限 若要實(shí)現(xiàn)64KB范圍內(nèi)的轉(zhuǎn)移 則可以借助于一條長(zhǎng)轉(zhuǎn)移指令的過(guò)渡來(lái)實(shí)現(xiàn) 5 子程序調(diào)用與返回指令 4條 定義 具有完整功能的程序段定義為子程序 供主程序調(diào)用 功能 供主程序在需要時(shí)調(diào)用 子程序可以在程序中反復(fù)多次使用 以簡(jiǎn)化源程序的書(shū)寫(xiě) 特點(diǎn) 子程序可以嵌套 有利于模塊化程序設(shè)計(jì) 主程序與子程序之間的調(diào)用關(guān)系如下左圖所示 兩級(jí)子程序嵌套的示意圖如下右圖所示 為了實(shí)現(xiàn)主程序?qū)ψ映绦虻囊淮瓮暾{(diào)用 必須有子程序調(diào)用指令和子程序返回指令 子程序調(diào)用指令在主程序中使用 而子程序返回指令則是子程序的最后一條指令 調(diào)用與返回指令是成對(duì)使用的 子程序調(diào)用指令的功能 必須具有自動(dòng)把程序計(jì)數(shù)器PC中的斷點(diǎn)地址保護(hù)到堆棧中 且將子程序入口地址自動(dòng)送入程序計(jì)數(shù)器PC中的功能 子程序返回指令的功能 必須具有自動(dòng)把堆棧中的斷點(diǎn)地址恢復(fù)到程序計(jì)數(shù)器PC中的功能 注意 子程序調(diào)用時(shí)應(yīng)注意入口參數(shù)設(shè)置 子程序返回時(shí)應(yīng)注意出口參數(shù)的傳遞 3 子程序返回指令RET PC 15 8 SP SP SP 1 PC 7 0 SP SP SP 1 4 中斷返回指令RETI PC 15 8 SP SP SP 1 PC 7 0 SP SP SP 1注 中斷服務(wù)程序是一種特殊的子程序 它是在計(jì)算機(jī)響應(yīng)中斷時(shí) 由硬件完成調(diào)用而進(jìn)入相應(yīng)的中斷服務(wù)程序 RETI指令與RET指令相仿 區(qū)別在于RET是從子程序返回 RETI是從中斷服務(wù)程序返回 無(wú)論是RET還是RETI都是子程序執(zhí)行的最后一條指令 指令格式 1 絕對(duì)短調(diào)用指令A(yù)CALLaddr11 PC PC 2 SP SP 1 SP PC 7 0 SP SP 1 SP PC 15 8 PC 10 0 addr11其中 addr11為11位地址 實(shí)際編程時(shí)可以用符號(hào)地址 并且只能在2KB范圍以?xún)?nèi)調(diào)用子程序 2 絕對(duì)長(zhǎng)調(diào)用指令LCALLaddr16 PC PC 3 SP SP 1 SP PC 7 0 SP SP 1 SP PC 15 8 PC 15 0 addr16其中 addr16為16位地址 實(shí)際編程時(shí)可以用符號(hào)地址 可以在64KB范圍以?xún)?nèi)調(diào)用子程序 6 空操作指令NOP 1條 指令格式 NOP PC PC 1功能 不執(zhí)行任何操作 消耗了一個(gè)機(jī)器周期 常用于軟件延時(shí)或在程序可靠性設(shè)計(jì)中用來(lái)穩(wěn)定程序 特點(diǎn) NOP占據(jù)一個(gè)單元的存儲(chǔ)空間 除了使PC的內(nèi)容加1外 CPU不產(chǎn)生任何操作結(jié)果 只是消耗了一個(gè)機(jī)器周期 2 3 5位操作指令 位操作 布爾變量操作 操作數(shù)不是字節(jié) 而是字節(jié)中的某個(gè)位 每位的取值只能取0或1 指令的尋址范圍 片內(nèi)RAM位尋址區(qū)20H 2FH SFR中的11個(gè)可位尋址特殊寄存器中的83個(gè)可尋址位 特點(diǎn) 以進(jìn)位標(biāo)志Cy作為位累加器 可以實(shí)現(xiàn)布爾變量的傳送 運(yùn)算和控制轉(zhuǎn)移等功能 指令中的位地址的表達(dá)方式 直接地址方式 如0AFH 特殊功能寄存器名 位序號(hào) 如PSW 3 字節(jié)地址 位序號(hào) 如0D0H 0 位名稱(chēng)方式 如F0 和用戶(hù)定義名稱(chēng)等幾種方式 1 位數(shù)據(jù)傳送指令 2條 特點(diǎn) 在可尋址位與位累加器Cy之間進(jìn)行的 不能在兩個(gè)可尋址位間直接進(jìn)行傳送 指令格式 MOVC bit Cy bit MOVbit C bit Cy 2 位邏輯操作指令 6條 指令格式 操作碼C 其中 操作碼包括ANL 邏輯位 與 ORL 邏輯位 或 包括bit bit CPL 其中 CPL表示取反 包括Cy bit 功能 位邏輯操作指令用于位邏輯操作 還可用于對(duì)組合邏輯電路的模擬 采用位操作指令進(jìn)行組合邏輯電路的設(shè)計(jì)比采用字節(jié)型邏輯指令節(jié)約存儲(chǔ)空間 運(yùn)算操作十分方便 3 位狀態(tài) 置位 清0 控制指令 4條 指令格式 CLR 0SETB 1其中 包括Cy bit 4 位條件 控制 轉(zhuǎn)移指令 5條 特點(diǎn) 以位的狀態(tài)作為實(shí)現(xiàn)程序轉(zhuǎn)移的判斷條件 指令格式 1 以進(jìn)位標(biāo)志位Cy內(nèi)容為條件的轉(zhuǎn)移指令JCrel 若 Cy 1 則轉(zhuǎn)移 PC PC 2 rel 否則順序執(zhí)行JNCrel 若 Cy 0 則轉(zhuǎn)移 PC PC 2 rel 否則順序執(zhí)行 2 以位地址bit內(nèi)容為條件的轉(zhuǎn)移指令指令格式 JBbit rel 若 bit 1 則轉(zhuǎn)移 PC PC 3 rel 否則順序執(zhí)行JNBbit rel 若 bit 0 則轉(zhuǎn)移 PC PC 3 rel 否則順序執(zhí)行JBCbit rel 若 bit 1 則轉(zhuǎn)移 PC PC 3 rel 且 bit 0 否則順序執(zhí)行 2 4匯編語(yǔ)言及程序設(shè)計(jì) 程序設(shè)計(jì) 就是編制計(jì)算機(jī)的程序 即應(yīng)用計(jì)算機(jī)所能識(shí)別的 接受的語(yǔ)言把要解決的問(wèn)題的步驟有序地描述出來(lái) 程序設(shè)計(jì)語(yǔ)言的種類(lèi) 1 機(jī)器語(yǔ)言 機(jī)器語(yǔ)言是用二進(jìn)制代碼表示的計(jì)算機(jī)惟一能識(shí)別和執(zhí)行的最原始的程序設(shè)計(jì)語(yǔ)言 2 匯編語(yǔ)言 利用指令助記符來(lái)描述的程序設(shè)計(jì)語(yǔ)言 3 高級(jí)語(yǔ)言 高級(jí)語(yǔ)言接近于人的自然語(yǔ)言 是面向過(guò)程而獨(dú)立于機(jī)器的通用語(yǔ)言 匯編語(yǔ)言的指令類(lèi)型 MCS 51單片機(jī)匯編語(yǔ)言 包含兩類(lèi)不同性質(zhì)的指令 1 基本指令 即指令系統(tǒng)中的指令 它們都是機(jī)器能夠執(zhí)行的指令 每一條指令都有對(duì)應(yīng)的機(jī)器碼 2 偽指令 匯編時(shí)用于控制匯編的指令 它們都是機(jī)器不執(zhí)行的指令 無(wú)機(jī)器碼 匯編語(yǔ)言的語(yǔ)句格式 匯編語(yǔ)言源程序是由匯編語(yǔ)句 即指令 組成的 典型的匯編語(yǔ)句格式如下 標(biāo)號(hào) 操作碼 操作數(shù) 操作數(shù) 注釋 數(shù)據(jù)的表示方法 1 二進(jìn)制數(shù) 由0 1組成 逢2進(jìn)1 的數(shù)制 如 01011110B 0 1后綴 B b 2 十六進(jìn)制數(shù) 便于讀寫(xiě)記憶的二進(jìn)制數(shù)的簡(jiǎn)寫(xiě)形式 0 9 A F后綴 H h 3 十進(jìn)制數(shù) 可用二進(jìn)制數(shù)表示 也稱(chēng)為BCD碼 0 9表示為 0000 1001B 也可用十進(jìn)制數(shù)表示 后綴 D d或無(wú)后綴 2 4 1匯編語(yǔ)言程序設(shè)計(jì)的步驟 匯編語(yǔ)言程序設(shè)計(jì) 根據(jù)任務(wù)要求 采用匯編語(yǔ)言編制程序的過(guò)程稱(chēng)為匯編語(yǔ)言程序設(shè)計(jì) 匯編語(yǔ)言程序設(shè)計(jì)的步驟 1 擬訂設(shè)計(jì)任務(wù)書(shū) 2 建立數(shù)學(xué)模型 3 確定算法 4 分配內(nèi)存單元 編制程序流程圖 5 編制源程序進(jìn)一步合理分配存儲(chǔ)器單元和了解I O接口地址 按功能設(shè)計(jì)程序 明確各程序之間的相互關(guān)系 用注釋行說(shuō)明程序 便于閱讀和修改調(diào)試和修改 6 上機(jī)調(diào)試 7 程序優(yōu)化 編制程序流程圖 是指用各種圖形 符號(hào) 指向線(xiàn)等來(lái)說(shuō)明程序設(shè)計(jì)的過(guò)程 國(guó)際通用的圖形和符號(hào)說(shuō)明如下 橢圓框 開(kāi)始和結(jié)束框 在程序的開(kāi)始和結(jié)束時(shí)使用 矩形框 處理框 表示要進(jìn)行的各種操作 菱形框 判斷框 表示條件判斷 以決定程序的流向 流向線(xiàn) 流程線(xiàn) 表示程序執(zhí)行的流向 圓圈 連接符 表示不同頁(yè)之間的流程連接 各種幾何圖形符號(hào)如下圖所示 2 4 2順序程序設(shè)計(jì) 特點(diǎn) 順序結(jié)構(gòu)程序是最簡(jiǎn)單 最基本的程序 程序按編寫(xiě)的順序依次往下執(zhí)行每一條指令 直到最后一條 它能夠解決某些實(shí)際問(wèn)題 或成為復(fù)雜程序的子程序 例題2 將片內(nèi)RAM30H單元中的兩位壓縮BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)送到片內(nèi)RAM40H單元中 解 兩位壓縮BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)的算法為 a1a0 BCD 10 a1 a0程序流程圖如右圖所示 程序如下 ORG1000HSTART MOVA 30H 取兩位BCD壓縮碼a1a0送AANLA 0F0H 取高4位BCD碼a1SWAPA 高4位與低4位換位MOVB 0AH 將二進(jìn)制數(shù)10送入BMULAB 將10 a1送入A中MOVR0 A 結(jié)果送入R0中保存MOVA 30H 再取兩位BCD壓縮碼a1a0送AANLA 0FH 取低4位BCD碼a0ADDA R0 求和10 a1 a0MOV40H A 結(jié)果送入40H保存SJMP 程序執(zhí)行完 原地踏步 END 例題3 利用查表指令將內(nèi)部RAM中20H單元的壓縮BCD碼拆開(kāi) 轉(zhuǎn)換成相應(yīng)的ASCII碼 存入21H 22H中 高位存在22H 解 BCD碼的0 9對(duì)應(yīng)的ASCII碼為30H 39H 將30H 39H按大小順序排列放入表TABLE中 先將BCD碼拆分 將拆分后的BCD碼送入A 表首址送入DPTR 然后領(lǐng)用查表指令MOVCA A DPTR 查表即得結(jié)果 然后存入21H 22H中 程序如下 ORG1000HSTART MOVDPTR TABLEMOVA 20HANLA 0FHMOVCA A DPTRMOV21H A MOVA 20HANLA 0F0HSWAPAMOVCA A DPTRMOV22H ASJMP TABLE DB30H 31H 32H 33H 34HDB35H 36H 37H 38H 39HEND 2 4 3分支程序設(shè)計(jì) 特點(diǎn) 根據(jù)不同的條件 確定程序的走向 它主要靠條件轉(zhuǎn)移指令 比較轉(zhuǎn)移指令和位轉(zhuǎn)移指令來(lái)實(shí)現(xiàn) 分支程序的結(jié)構(gòu)如右圖所示 分支程序的設(shè)計(jì)要點(diǎn)如下 1 先建立可供條件轉(zhuǎn)移指令測(cè)試的條件 2 選用合適的條件轉(zhuǎn)移指令 3 在轉(zhuǎn)移的目的地址處設(shè)定標(biāo)號(hào) 解 此題有三個(gè)條件 所以有三個(gè)分支程序 這是一個(gè)三分支歸一的條件轉(zhuǎn)移問(wèn)題 X是有符號(hào)數(shù) 判斷符號(hào)位是0還是1可利用JB或JNB指令 判斷X是否等于0則直接可以使用累加器A的判0指令 程序流程圖如右圖所示 例題4 求符號(hào)函數(shù)的值 已知片內(nèi)RAM的40H單元內(nèi)有一自變量X 編制程序按如下條件求函數(shù)Y的值 并將其存入片內(nèi)RAM的41H單元中 1X 0Y 0X 0 1X 0 ORG1000HSTART MOVA 40H 將X送入A中JZCOMP 若A為0 轉(zhuǎn)至COMP處JNBACC 7 POST 若A第7位不為1 X為正數(shù) 則程序轉(zhuǎn)到POST處 否則 X為負(fù)數(shù) 程序往下執(zhí)行MOVA 0FFH 將 1 補(bǔ)碼 送入A中SJMPCOMP 程序轉(zhuǎn)到COMP處POST MOVA 01H 將 1送入A中COMP MOV41H A 結(jié)果存入YSJMP 程序執(zhí)行完 原地踏步 END 2 4 4循環(huán)程序設(shè)計(jì) 特點(diǎn) 程序中含有可以重復(fù)執(zhí)行的程序段 循環(huán)體 采用循環(huán)程序可以有效地縮短程序 減少程序占用的內(nèi)存空間 使程序的結(jié)構(gòu)緊湊 可讀性好 組成 循環(huán)程序一般由下面四部分組成 1 循環(huán)初始化 位于循環(huán)程序開(kāi)頭 用于完成循環(huán)前的準(zhǔn)備工作 如設(shè)置各工作單元的初始值以及循環(huán)次數(shù) 2 循環(huán)體 循環(huán)程序的主體 位于循環(huán)體內(nèi) 是循環(huán)程序的工作程序 在執(zhí)行中會(huì)被多次重復(fù)使用 要求編寫(xiě)得盡可能簡(jiǎn)練 以提高程序的執(zhí)行速度 3 循環(huán)控制 位于循環(huán)體內(nèi) 一般由循環(huán)次數(shù)修改 循環(huán)修改和條件語(yǔ)句等組成 用于控制循環(huán)次數(shù)和修改每次循環(huán)時(shí)的參數(shù) 4 循環(huán)結(jié)束 用于存放執(zhí)行循環(huán)程序所得的結(jié)果 以及恢復(fù)各工作單元的初值 循環(huán)程序的結(jié)構(gòu) 1 先循環(huán)處理 后循環(huán)控制 即先處理后控制 如左下圖所示 2 先循環(huán)控制 后循環(huán)處理 即先控制后處理 如右下圖所示 循環(huán)程序按結(jié)構(gòu)形式 有單重循環(huán)與多重循環(huán) 1 單重循環(huán)程序定義 循環(huán)體內(nèi)部不包括其他循環(huán)的程序稱(chēng)為單重循環(huán)程序 例題5 已知片內(nèi)RAM30H 3FH單元中存放了16個(gè)二進(jìn)制無(wú)符號(hào)數(shù) 編制程序求它們的累加和 并將其和數(shù)存放在R4 R5中 解 每次求和的過(guò)程相同 可以用循環(huán)程序?qū)崿F(xiàn) 16個(gè)二進(jìn)制無(wú)符號(hào)數(shù)求和 循環(huán)程序的循環(huán)次數(shù)應(yīng)為16次 存放在R2中 它們的和放在R4 R5中 R4存高8位 R5存低8位 程序流程圖如右圖所示 程序如下 ORG1000HSTART MOVR0 30HMOVR2 10H 設(shè)置循環(huán)次數(shù) 16 MOVR4 00H 和高位單元R4清0MOVR5 00H 和低位單元R5清0LOOP MOVA R5 和低8位的內(nèi)容送AADDA R0 將 R0與R5的內(nèi)容相加并產(chǎn)生進(jìn)位CyMOVR5 A 低8位的結(jié)果送R5CLRA A清0ADDCA R4 將R4的內(nèi)容和Cy相加MOVR4 A 高8位的結(jié)果送R4INCR0 地址遞增 加1 DJNZR2 LOOP 若循環(huán)次數(shù)減1不為0 則轉(zhuǎn)到LOOP處循環(huán) 否則 循環(huán)結(jié)束SJMP END 例題6 編制程序?qū)⑵瑑?nèi)RAM的30H 4FH單元中的內(nèi)容傳送至片外RAM的2000H開(kāi)始的單元中 解 每次傳送數(shù)據(jù)的的過(guò)程相同 可以用循環(huán)程序?qū)崿F(xiàn) 30H 4FH共32個(gè)單元 循環(huán)次數(shù)應(yīng)為16次 保存在R2中 為了方便每次傳送數(shù)據(jù)時(shí)地址的修改 送片內(nèi)RAM數(shù)據(jù)區(qū)首地址送R0 片外RAM數(shù)據(jù)區(qū)首地址送DPTR 程序流程圖如右圖所示 程序如下 ORG1000HSTART MOVR0 30HMOVDPTR 2000HMOVR2 20H 設(shè)置循環(huán)次數(shù)LOOP MOVA R0 將片內(nèi)RAM數(shù)據(jù)區(qū)內(nèi)容送AMOVX DPTR A 將A的內(nèi)容送片外RAM數(shù)據(jù)區(qū)INCR0 源地址遞增INCDPTR 目的地址遞增DJNZR2 LOOP 若R2的不為0 則轉(zhuǎn)到LOOP處繼續(xù)循環(huán) 否則循環(huán)結(jié)束SJMP END 2 多重循環(huán)程序 定義 若循環(huán)中還包括有循環(huán) 稱(chēng)為多重循環(huán) 或循環(huán)嵌套 例題7 編制程序設(shè)計(jì)50ms延時(shí)程序 解 延時(shí)程序與MCS 51指令執(zhí)行時(shí)間 機(jī)器周期數(shù) 和晶振頻率fOSC有直接的關(guān)系 當(dāng)fOSC 12MHz時(shí) 機(jī)器周期為1 s 執(zhí)行一條DJNZ指令需要2個(gè)機(jī)器周期 時(shí)間為2 s 50ms 2 s 255 因此單重循環(huán)程序無(wú)法實(shí)現(xiàn) 可采用雙重循環(huán)的方法編寫(xiě)50ms延時(shí)程序 程序如下 ORG1000HDELAY MOVR7 200 設(shè)置外循環(huán)次數(shù) 此條指令需要1個(gè)機(jī)器周期 DLY1 MOVR6 123 設(shè)置內(nèi)循環(huán)次數(shù)DLY2 DJNZR6 DLY2 R6 1 0 則順序執(zhí)行 否則轉(zhuǎn)回DLY2繼續(xù)循環(huán) 延時(shí)時(shí)間為2 s 123 246 sNOP 延時(shí)時(shí)間為1 sDJNZR7 DLY1 R7 1 0 則順序執(zhí)行 否則轉(zhuǎn)回DLY1繼續(xù)循環(huán) 延時(shí)時(shí)間為 246 2 1 1 200 2 1 50 003msRET 子程序結(jié)束END 3 循環(huán)程序時(shí)應(yīng)注意的問(wèn)題 1 循環(huán)程序是一個(gè)有始有終的整體 它的執(zhí)行是有條件的 所以要避免從循環(huán)體外直接轉(zhuǎn)到循環(huán)體內(nèi)部 2 多重循環(huán)程序是從外層向內(nèi)層一層一層進(jìn)入 循環(huán)結(jié)束時(shí)是由內(nèi)層到外層一層一層退出的 在多重循環(huán)中 只允許外重循環(huán)嵌套內(nèi)重循環(huán) 不允許循環(huán)相互交叉 也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部 3 編寫(xiě)循環(huán)程序時(shí) 首先要確定程序結(jié)構(gòu) 處理好邏輯關(guān)系 一般情況下 一個(gè)循環(huán)體的設(shè)計(jì)可以從第一次執(zhí)行情況入手 先畫(huà)出重復(fù)執(zhí)行的程序框圖 然后再加上循環(huán)控制和置循環(huán)初值部分 使其成為一個(gè)完整的循環(huán)程序 4 循環(huán)體是循環(huán)程序中重復(fù)執(zhí)行的部分 應(yīng)仔細(xì)推敲 合理安排 應(yīng)從改進(jìn)算法 選擇合適的指令入手對(duì)其進(jìn)行優(yōu)化 以達(dá)到縮短程序執(zhí)行時(shí)間的目的 4 排序程序設(shè)計(jì) 冒泡法 例題7 設(shè)MCS 51單片機(jī)內(nèi)部RAM起始地址為30H的數(shù)據(jù)塊中共存有64個(gè)無(wú)符號(hào)數(shù) 編制程序使它們按從小到大的順序排列 解 設(shè)64個(gè)無(wú)符號(hào)數(shù)在數(shù)據(jù)塊中的順序?yàn)?e64 e63 e2 e1 使他們從小到大順序排列的方法很多 現(xiàn)以冒泡法為例進(jìn)行介紹 冒泡法又稱(chēng)兩兩比較法 它先使e64和e63比較 若e64 e63 則兩個(gè)存儲(chǔ)單元中的內(nèi)容交換 否則就不交換 然后使e63和e62比較 按同樣的原則決定是否交換 一直比較下去 最后完成e2和e1的比較及交換 經(jīng)過(guò)N 1 63次比較 常用內(nèi)循環(huán)63次來(lái)實(shí)現(xiàn) 后 e1的位置上必然得到數(shù)組中的最大值 猶如一個(gè)氣泡從水低冒出來(lái)一樣 如下頁(yè)圖所示 圖中只畫(huà)出了6個(gè)數(shù)的比較過(guò)程 第二次冒泡過(guò)程和第一次完全相同 比較次數(shù)也可以是63次 其實(shí)只需要62次 因?yàn)閑1的位置上是數(shù)據(jù)塊中的最大數(shù) 不需要再比較 冒泡后在e2的位置上得到數(shù)組中的次大數(shù) 如上頁(yè)圖所示 如此冒泡 即大循環(huán) 共63次 內(nèi)循環(huán)63 63次 便可完成64個(gè)數(shù)的排序 實(shí)際編程時(shí) 可通過(guò)設(shè)置 交換標(biāo)志 用來(lái)控制是否再需要冒泡 若剛剛進(jìn)行完的冒泡中發(fā)生過(guò)數(shù)據(jù)交換 即排序尚未完成 應(yīng)繼續(xù)進(jìn)行冒泡 若進(jìn)行完的冒泡中未發(fā)生過(guò)數(shù)據(jù)交換 即排序已經(jīng)完成 冒泡應(yīng)該停止 例如 對(duì)于一個(gè)已經(jīng)排好序的數(shù)組 1 2 3 63 64 排序程序只要進(jìn)行一次循環(huán)便可根據(jù) 交換標(biāo)志 的狀態(tài)而結(jié)束排序程序的再執(zhí)行 這自然可以減少63 1 62次的冒泡時(shí)間 冒泡法程序流程圖如下頁(yè)圖所示 程序如下 ORG1000HMOVR0 30H 數(shù)據(jù)區(qū)首地址送R0MOVR3 63H 設(shè)置外循環(huán)次數(shù)在R3中LP0 CLR7FH 交換標(biāo)志位2FH 7清0MOVA R3 取外循環(huán)次數(shù)MOVR2 A 設(shè)置內(nèi)循環(huán)次數(shù)MOVR0 30H 重新設(shè)置數(shù)據(jù)區(qū)首址LP1 MOV20H R0 數(shù)據(jù)區(qū)數(shù)據(jù)送20H單元中MOVA R0 20H內(nèi)容送AINCR0 修改地址指針 R0 1 MOV21H R0 下一個(gè)地址的內(nèi)容送21HCLRC Cy清0SUBBA 21H 前一個(gè)單元的內(nèi)容與下一個(gè)單元的內(nèi)容比較JCLP2 若有借位 Cy 1 前者小 程序轉(zhuǎn)移到LP2處執(zhí)行 若無(wú)借位 Cy 0 前者大 不轉(zhuǎn)移 程序往下執(zhí)行 MOV R0 20H 前 后內(nèi)容交換DECR0MOV R0 21HINCR0 修改地址指針 R0 1 SETB7FH 置位交換標(biāo)志位2FH 7為1LP2 DJNZR2 LP1 修改內(nèi)循環(huán)次數(shù)R2 減少 若R2 0 則程序轉(zhuǎn)到LP1處仍執(zhí)行循環(huán) 若R2 0 程序結(jié)束循環(huán) 程序往下執(zhí)行JNB7FH LP3 交換標(biāo)志位2FH 7若為0 則程序轉(zhuǎn)到LP3處結(jié)束循環(huán)DJNZR3 LP0 修改外循環(huán)次數(shù)R3 減少 若R3 0 程序轉(zhuǎn)到LP0處 執(zhí)行仍循環(huán) 若R3 0 程序結(jié)束循環(huán) 往下執(zhí)行LP3 SJMP 程序執(zhí)行完 原地踏步 END 2 4 5查表程序設(shè)計(jì) 查表 根據(jù)存放在ROM中數(shù)據(jù)表格的項(xiàng)數(shù)來(lái)查找與它對(duì)應(yīng)的表中值 適用場(chǎng)合 主要應(yīng)用于數(shù)碼顯示 打印字符的轉(zhuǎn)換 數(shù)據(jù)轉(zhuǎn)換等場(chǎng)合 1 采用MOVCA A DPTR指令查表程序的設(shè)計(jì)方法 1 在程序存儲(chǔ)器中建立相應(yīng)的函數(shù)表 設(shè)自變量為

溫馨提示

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