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

下載本文檔

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

文檔簡(jiǎn)介

第4章【單片機(jī)的程序設(shè)計(jì)】思考與練習(xí)題解析【4—1】簡(jiǎn)述下列基本概念:程序、程序設(shè)計(jì)、機(jī)器語言、匯編語言及高級(jí)語言?!敬稹扛骰靖拍钊缦隆!こ绦颍簽橛?jì)算某一算式或完成某一工作的若干指令的有序集合。·程序設(shè)計(jì):?jiǎn)纹瑱C(jī)的全部工作概括起來,就是執(zhí)行程序的過程。為單片機(jī)準(zhǔn)備這一程序,即編制程序的工作過程?!C(jī)器語言:用二進(jìn)制代碼表示的指令系統(tǒng)稱為“機(jī)器語言系統(tǒng)”,簡(jiǎn)稱為“機(jī)器語言”?!R編語言:用英文字符來代替機(jī)器語言,這些英文字符稱為“助記符’’。用這種助記符表示指令系統(tǒng)的語言稱為“匯編語言”或“符號(hào)語言”?!じ呒?jí)語言:參照數(shù)學(xué)語言而設(shè)計(jì)的、近似于人們?nèi)粘S谜Z的語言。它是面向問題或者面向過程的語言。這種語言不僅直觀、易學(xué)、易懂,而且通用性強(qiáng),易于移植到不同類型的機(jī)器中?!?—2】在單片機(jī)領(lǐng)域,目前最廣泛使用的是哪幾種語言?有哪些優(yōu)越性?單片機(jī)能否直接執(zhí)行這幾種語言?【答】在單片機(jī)領(lǐng)域,目前最廣泛使用的是匯編語言和高級(jí)語言。匯編語言編寫的程序效率高,占用存儲(chǔ)空間小,運(yùn)行速度快,而且能反映單片機(jī)的實(shí)際運(yùn)行情況。但編程比使用高級(jí)語言困難,通用性差。單片機(jī)不能直接執(zhí)行匯編語言程序,必須通過人工(或機(jī)器)匯編把匯編語言程序轉(zhuǎn)換為機(jī)器語言程序。高級(jí)語言不受具體機(jī)器的限制,而且使用了許多數(shù)學(xué)公式和習(xí)慣用語,從而簡(jiǎn)化了程序設(shè)計(jì)的過程,通用性強(qiáng),易于移植到不同類型的單片機(jī)中。單片機(jī)不能直接識(shí)別和執(zhí)行高級(jí)語言,需要將其轉(zhuǎn)換為機(jī)器語言程序才能識(shí)別和執(zhí)行。對(duì)于高級(jí)語言,這一轉(zhuǎn)換工作通常稱為“編譯”或者“解釋”。進(jìn)行編譯或者解釋的專用程序稱為“編譯程序”或者“解釋程序”?!?—3】什么叫偽指令?8OC51單片機(jī)程序設(shè)計(jì)中主要有哪些偽指令語句?【答】偽指令又稱為“匯編程序控制譯碼指令”?!皞巍斌w現(xiàn)在匯編時(shí)不產(chǎn)生機(jī)器指令代碼,不影響程序的執(zhí)行,僅指明在匯編時(shí)執(zhí)行一些特殊的操作。例如.為程序指定一個(gè)存儲(chǔ)區(qū),將一些數(shù)據(jù)、表格常數(shù)存放在指定的存儲(chǔ)單元,說明源程序開始或結(jié)束等.。不同的單片機(jī)開發(fā)裝置所定義的偽指令不全相同。80C51單片機(jī)程序設(shè)計(jì)中主要有偽指令語句如下。1.ORG(Origin)一匯編起始地址偽指令,指令格式為:ORG<表達(dá)式>’其含義是向匯編程序說明,下述程序段的起始地址由表達(dá)式指明。表達(dá)式通常為十六進(jìn)制地址碼。2.END(END0fAssembly)一匯編結(jié)束偽指令。其含義是通知匯編程序,該程序段匯編至此結(jié)束。3.EQU(EQUate)—賦值偽指令。指令格式為:<標(biāo)號(hào)>EQU<表達(dá)式>其含義是把表達(dá)式賦值于標(biāo)號(hào),這里的標(biāo)號(hào)和表達(dá)式是必不可少的。用EQU語句給一個(gè)標(biāo)號(hào)賦值以后,在整個(gè)源程序中該標(biāo)號(hào)的值是固定的,不能更改。4.DL--定義標(biāo)號(hào)值偽指令指令格式為:<標(biāo)號(hào)>DL<表達(dá)式>其含義也是說明標(biāo)號(hào)等值于表達(dá)式。同樣,標(biāo)號(hào)和表達(dá)式是必不可少的。用DL語句在同一源程序中給同一標(biāo)號(hào)賦予不同的值,即可更改已定義的標(biāo)號(hào)值。5.DB(DefineByte)—定義字節(jié)偽指令指令格式為:<標(biāo)號(hào)>DB<表達(dá)式或表達(dá)式表>其含義是將表達(dá)式或表達(dá)式表所表示的數(shù)據(jù)或數(shù)據(jù)串存入從標(biāo)號(hào)開始的連續(xù)存儲(chǔ)單元中。標(biāo)號(hào)為可選項(xiàng),它表示數(shù)據(jù)存儲(chǔ)單元地址。表達(dá)式或表達(dá)式表是指一個(gè)字節(jié)或用逗號(hào)分開的字節(jié)數(shù)據(jù)??梢允怯靡?hào)括起來的字符串,字符串中的字符按ASCII碼存于連續(xù)的ROM中。6.DW(DefineWord)---定義字偽指令指令格式為:<標(biāo)號(hào)>DW<表達(dá)式或表達(dá)式表>其含義是把字或字串值存人由標(biāo)號(hào)開始的連續(xù)存儲(chǔ)單元中,并且把字的高字節(jié)數(shù)存人低地址單元,低字節(jié)數(shù)存入高地址單元。按順序連續(xù)存放。7.DS(DefineStonage)—定義存儲(chǔ)區(qū)偽指令指令格式為:<標(biāo)號(hào)>DS<表達(dá)式>·其含義是通知匯編程序,在目標(biāo)代碼中,以標(biāo)號(hào)為首地址保留表達(dá)式值的若干存儲(chǔ)單元以備源程序使用。匯編時(shí),對(duì)這些單元不賦值。注意:對(duì)于80C51單片機(jī),DB、DW和DS等偽指令只能應(yīng)用于程序存儲(chǔ)器,而不能應(yīng)用于數(shù)據(jù)存儲(chǔ)器。8.BIT—位定義偽指令用于給字符名稱賦予位地址。命令格式為:<字符名稱>BIT<位地址>其中,位地址可以是絕對(duì)地址,也可以是符號(hào)地址?!?—4】什么是結(jié)構(gòu)化程序設(shè)計(jì)?它包含哪些基’本結(jié)構(gòu)程序?【答】程序設(shè)計(jì)有時(shí)可能是一件很復(fù)雜的工作,但往往有些程序結(jié)構(gòu)是很典型的。采用結(jié)構(gòu)化程序編程時(shí),規(guī)律性極強(qiáng),簡(jiǎn)單清晰,易讀/寫,具有調(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é)無符號(hào)數(shù)的加法程序段,最高字節(jié)的進(jìn)位存入用戶標(biāo)志F0中?!敬稹宽樞蚪Y(jié)構(gòu)是按照邏輯操作順序,從某一條指令開始逐條順序執(zhí)行,直至某一條指令為止。比如數(shù)據(jù)的傳送與交換、簡(jiǎn)單的運(yùn)算、查表等程序的設(shè)計(jì)。順序結(jié)構(gòu)是所有程序設(shè)計(jì)中最基本、最單純的程序結(jié)構(gòu)形式,因而是一種最簡(jiǎn)單、應(yīng)用最普遍的程序結(jié)構(gòu)。在順序結(jié)構(gòu)程序中沒有分支,也沒有子程序,但它是組成復(fù)雜程序的基礎(chǔ)和主干。例如:三字節(jié)無符號(hào)數(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é)在前。MOVA,30H;取被加數(shù)低字節(jié)數(shù)ADDA,20H;求和M0740H,A;和存入MOVA,31HADDCA,21H;帶進(jìn)位求和MOV41H,AMOVA,32HADDCA,22H;帶進(jìn)位求和MOV42H.A,MOVF0,C;最高字節(jié)的進(jìn)位存入用戶標(biāo)志F0中【4—6】80C51單片機(jī)有哪些查表指令?它們有何本質(zhì)區(qū)別?請(qǐng)編寫按序號(hào)i值查找Di(16位長(zhǎng)度)的方法。設(shè)值i存放在R7中,將查找到的數(shù)據(jù)存放于片內(nèi)RAM的30H、31H單元中。請(qǐng)畫出程序流程圖,編寫查表程序段,加上必要的偽指令,并對(duì)源程序加以注釋?!敬稹?0c51有兩種查表指令,即近程查表指令“MOVCA,@A+PC”和遠(yuǎn)程查表指令“MOVCA,@AA+DPTR"這兩條指令的功能均是從程序存儲(chǔ)器中讀取數(shù)據(jù)(如表格、常數(shù)等),執(zhí)行過程相同,其差別是基址不同,因此,適用范圍也不同。累加器A為變址寄存器,而PC、DPTR為基址寄存器。DPTR為基址寄存器時(shí),允許數(shù)表存放在程序存儲(chǔ)器的任意單元,稱為“遠(yuǎn)程查表”,編程比較直觀;而PC為基址寄存器時(shí),數(shù)表只能放在該指令單元往下的256個(gè)單元中,稱為“近程查表”。編程時(shí)需要計(jì)算累加器A中的值與數(shù)表首址的偏移量。例如,按序號(hào)i值查找Di(16位長(zhǎng)度)的源程序如下所示:ORGXXXXHMOVDPTR,#TABLE指向表首址MOVA,R7;取值iRLA;Di為二個(gè)字節(jié)MOVR7,A;ix2MOVCA,@A+DPTR;查表獲得Di的高字節(jié)MOV30H.AMOVA,R7INCA指向表的下一個(gè)地址MOVCA,@A+DPTR;{表獲得Di的低字節(jié)MOV31H,ATABLE:Dw……;表(Dw為雙字節(jié),高字節(jié)在前)RET查表程序流程圖如圖4-1所示。【4—7】根據(jù)運(yùn)算結(jié)果給出的數(shù)據(jù)到指定的數(shù)據(jù)表中查找對(duì)應(yīng)的數(shù)據(jù)字。運(yùn)算結(jié)果給出的數(shù)據(jù)在片內(nèi)RAM的40H單元中,給出的數(shù)據(jù)大小在00~0FH之間,數(shù)據(jù)表存放在20H開始的片內(nèi)存儲(chǔ)器中。查表所得數(shù)據(jù)字為雙字節(jié)(高字節(jié)在后),高字節(jié)存于42H、低字節(jié)存于41H單元。其對(duì)應(yīng)關(guān)系為:給出數(shù)據(jù):00H01H02H…0DH0EH0FH對(duì)應(yīng)數(shù)據(jù):00A0H7DC2HFF09H…3456H89ABH5678H請(qǐng)編制查表程序段,加上必要的偽指令,并加以注釋。【答】程序如下:ORG0000HAJMPMAIN,0RG0020HTAB:DBOAOH,OOH,0C2H,7DH,09H,OFFH,...,56H,34H,0.ABH,89H,DB78H,56H;數(shù)據(jù)字表ORG0050HMAIN:MOVA,40H;運(yùn)算結(jié)果給出的數(shù)據(jù)放在40H中MOVDPTR,#TAB;指向數(shù)據(jù)字表首地址RLA;由于是雙字節(jié),所以A左移1位(乘2)MOV40H,A;結(jié)果放在40H’MOVCA,@A+DPTR;查表,找出對(duì)應(yīng)的值MOV41H,A;查找出的數(shù)據(jù)值低字節(jié)放入41HMOVA.40HADDA,#01H;查找數(shù)據(jù)的高位字節(jié)MOVDPTR,#TABMOVCA,@A+DPTRMOV42H,A。;查找出的數(shù)據(jù)值高字節(jié)放入42HSJMP$注意:數(shù)據(jù)表存放在20H開始的片內(nèi)存儲(chǔ)器中,該存儲(chǔ)器應(yīng)為內(nèi)部程序存儲(chǔ)器,因?yàn)椴楸碇噶頜OVC的功能是從程序存儲(chǔ)器中讀數(shù)據(jù)。【4—8】什么是分支結(jié)構(gòu)程序?8OC1的哪些指令可用于分支結(jié)構(gòu)程序編程?有哪些多分支轉(zhuǎn)移指令?由累加器A中的動(dòng)態(tài)運(yùn)行結(jié)果值進(jìn)行選擇分支程序,分支轉(zhuǎn)移指令選用LJMP,請(qǐng)編寫散轉(zhuǎn)程序段和畫出程序流程圖,加上必要的偽指令,并加以注釋。【答】分支結(jié)構(gòu)程序的主要特點(diǎn)是程序執(zhí)行流程中必然包含有條件判斷指令。符合條件要求和不符合條件要求的有不同的處理路徑。編程的主要方法和技術(shù)是合理選用具有邏輯判斷功能的指令。在程序設(shè)計(jì)時(shí),往往借助程序框圖(判斷框)來指明程序的走向。一般情況下,每個(gè)分支均需要單獨(dú)執(zhí)行一段程序,對(duì)分支程序的起始地址賦予一個(gè)地址標(biāo)號(hào),以便當(dāng)條件滿足時(shí)轉(zhuǎn)向指定地址單元去執(zhí)行程序,條件不滿足時(shí)仍順序往下執(zhí)行程序。80C51的條件判跳指令極其豐富,功能極強(qiáng),特別是位處理判跳指令,對(duì)復(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)容動(dòng)態(tài)地選擇對(duì)應(yīng)的分支程序。因此,可以從多達(dá)256個(gè)分支中選擇一個(gè)分支散轉(zhuǎn)。(b)比較指令:CJNEA,direct,rel(共有4條)比較兩個(gè)數(shù)的大小,必然存在大于、等于、小于三種情況,這時(shí)就需要從三個(gè)分支中選擇一個(gè)分支執(zhí)行程序。例如:由累加器A中的動(dòng)態(tài)運(yùn)行結(jié)果值進(jìn)行選擇分支程序,分支轉(zhuǎn)移指令選用LJMP。ORGXXXXHMOVDPTR,#JPTAB;分支轉(zhuǎn)移表首地址CLRCMOVB,ARLCAJNCTABINCDPTRTAB:ADDA,B;(A)*3JNCTABLEINCDPTRTABLE:JMP@A+DPTR;多分支轉(zhuǎn)移JPTAB:LTMPLOOPl;長(zhǎng)轉(zhuǎn)移指令為3個(gè)字節(jié)LJMPLOOP2注意:長(zhǎng)轉(zhuǎn)移指令為3字節(jié),因此,A中內(nèi)容應(yīng)乘以3。若大于一個(gè)字節(jié),則DPH要加1。分支程序流程圖如圖4-2所示?!?-9】循環(huán)結(jié)構(gòu)程序有何特點(diǎn)?80C51的循環(huán)轉(zhuǎn)移指令有什么特點(diǎn)?何謂循環(huán)嵌套?編程時(shí)應(yīng)注意什么?【答】循環(huán)是強(qiáng)制CPU重復(fù)多次地執(zhí)行一串指令的基本程序結(jié)構(gòu)。從本質(zhì)上看,循環(huán)程序結(jié)構(gòu)只是分支程序中的一個(gè)特殊形式。循環(huán)程序由4個(gè)部分構(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é)束條件可以是搜索到某個(gè)關(guān)鍵字(比如回車符CR),也可以是發(fā)生的某種變化(如故障引起電路電平變化)等,什么時(shí)候結(jié)束循環(huán)是不可預(yù)知的。80C51設(shè)有功能強(qiáng)的循環(huán)轉(zhuǎn)移指令:DJNZRn,rel..;以工作寄存器作為控制計(jì)數(shù)器DJNZdirect,rel.;以直接尋址單元作為控制計(jì)數(shù)器CJNEA,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)生錯(cuò)誤。編程時(shí)要注意循環(huán)的正確退出,要防止出現(xiàn)“死循環(huán)”?!?-10】什么是子程序?它的結(jié)構(gòu)特點(diǎn)是什么?什么是子程序嵌套?【答】在編制應(yīng)用程序時(shí),往往將需要多次應(yīng)用但完成的運(yùn)算或操作相同的程序段,編制成一個(gè)子程序,并盡量使其標(biāo)準(zhǔn)化,存放于某存儲(chǔ)區(qū)域。調(diào)用子程序的程序稱為“主程序”或“調(diào)用程序”。子程序是由專門的子程序調(diào)用指令CALL調(diào)用,而以子程序返回指令RET結(jié)束的程序段。子程序的第一條指令地址,通常稱為“子程序首地址”或“人口地址”,往往采用標(biāo)號(hào)(可用助記符)加以表示,調(diào)用(轉(zhuǎn)子)指令的下一條指令地址,通常稱為“返回地址”或“斷點(diǎn)”。在子程序中調(diào)用子程序的現(xiàn)象通常稱為子程序嵌套?!?-11】手工匯編下列程序:KEYEQU20HORG2000HMOVRO,#30H;數(shù)據(jù)區(qū)首址MOVRl,#16;數(shù)據(jù)區(qū)長(zhǎng)度MOV20H,#KEY;關(guān)鍵字送20H單元CLRF0;清用戶標(biāo)志位MOV21H,#0l;序號(hào)置lLP:MOVA,@R0;取數(shù)CJNEA,20H,LP1.SJMPHERE;找到關(guān)鍵字,結(jié)束.LPI:INC21H;序號(hào)加1INCR0;數(shù)據(jù)區(qū)地址指針加1DJNZR1,LP;繼續(xù)SETBF0;未搜索到關(guān)鍵字,則置位用戶標(biāo)志HERE:SJMPHERE【答】根據(jù)指令查指令表得到機(jī)器碼,手工匯編結(jié)果如下:KEYEQU20HORG2000H20007830MOVR0,#30H;數(shù)據(jù)區(qū)首址20027910MOVR1,#16;數(shù)據(jù)區(qū)長(zhǎng)度2004752020MOV20H,#KEY;關(guān)鍵字送20H單元2007C2D5CLRF0;清用戶標(biāo)志位2009752101MOV21H,#01;序號(hào)置1200CE6LP:MOVA,@R0;取數(shù)200DB52002CJNEA,20H,LPI20108007SJMPHERE;找到關(guān)鍵字,結(jié)束20120521LPI:INC21H;序號(hào)加1201408INCR0;數(shù)據(jù)區(qū)地址指針加12015D9F5DJNZR1,LP;繼續(xù)2017D2D5SETBF0;未搜索到關(guān)鍵字,則置位用戶標(biāo)志201980FEHERE:SJMPHERE【4-12]把長(zhǎng)度為10H的字符串從內(nèi)部RAM的輸入緩沖區(qū)INBUF向設(shè)在外部RAM的輸出緩沖區(qū)OUTBUF進(jìn)行傳送,一直進(jìn)行到遇見字符“CR"時(shí)停止。若字符串中無字符“CR”,則整個(gè)字符串全部傳送。加上必要的偽指令,并對(duì)源程序加以注釋?!敬稹砍绦蛉缦拢篛RG0000HAJMPMAINORG0030HMAIN:MOVR7,#10H;數(shù)據(jù)長(zhǎng)度MOVR0,#INBUF;源數(shù)據(jù)首地址MOVDPTR,#OUTBUF;目的數(shù)據(jù)首地址LOOP:MOVA,@R0;把源數(shù)據(jù)的值賦給ACJNEA,#0DH,LOOPl;判斷是否為“CR”(ASCII碼值為0DH)SJMPENDl;是“CR",則結(jié)束傳送LOOPl:MOVX@DPTR,A;把A的值賦給目的數(shù)據(jù)INCR0;源數(shù)據(jù)下一個(gè)地址值INCDPTR;目的數(shù)據(jù)下一個(gè)地址值DJNZR7,L00P;判斷數(shù)據(jù)傳送是否完畢ENDI:SJMPENDIEND【4-13】?jī)?nèi)部RAM從2OH單元開始存放一個(gè)正數(shù)表,表中之?dāng)?shù)為無序排列,并以“-1”作為結(jié)束標(biāo)志。編程實(shí)現(xiàn)在表中找出最小正數(shù),存入10H。加上必要的偽指令,并對(duì)源程序加以注釋?!敬稹砍绦蛉缦拢篛RG0000HAJMPMAINORG0030HMAIN:MOVR0,#20H;正數(shù)表首址MOV10H,#7FH;初始值設(shè)為正數(shù)最大值LOOP:MOVA,@R0CJNEA,“-1’’,CHK;比較結(jié)束標(biāo)志“-1”SJMPEND1;是“-l",結(jié)束比較CHK:CJNEA,10H,CHKI;比較兩個(gè)數(shù)大小SJMPLOOP1;兩個(gè)數(shù)相等,不交換CHKI:JNCLOOP1;A較大,不交換MOV10H,ALOOP1INCR0SJMPLOOP‘;A較小,交換END1:SJMPEND1END例如:已知(20H)=22H,(21H)=23H,(22H)=0CH,(23H)=20H,(24H)=16H,(25H)=-1。執(zhí)行結(jié)果:(10H)=0CH【4-14】比較兩個(gè)ASCII碼字符串是否相等。字符串的長(zhǎng)度在內(nèi)部RAM的2H單元,第一個(gè)字符串的首地址在30H中,第二個(gè)字符串的首地址在50H中。如果兩個(gè)字符串相等,則置用戶標(biāo)志FO為0;否則,置用戶標(biāo)志FO為1。加上必要的偽指令,并對(duì)源程序加以注釋(每個(gè)ASCII碼字符為一個(gè)字節(jié),如ASCII碼“A”表示為41H)。LOOPl:MOVX@DPTR,A;把A的值賦給目的數(shù)據(jù)INCR0;源數(shù)據(jù)下一個(gè)地址值INCDPTR;目的數(shù)據(jù)下一個(gè)地址值DJNZR7,L00P;判斷數(shù)據(jù)傳送是否完畢ENDI:SJMPENDIEND【答】字符串中每一個(gè)字符都可以用一個(gè)ASCII碼表示。只要有一個(gè)字符不相同,就可以判斷字符串不相等。ORG0000H’AJMPMAIN·ORG0030HMAIN:MOVR0,#30H第一個(gè)字符串的首地址MOVR1.,#50H第二個(gè)字符串的首地址LOOP:MOVA,@R0第一個(gè)字符串的字符值賦給AMOVB,@R1;第二個(gè)字符串的字符值賦給BCJNEA,B,NEXT;兩個(gè)字符值比較INCR0字符值相等,則繼續(xù)比較INCR1.DJNZ20H,LOOP;判斷字符串是否比較完CLRF0字符串相等,則F0位清0SJMP$NEXT:SETBF0字符串不等,則F0位置1SJMP$END例如:(2OH)=03H,(3OH)=41H,(31H)=42H,(32H)=43H,(5OH)=41H,(51H)=42H,(52H)=43H。兩個(gè)字符串均為“ABC"。執(zhí)行結(jié)果:F0=0【4—15】已知經(jīng)A/D轉(zhuǎn)換后的溫度值存在40H中,設(shè)定溫度值存在41H中。要求編寫控制程序,當(dāng)測(cè)量的溫度值大于(設(shè)定溫度值+2℃)時(shí),從P1.0引腳上輸出低電平;當(dāng)測(cè)量的溫度值小于(設(shè)定溫度值一2℃)時(shí),從P1.0引腳上輸出高電平;其他情況下,P1.0引腳輸出電平不變(假設(shè)運(yùn)算中C中的標(biāo)志不會(huì)被置1)。加上必要的偽指令,并對(duì)源程序加以注釋。【答】程序如下:ORG0000HAJMPMAINORG‘0020HMAIN:.MOVB,41H;設(shè)定的溫度值MOVA.BADDA,#02HMOVB,A;設(shè)定溫度值+2℃MOVA,40H;測(cè)量的溫度值CLRCSUBBA,BJNCLOWER;測(cè)量的溫度值>(設(shè)定溫度值+2℃),轉(zhuǎn)LOWER子程序,使P1.0引腳上輸出低電平MOVB,41H;設(shè)定的溫度值MOVA,BDECADECA.MOVB,A;設(shè)定溫度值一2℃MOVA,40H;測(cè)量的溫度值CLRCSUBBA,BJCHIGH;測(cè)量的溫度值<設(shè)定溫度值-2℃,轉(zhuǎn)HIGH子程序,使P1.0引腳上輸出高電平SJMP$;都不是,則P1.0引腳上輸出不變LOWER:CLRP1.0SJMP$HIGH:SETBP1.0’SJMP$END【4—16】80C51單片機(jī)從內(nèi)部RAM的31H單元開始存放一組8位帶符號(hào)數(shù),字節(jié)個(gè)數(shù)存放在30H中。請(qǐng)編寫程序統(tǒng)計(jì)出其中正數(shù)、0和負(fù)數(shù)的數(shù)目,并把統(tǒng)計(jì)結(jié)果分別存入20H、21H和22H三個(gè)單元中。加上必要的偽指令,并對(duì)源程序加以注釋。【答】程序如下:LENGTHEQU30H;數(shù)據(jù)長(zhǎng)度DATA_ADREQU31H;數(shù)據(jù)首地址POS_NUMEQU20H;正數(shù)個(gè)數(shù)ZERO_NUMEQU21H;0個(gè)數(shù)NEG_NUMEQU22H;負(fù)數(shù)個(gè)數(shù)ORG0000HAJMPMAIN,ORG0030HMAIN:MOVPOS_NUM,#0;計(jì)數(shù)單元初始化為0MOVZERO_NUM,#0MOVNEG_NUM,#0MOVR1,#LENGTH;數(shù)據(jù)長(zhǎng)度MOVR0,#DATA_ADR;數(shù)據(jù)首地址LOOP:MOVA,@R0.JBACC.7,INC_NEG;符號(hào)位為1,該數(shù)為負(fù)數(shù),跳轉(zhuǎn)加1CJNEA,#0,INC_POSINCZERO_NUM;該數(shù)為0,0個(gè)數(shù)加1AJMPL00P1INCNEG:INCNE~_NUM;負(fù)數(shù)個(gè)數(shù)加1AJMPLOOPl.INC_POS:INCPOS_NUM;該數(shù)為正數(shù),正數(shù)個(gè)數(shù)加1LOOPl:INCR0;判斷統(tǒng)計(jì)是否結(jié)束DJNZR1,LOOPEND例如:已知(30H)=08H,31H單元起存放數(shù)據(jù)為00H,80H,7EH,6DH,2FH,34H,EDH,F(xiàn)FH。執(zhí)行結(jié)果:(20H)=04H,(21H)=01H,(22H)=03H?!?-17]兩個(gè)10位的無符號(hào)二一十進(jìn)制數(shù),分別從內(nèi)部RAM的40H單元和50H單元開始存放。請(qǐng)編程計(jì)算該兩個(gè)數(shù)的和,并從內(nèi)部RAM的60H單元開始存放。加上必要的偽指令,并對(duì)源程序加以注釋?!敬稹?0位的無符號(hào)二~十進(jìn)制數(shù),占5字節(jié),每個(gè)字節(jié)存放一個(gè)壓縮BCD碼(2位)。ORG0000HAJMPMAIN0Re0030HMAIN:MOVR7,#05H;十位(5字節(jié))計(jì)數(shù)MOVR0,#40H;被加數(shù)首址MOVR1,#50H;加數(shù)首址MOVR2,#60H;和數(shù)首址CLRC;清C標(biāo)志位ADDB:MOVA,@R0ADDCA,@R1DAA;二一十進(jìn)制調(diào)整MOVB,R0;保護(hù)被加數(shù)地址MOV20H,R2MOVR0,20HMOV@R0,A;存和MOVR2,20H;恢復(fù)和數(shù)地址MOVR0,B;恢復(fù)被加數(shù)地址INCR0;三個(gè)地址指針均加1INCR1INCR2DJNZR7,ADDB;多字節(jié)加未結(jié)束,則循環(huán)HERE:SJMPHEREEND注意:寄存器間接尋址只針對(duì)R0和R1,所以存和時(shí)不能使用指令“MOV@R2,A”。例如:40H~44H內(nèi)容為78H,10H,10H,10H,10H5OH~54H內(nèi)容為42H,10H,10H,10H,10H1010101078即BCD數(shù)+10101010422020202120運(yùn)行結(jié)果:6OH~64H單元中的數(shù)為20H,21H,20H,20H,20H。【4-18】編寫子程序,實(shí)現(xiàn)4位非壓縮BCD碼數(shù)轉(zhuǎn)換為二進(jìn)制數(shù),加上必要的偽指令,并對(duì)源程序加以注釋。【答】程序如下:ORGOOH00000130AJMPMAIN0RG30H0030752006MAIN:MOV20H,#06H;4位BCD數(shù)為65530033752105MOV21H,#05H0036752205MOV22H,#05H0039752303MOV23H,#03H003C7820MOVR0,#20H;高位地址指針003E7A03MOVR2,#3;循環(huán)(n一1)次,n為BCD碼位數(shù)00401144ACALLBCDB00420142AJMP$………………..;轉(zhuǎn)換原理:假設(shè)4位BCD碼為a3a2a1a0,即a3×103+a2×102+alX101+a0×100;二進(jìn)制值:((a3X10+a2)X10+a1)X10+a0;4位非壓縮BCD碼數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)子程序0044CODOBCDB:PUSHI:'SW;現(xiàn)場(chǎng)保護(hù)0046COEOPUSHACC0048COFOPUSHB004A7BOOMOTR3,#00H;設(shè)R3中的初始值為b1004CE6MOTA,@RO004DFCMOVR4,A;BCD碼千位a3送R4004EECLOOP:MOTA,R4;以下()H表示高8位,()L表示低8位004F75FOOAMOTB,#100052A4MULAB;R4X10,設(shè)(R4×l0)L=b2,(R4X10)H=b30053FCMOVR4,A;將R4×10后的低8位送到R4中0054CSFOXCHA,B;(A)=b3,(B)=b20056CBXCHA,R3;(A)=R3(b1),(R3)=b3005775F00AMOVB,#10005A4MULAB;(A)=(blXl0)L,(B)=(blXl0)H005B2BADDA,R3;A=[(blX1O)L+b3]005CFBMOTR3,A;此時(shí)R3×10,R4×10已經(jīng)完成005D08INCR0;取下一位BCD碼005EECMOVA,R4;(R4+下一位BCD碼數(shù)值)送B4005F26ADDA,@RO0060FCMOVR4,A0061EBMOVA,R3;進(jìn)位加到高8位00623400ADDCA,#00064FBMOVR3.A0065DAE7DJNZR2,LOOP;循環(huán)(n-1)次0067D0F0POPB;恢復(fù)現(xiàn)場(chǎng)0069D0E0POPACC006BD0D0POPPSW006D22RET;返回例如:4位.BCD數(shù)為6553,依次存入內(nèi)存單元20H、21H、22H和23H中。轉(zhuǎn)換結(jié)果為199H,依次存人R3和R4中。【4-19】將外部RAM的40H單元中的一個(gè)字節(jié)拆成2個(gè)ASCII碼,分別存入內(nèi)部數(shù)據(jù)存儲(chǔ)器40H和41H單元中。試編寫以子程序形式給出的轉(zhuǎn)換程序,說明調(diào)用該子程序的入口條件和出口功能。加上必要的偽指令,并對(duì)源程序加以注釋?!敬稹孔映绦虻娜肟跅l件、出口功能及源代碼如下:子程序人口條件:準(zhǔn)備拆為2個(gè)ASCII碼的數(shù)存入外部RAM的40H單元中。子程序出口功能:完成外部RAM單元一個(gè)字節(jié)拆成2個(gè)ASCII碼,分別存入內(nèi)部數(shù)據(jù)存儲(chǔ)器40H和41H單元中。ORG1000HB_TO_A:MOVDPTR,#40H;外部RAM40H單元MOVR0,#40HMOVXA,@DPTR;取數(shù)PUSHAANLA,#0FH;低4位轉(zhuǎn)換為ASCII碼LCALL.CHANGEMOV@RO,AINCR0POPA’SWAPAANLA,#0FH;高4位轉(zhuǎn)換為ASCII碼LCALLCHANGEMOV@R0,ARETCHANGE:CJNEA,#0AH,NEXT;轉(zhuǎn)換子程序NEXT:JNCNEXT2;≥0AH,轉(zhuǎn)移ADDA,#30H;≤9,數(shù)字0-9轉(zhuǎn)化為ASCII碼RETNEXT2:ADDA,#37H;字母A~F轉(zhuǎn)化為ASCII碼RETEND設(shè)外部(40H)=12H。執(zhí)行程序B_TO_A后:內(nèi)部(40H)=31H,(41H)=32H。設(shè)外部RAM(40H)=ABH。執(zhí)行程序B_TO_A后,內(nèi)部(40H)=41H,(41H)=42H。【4-20】請(qǐng)編寫中值數(shù)字濾波子程序FILLE,加上必要的偽指令,并對(duì)源程序加以注釋。入口條件:3次采集數(shù)據(jù)分別存儲(chǔ)在內(nèi)部存儲(chǔ)器的20H、21H和22H中。出口結(jié)果:中值在R0寄存器中?!敬稹砍绦蛉缦拢篛RG00H00000130AJMPLIZIORG30H0030752056LIZI:MOV20H,#56H;3次采集數(shù)據(jù)0033752184MOV21H,#84H0036752212MOV22H,#12H0039113DACALLFILLE003B013BAJMP$;中值數(shù)字濾波子程序FILLV.003DCOD0FILLE:PUSHPSW;PSW及ACC保護(hù)入棧003FCOE0PUSHACC.0041E520MOVA,20H;取第一個(gè)數(shù)0043C3CLRC00449521SUBBA,21H;與第二個(gè)數(shù)比較00465006JNCLOB1;第一個(gè)數(shù)比第二個(gè)大,轉(zhuǎn)LOBl0048E520MOVA,20H;第一個(gè)數(shù)比第二個(gè)小,交換位置004AC521XCHA,21H004CF520MOV20H,A004EE522LOB1l:MOVA,22H0050C3CLRC00519520SUBBA,20H;第三個(gè)數(shù)與前二個(gè)數(shù)中的較大數(shù)比較0053500FJNCLOB3;第三個(gè)數(shù)大于前二個(gè)中的較大數(shù),轉(zhuǎn)LOB30055E522MOVA,22H0057C3CLRC00589521SUBBA,21H;第三個(gè)數(shù)與前二個(gè)數(shù)中的較小數(shù)比較005A500DJNCIOB4005CE521MOVA,21H.005EF8MOVR0,A;存入中值005FD0E0LOB2:POPACC;恢復(fù)ACC和PSW0061D0D0POPPSW006322RET0064E520LOB3:MOVA,20H0066F8MOVR0,A0067015FAJMPLOB20069E522LOB4:MOVA,22H006BF8MOVR0,A;存入中值006C015FAJMPLOB2執(zhí)行結(jié)果為(RO)=56H。【4-21】根據(jù)8100H單元中的值X,決定P1口引腳輸出為:加上必要的偽指令,并對(duì)源程序加以注釋。.【答】程序如下:ORG0000HSJMPBEGINORG0030HBEGIN:MOVDPTR,#8100HMOVXA,@DPTRMOVR2,AJBACC.7,SMALLER;有符號(hào)數(shù)<0SJMPUNSIGNED;無符號(hào)數(shù)≥0SMALLER:DECA;X<0,輸出-X(先減1,再取反)CPLAMOVP1,ASJMPOKUNSIGNED:CJNEA,#00H,BIGGER;不等于0即大于0MOVP1,#80H;X等于0,輸出80HSJMPOKBIGGER:CLRC;X大于0,輸出A×2RLCA;A×2MOVP1,AOK:SJMP$END例如:輸入55H,P1口引腳輸出AAH;輸入00H,P1口引腳輸出80H;輸入F1(一15的補(bǔ)碼),P1口引腳輸出0FH?!?-22】將4000H~40FFH中256個(gè)ASCII碼加上奇校驗(yàn)后從P1口依次輸出。加上必要的偽指令,并對(duì)源程序加以注釋?!敬稹孔⒁猓篈SCII碼的有效位為7位,其最高位D7可與程序狀態(tài)字PSW中的奇偶校驗(yàn)位P配合進(jìn)行校驗(yàn)。ORG0000HSJMPBEGINORG0030HBEGIN:MOVDPTR,#4000H;首地址MOVR0,#00H;發(fā)送計(jì)數(shù)器LOOP:MOVXA,@DPTRMOVC,PCPLCMOVACC.7,C,;置奇校驗(yàn)MOVPI,A;從PI口輸出INCDPTRDJNZR0,LOOP;循環(huán)AJMP$END【4-23】編寫將1O位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼的程序。假定十六進(jìn)制數(shù)存放在內(nèi)部RAM的20H單元開始的區(qū)域中,轉(zhuǎn)換得到的ASCII碼存放在內(nèi)存3OH單元開始的區(qū)域中。加上必要的偽指令,并對(duì)源程序加以注釋?!敬稹坎楸矸ǎ篛RG0000HSJMPBEGINORG0030HBEGIN:MOVR2,#5;10位十六進(jìn)制數(shù)MOVR0,#20H;讀指針MOVRI,#30H;寫指針MOVDPTR,#ASCTB~ASCII碼表首址LOOP:MOVA,@R0‘ANLA,#0FOH;取高半字節(jié)SWAPAACALLTRANS;調(diào)用十六進(jìn)制到ASCII碼轉(zhuǎn)換子程序MOVA,@R0ANLA,#0FH;取低半字節(jié)ACALLTRANS;調(diào)用十六進(jìn)制到ASCII碼轉(zhuǎn)換子程序INCR0DJNZR2,LOOPSJMP$;查表法子程序.TRANS:MOVCA,@A+DPTR;取得ASCII碼MOV@R1,AINCR1RETASCTB:;ASCII碼表DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39HDB41H,42H,43H,44H,45H,46HEND注意:十六進(jìn)制數(shù)0~9所對(duì)應(yīng)的ASCII碼為30H~39H,十六進(jìn)制數(shù)A~F所對(duì)應(yīng)的ASCII碼為41H~46H。,例如:在20H開始輸入5個(gè)十六進(jìn)制數(shù):11H,F(xiàn)4H,F(xiàn)1H,12H,34H。執(zhí)行程序后:內(nèi)存30H單元開始的區(qū)域中依次為31H,31H,46H,34H,46H,31H,31H,32H,33H,34H。、【4-24]80C51單片機(jī)的P1.7、P1.6和P1.5輸出的6拍波形如圖4-3所示,后面輸出波形重復(fù),輸出波形9O拍后停止。請(qǐng)編寫源程序,并加以注釋,并加上必要的偽指令?!敬稹坑蓤D4-3分析,可以得到一個(gè)周期為6拍的波形表。ORG0000H0000802ESJMPBEGINORG0030H00307860BEGIN:MOVR0,#90;90拍波形計(jì)數(shù)器00327906LOOP2:MOVR1,#6;6拍波形計(jì)數(shù)器0034900047MOVDPTR,#TAB0037E4LOOPI:CLRA003893MOVCA,@A+DPTR;查表得到輸出波形值0039F590MOVPI,A003BE8MOVA,R0、;判斷90拍波形輸出結(jié)束?003C14DECA003DF8MOVR0,A003E6005JZSTOP;90拍波形輸出完,則轉(zhuǎn)停止輸出0040A3INCDPTR0041D9F4DJNZR1,LOOP1;6拍波形循環(huán)004380EDSJMPL00P2004580FESTOP:SJMPSTOP0047E040A0TAB:DB0E0H,40H,0A0H,60H,0C0H,60H;6拍波形表004A60C060END【4-25】編寫求無符號(hào)數(shù)最大值的子程序。入口條件:采樣值存放在外部RAM的1000H~100FH單元中。出口結(jié)果:求得的最大值存入內(nèi)部RAM區(qū)的20H單元中。對(duì)源程序加以注釋和加上必要的偽指令?!敬稹砍绦蛉缦拢?;求無符號(hào)數(shù)最大值的子程序CMPORG1000HCMP:MOVR0,#10H;采樣值數(shù)據(jù)區(qū)長(zhǎng)度MOVDPTR,#1000H;采樣值存放首址MOV20H,#00H;最大值單元初始值設(shè)為最小數(shù)LP:MOVXA,@

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論