單片微型計(jì)算機(jī)原理與接口技術(shù) 髙鋒版 課后答案第4章.doc_第1頁
單片微型計(jì)算機(jī)原理與接口技術(shù) 髙鋒版 課后答案第4章.doc_第2頁
單片微型計(jì)算機(jī)原理與接口技術(shù) 髙鋒版 課后答案第4章.doc_第3頁
單片微型計(jì)算機(jī)原理與接口技術(shù) 髙鋒版 課后答案第4章.doc_第4頁
單片微型計(jì)算機(jī)原理與接口技術(shù) 髙鋒版 課后答案第4章.doc_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章 【單片機(jī)的程序設(shè)計(jì)】 思考與練習(xí)題解析【41】簡述下列基本概念:程序、程序設(shè)計(jì)、機(jī)器語言、匯編語言及高級語言?!敬稹扛骰靖拍钊缦?。 程序:為計(jì)算某一算式或完成某一工作的若干指令的有序集合。 程序設(shè)計(jì):單片機(jī)的全部工作概括起來,就是執(zhí)行程序的過程。為單片機(jī)準(zhǔn)備這一程 序,即編制程序的工作過程。 機(jī)器語言:用二進(jìn)制代碼表示的指令系統(tǒng)稱為“機(jī)器語言系統(tǒng)”,簡稱為“機(jī)器語言”。 匯編語言:用英文字符來代替機(jī)器語言,這些英文字符稱為“助記符。用這種助記符表示指令系統(tǒng)的語言稱為“匯編語言”或“符號語言”。 高級語言:參照數(shù)學(xué)語言而設(shè)計(jì)的、近似于人們?nèi)粘S谜Z的語言。它是面向問題或者 面向過程的語言。這種語言不僅直觀、易學(xué)、易懂,而且通用性強(qiáng),易于移植到不同類型的機(jī)器中?!?2】在單片機(jī)領(lǐng)域,目前最廣泛使用的是哪幾種語言?有哪些優(yōu)越性?單片機(jī)能否直接執(zhí)行這幾種語言?【答】在單片機(jī)領(lǐng)域,目前最廣泛使用的是匯編語言和高級語言。 匯編語言編寫的程序效率高,占用存儲空間小,運(yùn)行速度快,而且能反映單片機(jī)的實(shí)際運(yùn)行情況。但編程比使用高級語言困難,通用性差。單片機(jī)不能直接執(zhí)行匯編語言程序,必須通過人工(或機(jī)器)匯編把匯編語言程序轉(zhuǎn)換為機(jī)器語言程序。 高級語言不受具體機(jī)器的限制,而且使用了許多數(shù)學(xué)公式和習(xí)慣用語,從而簡化了程序設(shè)計(jì)的過程,通用性強(qiáng),易于移植到不同類型的單片機(jī)中。 單片機(jī)不能直接識別和執(zhí)行高級語言,需要將其轉(zhuǎn)換為機(jī)器語言程序才能識別和執(zhí)行。對于高級語言,這一轉(zhuǎn)換工作通常稱為“編譯”或者“解釋”。進(jìn)行編譯或者解釋的專用程序稱為“編譯程序”或者“解釋程序”?!?3】什么叫偽指令?8OC51單片機(jī)程序設(shè)計(jì)中主要有哪些偽指令語句?【答】偽指令又稱為“匯編程序控制譯碼指令”?!皞巍斌w現(xiàn)在匯編時不產(chǎn)生機(jī)器指令代碼,不影響程序的執(zhí)行,僅指明在匯編時執(zhí)行一些特殊的操作。例如為程序指定一個存儲區(qū),將 一些數(shù)據(jù)、表格常數(shù)存放在指定的存儲單元,說明源程序開始或結(jié)束等。不同的單片機(jī)開發(fā)裝置所定義的偽指令不全相同。 80C51單片機(jī)程序設(shè)計(jì)中主要有偽指令語句如下。 1ORG(Origin)一匯編起始地址偽指令 , 指令格式為:ORG 其含義是向匯編程序說明,下述程序段的起始地址由表達(dá)式指明。表達(dá)式通常為十六進(jìn) 制地址碼。 2END(END 0f Assembly)一匯編結(jié)束偽指令 。 其含義是通知匯編程序,該程序段匯編至此結(jié)束。 3EQU(EQUate)賦值偽指令 。 指令格式為: EQU 其含義是把表達(dá)式賦值于標(biāo)號,這里的標(biāo)號和表達(dá)式是必不可少的。用EQU語句給一 個標(biāo)號賦值以后,在整個源程序中該標(biāo)號的值是固定的,不能更改。 4DL-定義標(biāo)號值偽指令 指令格式為: DL 其含義也是說明標(biāo)號等值于表達(dá)式。同樣,標(biāo)號和表達(dá)式是必不可少的。用DL語句在 同一源程序中給同一標(biāo)號賦予不同的值,即可更改已定義的標(biāo)號值。 5DB(Define Byte)定義字節(jié)偽指令 指令格式為:DB 其含義是將表達(dá)式或表達(dá)式表所表示的數(shù)據(jù)或數(shù)據(jù)串存入從標(biāo)號開始的連續(xù)存儲單元 中。標(biāo)號為可選項(xiàng),它表示數(shù)據(jù)存儲單元地址。表達(dá)式或表達(dá)式表是指一個字節(jié)或用逗號分 開的字節(jié)數(shù)據(jù)??梢允怯靡柪ㄆ饋淼淖址?,字符串中的字符按ASCII碼存于連續(xù)的 ROM中。 6DW(Define Word)-定義字偽指令 指令格式為: DW 其含義是把字或字串值存人由標(biāo)號開始的連續(xù)存儲單元中,并且把字的高字節(jié)數(shù)存人低 地址單元,低字節(jié)數(shù)存入高地址單元。按順序連續(xù)存放。 7DS(Define Stonage)定義存儲區(qū)偽指令 指令格式為:DS 其含義是通知匯編程序,在目標(biāo)代碼中,以標(biāo)號為首地址保留表達(dá)式值的若干存儲單元以備源程序使用。匯編時,對這些單元不賦值。 注意:對于80C51單片機(jī),DB、DW和DS等偽指令只能應(yīng)用于程序存儲器,而不能應(yīng)用于數(shù)據(jù)存儲器。 8BIT位定義偽指令用于給字符名稱賦予位地址。 命令格式為: BIT 其中,位地址可以是絕對地址,也可以是符號地址?!?4】什么是結(jié)構(gòu)化程序設(shè)計(jì)?它包含哪些基本結(jié)構(gòu)程序?【答】 程序設(shè)計(jì)有時可能是一件很復(fù)雜的工作,但往往有些程序結(jié)構(gòu)是很典型的。采用結(jié) 構(gòu)化程序編程時,規(guī)律性極強(qiáng),簡單清晰,易讀寫,具有調(diào)試方便、生成周期短、可靠性高等特點(diǎn)。 根據(jù)結(jié)構(gòu)化程序設(shè)計(jì)的觀點(diǎn),功能復(fù)雜的程序結(jié)構(gòu)一般采用三種基本控制結(jié)構(gòu),即順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),再加上子程序結(jié)構(gòu)及中斷服務(wù)子程序結(jié)構(gòu),共包含五種基本程序結(jié)構(gòu)?!?5】順序結(jié)構(gòu)程序的特點(diǎn)是什么?試用順序結(jié)構(gòu)編寫三字節(jié)無符號數(shù)的加法程序段,最高字節(jié)的進(jìn)位存入用戶標(biāo)志F0中。【答】順序結(jié)構(gòu)是按照邏輯操作順序,從某一條指令開始逐條順序執(zhí)行,直至某一條指令為止。比如數(shù)據(jù)的傳送與交換、簡單的運(yùn)算、查表等程序的設(shè)計(jì)。順序結(jié)構(gòu)是所有程序設(shè)計(jì)中 最基本、最單純的程序結(jié)構(gòu)形式,因而是一種最簡單、應(yīng)用最普遍的程序結(jié)構(gòu)。在順序結(jié)構(gòu)程序中沒有分支,也沒有子程序,但它是組成復(fù)雜程序的基礎(chǔ)和主干。 例如:三字節(jié)無符號數(shù)的加法程序段,最高字節(jié)的進(jìn)位存人用戶標(biāo)志FO中。 假設(shè)加數(shù)存放在內(nèi)存20H、21H和22H中,被加數(shù)存放在內(nèi)存3OH、31H和32H中,和存放在內(nèi)存40H、41H和42H中。數(shù)據(jù)存放次序?yàn)榈妥止?jié)在前。 MOV A,3 0H ;取被加數(shù)低字節(jié)數(shù) ADD A,20H ;求和 M07 40H,A ;和存入 MOV A,31H ADDC A,21H ;帶進(jìn)位求和 MOV 41H,A MOV A,32H ADDC A,22H ;帶進(jìn)位求和 MOV 42HA , MOV F0,C ;最高字節(jié)的進(jìn)位存入用戶標(biāo)志F0中【46】80C51單片機(jī)有哪些查表指令?它們有何本質(zhì)區(qū)別?請編寫按序號i 值查找Di(1 6位長度)的方法。設(shè)值i存放在R7中,將查找到的數(shù)據(jù)存放于片內(nèi)RAM的30H、31H單元中。請畫出程序流程圖,編寫查表程序段,加上必要的偽指令,并對源程序加以注釋?!敬稹?0c51有兩種查表指令,即近程查表指令“MOVC A,A+PC”和遠(yuǎn)程查表指令 “MOVC A,AA+ DPTR 這兩條指令的功能均是從程序存儲器中讀取數(shù)據(jù)(如表格、常數(shù)等),執(zhí)行過程相同,其差別是基址不同,因此,適用范圍也不同。 累加器A為變址寄存器,而PC、DPTR為基址寄存器。DPTR為基址寄存器時,允許數(shù)表存放在程序存儲器的任意單元,稱為“遠(yuǎn)程查表”,編程比較直觀;而PC為基址寄存器時,數(shù)表只能放在該指令單元往下的256個單元中,稱為“近程查表”。編程時需要計(jì)算累加器A中的值與數(shù)表首址的偏移量。 例如,按序號i值查找Di(1 6位長度)的源程序如下所示: ORG XXXXH MOV DPTR,#TABLE 指向表首址 MOV A,R7 ;取值i RL A ;Di為二個字節(jié) MOV R7,A ;i x 2 MOVC A,A+DPTR ;查表獲得Di的高字節(jié) MOV 30HA MOV A,R7 INC A 指向表的下一個地址 MOVC A,A+DPTR ;表獲得Di的低字節(jié) MOV 31H, A TABLE: Dw ;表(Dw為雙字節(jié),高字節(jié)在前) RET 查表程序流程圖如圖4-1所示。【47】根據(jù)運(yùn)算結(jié)果給出的數(shù)據(jù)到指定的數(shù)據(jù)表中查找對應(yīng)的數(shù)據(jù)字。運(yùn)算結(jié)果給出的數(shù)據(jù)在片內(nèi)RAM的40H單元中,給出的數(shù)據(jù)大小在000FH之間,數(shù)據(jù)表存放在20H開始的片內(nèi)存儲器中。查表所得數(shù)據(jù)字為雙字節(jié)(高字節(jié)在后),高字節(jié)存于42H、低字節(jié)存于41H單元。其對應(yīng)關(guān)系為:給出數(shù)據(jù): 00 H 0 1 H 0 2 H 0DH 0EH 0FH對應(yīng)數(shù)據(jù):00 A0 H 7DC2 H FF09 H 3456H 89ABH 5678 H請編制查表程序段,加上必要的偽指令,并加以注釋?!敬稹砍绦蛉缦拢?ORG 0000H AJMP MAIN , 0RG 0020H TAB:DB OAOH,OOH,0C2H,7DH,09H,OFFH,.,56H,34H,0ABH,89H,DB 78H,56H; 數(shù)據(jù)字表 ORG 0050H MAIN: MOV A,40H ;運(yùn)算結(jié)果給出的數(shù)據(jù)放在40H中 MOV DPTR,#TAB ;指向數(shù)據(jù)字表首地址 RL A ;由于是雙字節(jié),所以A左移1位(乘2) MOV 40H,A ;結(jié)果放在40H MOVC A,A+DPTR ;查表,找出對應(yīng)的值 MOV 41H,A ;查找出的數(shù)據(jù)值低字節(jié)放入41H MOV A40H ADD A,#01H ;查找數(shù)據(jù)的高位字節(jié) MOV DPTR,#TAB MOVC A,A+DPTR MOV 42H,A 。 ;查找出的數(shù)據(jù)值高字節(jié)放入42H SJMP$注意:數(shù)據(jù)表存放在20 H開始的片內(nèi)存儲器中,該存儲器應(yīng)為內(nèi)部程序存儲器,因?yàn)椴楸碇噶頜OVC的功能是從程序存儲器中讀數(shù)據(jù)?!?8】什么是分支結(jié)構(gòu)程序?8OC 1的哪些指令可用于分支結(jié)構(gòu)程序編程?有哪些多分支轉(zhuǎn)移指令?由累加器A中的動態(tài)運(yùn)行結(jié)果值進(jìn)行選擇分支程序,分支轉(zhuǎn)移指令選用LJMP,請編寫散轉(zhuǎn)程序段和畫出程序流程圖,加上必要的偽指令,并加以注釋?!敬稹糠种ЫY(jié)構(gòu)程序的主要特點(diǎn)是程序執(zhí)行流程中必然包含有條件判斷指令。符合條件要求和不符合條件要求的有不同的處理路徑。編程的主要方法和技術(shù)是合理選用具有邏輯判斷功能的指令。在程序設(shè)計(jì)時,往往借助程序框圖(判斷框)來指明程序的走向。 一般情況下,每個分支均需要單獨(dú)執(zhí)行一段程序,對分支程序的起始地址賦予一個地址標(biāo)號,以便當(dāng)條件滿足時轉(zhuǎn)向指定地址單元去執(zhí)行程序,條件不滿足時仍順序往下執(zhí)行程序。 80C51的條件判跳指令極其豐富,功能極強(qiáng),特別是位處理判跳指令,對復(fù)雜問題的編程提供了極大方便。程序中每增加一條條件判跳指令,就應(yīng)增加一條分支。 分支結(jié)構(gòu)程序的形式有單分支結(jié)構(gòu)和多分支結(jié)構(gòu)兩種。 在80C51指令系統(tǒng)中可實(shí)現(xiàn)單分支程序轉(zhuǎn)移的指令有位條件轉(zhuǎn)移指令,如JC、JNC、 JB、JNB和JBC等,還有一些條件轉(zhuǎn)移指令,如JZ、JNZ和DJNZ等。 80C51設(shè)有兩條多分支選擇指令。 (a)散轉(zhuǎn)指令:JMP A+DPTR 散轉(zhuǎn)指令由數(shù)據(jù)指針DPTR決定多分支轉(zhuǎn)移程序的首地址,由累加器A中內(nèi)容動態(tài)地選擇對應(yīng)的分支程序。因此,可以從多達(dá)256個分支中選擇一個分支散轉(zhuǎn)。 (b)比較指令:CJNE A,direct,rel (共有4條) 比較兩個數(shù)的大小,必然存在大于、等于、小于三種情況,這時就需要從三個分支中選擇一 個分支執(zhí)行程序。 例如:由累加器A中的動態(tài)運(yùn)行結(jié)果值進(jìn)行選擇分支程序,分支轉(zhuǎn)移指令選用LJMP。 ORG XXXXH MOV DPTR,#JPTAB ;分支轉(zhuǎn)移表首地址 CLR C MOV B, A RLC A JNC TAB INC DPTR TAB: ADD A,B ;(A)* 3 JNC TABLE INC DPTR TABLE: JMPA+DPTR ;多分支轉(zhuǎn)移 JPTAB:LTMP LOOPl ;長轉(zhuǎn)移指令為3個字節(jié) LJMP LOOP2 注意:長轉(zhuǎn)移指令為3字節(jié),因此,A中內(nèi)容應(yīng)乘以3。若大于一個字節(jié),則DPH要加1。分支程序流程圖如圖4-2所示?!?-9】循環(huán)結(jié)構(gòu)程序有何特點(diǎn)?80C51的循環(huán)轉(zhuǎn)移指令有什么特點(diǎn)?何謂循環(huán)嵌套?編程時應(yīng)注意什么?【答】循環(huán)是強(qiáng)制CPU重復(fù)多次地執(zhí)行一串指令的基本程序結(jié)構(gòu)。從本質(zhì)上看,循環(huán)程序結(jié)構(gòu)只是分支程序中的一個特殊形式。循環(huán)程序由4個部分構(gòu)成,即循環(huán)初始化、循環(huán)體、循環(huán)控制和結(jié)束部分。循環(huán)次數(shù)已知情況下,采用計(jì)數(shù)循環(huán)程序,其特點(diǎn)是必須在初始化部分設(shè)定計(jì)數(shù)的初值,循環(huán)控制部分依據(jù)計(jì)數(shù)器的值決定循環(huán)次數(shù)。 根據(jù)控制循環(huán)結(jié)束的條件,決定是否繼續(xù)循環(huán)程序的執(zhí)行。所謂的結(jié)束條件可以是搜索 到某個關(guān)鍵字(比如回車符CR),也可以是發(fā)生的某種變化(如故障引起電路電平變化)等,什 么時候結(jié)束循環(huán)是不可預(yù)知的。 80C5 1設(shè)有功能強(qiáng)的循環(huán)轉(zhuǎn)移指令: DJNZ Rn,rel ;以工作寄存器作為控制計(jì)數(shù)器 DJNZ direct,rel ;以直接尋址單元作為控制計(jì)數(shù)器 CJNE A,direct,rel ;比較不相等轉(zhuǎn)移 這幾條基本指令可派生出很多條不同控制計(jì)數(shù)器的循環(huán)轉(zhuǎn)移指令,大大擴(kuò)充了應(yīng)用范圍 和多重循環(huán)層次。 循環(huán)嵌套就是在循環(huán)內(nèi)套用循環(huán)的結(jié)構(gòu)形式,也稱“多重循環(huán)”。 循環(huán)的執(zhí)行過程是從內(nèi)向外逐層展開的。內(nèi)層執(zhí)行完全部循環(huán)后,外層則完成一次循環(huán), 逐次類推。層次必須分明,層次之間不能有交叉,否則將產(chǎn)生錯誤。編程時要注意循環(huán)的正確退出,要防止出現(xiàn)“死循環(huán)”?!?-10】什么是子程序?它的結(jié)構(gòu)特點(diǎn)是什么?什么是子程序嵌套?【答】在編制應(yīng)用程序時,往往將需要多次應(yīng)用但完成的運(yùn)算或操作相同的程序段,編制 成一個子程序,并盡量使其標(biāo)準(zhǔn)化,存放于某存儲區(qū)域。調(diào)用子程序的程序稱為“主程序”或 “調(diào)用程序”。 子程序是由專門的子程序調(diào)用指令CALL調(diào)用,而以子程序返回指令RET結(jié)束的程序 段。子程序的第一條指令地址,通常稱為“子程序首地址”或“人口地址”,往往采用標(biāo)號(可用助記符)加以表示,調(diào)用(轉(zhuǎn)子)指令的下一條指令地址,通常稱為“返回地址”或“斷點(diǎn)”。 在子程序中調(diào)用子程序的現(xiàn)象通常稱為子程序嵌套?!?-11】手工匯編下列程序: KEY EQU 2 0H ORG 2000H MOV RO,#30H ;數(shù)據(jù)區(qū)首址 MOV Rl,#1 6 ;數(shù)據(jù)區(qū)長度 MOV 20H,#KEY ;關(guān)鍵字送20H單元 CLR F0 ;清用戶標(biāo)志位 MOV 21H,#0l ;序號置l LP: MOV A,R0 ;取數(shù) CJNE A,20H,LP1 SJMP HERE ;找到關(guān)鍵字,結(jié)束 LPI: INC 21H ;序號加1 INC R0 ;數(shù)據(jù)區(qū)地址指針加1DJNZ R1,LP ;繼續(xù) SETB F0 ;未搜索到關(guān)鍵字,則置位用戶標(biāo)志 HERE:SJMP HERE【答】根據(jù)指令查指令表得到機(jī)器碼,手工匯編結(jié)果如下: KEY EQU 20H ORG 2000H 2000 7830 MOV R0,#30H ;數(shù)據(jù)區(qū)首址 2002 7910 MOV R1,#1 6 ;數(shù)據(jù)區(qū)長度 2004 752020 MOV 20H,#KEY ;關(guān)鍵字送20H單元 2007 C2D5 CLR F0 ;清用戶標(biāo)志位 2009 752101 MOV 21H,#01 ;序號置1 200C E6 LP: MOV A,R0 ;取數(shù) 200D B52002 CJNE A,20H,LPI 2010 8007 SJMP HERE ;找到關(guān)鍵字,結(jié)束 2012 0521 LPI:INC 21H ;序號加1 2014 08 INC R0 ;數(shù)據(jù)區(qū)地址指針加1 2015 D9F5 DJNZ R1,LP ;繼續(xù) 2017 D2D5 SETB F0 ;未搜索到關(guān)鍵字,則置位用戶標(biāo)志 2019 80FE HERE:SJMP HERE【4-12把長度為10 H的字符串從內(nèi)部RAM的輸入緩沖區(qū)INBUF向設(shè)在外部RAM的輸出緩沖區(qū)OUTBUF進(jìn)行傳送,一直進(jìn)行到遇見字符“CR時停止。若字符串中無字符“CR”,則整個字符串全部傳送。加上必要的偽指令,并對源程序加以注釋?!敬稹砍绦蛉缦拢?ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV R7,#10H ;數(shù)據(jù)長度 MOV R0,#INBUF ;源數(shù)據(jù)首地址 MOV DPTR,#OUTBUF ;目的數(shù)據(jù)首地址 LOOP: MOV A,R0 ;把源數(shù)據(jù)的值賦給A CJNE A,#0DH,LOOPl ;判斷是否為“CR”(ASCII碼值為0DH)SJMP ENDl ;是“CR,則結(jié)束傳送 LOOPl: MOVX DPTR,A ;把A的值賦給目的數(shù)據(jù) INC R0 ;源數(shù)據(jù)下一個地址值 INC DPTR ;目的數(shù)據(jù)下一個地址值 DJNZ R7,L00P ;判斷數(shù)據(jù)傳送是否完畢 ENDI: SJMP ENDI END 【4-13】內(nèi)部RAM從2OH單元開始存放一個正數(shù)表,表中之?dāng)?shù)為無序排列,并以“-1”作為結(jié)束標(biāo)志。編程實(shí)現(xiàn)在表中找出最小正數(shù),存入10H。加上必要的偽指令,并對源程序加以注釋?!敬稹砍绦蛉缦拢?ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV R0,#20H ;正數(shù)表首址 MOV 1 0H,#7FH ;初始值設(shè)為正數(shù)最大值 LOOP: MOV A,R0 CJNE A,“-1,CHK ;比較結(jié)束標(biāo)志“-1” SJMP END1 ;是“-l,結(jié)束比較 CHK: CJNE A,10H,CHKI ;比較兩個數(shù)大小 SJMP LOOP1 ;兩個數(shù)相等,不交換 CHKI: JNC LOOP1 ;A較大,不交換 MOV 10H,A ;A較小,交換 LOOP1 INC R0 SJMP LOOP END1: SJMP END1 END例如:已知(20H)=22 H,(21H)=23H,(22H)=0CH,(23H)=20H,(24H)=16H, (25H)=-1。 執(zhí)行結(jié)果:(10H)=0CH【4-14】比較兩個ASCII碼字符串是否相等。字符串的長度在內(nèi)部RAM的2 H單元,第一個字符串的首地址在30H中,第二個字符串的首地址在50H中。如果兩個字符串相等,則置用戶標(biāo)志FO為0;否則,置用戶標(biāo)志FO為1。加上必要的偽指令,并對源程序加以注釋(每個ASCII碼字符為一個字節(jié),如ASCII碼“A”表示為41H)。 LOOPl: MOVX DPTR,A ;把A的值賦給目的數(shù)據(jù) INC R0 ;源數(shù)據(jù)下一個地址值 INC DPTR ;目的數(shù)據(jù)下一個地址值 DJNZ R7,L00P ;判斷數(shù)據(jù)傳送是否完畢 ENDI: SJMP ENDIEND 【答】字符串中每一個字符都可以用一個ASCII碼表示。只要有一個字符不相同,就可以判斷字符串不相等。 ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV R0,#30H 第一個字符串的首地址 MOV R1,#5 0H 第二個字符串的首地址 LOOP: MOV A,R0 第一個字符串的字符值賦給A MOV B,R1 ;第二個字符串的字符值賦給B CJNE A,B,NEXT ;兩個字符值比較 INC R0 字符值相等,則繼續(xù)比較 INC R1 DJNZ 20H,LOOP ;判斷字符串是否比較完 CLR F0 字符串相等,則F0位清0 SJMP $ NEXT: SETB F0 字符串不等,則F0位置1 SJMP $ END 例如:(2OH)=03H,(3OH)=41H,(31H)=42H,(32H)=43H,(5OH)=41H,(51H)= 42H,(52H)=43H。兩個字符串均為“ABC。 執(zhí)行結(jié)果:F0=0【41 5】已知經(jīng)AD轉(zhuǎn)換后的溫度值存在4 0 H中,設(shè)定溫度值存在4 1 H中。要求編寫控制程序,當(dāng)測量的溫度值大于(設(shè)定溫度值+2)時,從P 1.0引腳上輸出低電平;當(dāng)測量的溫度值小于(設(shè)定溫度值一2)時,從P 1.0引腳上輸出高電平;其他情況下,P 1.0引腳輸出電平不變(假設(shè)運(yùn)算中C中的標(biāo)志不會被置1)。加上必要的偽指令,并對源程序加以注釋?!敬稹砍绦蛉缦拢?ORG 0000H AJMP MAIN ORG 0020H MAIN: MOV B,41H ;設(shè)定的溫度值 MOV ABADD A,#02H MOV B,A ;設(shè)定溫度值+2 MOV A,40H ;測量的溫度值 CLR C SUBB A,B JNC LOWER ;測量的溫度值(設(shè)定溫度值+2),轉(zhuǎn)LOWER子程序,使P10引腳上輸出低電平 MOV B,41H ;設(shè)定的溫度值 MOV A,B DEC A DEC A MOV B,A ;設(shè)定溫度值一2 MOV A,40H ;測量的溫度值 CLR C SUBB A,B JC HIGH ;測量的溫度值設(shè)定溫度值-2,轉(zhuǎn)HIGH子程序,使P1.0引腳上輸出高電平 SJMP $ ;都不是,則P1.0引腳上輸出不變 LOWER: CLR P1.0 SJMP $ HIGH: SETB P1.0 SJMP $ END【41 6】80C51單片機(jī)從內(nèi)部RAM的31H單元開始存放一組8位帶符號數(shù),字節(jié)個數(shù)存放在30H中。請編寫程序統(tǒng)計(jì)出其中正數(shù)、0和負(fù)數(shù)的數(shù)目,并把統(tǒng)計(jì)結(jié)果分別存入20H、21H和22H三個單元中。加上必要的偽指令,并對源程序加以注釋?!敬稹砍绦蛉缦拢?LENGTH EQU 30H ;數(shù)據(jù)長度 DATA_ADR EQU 31H ;數(shù)據(jù)首地址 POS_NUM EQU 20H ;正數(shù)個數(shù) ZERO_NUM EQU 21H ;0個數(shù) NEG_NUM EQU 22H ;負(fù)數(shù)個數(shù) ORG 0000H AJMP MAIN , ORG 0030HMAIN: MOV POS_NUM,#0 ;計(jì)數(shù)單元初始化為0 MOV ZERO_NUM,#0 MOV NEG_NUM,#0 MOV R1,#LENGTH ;數(shù)據(jù)長度 MOV R0,#DATA_ADR ;數(shù)據(jù)首地址 LOOP: MOV A,R0 JB ACC7,INC_NEG ;符號位為1,該數(shù)為負(fù)數(shù),跳轉(zhuǎn)加1 CJNE A,#0,INC_POS INC ZERO_NUM ;該數(shù)為0,0個數(shù)加1 AJMP L00P1 INC NEG:INC NE_NUM ;負(fù)數(shù)個數(shù)加1 AJMP LOOPl INC_POS:INC POS_NUM ;該數(shù)為正數(shù),正數(shù)個數(shù)加1 LOOPl: INC R0 ;判斷統(tǒng)計(jì)是否結(jié)束 DJNZ R1,LOOP END 例如:已知(30H)=08H,31H單元起存放數(shù)據(jù)為00H,80H,7EH,6DH,2FH,34H, EDH,F(xiàn)FH。 執(zhí)行結(jié)果:(20 H)=04 H,(21 H)=01H,(22H)=03 H?!?-17兩個10位的無符號二一十進(jìn)制數(shù),分別從內(nèi)部RAM的40 H單元和50H單元開始存放。請編程計(jì)算該兩個數(shù)的和,并從內(nèi)部RAM的60 H單元開始存放。加上必要的偽指令,并對源程序加以注釋。【答】10位的無符號二十進(jìn)制數(shù),占5字節(jié),每個字節(jié)存放一個壓縮BCD碼(2位)。 ORG 0000H AJMP MAIN 0Re 0030H MAIN: MOV R7,#05H ;十位(5字節(jié))計(jì)數(shù) MOV R0,#40H ;被加數(shù)首址 MOV R1,#50H ;加數(shù)首址 MOV R2,#60H ;和數(shù)首址 CLR C ;清C標(biāo)志位 ADDB: MOV A,R0 ADDC A,R1 DA A ;二一十進(jìn)制調(diào)整 MOV B,R0 ;保護(hù)被加數(shù)地址MOV 20H, R2 MOV R0,20H MOV R0,A ;存和 MOV R2,20H ;恢復(fù)和數(shù)地址 MOV R0,B ;恢復(fù)被加數(shù)地址 INC R0 ;三個地址指針均加1 INC R1 INC R2 DJNZ R7,ADDB ;多字節(jié)加未結(jié)束,則循環(huán) HERE: SJMP HERE END 注意:寄存器間接尋址只針對R0和R1,所以存和時不能使用指令“MOVR2,A”。 例如: 40 H44 H內(nèi)容為78 H,10 H,10 H,10 H,10 H 5O H54 H內(nèi)容為42 H,10 H,10 H,10 H,10 H 1 0 1 0 1 0 1 0 7 8即BCD數(shù) +1 0 1 0 1 0 1 0 4 2 2 0 2 0 2 0 2 1 2 0 運(yùn)行結(jié)果:6O H64 H單元中的數(shù)為20 H,21 H,20 H,20 H,20 H?!?-18】編寫子程序,實(shí)現(xiàn)4位非壓縮BCD碼數(shù)轉(zhuǎn)換為二進(jìn)制數(shù),加上必要的偽指令,并對源程序加以注釋?!敬稹砍绦蛉缦拢?ORG OOH 0000 0130 AJMP MAIN 0RG 30H 0030 752006 MAIN: MOV 20H,#06H ;4位BCD數(shù)為6553 0033 7521 05 MOV 21H,#05H 0036 752205 MOV 22H,#05H 0039 752303 MOV 23H,#03H 003C 7820 MOV R0,#20H ;高位地址指針 003E 7A03 MOV R2,#3 ;循環(huán)(n一1)次,n為BCD碼位數(shù) 0040 1144 ACALL BCDB 0042 0142 AJMP $ .;轉(zhuǎn)換原理:假設(shè)4位BCD碼為a3 a2 a1 a0,即a3103+a2102 + al X 101+a0100 ;二進(jìn)制值:(a3 X 1 0+a2)X 10+a1)X 10+a0 ;4位非壓縮BCD碼數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)子程序 0044 CODO BCDB:PUSH I:SW ;現(xiàn)場保護(hù) 0046 COEO PUSH ACC 0048 COFO PUSH B 004A 7BOO MOT R3,#00H ;設(shè)R3中的初始值為b1 004C E6 MOT A,RO 004D FC MOV R4,A ;BCD碼千位a3送R4 004E EC LOOP: MOT A,R4 ;以下()H表示高8位,()L表示低8位 004F 7 5FOOA MOT B,#1 0 0052 A4 MUL AB ;R4 X 10,設(shè)(R4l0)L=b2,(R4 X 10)H=b3 0053 FC MOV R4,A ;將R410后的低8位送到R4中 0054 CSFO XCH A,B ;(A)=b3,(B)=b2 0056 CB XCH A,R3 ;(A)=R3(b1),(R3)=b3 0057 75F00A MOV B,#10 005 A4 MUL AB ;(A)=(bl X l0)L,(B)=(bl X l0)H 005B 2B ADD A,R3 ;A=(bl X 1O)L+b3 005C FB MOT R3,A ;此時R310,R410已經(jīng)完成 005D 08 INC R0 ;取下一位BCD碼 005E EC MOV A,R4 ;(R4+下一位BCD碼數(shù)值)送B4 005F 26 ADD A,RO 0060 FC MOV R4, A 0061 EB MOV A,R3 ;進(jìn)位加到高8位 0062 3400 ADDC A,#0 0064 FB MOV R3A 0065 DAE7 DJNZ R2,LOOP ;循環(huán)(n-1)次 0067 D0F0 POP B ;恢復(fù)現(xiàn)場 0069 D0E0 POP ACC 006B D0D0 POP PSW 006D 22 RET ;返回 例如:4位BCD數(shù)為6553,依次存入內(nèi)存單元20 H、21 H、22 H和23 H中。轉(zhuǎn)換結(jié)果為19 9H,依次存人R3和R4中?!?-19】將外部RAM的40 H單元中的一個字節(jié)拆成2個ASCII碼,分別存入內(nèi)部數(shù)據(jù)存儲器40 H和41 H單元中。試編寫以子程序形式給出的轉(zhuǎn)換程序,說明調(diào)用該子程序的入口條件和出口功能。加上必要的偽指令,并對源程序加以注釋。 【答】子程序的入口條件、出口功能及源代碼如下: 子程序人口條件:準(zhǔn)備拆為2個ASCII碼的數(shù)存入外部RAM的40 H單元中。 子程序出口功能:完成外部RAM單元一個字節(jié)拆成2個ASCII碼,分別存入內(nèi)部數(shù)據(jù)存儲器40 H和41 H單元中。 ORG 1 000H B_TO_A:MOV DPTR,#40H ;外部RAM40H單元 MOV R0,#40H MOVX A,DPTR ;取數(shù) PUSH A ANL A,#0FH ;低4位轉(zhuǎn)換為ASCII碼 LCALL CHANGE MOV RO,A INC R0 POP A SWAP A ANL A,#0FH ;高4位轉(zhuǎn)換為ASCII碼 LCALL CHANGE MOV R0,A RET CHANGE:CJNE A,#0AH,NEXT ;轉(zhuǎn)換子程序 NEXT: JNC NEXT2 ;0AH,轉(zhuǎn)移 ADD A,#3 0H ;9,數(shù)字0-9轉(zhuǎn)化為ASCII碼 RET NEXT2: ADD A,#37H ;字母AF轉(zhuǎn)化為ASCII碼 RET END 設(shè)外部(40 H)=12 H。 執(zhí)行程序B_TO_A后:內(nèi)部(40 H)=31 H,(41 H)=32 H。 設(shè)外部RAM(40 H)=ABH。執(zhí)行程序B_TO_A后,內(nèi)部(40 H)=41 H,(41 H)=42 H?!?-20】請編寫中值數(shù)字濾波子程序FILLE,加上必要的偽指令,并對源程序加以注釋。 入口條件:3次采集數(shù)據(jù)分別存儲在內(nèi)部存儲器的20 H、21 H和22 H中。出口結(jié)果:中值在R0寄存器中?!敬稹砍绦蛉缦拢?ORG 00H 0000 0130 AJMP LIZI ORG 30H 0030 752056 LIZI:MOV 20H,#56H ;3次采集數(shù)據(jù) 0033 752184 MOV 21H,#84H 0036 752212 MOV 22H,#12H 0039 113D ACALL FILLE 003B 013B AJMP $ ;中值數(shù)字濾波子程序FILLV 003D COD0 FILLE:PUSH PSW ;PSW及ACC保護(hù)入棧 003F COE0 PUSH ACC0041 E520 MOV A,20H ;取第一個數(shù) 0043 C3 CLR C 0044 9521 SUBB A,21H ;與第二個數(shù)比較 0046 5006 JNC LOB1 ;第一個數(shù)比第二個大,轉(zhuǎn)LOBl 0048 E520 MOV A,20H ;第一個數(shù)比第二個小,交換位置 004A C521 XCH A,21H 004C F520 MOV 20H,A 004E E522 LOB1l: MOV A,22H 0050 C3 CLR C 0051 9520 SUBB A,20H ;第三個數(shù)與前二個數(shù)中的較大數(shù)比較 0053 500F JNC LOB3 ;第三個數(shù)大于前二個中的較大數(shù),轉(zhuǎn)LOB3 0055 E522 MOV A,22H 0057 C3 CLR C 0058 9521 SUBB A,21H ;第三個數(shù)與前二個數(shù)中的較小數(shù)比較 005A 500D JNC IOB4 005C E521 MOV A,21H 005E F8 MOV R0,A ;存入中值 005F D0E0 LOB2:POP ACC ;恢復(fù)ACC和PSW 0061 D0D0 POP PSW 0063 22 RET 0064 E520 LOB3: MOV A,20H 0066 F8 MOV R0,A 0067 015F AJMP LOB2 0069 E522 LOB4: MOV A,22H006B F8 MOV R0,A ;存入中值 006C 015F AJMP LOB2 執(zhí)行結(jié)果為(RO)=56 H?!?-21】根據(jù)8100 H單元中的值X,決定P1口引腳輸出為: 加上必要的偽指令,并對源程序加以注釋。 【答】程序如下: ORG 0000H SJMP BEGIN ORG 0030H BEGIN: MOV DPTR,#8100H MOVX A,DPTR MOV R2,A JB ACC.7,SMALLER;有符號數(shù)0 SJMP UNSIGNED ;無符號數(shù)0 SMALLER:DEC A ;X0,輸出-X(先減1,再取反) CPL A MOV P1,A SJMP OK UNSIGNED:CJNE A,#00H,BIGGER ;不等于0即大于0 MOV P1,#80H ;X等于0,輸出80H SJMP OK BIGGER: CLR C ;X大于0,輸出A2 RLC A ;A2 MOV P1,A OK: SJMP $ END例如:輸入55 H,P1口引腳輸出AAH;輸入00 H,P1口引腳輸出80 H;輸入F1(一1 5的補(bǔ)碼),P1口引腳輸出0FH?!?-22】將4000 H40FF H中256個ASCII碼加上奇校驗(yàn)后從P1口依次輸出。加上必要的偽指令,并對源程序加以注釋?!敬稹孔⒁猓篈SCII碼的有效位為7位,其最高位D7可與程序狀態(tài)字PSW中的奇偶校驗(yàn)位P配合進(jìn)行校驗(yàn)。 ORG 0000H SJMP BEGIN ORG 0030H BEGIN: MOV DPTR,#4000H ;首地址 MOV R0,#00H ;發(fā)送計(jì)數(shù)器 LOOP: MOVX A,DPTR MOV C,P CPL C MOV ACC.7,C , ;置奇校驗(yàn) MOV PI,A ;從PI口輸出 INC DPTR DJNZ R0,LOOP ;循環(huán) AJMP $ END【4-23】 編寫將1 O位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼的程序。假定十六進(jìn)制數(shù)存放在內(nèi)部RAM的20 H單元開始的區(qū)域中,轉(zhuǎn)換得到的ASCII碼存放在內(nèi)存3O H單元開始的區(qū)域中。加上必要的偽指令,并對源程序加以注釋?!敬稹坎楸矸ǎ?ORG 0000H SJMP BEGIN ORG 0030H BEGIN: MOV R2,#5 ;10位十六進(jìn)制數(shù) MOV R0,#20H ;讀指針 MOV RI,#30H ;寫指針 MOV D

溫馨提示

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

評論

0/150

提交評論