版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第4章【單片機的程序設計】思考與練習題解析【4 1】簡述下列基本概念:程序、程序設計、機器語言、匯編語言及高級語言?!敬稹扛骰靖拍钊缦隆3绦颍簽橛嬎隳骋凰闶交蛲瓿赡骋还ぷ鞯娜舾芍噶畹挠行蚣?。程序設計:單片機的全部工作概括起來,就是執(zhí)行程序的過程。為單片機準備這一程序,即編制程序的工作過程。機器語言:用二進制代碼表示的指令系統(tǒng)稱為“機器語言系統(tǒng)”,簡稱為“機器語言” C匯編語言:用英文字符來代替機器語言,這些英文字符稱為“助記符'用這種助記符表示指令系統(tǒng)的語言稱為“匯編語言”或“符號語言”。高級語言:參照數(shù)學語言而設計的、近似于人們?nèi)粘S谜Z的語言。它是面向問題或者 面向過程的語言。這
2、種語言不僅直觀、易學、易懂,而且通用性強,易于移植到不同類型的 機器中?!?2】在單片機領域,目前最廣泛使用的是哪幾種語言 ?有哪些優(yōu)越性?單片機能否直接執(zhí) 行這幾種語言?【答】在單片機領域,目前最廣泛使用的是匯編語言和高級語言。匯編語言編寫的程序效率高,占用存儲空間小,運行速度快,而且能反映單片機的實際運行情況。但編程比使用高級語言困難,通用性差。單片機不能直接執(zhí)行匯編語言程序,必須通過人工(或機器)匯編把匯編語言程序轉(zhuǎn)換為機器語言程序。高級語言不受具體機器的限制,而且使用了許多數(shù)學公式和習慣用語,從而簡化了程序設計的過程,通用性強,易于移植到不同類型的單片機中。單片機不能直接識別和執(zhí)行高級
3、語言,需要將其轉(zhuǎn)換為機器語言程序才能識別和執(zhí)行。 對于高級語言,這一轉(zhuǎn)換工作通常稱為“編譯”或者“解釋”。進行編譯或者解釋的專用程 序稱為“編譯程序”或者“解釋程序” ?!?3】什么叫偽指令?8OC51單片機程序設計中主要有哪些偽指令語句?【答】偽指令又稱為“匯編程序控制譯碼指令”?!皞巍斌w現(xiàn)在匯編時不產(chǎn)生機器指令代碼,不影響程序的執(zhí)行,僅指明在匯編時執(zhí)行一些特殊的操作。例如為程序指定一個存儲區(qū), 將 一些數(shù)據(jù)、表格常數(shù)存放在指定的存儲單元,說明源程序開始或結(jié)束等.。不同的單片機開發(fā)裝置所定義的偽指令不全相同。80C51 單片機程序設計中主要有偽指令語句如下。1 ORGQrigi n) 匯編起
4、始地址偽指令,指令格式為:ORG 表達式'其含義是向匯編程序說明, 下述程序段的起始地址由表達式指明。表達式通常為十六進制地址碼。2 END(END Of Assembly) 一匯編結(jié)束偽指令。其含義是通知匯編程序,該程序段匯編至此結(jié)束。3 EQU(EQUate賦值偽指令。指令格式為: 標號 EQU 表達式其含義是把表達式賦值于標號,這里的標號和表達式是必不可少的。用EQU語句給一個標號賦值以后,在整個源程序中該標號的值是固定的,不能更改。4 DL-定義標號值偽指令指令格式為: 標號 DL 表達式其含義也是說明標號等值于表達式。同樣,標號和表達式是必不可少的。用DL語句在同一源程序中給
5、同一標號賦予不同的值,即可更改已定義的標號值。5 . DB(Define Byte)定義字節(jié)偽指令指令格式為: 標號DB 表達式或表達式表其含義是將表達式或表達式表所表示的數(shù)據(jù)或數(shù)據(jù)串存入從標號開始的連續(xù)存儲單元中。標號為可選項,它表示數(shù)據(jù)存儲單元地址。表達式或表達式表是指一個字節(jié)或用逗號分開的字節(jié)數(shù)據(jù)??梢允怯靡柪ㄆ饋淼淖址址械淖址?ASCII碼存于連續(xù)的 ROM中。6 . DW(Define Word)- 定義字偽指令指令格式為: 標號 DW 表達式或表達式表其含義是把字或字串值存人由標號開始的連續(xù)存儲單元中,并且把字的高字節(jié)數(shù)存人低地址單元,低字節(jié)數(shù)存入高地址單元。按順序連
6、續(xù)存放。7 . DS(Define Stonage)定義存儲區(qū)偽指令指令格式為: 標號DS 表達式其含義是通知匯編程序,在目標代碼中,以標號為首地址保留表達式值的若干存儲單元以備源程序使用。匯編時,對這些單元不賦值。注意:對于80C51單片機,DB DW和DS等偽指令只能應用于程序存儲器,而不能應用 于數(shù)據(jù)存儲器。8 . BIT 位定義偽指令用于給字符名稱賦予位地址。命令格式為: 字符名稱 BIT 位地址其中,位地址可以是絕對地址,也可以是符號地址?!?4】什么是結(jié)構化程序設計 ?它包含哪些基本結(jié)構程序 ?【答】程序設計有時可能是一件很復雜的工作,但往往有些程序結(jié)構是很典型的。采用結(jié) 構化程序
7、編程時,規(guī)律性極強,簡單清晰,易讀/寫,具有調(diào)試方便、生成周期短、可靠性 高等特點。根據(jù)結(jié)構化程序設計的觀點,功能復雜的程序結(jié)構一般采用三種基本控制結(jié)構,即順序結(jié)構、分支結(jié)構和循環(huán)結(jié)構,再加上子程序結(jié)構及中斷服務子程序結(jié)構,共包含五種基本程序結(jié)構?!?5】順序結(jié)構程序的特點是什么 ?試用順序結(jié)構編寫三字節(jié)無符號數(shù)的加法程序段,最 高字節(jié)的進位存入用戶標志F0中?!敬稹宽樞蚪Y(jié)構是按照邏輯操作順序,從某一條指令開始逐條順序執(zhí)行,直至某一條指令為止。比如數(shù)據(jù)的傳送與交換、簡單的運算、查表等程序的設計。順序結(jié)構是所有程序設計中 最基本、最單純的程序結(jié)構形式,因而是一種最簡單、應用最普遍的程序結(jié)構。在順
8、序結(jié)構 程序中沒有分支,也沒有子程序,但它是組成復雜程序的基礎和主干。例如:三字節(jié)無符號數(shù)的加法程序段,最高字節(jié)的進位存人用戶標志F0中。假設加數(shù)存放在內(nèi)存 20H 2伯和22H中,被加數(shù)存放在內(nèi)存 3OH 3伯和32H中,和存 放在內(nèi)存40H 41H和42H中。數(shù)據(jù)存放次序為低字節(jié)在前。MOVA,3 0H;取被加數(shù)低字節(jié)數(shù)ADDA,20H;求和M0740H,A;和存入MOVA,31HADDCA,21H;帶進位求和MOV41H,AMOVA,32HADDCA,22H;帶進位求和MOV 42H. A ,MOV F0 , C;最高字節(jié)的進位存入用戶標志F0中【46】80C51單片機有哪些查表指令 ?
9、它們有何本質(zhì)區(qū)別?請編寫按序號i值查找Di(1 6 位長度)的方法。設值i存放在R7中,將查找到的數(shù)據(jù)存放于片內(nèi) RAM勺30H、31H單元中。 請畫出程序流程圖,編寫查表程序段,加上必要的偽指令,并對源程序加以注釋。【答】80c51有兩種查表指令,即近程查表指令“MOV(A, A+P”和遠程查表指令“ MOVCA, AA+DPTR"這兩條指令的功能均是從程序存儲器中讀取數(shù)據(jù)(如表格、常數(shù)等),執(zhí)行過程相同,其差別是基址不同,因此,適用范圍也不同。累加器A為變址寄存器,而 PC DPTR為基址寄存器。DPTR為基址寄存器時,允許數(shù)表 存放在程序存儲器的任意單元,稱為“遠程查表”,編程
10、比較直觀;而 PC為基址寄存器時,數(shù)表只能放在該指令單元往下的 256個單元中,稱為“近程查表”。編程時需要計算累加器 A中的值與數(shù)表首址的偏移量。例如,按序號i值查找Di(1 6位長度)的源程序如下所示:ORG XXXXHMOV DPTR , #TABLE 指向表首址MOV A , R7 ;取值 iRL A; Di為二個字節(jié)MOV R7 , A ; i x 2MOVC A , A+DPTR ;查表獲得 Di的高字節(jié)MOV 30H. AMOV A , R7INC A指向表的下一個地址MOVC A , A+DPTR ; 表獲得Di的低字節(jié) MOV 31H, ATABLE : Dw ;表(Dw為雙
11、字節(jié),高字節(jié)在前 )RETB4-1査豪和序謊瑕團查表程序流程圖如圖 4-1所示?!?7】根據(jù)運算結(jié)果給出的數(shù)據(jù)到指定的 數(shù)據(jù)表中查找對應的數(shù)據(jù)字。運算結(jié)果給出的 數(shù)據(jù)在片內(nèi)RAM的40H單元中,給出的數(shù)據(jù)大 小在000FH之間,數(shù)據(jù)表存放在 20H開始的 片內(nèi)存儲器中。查表所得數(shù)據(jù)字為雙字節(jié)(高字節(jié)在后),高字節(jié)存于42H、低字節(jié)存于41H單 元。其對應關系為:給出數(shù)據(jù):00 H 0 1 H 0 2 H0DH 0EH 0FH對應數(shù)據(jù):00 A0 H 7DC2 H FF09 H 3456H 89ABH 5678 H請編制查表程序段,加上必要的偽指令,并加以注釋。【答】程序如下:ORG 0000H
12、AJMP MAIN,0RG 0020HTAB : DB OAOH OOH 0C2H, 7DH, 09H, OFFH .,56H, 34H , 0. ABH, 89H, DB 78H,56H;數(shù)據(jù)字表ORG 0050HMAIN : MOV A , 40H;運算結(jié)果給出的數(shù)據(jù)放在40H中MOV DPTR , #TAB ;指向數(shù)據(jù)字表首地址RL A;由于是雙字節(jié),所以 A左移1位(乘2)MOV 40H ,A;結(jié)果放在 40H'MOVC A ,A+DPTR ;查表,找出對應的值MOV 41H ,A ;查找出的數(shù)據(jù)值低字節(jié)放入41HMOV A . 40HADD A, #01H;查找數(shù)據(jù)的高位字節(jié)
13、MOV DPTR , #TABMOVC A , A+DPTRMOV 42H , A 。;查找出的數(shù)據(jù)值高字節(jié)放入42HSJMP$注意:數(shù)據(jù)表存放在 20H開始的片內(nèi)存儲器中,該存儲器應為內(nèi)部程序存儲器,因為查表指令MOVC勺功能是從程序存儲器中讀數(shù)據(jù)。【48】什么是分支結(jié)構程序 ?8OC1的哪些指令可用于分支結(jié)構程序編程?有哪些多分支轉(zhuǎn)移指令?由累加器A中的動態(tài)運行結(jié)果值進行選擇分支程序,分支轉(zhuǎn)移指令選用LJMP請編寫散轉(zhuǎn)程序段和畫出程序流程圖,加上必要的偽指令,并加以注釋?!敬稹糠种ЫY(jié)構程序的主要特點是程序執(zhí)行流程中必然包含有條件判斷指令。符合條件要求和不符合條件要求的有不同的處理路徑。編程
14、的主要方法和技術是合理選用具有邏輯判斷功能的指令。在程序設計時,往往借助程序框圖(判斷框)來指明程序的走向。一般情況下,每個分支均需要單獨執(zhí)行一段程序,對分支程序的起始地址賦予一個地址標號,以便當條件滿足時轉(zhuǎn)向指定地址單元去執(zhí)行程序,條件不滿足時仍順序往下執(zhí)行程序。80C51的條件判跳指令極其豐富,功能極強,特別是位處理判跳指令,對復雜問題的編程提供了極大方便。程序中每增加一條條件判跳指令,就應增加一條分支。分支結(jié)構程序的形式有單分支結(jié)構和多分支結(jié)構兩種。 在80C51指令系統(tǒng)中可實現(xiàn)單分支程序轉(zhuǎn)移的指令有位條件轉(zhuǎn)移指令,如JC、JNCJB、JNB和JBC等,還有一些條件轉(zhuǎn)移指令,如JZ、JN
15、Z和DJNZ等。 80C51設有兩條多分支選擇指令。(a) 散轉(zhuǎn)指令:JMP A+DPTR散轉(zhuǎn)指令由數(shù)據(jù)指針 DPTR決定多分支轉(zhuǎn)移程序的首地址,由累加器A中內(nèi)容動態(tài)地選擇對應的分支程序。因此,可以從多達256個分支中選擇一個分支散轉(zhuǎn)。(b) 比較指令:CJNE A, direct , rel ( 共有 4 條)比較兩個數(shù)的大小, 必然存在大于、等于、小于三種情況,這時就需要從三個分支中選 擇一個分支執(zhí)行程序。例如:由累加器 A中的動態(tài)運行結(jié)果值進行選擇分支程序,分支轉(zhuǎn)移指令選用LJMPORG XXXXHMOV DPTR , #JPTAB ;分支轉(zhuǎn)移表首地址CLR CMOV B, ARLC A
16、JNC TABINC DPTRTAB : ADD A , B ; (A)* 3JNC TABLEINC DPTRTABLE : JMPA+DPTR ;多分支轉(zhuǎn)移JPTAB : LTMP LOOPI ;長轉(zhuǎn)移指令為 3個字節(jié)LJMP LOOP2注意:長轉(zhuǎn)移指令為 3字節(jié),因此,A中內(nèi)容應乘以3。若大于一個字節(jié),則 DPH要加1。分支程序流程圖如圖 4-2所示。R4-! 粘生理再連理£【4-9】循環(huán)結(jié)構程序有何特點 ?80C51的循環(huán)轉(zhuǎn)移指令有什么特點 ?何謂循環(huán)嵌套?編程時應 注意什么?【答】循環(huán)是強制CPU重復多次地執(zhí)行一串指令的基本程序結(jié)構。從本質(zhì)上看,循環(huán)程序結(jié)構只是分支程序中的
17、一個特殊形式。循環(huán)程序由4個部分構成,即循環(huán)初始化、循環(huán)體、循環(huán)控制和結(jié)束部分。循環(huán)次數(shù)已知情況下,采用計數(shù)循環(huán)程序,其特點是必須在初始化部分設定計數(shù)的初 值,循環(huán)控制部分依據(jù)計數(shù)器的值決定循環(huán)次數(shù)。根據(jù)控制循環(huán)結(jié)束的條件,決定是否繼續(xù)循環(huán)程序的執(zhí)行。所謂的結(jié)束條件可以是搜索到某個關鍵字(比如回車符 CR),也可以是發(fā)生的某種變化 (如故障引起電路電平變化)等, 什 么時候結(jié)束循環(huán)是不可預知的。80C5 1 設有功能強的循環(huán)轉(zhuǎn)移指令:DJNZ Rn , rel .;以工作寄存器作為控制計數(shù)器DJNZ direct , rel .;以直接尋址單元作為控制計數(shù)器CJNE A , direct ,
18、rel;比較不相等轉(zhuǎn)移這幾條基本指令可派生出很多條不同控制計數(shù)器的循環(huán)轉(zhuǎn)移指令,大大擴充了應用范圍和多重循環(huán)層次。循環(huán)嵌套就是在循環(huán)內(nèi)套用循環(huán)的結(jié)構形式,也稱“多重循環(huán)”。循環(huán)的執(zhí)行過程是從內(nèi)向外逐層展開的。內(nèi)層執(zhí)行完全部循環(huán)后,外層則完成一次循環(huán),逐次類推。層次必須分明,層次之間不能有交叉,否則將產(chǎn)生錯誤。編程時要注意循環(huán)的正確退出,要防止出現(xiàn)“死循環(huán)”。【4-10】什么是子程序?它的結(jié)構特點是什么?什么是子程序嵌套?【答】在編制應用程序時,往往將需要多次應用但完成的運算或操作相同的程序段,編制 成一個子程序,并盡量使其標準化,存放于某存儲區(qū)域。調(diào)用子程序的程序稱為“主程序”或“調(diào)用程序”。
19、子程序是由專門的子程序調(diào)用指令CALL調(diào)用,而以子程序返回指令RET結(jié)束的程序段。子程序的第一條指令地址,通常稱為“子程序首地址”或“人口地址”,往往采用標號(可用助記符)加以表示,調(diào)用(轉(zhuǎn)子)指令的下一條指令地址,通常稱為“返回地址”或“斷點”。在子程序中調(diào)用子程序的現(xiàn)象通常稱為子程序嵌套?!?-11】手工匯編卜列程序:KEYEQU 2 0HORG2000HMOVRO ,#30H;數(shù)據(jù)區(qū)首址MOVRl ,#1 6;數(shù)據(jù)區(qū)長度MOV20H,#KEY;關鍵字送20H單元CLRF0;清用戶標志位MOV21H,#0l;序號置1LP :MOVA ,R0;取數(shù)CJNEA ,20H,LP1.SJMP HE
20、RE;找到關鍵字,結(jié)束.LPIINC21H;序號加1INCR0;數(shù)據(jù)區(qū)地址指針加 1DJNZ R1 ,LP;繼續(xù)SETBF0;未搜索到關鍵字,則置位用戶標志HERE : SJMP HERE【答】根據(jù)指令查指令表得到機器碼,手工匯編結(jié)果如下:KEY EQU 20HORG 2000H2000 7830 MOV R02002 7910 MOV R12004 752020 MOV 20H2007 C2D5 CLR F02009 752101 MOV 21H200C E6 LP : MOV A200D B52002 CJNE A2010 8007 SJMP HERE2012 0521 LPI : INC
21、 21H2014 08 INC R02015 D9F5 DJNZ R12017 D2D5 SETB F0,#30H;數(shù)據(jù)區(qū)首址,#1 6;數(shù)據(jù)區(qū)長度,#KEY ;關鍵字送20H單元;清用戶標志位,#01;序號置1,R0;取數(shù),20H, LPI,LP;找到關鍵字,結(jié)束;序號加1;數(shù)據(jù)區(qū)地址指針加1;繼續(xù);未搜索到關鍵字,則置位用戶標志2019 80FE HERE : SJMP HERERAM的輸出緩沖CR',則整個【4-12把長度為10 H的字符串從內(nèi)部 RAM的輸入緩沖區(qū)INBUF向設在外部 區(qū)OUTBU進行傳送,一直進行到遇見字符“ CR"時停止。若字符串中無字符 字符串全
22、部傳送。加上必要的偽指令,并對源程序加以注釋。【答】程序如下:ORG 0000HAJMP MAINORG 0030HMAIN : MOV R7 ,#10H;數(shù)據(jù)長度MOV R0 ,#INBUF ;源數(shù)據(jù)首地址MOV DPTR,#OUTBUF ;目的數(shù)據(jù)首地址LOOP : MOV A , R0;把源數(shù)據(jù)的值賦給 ACJNE A , #0DH LOOPl ;判斷是否為“ CR' (ASCII 碼值為 ODH)SJMP ENDl ;是“ CR",則結(jié)束傳送LOOPl : MOVX DPTR,A ;把A的值賦給目的數(shù)據(jù)INC RO;源數(shù)據(jù)下一個地址值INC DPTR;目的數(shù)據(jù)下一個地
23、址值DJNZ R7 ,L00P;判斷數(shù)據(jù)傳送是否完畢ENDI : SJMP ENDIEND【4-13】內(nèi)部RAM從 20H單元開始存放一個正數(shù)表,表中之數(shù)為無序排列,并以“ -1 ”作為 結(jié)束標志。編程實現(xiàn)在表中找出最小正數(shù),存入10耳加上必要的偽指令,并對源程序加以注釋?!敬稹砍绦蛉缦拢篛RG 0000HAJMPMAINORG 0030HMAIN:MOVR0,#20H;正數(shù)表首址MOV1 0H,#7FH;初始值設為正數(shù)最大值LOOP:MOVA,R0CJNEA ,“-1 '',CHK;比較結(jié)束標志“ -1 ”SJMPEND1是“ -l",結(jié)束比較CHK :CJNEA,
24、10H, CHKI;比較兩個數(shù)大小SJMP LOOP1;兩個數(shù)相等,不交換CHKI:JNC LOOP1; A較大,不交換MOV10H,,A;A較小,交換LOOP1INC R0SJMP LOOP 'END1 : SJMP END1END例如:已知(20H)=22 H, (2伯)=23H,(22H)=0CH, (23H)=20H,(24H)=16H,(25H)=-1。執(zhí)行結(jié)果:(10H)=0CH【4-14】比較兩個ASCII碼字符串是否相等。字符串的長度在內(nèi)部 RAM的2 H單元,第一個 字符串的首地址在 30H中,第二個字符串的首地址在 50H中。如果兩個字符串相等, 則置用 戶標志FO
25、為0;否則,置用戶標志 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 0030HMAIN : MOV RO , #30H第一個字符串的首地址MOV R
26、1#5 OH第二個字符串的首地址LOOP : MOV A , R0第一個字符串的字符值賦給AMOV B , R1;第二個字符串的字符值賦給BCJNE A ,B, NEXT;兩個字符值比較INC R0字符值相等,則繼續(xù)比較INC R1DJNZ 20H,LOOP ;判斷字符串是否比較完CLR F0字符串相等,則 F0位清0SJMP $NEXT : SETB F0字符串不等,則 F0位置1SJMP $END例如:(2OH)=03H,(3OH)=4伯,(31H)=42H,(32H)=43H,(5OH)=4伯,(51H)=42H,(52H)=43H。兩個字符串均為“ ABC"。執(zhí)行結(jié)果:F0=
27、0【4 1 5】已知經(jīng)A/ D轉(zhuǎn)換后的溫度值存在 4 0 H中,設定溫度值存在 4 1 H中。要求編 寫控制程序,當測量的溫度值大于(設定溫度值+2C )時,從P 1.0弓I腳上輸出低電平;當測量的溫度值小于(設定溫度值一 2 C)時,從P 1.0引腳上輸出高電平;其他情況下, P 1.0 引腳輸出電平不變(假設運算中C中的標志不會被置1)。加上必要的偽指令,并對源程序加 以注釋?!敬稹砍绦蛉缦拢篛RG 0000HAJMP MAINOR G'0020HMAIN:.MOVB,41H;設定的溫度值MOVA.BADD A,#02HMOVB,A;設定溫度值+2CMOVA,40H;測量的溫度值C
28、LRCSUBBA,BJNC LOWER ;測量的溫度值 (設定溫度值+2C ),轉(zhuǎn)LOWE子程序,使P1. 0引腳上 輸出低電平MOVB,41H;設定的溫度值MOVA,BDECADECA.MOVB,A;設定溫度值一 2CMOVA,40H;測量的溫度值CLRCSUBB A , BJC HIGH ;測量的溫度值 設定溫度值-2 C,轉(zhuǎn)HIGH子程序,使P1.0引腳上輸出高 電平SJMP $;都不是,貝U P1.0引腳上輸出不變LOWER : CLR P1.0SJMP $HIGHSETB P1.0SJMP$END【4 1 6】80C51單片機從內(nèi)部 RAM的31H單元開始存放一組 8位帶符號數(shù),字節(jié)
29、個數(shù)存放 在30H中。請編寫程序統(tǒng)計出其中正數(shù)、0和負數(shù)的數(shù)目,并把統(tǒng)計結(jié)果分別存入 20H 21H和22H三個單元中。加上必要的偽指令,并對源程序加以注釋?!敬稹砍绦蛉缦拢篗OVMOVMOVLOOP,#0,#LENGTH ;,#DATA_ADRMOV A , R0.7, INC_NEG,#0, INC_POS;該數(shù)為0, 0個數(shù)加NEG NUMR1R0數(shù)據(jù)長度;數(shù)據(jù)首地址JB ACCCJNE AINC ZERO NUM;符號位為1 ,該數(shù)為負數(shù),跳轉(zhuǎn)加 1DATA_ADREQU31H;數(shù)據(jù)首地址POS_NUMEQU20H;正數(shù)個數(shù)ZERO_NUMEQU21H;0個數(shù)NEG_NUMEQU22H
30、;負數(shù)個數(shù)ORG 0000HAJMP MAINORG 0030HMAIN: MOV POS_NUM #0;計數(shù)單元初始化為MOV ZERO_NUM,#0;數(shù)據(jù)長度LENGTH EQU 30H0AJMP L00P1;負數(shù)個數(shù)加INC NEG : INC NE_NUMAJMP LOOPl.INC_POS : INC POS_NUM ;該數(shù)為正數(shù),正數(shù)個數(shù)加1LOOPl : INC R0;判斷統(tǒng)計是否結(jié)束DJNZ R1 , LOOPEND例如:已知(30H)=08H , 31H 單元起存放數(shù)據(jù)為 00H, 80H, 7EH, 6DH, 2FH 34H,EDH, FFH執(zhí)行結(jié)果:(20 H)=04 H
31、 , (21 H)=01H , (22H)=03 H?!?-17兩個10位的無符號二一進制數(shù),分別從內(nèi)部RAM的40 H單元和50H單元開始存放。請編程計算該兩個數(shù)的和,并從內(nèi)部RAM的60 H單元開始存放。加上必要的偽指令,并對源程序加以注釋?!敬稹?0位的無符號二十進制數(shù),占 5字節(jié),每個字節(jié)存放一個壓縮BCD碼(2位)。ORG 0000HAJMP MAINMAIN:MOV R7 , #05H;十MOVR0,#40H;被加數(shù)首址MOVR1,#50H;加數(shù)首址MOVR2,#60H;和數(shù)首址CLRC;清C標志位ADDB:MOV A,R0ADDCA,R1DA A;-二二丨進制調(diào)整MOVB,R0;
32、保護被加數(shù)地址ORe 0030HMOV 20H, R2(5字節(jié))計數(shù)MOVR0,20HMOVR0,A;存和MOVR2,20H;恢復和數(shù)地址MOVR0,B;恢復被加數(shù)地址INCR0;三個地址指針均加 1INCR1INCR2DJNZR7,ADDB;多字節(jié)加未結(jié)束,則循環(huán)HERESJMP HEREEND注意:寄存器間接尋址只針對R0和R1,所以存和時不能使用指令“ MOVR2A”。例如:40 H 44 H 內(nèi)容為 78 H , 10 H , 10 H , 10 H , 10 H5O H 54 H 內(nèi)容為 42 H , 10 H , 10 H , 10 H , 10 H1 0 1 0 1 0 1 0
33、7 8即 BCD數(shù) +1 0 1 0 1 0 1 0 4 22 0 2 0 2 0 2 1 2 0運行結(jié)果:6O H64 H單元中的數(shù)為 20 H , 21 H , 20 H , 20 H , 20 H?!?-18】編寫子程序,實現(xiàn)4位非壓縮BCD碼數(shù)轉(zhuǎn)換為二進制數(shù),加上必要的偽指令, 并對源程序加以注釋?!敬稹砍绦蛉缦拢篛RG OOH0000 0130 AJMP MAIN0RG 30H0030 752006 MAIN : MOV 20H , #06H; 4 位 BCD數(shù)為 65530033 7521 05i MOVr 21H,#05H0036 752205MOV22H,#05H0039 75
34、2303MOV23H,#03H003C 7820MOVR0,#20H;高位地址指針003E 7A03MOVR2,#3;循環(huán)(n 一 1)次,n為BCD碼位數(shù)0040 1144 丿ACALLBCDB0042 0142 AJMP $3210;轉(zhuǎn)換原理:假設 4 位 BCD碼為 a3 a2 a1 a0,即 a3x 10+a2 x 10 + al X 10 +a0x 10 ;二進制值:(a3 X 1 0+a2)X 10+a1)X 10+a0;4位非壓縮BCD碼數(shù)轉(zhuǎn)換為二進制數(shù)子程序;現(xiàn)場保護0046 COEO PUSH ACC0048 COFO PUSH B004A 7BOO MOT R30044 C
35、ODO BCDB : PUSH I : 'SW0065 DAE70067 D0F00069 D0E0006B D0D0DJNZ R2POP BPOP ACCPOP PSWLOOP ;循環(huán)(n-1)次恢復現(xiàn)場返回006D 22 RET;例如:4位.BCD數(shù)為果為19 9H,依次存人 R3和R4中。【4-19】將外部RAM的40 H單元中的一個字節(jié)拆成 2個ASCII碼,分別存入內(nèi)部數(shù)據(jù)存儲 器40 H和41 H單元中。試編寫以子程序形式給出的轉(zhuǎn)換程序,說明調(diào)用該子程序的入口條 件和出口功能。加上必要的偽指令,并對源程序加以注釋。【答】子程序的入口條件、出口功能及源代碼如下:子程序人口條件
36、:準備拆為子程序出口功能:完成外部儲器40 H和41 H單元中。ORG 1 000H6553,依次存入內(nèi)存單元 20 H、21 H、22 H和23 H中。轉(zhuǎn)換結(jié)2個ASCII碼的數(shù)存入外部 RAM的40 H單元中。RAM單元一個字節(jié)拆成 2個ASCII碼,分別存入內(nèi)部數(shù)據(jù)存B_TO_A : MOV DPTR#40H;外部RAM40H單元004C E6MOTA,RO004D FCMOVR4,A;BCD碼千位a3送R4004E EC LOOPMOTA,R4;以下()H表示咼8位,()L表示低004F 7 5FOOAMOT B,#1 00052 A4MULAB;R4 X 10,設(R4 x l0)L
37、=b2 , (R4 X 10)H=b30053 FCMOVR4,A;將R4X 10后的低8位送到R4中0054 CSFO XCHA ,B;(A)=b3 , (B)=b20056 CB XCH A, R3;(A)=R3(b1) , (R3)=b30057 75F00A MOV B#10005 A4MUL ,AB;(A)=(bl X l0)L,(B)=(bl X l0)H005B 2BADDA,R3;A=(bl X 1O)L+b3005C FBMOTR3,A;此時R3X 10, R4X 10已經(jīng)完成005D 08INCR0;取下一位BCD碼005E ECMOVA,R4;(R4+下一位BCD碼數(shù)值)
38、送B4005F 26ADDA,RO0060 FCMOVR4, A0061 EBMOVA,R3;進位加到高8位0062 3400 ADDC A#00064 FBMOVR3.A;設R3中的初始值為bl,#00H8位MOV R0,#40HMOVX A,DPTR ;取數(shù)PUSH AANL A,#0FH;低4位轉(zhuǎn)換為ASCII碼LCALL .CHANGEMOV RO , AINC ROPOP A 'SWAP AANL A , #0FH ;高4位轉(zhuǎn)換為 ASCII碼LCALL CHANGEMOV R0, ARETCHANGE:CJNE A ,#0AHNEXT;轉(zhuǎn)換子程序NEXT :JNC NEXT
39、2;> 0AH,轉(zhuǎn)移ADD A,#3 0H;w 9,數(shù)字0-9轉(zhuǎn)化為ASCII碼RETNEXT2 :ADD A ,#37H;字母AF轉(zhuǎn)化為ASCII碼RETEND設外部(40 H)=12 H 。執(zhí)行程序 B_TO_A后:內(nèi)部(40 H)=31 H , (41 H)=32 H。設外部 RAM(40 H)=ABH=執(zhí)行程序 B_TO_A后,內(nèi)部(40 H)=41 H , (41 H)=42 H。【4-20】請編寫中值數(shù)字濾波子程序FILLE,加上必要的偽指令,并對源程序加以注釋。入口條件:3次采集數(shù)據(jù)分別存儲在內(nèi)部存儲器的20 H、21 H和22 H中。出口結(jié)果:中值在R0寄存器中。【答】程
40、序如下:ORG 00H0000 0130 AJMP LIZIORG 30H0030 752056 LIZI : MOV0033 752184 MOV 21H0036 752212 MOV 22H0039 113D ACALL FILLE003B 013B AJMP $20H,#56H; 3次采集數(shù)據(jù),#84H,#12H;中值數(shù)字濾波子程序FILLV .003D COD0 FILLEPUSH PSW ; PSW及 ACC保護入棧003F COE0 PUSH ACC .0041 E520 MOV A0043 C3 CLR C0044 95210046 50060048 E520004A C521S
41、UBB AJNC LOB1MOV AXCH A,20H;取第一個數(shù),21H;與第二個數(shù)比較;第一個數(shù)比第二個大,轉(zhuǎn)LOBl,20H;第一個數(shù)比第二個小,交換位置,21H004C F520 MOV 20H,A004E E522LOB1l:MOV A,22H0050 C3CLR C0051 9520SUBBA,20H;第二個數(shù)與前一個數(shù)中的較大數(shù)比較0053 500FJNCLOB3;第二個數(shù)大于前一個中的較大數(shù),轉(zhuǎn)0055 E522MOVA,22H0057 C3CLR C0058 9521SUBBA,21H;第二個數(shù)與前一個數(shù)中的較小數(shù)比較005A 500DJNCIOB4005C E521MOVA
42、,21H005E F8MOVR0,A;存入中值005F D0E0LOB2:POP ACC;恢復ACC和PSW0061 D0D0POPPSW0063 22RET0064 E520LOB3MOV A ,20H0066 F8 MOV R0,A0067 015FAJMPLOB20069 E522LOB4:MOV A,22H006B F8MOV R0,A;存入中值LOB3006C 015F AJMP L0B2執(zhí)行結(jié)果為(RO)=56 H?!?-21】根據(jù)8100 H單元中的值X,決定P1 口引腳輸出為:2XX>080 HX=0(-128D<X<63D)X畫反XVQ加上必要的偽指令,并對
43、源程序加以注釋?!敬稹砍绦蛉缦拢篛RG 0000HSJMP BEGINORG 0030HBEGIN :MOV DPTR , #8100HMOVX A , DPTRMOV R2 , AJB ACC.7 , SMALLER 有符號數(shù) <0SJMP UNSIGNED;無符號數(shù)0SMALLER : DEC A ; X<0,輸出-X(先減 1,再取反)CPL AMOV P1 , ASJMP OKUNSIGNED : CJNE A , #00H, BIGGER ;不等于 0 即大于 0MOV P1 , #80H; X 等于 0,輸出 80HSJMP OKBIGGER : CLR C; X大于
44、0,輸出 AX 2RLC A; AX 2MOV P1 , AOK :SJMP $END例如:輸入55 H , P1 口引腳輸出 AAH輸入00 H , P1 口引腳輸出80 H ;輸入F1( 1 5的補碼),P1 口引腳輸出0FH【4-22】將4000 H40FF H中256個ASCII碼加上奇校驗后從 P1 口依次輸出。加上必要的 偽指令,并對源程序加以注釋?!敬稹孔⒁猓篈SCII碼的有效位為7位,其最高位 D7可與程序狀態(tài)字 PSW中的奇偶校驗 位P配合進行校驗。ORG 0000HSJMP BEGINORG 0030HBEGIN :MOV DPTR,#4000HMOV RO,#00H;首地
45、址;發(fā)送計數(shù)器LOOP :MOVX AMOV C,DPTRPCPL CMOV ACC.7MOV PI ,A,C;從PI;置奇校驗 口輸出INC DPTRDJNZROLOOP;循環(huán)AJMPEND【4-23】編寫將1 O位十六進制數(shù)轉(zhuǎn)換為 ASCII碼的程序。假定十六進制數(shù)存放在內(nèi)部RAM的20 H單元開始的區(qū)域中,轉(zhuǎn)換得到的ASCII碼存放在內(nèi)存3OH單元開始的區(qū)域中。加上必要的偽指令,并對源程序加以注釋?!敬稹坎楸矸ǎ篛RG 0000HSJMP BEGINORG 0030HBEGIN : MOV R2 ,#5; 10位十六進制數(shù)MOV R0,#20H;讀指針MOV RI,#30H;寫指針MOV
46、 DPTR,#ASCTB ASCII 碼表首址LOOP : MOV A ,R0'ANL A ,#0FOH ;取高半字節(jié)SWAP AACALL TRANS;調(diào)用十六進制到 ASCII碼轉(zhuǎn)換子程序MOV A,R0ANL A,#0FH;取低半字節(jié)ACALL TRANS ;調(diào)用十六進制到 ASCII碼轉(zhuǎn)換子程序INC R0DJNZR2,LOOPSJMP$;查表法子程序.TRANS :MOVCA,A+DPTR ;取得 ASCII 碼MOVR1,AINC R1RETASCTB :; ASCII 碼表DB 30H, 31H, 32H,33H, 34H,35H,36H,37H,38H, 39HDB 4
47、1H, 42H, 43H,44H, 45H,46HEND注意:十六進制數(shù)09所對應的ASCII碼為30 H39H,十六進制數(shù)AF所對應的ASCII 碼為41 H46 H。,例如:在20 H開始輸入 5個十六進制數(shù):11 H , F4 H , F1 H , 12 H , 34 H。執(zhí)行程序后:內(nèi)存 3 0 H單元開始的區(qū)域中依次為31 H,31 H,46 H,34 H,46 H,31 H,31 H,32 H,33 H,34 H。、【答】由圖4-3分析,可以得到一個周期為ORG 0000H【4-2480C51單片機的P1.7、P1.6和P 1.5輸出的6拍波形如圖4-3所示,后面輸出波形 重復,輸
48、出波形90拍后停止。請編寫源程序,并加以注釋,并加上必要的偽指令。0000 802E SJMPBEGINORG 003 0H0030 7860 BEGINMOVR0,#90;90拍波形計數(shù)器0032 7906 LOOP2 :MOVR1,#6;6拍波形計數(shù)器6拍的波形表。0034 9 00047 MOV DPTR ,#TAB0037 E4 LOOPI : CLR A0038 93 MOVC A,A+DPTR ;查表得到輸出波形值0039 F59 0 MOV PI,A003B E8 MOV A,R0、;判斷90拍波形輸出結(jié)束?003C 14 DEC A003D F8 MOV R0,A003E 60
49、05 JZ STOP;90拍波形輸出完,則轉(zhuǎn)停止輸出0040 A3 INC DPTR0041 D9F4 DJNZ R1,LOOP1 ; 6拍波形循環(huán)0043 80ED SJMP L00P20045 80FE STOP : SJMP STOP0047 E040A0 TAB : DB 0E0H, 40H, OAOH, 60H, 0C0H 60H; 6 拍波形表004A 60C060END【4-25】編寫求無符號數(shù)最大值的子程序。入口條件:采樣值存放在外部 RAM的 1000 H100FH單元中。出口結(jié)果:求得的最大值存入內(nèi)部RAM區(qū)的20 H單元中。對源程序加以注釋和加上必要的偽指令?!敬稹砍绦蛉缦拢?求無符號數(shù)最
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度二手車售后服務合同協(xié)議2篇
- 2025版模特與時尚博主互動合作合同4篇
- 2025年個人購房稅費減免專項合同
- 南京地區(qū)2025年二手房電子簽約合同模板2篇
- 基于2025年度項目的合作研究合同3篇
- 2025年度模特經(jīng)紀公司模特培訓合同4篇
- 2025年度智慧教育平臺搭建承擔連帶責任擔保借款合同4篇
- 二零二五年度教師教學資源庫建設合同4篇
- 2025年版?zhèn)€人個人之間消費分期借款合同范本4篇
- 二零二五年度新能源儲能融資借款服務合同3篇
- 物流無人機垂直起降場選址與建設規(guī)范
- 肺炎臨床路徑
- 外科手術鋪巾順序
- 創(chuàng)新者的窘境讀書課件
- 綜合素質(zhì)提升培訓全面提升個人綜合素質(zhì)
- 如何克服高中生的社交恐懼癥
- 聚焦任務的學習設計作業(yè)改革新視角
- 移動商務內(nèi)容運營(吳洪貴)任務三 APP的品牌建立與價值提供
- 電子競技范文10篇
- 食堂服務質(zhì)量控制方案與保障措施
- VI設計輔助圖形設計(2022版)
評論
0/150
提交評論