




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
04七月2025
匯編語言程序設計
04七月20251.機器語言(MachineLanguage)
這是一種用二進制代碼“0”和“1”表示指令和數據的程序設計語言。計算機只能識別二進制代碼,這種語言是能被計算機直接識別和執行的機器級語言。特點:機器語言能夠被計算機立即識別并加以執行,具有執行速度快、占用內存少等優點。但對于使用者來說,用機器語言編寫程序具有編寫難、識別難、記憶難、查錯難、交流難等缺點。6.1匯編語言04七月20252.匯編語言(AssemblyLanguage)
匯編語言是一種用助記符來表示的面向機器的程序設計語言。不同的機器所使用的匯編語言一般是不同的。但計算機的CPU不能直接識別匯編語言,所以計算機不能立即執行匯編語言程序。用匯編語言編寫的源程序,在由計算機執行之前,必須將它翻譯成機器語言程序。特點:這種語言彌補了機器語言的不足,用匯編語言編寫程序比用機器語言方便、直觀、易懂、易用、易記。可以編寫出結構緊湊、運行時間精確的程序。所以,這種語言非常適合于實時控制的需要。6.1匯編語言04七月20253.高級語言(High-LevelLanguage)
高級語言是面向過程并能獨立于計算機硬件結構的通用程序設計語言,是一種接近人類語言和數學表達式的計算機語言。比如:BASIC、FORTRAN、COBOL、PASCAL、C語言等。高級語言不能被計算機直接識別和執行,需要用編譯程序或解釋程序將高級語言編寫的源程序翻譯為機器語言。特點:它比匯編語言易學、易懂,具有通用性強、易于移植等優點。高級語言的語句功能強,它的一條語句往往相當于許多條指令,因而用于翻譯的程序要占用較多的存儲空間,而且執行時間長,且不易精確掌握,故在高速實時控制中一般是不適用的。6.1匯編語言04七月2025
基本概念在目前單片機的開發應用中,經常采用C語言和匯編語言共同編寫程序。要想很好地掌握和應用單片機首先要掌握匯編語言。
匯編語言是面向機器的程序設計語言,對于CPU不同的單片機,其匯編語言一般是不同的。用匯編語言編寫的程序稱為匯編語言源程序。匯編語言源程序是由匯編語言語句構成的。匯編語言語句可分為兩大類:指令性語句和指示性語句。指令性語句是由指令組成的由CPU執行的語句,指示性語句是由偽指令組成的,它不被CPU執行,用來告訴匯編程序如何對程序進行匯編的指令;由于它不能生成機器語言,故又被稱為偽指令語句。6.1匯編語言04七月20251.指令性語句格式
[標號:]操作碼助記符[目的操作數][,源操作數][;注釋]
每條匯編語句一般由若干部分組成,每一部分稱為一個字段。每個字段之間應該嚴格地用分界符加以分隔。分界符包括冒號、空格符、逗號、分號等。標號段與操作碼之間要加冒號“:”;操作碼與操作數之間要用空格相隔;各操作數之間要用逗號“,”相隔;操作數與注釋段之間要加分號“;”相隔。6.1匯編語言04七月20252.偽指令的指示性語句格式
[標號:]偽操作操作數[,操作數,......][;注釋]
偽指令不是真正的指令,是在匯編時供匯編程序識別的指令,又稱為匯編指令。它不屬于指令系統,也無對應的機器碼,只是用來對匯編過程進行某種控制。利用偽指令告訴匯編程序如何進行匯編,為編程提供方便。
6.1匯編語言04七月20253.匯編語言源程序的匯編匯編語言源程序必須要轉換為機器碼(即目的程序),計算機才能執行,這個轉換過程稱為匯編。匯編語言源程序的匯編可分為手工匯編和機器匯編兩類。手工匯編是指用人腦通過查指令編碼表(見附錄中的指令表)把匯編語言源程序翻譯成機器碼的過程,又稱為人工代真。機器匯編是用機器代替人腦并由專門的程序來進行的,這種程序稱為匯編程序(不同的指令系統匯編程序不同)。機器匯編由計算機自動完成,匯編程序把用匯編語言編寫的源程序翻譯成由機器語言表示的目的程序。反匯編是在分析程序存儲器已有的程序時,將機器語言翻譯成匯編語言的轉換過程。6.1匯編語言04七月2025
源程序、匯編程序和目的程序之間的關系如下圖所示
4.匯編語言源程序的編輯匯編語言源程序一般在微機上借助編輯軟件進行編寫,可供使用的編輯工具有許多,如行編輯軟件、屏幕編輯軟件等。6.1匯編語言04七月2025
匯編語言程序具有四種結構形式,即順序結構、循環結構、分支結構和子程序結構。1.順序程序順序程序是一種最簡單、最基本的程序結構,又稱為簡單程序或直線程序。程序按順序一條一條地執行指令,程序流向不變。2.循環程序循環程序是把需要多次重復執行的某段程序,利用條件轉移指令反復轉向執行,可減小整個程序的長度,優化程序結構。循環程序一般由循環初始化、循環處理、循環控制和循環結束四部分組成。6.1匯編語言04七月20253.分支程序分支程序是根據條件進行判斷決定程序的執行,滿足條件則進行程序轉移,不滿足條件就順序執行程序。判斷是通過條件轉移指令實現的。分支程序又分為單分支結構和多分支結構。4.子程序子程序是指完成某一確定任務并能被其他程序反復調用的程序段。使用子程序可以減小整個程序的長度,實現模塊化程序結構。6.1匯編語言04七月2025程序設計方法和技巧
1.程序設計的一般步驟(1)分析工作任務,明確要達到的工作目的、技術指標等。(2)確定解決問題的算法。算法就是如何將實際問題轉化成程序模塊來處理,要對不同的算法進行分析、比較,找出最適宜的算法。(3)畫出程序流程圖。(4)分配內存工作區及有關端口地址,確定程序與數據的存放地址。(5)編寫匯編源程序。(6)上機仿真、調試、修改源程序。(7)固化程序。6.1匯編語言04七月20252.程序設計的一般原則按照盡可能使程序簡短和縮短運行時間兩個原則編寫程序。應用程序一般都由一個主程序(包括若干個功能模塊)和多個子程序構成,即采用模塊化的程序設計方法。每一功能模塊或子程序都能完成一個明確的任務,實現某個具體功能,如檢測輸入信號、碼制轉換、輸出控制信號、發送數據、接收數據、延時、顯示、打印等。
6.1匯編語言04七月20253.模塊化程序設計方法的特點單個模塊結構的程序功能單一,易于編寫、調試和修改。對程序的局部修改,可以使無關的部分保持不變。程序可讀性好,便于功能擴展和版本升級。對于使用頻繁的子程序可以建立子程序庫,便于多個模塊調用。可實現多人同時進行程序的編寫和調試工作,縮短程序編寫時間。
每個模塊應具有獨立的功能,能產生一個明確的結果。模塊長度適中。模塊語句的長度為20~100條的范圍較合適。6.1匯編語言04七月20254.程序設計的一般技巧盡量采用循環結構和子程序結構。這樣可以使程序的總容量大大減少,提高程序的效率,節省內存。盡量少用無條件轉移指令。這樣可以使程序條理更加清楚,從而減少錯誤。對于通用的子程序,除了用于存放子程序入口參數的寄存器外,子程序中用到的其他寄存器的內容應壓入堆棧,即保護現場。一般不必把標志寄存器壓入堆棧。在中斷處理程序中,除了要保護中斷處理程序中用到的寄存器外,還要保護標志寄存器。用累加器傳遞入口參數或返回參數比較方便,在子程序中,一般不必把累加器內容壓入堆棧。
6.1匯編語言04七月20256.2順序結構程序設計順序結構程序是最簡單、最基本的程序。要設計出高質量的程序需要掌握一定的技巧,需要熟悉指令系統,正確地選擇指令,掌握程序設計的基本方法和技巧,以達到提高程序執行效率、減少程序長度、最大限度地優化程序的目的。順序程序的特點和設計方法:結構比較單一和簡單,按程序編寫的順序依次執行,中間沒有任何分支,程序流向不變。數據傳送指令使用得較多,沒有控制轉移類指令。作為復雜程序的某個組成部分,如循環結構程序中需多次重復執行的某段程序(稱為循環處理)。04七月2025【例6.1】
雙字節二進制數求補。解:求補——變反加1
雙字節數放在R3R2中程序流程圖為:
6.2順序結構程序設計開始結束A←R2取反,加1R2←AA←R3R3←A取反加進位04七月2025【例6.2】
拆字程序。將30H單元的內容拆開,高位送31H低位,低位送32H低位。解:怎樣拆分?用什么指令?流程圖為:6.2順序結構程序設計開始A←R2取反,加1R2←AA←R3結束04七月20256.2順序結構程序設計【例】二進制數→BCD碼BINBCD:MOVB,#64HDIVABMOV51H,AMOVA,#0AHXCHA,BDIVABSWAPAADDA,BMOV50H,ARET04七月20256.3循環結構程序設計循環程序的結構一般包括以下幾部分。置循環初值——置循環初值是設置用于循環過程工作單元的初始值,包括設置循環計數初值、地址指針、存放和數的單元、數據塊長度等初值。循環體——是需要多次重復執行的程序段。循環體是循環程序的核心,用于完成主要的計算和操作任務。循環修改——對循環計數器的修改。循環控制——是用條件轉移指令控制循環是否繼續。每循環一次,根據循環結束條件進行一次判斷;當滿足條件時,停止循環,繼續執行其他程序;否則,再作循環。循環結束——用于存放循環程序的執行結果,同時恢復相關工作單元的初值。
04七月20256.3循環結構程序設計循環程序一般有兩種編寫方法。先循環處理后循環控制(即先處理后判斷)先循環控制后循環處理(即先判斷后處理)若循環程序的循環體內不再包含其他循環程序,則稱為單重循環程序。若循環程序的循環體內包含有其他循環程序,則稱為多重循環程序,又稱為循環嵌套。多重循環程序中的各重循環不能有交叉,不能從外循環跳入內循環,只能外循環內嵌套內循環。兩重循環程序流程如下圖所示。
04七月2025兩重循環程序流程圖
開始
循環控制
循環結束
循環處理
循環初始化
結束
Y
N
條件滿足?
循環控制2
循環結束
循環處理1
循環初始化1
結束
Y
N
循環處理2
循環初始化2
Y
N
循環控制1
開始
條件滿足?
條件滿足?
先判斷后處理循環程序流程圖先處理后判斷循環程序流程圖6.3循環結構程序設計04七月20256.3循環結構程序設計循環程序的特點和設計方法。程序結構緊湊,占用存儲單元較少,程序中間有分支,循環程序本質上是分支程序的一種特殊形式。DJNZ指令使用得較多,凡是分支程序中可以使用的控制轉移類指令,循環程序一般都可以使用。循環控制的形式有多種。計數循環是最常用的一種,它先預置計數初值,再用DJNZ指令控制循環次數;條件循環也是較常用的一種,它先預置結束循環的條件,再用CJNE指令、JZ指令或JB指令控制循環的結束。
04七月20256.3循環結構程序設計【例6.3】數據傳送程序。將片內RAM40H單元開始的內容依次傳送到片外RAM1000H單元開始的區域,直到遇到傳送的內容是0為止。解:本題要注意:片內RAM的訪問方式,片外RAM的訪問方式循環結構:循環次數是否已知用什么條件控制指令04七月20256.3循環結構程序設計【例6.4】數據極值查找程序。內部RAM30H單元開始存放了10個數,找出其中的最大的數。解:本題要注意:循環結構:循環次數是否已知用什么條件控制指令極值的查找算法:比較交換法開始取一個數->MAX取下一個數->A比較兩數將大數送MAX全部數據比較完嗎?結束NoYes設置數據首址及數據個數04七月2025【例6.4】片內RAM中數據塊排序程序。6.3循環結構程序設計解:數據排序的方法有很多,本例采用常用的冒泡排序法,又稱為兩兩比較法。想象把10個數縱向排列,自上而下將存儲單元相鄰的兩個數進行比較,若前數大于后數,則存儲單元中的兩個數互換位置;若前數小于后數,則存儲單元中的兩個數保持原來位置。按同樣的原則依次比較后面的數據,直到該組數據全部比較完,經過第1輪的比較,最大的數據就像冒泡一樣排在了存儲單元最末的位置上。經過9輪冒泡,便可完成10個數據的排序。04七月20256.3循環結構程序設計在實際排序中,10個數不一定要經過9輪排序冒泡,可能只要幾次就可以了。為了減少不必要的冒泡次數,可以設計一個交換標志,每一輪冒泡的開始將交換標志位清0,在該輪數據比較中若有數據位置互換,則將交換標志位置1;每輪冒泡結束時,若交換標志位仍為0,則表明數據排序已完成,可以提前結束排序。冒泡法排序算法流程圖開始交換標志清0取相鄰兩數進行比較前數<后數交換兩數,并置交換標志Yes比較一遍NoNoYes有交換標志結束YesNo04七月20256.3循環結構程序設計04七月2025小結:順序結構程序設計加、減指令和傳送指令的使用循環結構程序設計條件控制類指令的使用作業:
P1162、3、126.3循環結構程序設計04七月20256.4分支結構程序設計分支程序是根據程序的要求改變程序的執行順序,并根據條件對程序的流向進行判斷的程序結構。分支程序一般有兩個或兩個以上的出口。分支程序又分為單分支和多分支結構。04七月20256.4分支結構程序設計分支程序的特點和設計方法:程序中有轉移指令包括無條件轉移、條件轉移和散轉指令。分支的出口有兩個以上時,形成散轉程序,一般用散轉指令來實現,設計方法有4種。分別是轉移指令表法、地址偏移量表法、轉向地址表法和利用RET指令法。單分支程序一般有一個入口、兩個出口,一般用無條件轉移和條件轉移指令來實現,結構形式有兩種。一種是當條件滿足時,執行處理程序2,否則執行處理程序3。分支程序流程圖如下圖(a)所示。另一種是當條件滿足時,跳過處理程序2,直接執行處理程序3,否則順序執行處理程序2和處理程序3。分支程序流程圖如下圖(b)所示。04七月2025(a)分支程序流程圖(b)分支程序流程圖6.4分支結構程序設計04七月2025分支程序允許嵌套,即一個分支接一個分支,形成樹狀多分支結構。多分支程序流程圖如右圖所示。多分支程序流程圖6.4分支結構程序設計04七月20256.4分支結構程序設計【例6.6】設補碼數x存放在30H單元之中,函數值y按下式進行賦值:解:怎樣判斷一個數是否為0?
怎樣判斷一個數是正/負?
30H:X、Y
算法流程圖為:開始A←(30H)A=0?Y←10HACC.7=0?Y←X+5結束YNNY04七月20256.4分支結構程序設計【例6.7】使用地址偏移量的散轉程序。按R2的內容轉向5個處理程序。解:散轉使用JMP@A+DPTR指令
JMP1:MOVA,R2MOVDPTR,#TAB MOVCA,@A+DPTRJMP@A+DPTRTAB:DBPRG0_TABDBPRG1_TAB
……DBPRG4_TABPRGO:……PRG1:……PRG2:……PRG3:……PRG4:……04七月20256.4分支結構程序設計【例6.9】
設計一個水塔水位控制系統,晶振頻率6MHz。設計要求如下:(1)在水塔內三個不同的高度分別安裝了一根固定不動的金屬棒,正常情況下,塔內水位應保持在虛線之內,水位控制原理如下圖所示。(2)A棒處于水位上限,B棒處于水位下限。當水位低于水位下限時,自動啟動水泵電機給水塔供水;直到塔內水位達到水位上限,自動停止水泵電機動轉。(3)塔內水位從水位上限下降到水位下限的過程中,水泵電機不會自動啟動。(4)水塔進水時,要有信號燈指示;水位檢測發生故障時,要有故障燈指示并使水塔水位控制系統停止工作。04七月20256.4分支結構程序設計
由于水的導電作用,當塔內水位達到水位下限時,B棒接通+5V;當塔內水位達到水位上限時,A棒也接通+5V。
水位上限信號輸入至P1.0,水位下限信號輸入至P1.1,P1.2輸出控制信號以控制水泵電機的啟動(P1.2=0)和停止(P1.2=1),P1.3輸出顯示信號以指示水泵電機的運行狀態(P1.3=0時點亮),P1.4輸出故障信號以指示水位檢測系統故障狀態(P1.4=0時點亮)。
解:當塔內水位處于水位下限以下時,A、B棒通過電阻接地。
04七月20256.4分支結構程序設計
水位控制信號與水泵電機控制狀態的對應關系為了防止電機頻繁啟停,在啟動或停止電機后最少要維持這一狀態20s,這可以采用延時程序來實現。
P1.1P1.0控制狀態P1.2P1.3P1.400水泵電機啟動00101故障報警11010維持原來狀態111水泵電機停止11104七月2025主程序:ORG0000H LJMPMAIN ORG0030H MAIN:ORLP1,#03H ;水位信號輸入端做讀入準備MOVA,P1 ;讀入水位檢測信號JNBACC.1,QDZB ;P1.1=0,轉移至啟動準備JBACC.0,TZDJ ;P1.0=1,轉移至停止電機YS:LCALLDELAY ;延時20sSJMPMAIN QDZB:JNBACC.0,QDDJ ;P1.0=0,轉移至啟動電機SETBP1.2 ;停止電機SETBP1.3 ;關閉電機運行指示CLRP1.4 ;打開水位檢測故障指示SJMP$ QDDJ:CLRP1.2 ;啟動電機CLRP1.3 ;打開電機運行指示SJMPYS TZDJ:SETBP1.2 ;停止電機SETBP1.3 SJMPYS04七月2025延時子程序:
ORG0100HDELAY:MOVR3,#200LP1:MOVR7,#200LP2:MOVR6,#123NOPLP3:DJNZR6,LP3DJNZR7,LP2DJNZR3,LP1RETEND6.4分支結構程序設計04七月2025小結:分支結構程序設計用什么指令?散轉作業:
P1162、3、6、12實驗:
P1178、96.4分支結構程序設計04七月20256.5子程序設計一、子程序的概念子程序是指完成某一專門任務并能被其他程序反復調用的程序段。調用子程序的程序稱為主程序或調用程序。使用子程序的過程稱為調用子程序。子程序執行完后返回主程序的過程稱為子程序返回。主程序和子程序是相對的,同一程序既可以作為另一程序的子程序,也可以有自己的子程序。也就是說,子程序是允許嵌套的,嵌套深度和堆棧區的大小有關。采用子程序能使整個程序結構簡單,縮短程序設計時間,減少對存儲空間的占用。子程序具有通用性和獨立性,以滿足所有調用程序實現資源共享。子程序的第一條指令的地址稱為子程序的入口地址,該指令前應有標號。04七月20256.5子程序設計二、子程序的設計1.主程序與子程序之間的轉返主程序---→子程序:調用(LCALL、ACALL)子程序---→主程序:返回(RET)在主程序中可以用調用指令調用子程序,在子程序末尾用RET返回指令從子程序返回主程序。2.主程序與子程序間的參數傳遞合理地確定子程序的參數傳遞方式:入口參數是子程序需要的原始參數,由主程序通過相關的工作寄存器、特殊功能寄存器、片內RAM或堆棧等傳送給子程序;出口參數是根據入口參數執行子程序后獲得的結果,由子程序通過相關的工作寄存器、特殊功能寄存器、片內RAM或堆棧等傳遞給主程序。04七月20256.5子程序設計傳送子程序參數的方法:利用寄存器或片內RAM傳送參數。可以把入口參數存放到寄存器或片內RAM中傳送給子程序,也可以把出口參數存放到寄存器或片內RAM中傳送給主程序。利用寄存器傳送參數的地址。把存放入口參數的地址通過寄存器傳送給子程序,子程序根據寄存器中存放入口參數的地址便可找到入口參數并對它們進行相應操作;出口參數的地址也可通過寄存器傳送給主程序。利用堆棧傳送參數。可以用壓棧指令PUSH把入口參數壓入堆棧傳送給子程序,也可以使用壓棧指令PUSH把出口參數壓入堆棧傳送給主程序。
04七月20256.5子程序設計3.現場保護根據需要保護現場和恢復現場。在子程序的開始,使用壓棧指令把需要保護的內容壓入堆棧;在返回主程序前,使用彈出指令把堆棧中保護的內容送回原來的存儲單元中。子程序中有可能要使用累加器A或工作寄存器,在子程序使用它們之前,把它們中可能存有的主程序的中間結果保存起來,這一過程稱為保護現場。在子程序執行完并將返回主程序之前,再將這些中間結果取出,送回到累加器A或原來的工作寄存器中,這一過程稱為恢復現場。子程序中應盡量使用相對轉移指令而不使用其他轉移指令,以便子程序放在內存的任何區域都能被主程序調用。要正確地設置堆棧指針,以避免堆棧區與工作寄存器或其他存儲單元發生沖突。04七月2025子程序設計的步驟:1確定子程序名稱,即入口標號。2確定子程序的輸入/輸出參數。3確定所用的寄存器和存儲單元,以便現場保護。斷點保護由指令自動完成。4確定子程序的算法,編寫源程序。6.5子程序設計04七月2025例6.9用程序實現c=a2+b2,假設a,b,c分別存于R2、R3、R4當中。解:我們用子程序來求某個數的平方,求平方用查表的方式求得。子程序的入口參數和出口參數均為A本例不需要保護現場6.5子程序設計04七月2025主程序:MAIN:MOVA,R2ACALLSQRMOVR0,A MOVA,R3 ACALLSQR ADDA,R0MOVR4,ASJMP$子程序:SQR:INCAMOVCA,@A+PCRETTAB:DB0,1,4,9,16,25,36,49,64,81END6.5子程序設計該指令的作用是什么?04七月2025例6.10設計求內部RAM中N個字節無符號數之和(小于65536)的子程序。解:根據題意,該子程序的入口參數在RAM中,可用間接指針指示參數的位置。入口參數用R0作為指針R7為數塊的長度出口參數:運算結果存放在RAM中,可用R1作為指針6.5子程序設計04七月2025NADD: MOV @R1,#0;結果單元清0 INC R1 MOV @R1,#0LOOP: MOV A,@R0 ADD A,@R1 MOV @R1,A;做累加,保存結果
DEC R1;R1指向高字節(高位)
CLR A ADDC A,@R1;加進位
MOV @R1,A INC R1 INC R0 DJNZ R7,LOOP RET6.5子程序設計04七月2025【例11】
將片內RAM區20H~24H單元中的一位十六進制數轉換成ASCII碼,并分別存放到片內RAM區30H~34H單元中。解:ASCII碼是有一定規律的編碼,如十六進制數的0~9的ASCII碼為該數值加上30H,分別為30H~39H;十六進制數的A~F的ASCII碼為該數值加上37H,分別為41H~46H。6.5子程序設計04七月2025主程序:
程序 注釋
ORG0000H
LJMPMAIN
ORG0100H MAIN: MOVR4,#05H ;數據塊的長度
MOVR0,#20H ;存放十六進制數首地址
MOVR1,#30H ;存放ASCII碼首地址LP1: MOVA,@R0 ;取十六進制數
LCALLHAC ;調用代碼轉換程序
MOV@R1,A ;存放ASCII碼
INCR0
INCR1
DJNZR4,LP1
SJMP$ 6.5子程序設計04七月2025子程序:
程序 注釋
;程序名:HAC ;功能:十六進制數轉換成ASCII碼
;入口參數:A存放要轉換的十六進制數
;出口參數:A存放轉換后的ASCII碼
;占用資源:PSW ORG0150H ;子程序從地址0150H開始存放
HAC: PUSHPSW ;保護現場
ANLA,#0FH ;屏蔽掉高4位
PUSHACC CLRC SUBBA,#0AH;比較A中內容的大小
POPACC
JCLP2 ;(A)<10時,轉移
ADDA,#07H
LP2: ADDA,#30H
POPPSW ;恢復現場
RET ;子程序返回
END04七月2025小結:子程序設計的方法子程序設計的步驟6.5子程序設計04七月2025作業、實驗中的問題1、指令不熟悉,隨意造指令。
MOVC,AMOV@R0,@DPTRMOVDPTR,#0MOVR1,#30HMOVR1,30H2、存儲器的特點不熟悉。
尋址方式——存儲空間3、題意沒有弄清楚。04七月20256.6實用程序設計6.6.1代碼轉換程序例6.118位二進制數轉換為BCD碼。解:8位二進制數00~FFH轉換為BCD碼為00~255
每位BCD碼用四位二進制代碼表示,因此1個字節的二進制數最多需要12位二二進制代碼。(S)2=X2×100+X1×10+X0BINBCD:MOVB,#100DIVABPUSHACCMOVA,#10XCHA,BDIVABSWAPAADDA,BPOPBRET04七月20256.6實用程序設計例6.12雙字節二進制數轉換為BCD碼。解:16位二進制數的范圍為0000~FFFFH轉換為BCD碼為0~65535
每位BCD碼用四位二進制代碼表示,因此2個字節的二進制數最多需要3個字節來存放。二制數轉換為十進制數的方法是:按權展累加法(S)2=a15×215+a14×214+…+a1×21+a0×20=(…(a15×2+a14)×2+…+a1)×2+a0入口參數:R3R2出口參數:R6(萬位)、R5(千位、百位)、R4(十位、個位)流程圖:P105圖6.704七月20256.6實用程序設計例6.13BCD碼轉換為二進制數。解:(a1a0)10=a1×10+a0
將A的高半字節乘以10,再加上A的低半字節即:A7~4×10+A3~0
程序如下:
BCDBIN:PUSHACCANLA,#0F0HSWAPAMOVB,#10MULABMOVB,APOPACCANLA,#0FHADDA,B RET04七月20256.6實用程序設計例6.144位二進制數轉換為ASCII碼。解:將數碼0~9、A~F轉換為ASCII碼字符‘0’~‘9’的ASCII值為30H~39H‘A’~‘F’的ASCII值為41H~46H
當為0~9時,加上30H即可;當為A~F時,加上37H。首先判斷其值是<10或是≥10,以決定是加30H或是加37H。流程序圖:P108圖6.8入口:R2出口:R204七月20256.6實用程序設計例6.15ASCII碼轉換為4位二進制數。解:將ASCII碼字符轉換為數碼0~9、A~F‘0’~‘9’的ASCII值為30H~39H‘A’~‘F’的ASCII值為41H~46H
當為‘0’~‘9’時,減去30H即可;當為‘A’~‘F’時,減去37H。流程序圖:P108圖6.9入口:R2出口:R204七月20256.6實用程序設計6.6.2延時程序編寫延時程序要弄清每指令執行的機器周期,每個機器周期執行的時間。1.單循環延時程序
MOVR7,#TIME;置循環次數,1周期LOOP:NOP;1周期
NOP;1周期
DJNZR7,LOOP;2周期
RET;2周期延時時間=(4×TIME+1+2+2)×T機具體延時時間與單片機的晶振頻率有關調用指令04七月20252.雙循環延時程序
MOVR7,#TIME1;1周期LOOP1:MOVR6,#TIME2;1周期LOOP2:NOP;1周期
NOP;1周期
DJNZR6,LOOP2;2周期
DJNZR7,LOOP1;2周期
RET;2周期延時時間=((TIME2×4+2+1)×TIME1+1+2+2)×T機6.6實用程序設計04七月20256.6實用程序設計6.6.3查表程序在單片機的實際應用中,經常要對一些數據進行函數運算,例如求平方、正弦函數等,為了提高單片機執行程序的速度,一般將某函數的全部函數值按一定的規律編成表格存放到程序存儲器中。查表程序就是根據某數據的函數運算要求,按索引號從程序存儲器中查找與之相對應的函數值的程序結構。設計查表程序時,主要通過兩條查表指令實現查表功能。04七月20256.6實用程序設計查表程序的特點和設計方法:查表指令“MOVCA,@A+DPTR”的查表過程比較簡單。查表時首先需要把數據表格起始地址存入DPTR,然后把所查數據的索引值送入累加器A中,最后使用查表指令“MOVCA,@A+DPTR”完成查表。查表指令“MOVCA,@A+PC”的查表過程相對復雜一些。查表時首先使用傳送指令把所查數據的索引值送入累加器A,然后用“ADDA,#data”指令對累加器A進行修正。data值由該式確定:PC+data=數據表格的首地址。其中,PC是“MOVCA,@A+PC”的下一條指令的地址。因此,data值實際等于查表指令和數據表格之間的字節數。最后使用查表指令“MOVCA,@A+PC”完成查表。04七月20256.6實用程序設計【例6.16】在程序中定義一個0~9的平方表,利用查表指令指出累加器A=05的平方值.解法一:首先把平方表格起始地址TABLE存入DPTR,然后將要查找的數放入累加器A中,最后使用查表指令“MOVCA,@A+DPTR”完成查表。
程序如下:ORG0050HMOVDPTR,#TABLEMOVA,#05HMOVCA,@A+DPTRRETTABLE:DB0,1,4,9,16,25,36,49,64,8104七月20256.6實用程序設計解法二:如果采用查表指令“MOVCA,@A+PC”,首先把要查的數據送入累加器A中,然后用“ADDA,#data”指令對累加器A進行修正,最后使用查表指令“MOVCA,@A+PC”完成查表。修正值=平方表格首址-下一條指令的PC值程序如下:ORG0050HMOVA,#05HADDA,#01HMOVCA,@A+DPTRRETTABLE:DB0,1,4,9,16,25,36,49,64,8104七月20256.6實用程序設計例6.18在一溫度控制器中,測出的電壓與溫度為非線性關系,需對它進行線性化補償。測得的電壓已由A/D轉換為10位二進制數。現要求采用查表法實現線性化處理。解:測出不同溫度下的輸入值,然后用測得的數據構成一個表,表中存放溫度值y,x為電壓值。設測量輸入值放入R2R3中,轉換后的線性溫度值仍放入R2R3中。
MOV A,R3 CLR C RLC A MOV R3,A XCH A,R2 RLC A XCH A,R2該程序段的作用是什么?04七月20256.6實用程序設計【例】一位十六進制數轉換8段式數碼管顯示碼。一位十六進制數0~9、A、B、C、D、E、F的8段式數碼管的共陰極顯示碼為3FH、06H、5BH、4FH、66H、6DH、7DH、07H、7FH、67H、77H、7CH、39H、5EH、79H、71H。由于數與顯示碼沒有規律,不能通過運算得到,只能通過查表方式得到。設數放在R2中,查得的顯示碼也放于R2中,用MOVCA,@A+DPTR查表。04七月2025程序如下:
ORG0200HCONVERT:MOVDPTR,#TAB;DPTR指向表首址
MOVA,R2;轉換的數放于A
MOVCA,@A+DPTR;查表指令轉換
MOVR2,A RETTAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,67H,77H,7CH,39H,5EH,79H,71H;顯示碼表在這個例子中,編碼是一個字節,只通過一次查表指令就可實現轉換,如編碼是兩個字節,則需要用兩次查表指令才能查得編碼,第一次取得低位,第二次取得高位。6.6實用程序設計04七月20256.6實用程序設計6.6.4運算程序【例6.19】多字節無符號數加法解:多字節的加法運算是按低字節到高字節的順序依次進行。入口:R0—被加數低位字節地址指針
R1—加數低位字節地址指針
R2—字節數出口:R0—和數高位字節地址指針用R2為循環變量,在循環體中用ADDC指令把R0指針指向的單元與R1指針指向的單元相加,加得的結果放回R0指向的單元,改變R0、R1指針指向下一個單元,在第一次循環前應先將CY清零。程序流程圖和程序如下:04七月2025程序:BINADD:CLRC LOOP1:MOVA,@R0 ADDCA,@R1 MOV@R0,A INCR0 INCR1 DJNZR2,LOOP1JNCLOOP2MOV@R0,#01HRETLOOP2:DECR0RET開始進位清0與加數相加(帶進位)存和,指針加1結束否是6.6實用程序設計取被加數恢復地址指針做完加法了嗎?有進位嗎?存最高位否是04七月20256.6實用程序設計【例6.20】多字節無符號數減法解:多字節無符號數的減法運算與加法運算相似入口:R0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 青年教師學術論文寫作計劃
- 2025年新教師高中歷史課程改革培訓心得體會
- 新零售門店物資計劃
- 小學一年級體育運動計劃
- 班主任個人總結與自我評價1500字范文
- 應急響應案例警示教育學習心得體會
- 婦產科手術感染預防控制措施
- 道路橋梁工程質量技術組織措施
- 小學一年級勞動與技術教學內容計劃
- 文化建筑施工緊急情況應急措施
- 2025-2030年中國地理信息行業市場深度調研及前景趨勢與投資研究報告
- BA系統對電氣設備動力柜(箱)的自控接口要求
- 汕尾市市直單位招聘政府聘員筆試真題2024
- 遼寧省鐵嶺市鐵嶺縣2023-2024學年七年級下學期7月期末考試地理試卷(含答案)
- 玻璃幕墻工程技術規范 JGJ 102-2003 知識培訓
- 2024年04月高等教育自學考試《00067財務管理學》試題
- 2025年中考英語考前沖刺卷(北京卷)(解析版)
- 農村房產抵押協議書
- 境外旅游包車協議書
- 分揀物流考試試題及答案
- 抱負與使命主題范文引領-2024-2025學年高一語文單元寫作深度指導(統編版必修下冊)
評論
0/150
提交評論