單片機編程技術_第1頁
單片機編程技術_第2頁
單片機編程技術_第3頁
單片機編程技術_第4頁
單片機編程技術_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、單片機編程技術 單片機與一般集成電路的區(qū)別在于可編程應用,程序是單片機應用系統(tǒng)的靈魂。 3.1 程序設計的方法和技巧 由于匯編語言是面向機器的語言,因此對單片機系統(tǒng)進展程序設計時必須考慮硬件資源的配置。當硬件系統(tǒng)設計完成后,可從以下幾方面進展程序設計:1. 分析問題針對現(xiàn)有條件,明確在程序設計時應該“做什么2. 確定算法解決“怎樣做的問題3. 繪制程序流程圖用圖形的方法描繪解決問題的思路 常用的程序流程圖符號如圖3-1所示 4. 分配內存單元確定程序和數(shù)據(jù)區(qū)的起始地址5. 編寫源程序用指令的形式將程序流程圖實現(xiàn)出來6. 匯編用開發(fā)機或仿真器將源程序轉換成機器碼,便于單片機識別7. 在線仿真調試

2、查錯、改錯,對程序進展優(yōu)化。常用的程序流程圖符號如圖3-1所示。 圖3-1 常用的程序流程圖符號3.1.2 匯編語言編程技巧 盡量采用模塊化程序設計方法 ; 這種設計方法是把一個完整的程序分成假設干個功能相對獨立的、較小的程序模塊,對各個程序模塊分別進展設計、編制程序和調試,最后把各個調試好的程序模塊裝配起來進展聯(lián)調,最終成為一個有實用價值的程序。 模塊化程序設計的優(yōu)點是:對單個程序模塊設計和調試比較方便、容易完成,一個模塊可以被多個任務共用。盡量采用循環(huán)構造和子程序構造 ; 采用循環(huán)構造和子程序構造,可以使程序的總容量減小,提高程序的效率,節(jié)省內存。盡量少用無條件轉移指令 ; 少用無條件轉移

3、指令,可以保證程序的條理更加清晰,從而減少錯誤發(fā)生。充分利用累加器; 累加器是主程序和子程序之間信息傳遞的橋梁,利用累加器傳遞入口參數(shù)或返回參數(shù)比較方便。這時,一般不要把累加器內容壓入堆棧。對于通用子程序要保護現(xiàn)場; 由于子程序的通用性,除了保護子程序入口參數(shù)的存放器內容外,還要對子程序中用到的其它存放器內容一并入棧保護。 對于中斷處理,還要保護程序狀態(tài)字 在中斷處理程序中,既要保護處理程序中用到的存放器內容,還要保護程序狀態(tài)字PSW。否那么,當中斷效勞程序執(zhí)行完畢返回主程序時,整個程序的執(zhí)行可能會被打亂。 80C51單片機匯編語言的語句行由4個字段組成,匯編程序能對這種格式正確地進展識別。這

4、4個字段的格式為: 標號: 操作碼操作數(shù) ;注釋 括號內的局部可根據(jù)實際情況取舍,各字段之間要用分隔符分隔??捎米鞣指舴姆栍忻疤枴⒖崭?、逗號、分號等。如: MAIN:MOV A,#68H ;A68H1標號 標號是指令的符號地址。有了標號,程序中的其它語句才能很方便地訪問該語句。有關標號的規(guī)定為:標號要由18個ASCII碼字符組成,但必須以字母開 頭,其余字符可以是字母、數(shù)字或其它特定字符。不能使用匯編語言已經(jīng)定義了的符號作為標號,如指令 助記符MOV、偽指令記憶符END以及存放器的符號名 稱R1等。標號后邊必須跟冒號。同一標號在一個程序中只能定義一次,不能重復定義。2操作碼 操作碼用于規(guī)定

5、語句執(zhí)行的操作。它用指令助記符或偽指令助記符表示,是匯編語句中唯一不能空缺的局部。3操作數(shù) 操作數(shù)用于給指令的操作提供數(shù)據(jù)或地址。在一條語句中,可能沒有操作數(shù),也可能只有1個操作數(shù),還可能同時包含23個操作數(shù)。各操作數(shù)之間要以逗號分隔。操作數(shù)一般以下面幾種形式出現(xiàn):常數(shù)工作存放器名特殊功能存放器名 標號名符號“$,表示程序計數(shù)器PC的當前值。如: SJMP $表達式4注釋 注釋不屬于語句的功能局部,它只是對語句的解釋說明,只要用“;開頭,就說明以下為注釋內容。使用注釋可使程序文件的編制顯得更加清楚,便于編程人員的閱讀和維護。注釋的長度不限,一行不夠可以換行接著書寫,但換行后仍要以“;開頭。 用

6、戶根據(jù)系統(tǒng)要求用匯編語言或高級語言編好的程序,叫源程序。3.2.1 源程序的編輯和匯編 由于通用微型計算機的普及,現(xiàn)在單片機應用系統(tǒng)的程序設計都借助于通用微型計算機。全過程可概括為“機器編輯穿插匯編串行傳送三個部驟,如圖3-2所示。 3. 2 源程序的編制1. 編輯 將源程序輸入計算機并進展修改的過程就是編輯。編輯工作一般在通用微型計算機上利用各種編輯軟件完成,故又稱其為機器編輯。編輯完成后,生成一個由匯編指令和偽指令共同組成的ASCII碼文件,其擴展名為“ASM。 圖3-2 單片機匯編語言程序的生成過程 計算機只能識別機器語言,但程序編制人員通常以匯編語言或高級語言編制源程序。這樣,要讓計算

7、機能聽從程序編制人員的指揮,就必須要將匯編語言或高級語言轉換成機器語言,供計算機識別,這個過程稱為匯編或編譯。 匯編工作常由匯編軟件來完成。匯編軟件通常具有指令的錯誤識別與提示能力,為編程者迅速查找源程序中的錯誤提供了方便。在匯編過程中,我們只能發(fā)現(xiàn)源程序中的語法錯誤和一般性的邏輯錯誤,但不能檢查程序構造上的錯誤。如果有錯誤,匯編軟件會報告,指出錯誤位置及錯誤類型。程序錯誤被糾正后,要重新進展編譯調試,直至程序匯編無誤為止。 現(xiàn)在常用的匯編方法是穿插匯編,即用PC機中的匯編程序去匯編80C51單片機中的源程序。匯編后生成的機器碼稱為目標程序,擴展名為“OBJ。該目標程序可通過PC機的串行通信接

8、口直接傳送到開發(fā)系統(tǒng)的RAM中。 2. 匯編 在前面的課題與實訓環(huán)節(jié)中用到的ORG和END命令就是典型的偽指令,它們是為下一步的匯編工作提供起始地址和完畢地址的。 我們知道,匯編語言程序的機器匯編是由計算機自動完成的,因此在源程序中應該有向匯編程序發(fā)出的命令。 這種在源程序中出現(xiàn),通知匯編程序應該如何完成匯編工作的指令,就是偽指令。 下面介紹80C51單片機常用的偽指令。 3.2.2 偽指令1. ORGOrigin匯編起始命令格式為:ORG 16位地址或標號 該命令總是出現(xiàn)在源程序的開場位置。用來規(guī)定目標程序即此命令后面的程序或數(shù)據(jù)塊的起始地址。ORG后面通常是16位地址,也可以是已定義的標號

9、地址或表達式。如ORG 1000H。 在程序中如果不用ORG規(guī)定起始地址,那么匯編得到的目標程序將從0000H開場存放。在一個源程序中,ORG指令可以屢次使用,但要求地址值要由小到大依序排列,且不能出現(xiàn)空間上的重疊。2. END 匯編完畢命令格式為:END 該命令用于中止源程序的匯編工作。END是匯編語言源程序的完畢標志,因此在整個源程序中只能有一條END指令,且位于程序的最后。如果END命令出現(xiàn)在源程序中間,對其后面的源程序,計算機將不予匯編。3. EQUEquate等值命令格式為: 標號名 EQU 表達式 該命令用來給標號賦值。賦值以后,其標號值在整個程序中有效。例如: DAT EQU 3

10、0H 4. DB (Define Byte) 定義字節(jié)命令格式為: 標號: DB 字節(jié)數(shù)據(jù)表 該命令用于從標號指定的地址開場,連續(xù)存放字節(jié)數(shù)據(jù)表,常與查表指令MOVC配合使用。其中字節(jié)數(shù)據(jù)表可以是一個或多個字節(jié)數(shù)據(jù)、字符串或表達式。例如: DB “hello 5. DW (Define Word)定義字命令格式為: 標號: DW 字數(shù)據(jù)表 該命令用于從標號指定的地址開場,連續(xù)存放16位字數(shù)據(jù)表。該數(shù)據(jù)表在程序存儲器中存放的格式為:高8位存放在低地址單元,低8位存放在高地址單元。例如:ORG 1000HTABLE: DW 1234H, 66H 匯編后,(1000H)=12H, (1001H)=3

11、4H, (1002H)=00H, (1003H)=66H。DB和DW定義的數(shù)據(jù)表,數(shù)的個數(shù)不能超過80個。如遇數(shù)目較多時,可以使用多個定義命令。在80C51程序設計中,常用DB來定義數(shù)據(jù),DW來定義地址。 6. BIT 定義位命令 格式為:標號名 BIT 位地址 該命令用來將位地址賦值給指定的標號名。例如:將P1.0的位地址賦值給標號KAIGUAN,在后面編程時就可以用KAIGUAN來代替P1.0。7. DS (Define Storage)定義空間命令格式為: 標號: DS 表達式 該命令用于從指定單元開場,預留一定數(shù)目的字節(jié)單元作存儲區(qū),供程序運行使用。 程序構造通常分為三種形式:順序構造

12、、分支構造、循環(huán)構造。形式如圖3-3所示。 圖3-3 三種程序構造3.3 根本程序構造 順序程序是最簡單的程序構造,它既無分支,又無循環(huán),在執(zhí)行時單片機是按程序中指令的順序逐條進展的。編程本卷須知: 正確選擇程序存放的地址:通常主程序起始地址在0100H之后,但由于80C51單片機上電后從0000H開場執(zhí)行,所以必須在0000H設一條轉移指令,轉至主程序首址。 要注意檢查所用指令是否合法,在沒有把握的情況下,最好查一下指令表。如,下面的指令是非法的: MOVX 2002H,2000H 為使程序運行完畢時不至于跑飛,可在程序最后加一條暫停指令,如:SJMP $。例1 將地址為2000H、2001

13、H、2002H的片外數(shù)據(jù)存儲單元的內容分別傳送到2002H、2003H和2004H單元中去。 ORG 0000H AJMP 0100H ;轉到主程序起始地址 ORG 0100H MOV DPTR, #2002H ;最后一個數(shù)據(jù)的起始地址 MOVX A,DPTR ;2002H單元的數(shù)據(jù)送A MOV DPTR, #2004H ;最后一個數(shù)據(jù)的目的地址 MOVX DPTR,A ;2002H單元的數(shù)據(jù)送2004H單元 MOV DPTR, #2001H ;中間數(shù)據(jù)的起始地址 MOVX A,DPTR ;2001H單元的數(shù)據(jù)送A MOV DPTR, #2003H ;中間數(shù)據(jù)的目的地址 MOVX DPTR,A

14、 ;2001H單元的數(shù)據(jù)送2003H單元 MOV DPTR, #2000H ;第一個數(shù)據(jù)的起始地址 MOVX A,DPTR ;2000H單元的數(shù)據(jù)送A MOV DPTR, #2002H ;第一個數(shù)據(jù)的目的地址 MOVX DPTR,A ;2000H單元的數(shù)據(jù)送2002H單元 SJMP $ END 還可以怎樣修改? 例2 30H單元存有8位二進制數(shù)的BCD碼,請將其轉換為共陰顯示的字形碼,然后從P1 口輸出。設這些字形碼存放在標號為TABLE 的存儲單元。程序如下: ORG 0000H AJMP MAIN ;轉到主程序起始地址 ORG 0100H MAIN:MOV DPTR, #TABLE ;字形

15、碼表首地址送DPTR MOV A,30H ;取數(shù) MOVC A,A+DPTR ;查表取值送A MOV P1, A ;字形碼送P1 SJMP $ TABLE:DB 3FH,06H,5BH,4FH,66H;04共陰字形碼 DB 6DH,7DH,07H,7FH,6FH;59共陰字形碼 END2查表程序 通常情況下,程序是順序執(zhí)行的,但我們也可以根據(jù)需要,在程序中安排一些控制轉移指令,改變程序的執(zhí)行方向,這就是分支程序。分支程序可以分為單分支和多分支等情況。 單分支程序構造如圖3-3b所示。當條件滿足時順序執(zhí)行程序段A,否那么執(zhí)行程序段B。 多分支構造如圖3-4所示。先將分支按序號排列,然后按照分支的

16、值來實現(xiàn)多分支選擇。 圖3-4 多分支構造3.3.2分支程序 分支程序在單片機系統(tǒng)中應用較多,在編程時有許多技巧,設計要點如下:(1)先建立可供條件轉移指令測試的條件。 (2)選用適宜的條件轉移指令。(3)在轉移的目的地址處設定標號。 3 內RAM30H單元存有一個ASCII碼,試對其進展判斷,如果是“$24H,將其存入40H,否那么存入31H單元。程序如下: ORG 0000H AJMP MAIN ORG 0100H MAIN:MOV A,30H CJNE A,#24H,DY31 ; 不是“$,轉去ZY31 MOV 40H,A ;是“$,存入40H單元 AJMP END0 DY31:MOV

17、31H,A ; 不是$,存入31H單元END0:SJMP $ END1單分支程序1位操作程序例4 某信號燈電路如圖3-5,試編程實現(xiàn)如下功能: S0單獨按下,紅燈亮,其余燈滅; S1單獨按下,綠燈亮,其余燈滅; S0、S1均按下,紅、綠、黃燈全亮; 都不按下黃燈亮。圖3-5 某信號燈電路參考程序如下: ORG 0000H LJMP START ORG 0100H START:ORL P1,#11000111B ;P1.6、P1.7設為輸入,紅綠黃燈滅2多分支程序 SS0: JB P1.7,SS1 ;S0未按,轉判S1 JB P1.6,RED ;S0按下,S1未按,轉紅燈亮 DL:CLR P1.

18、2 ;紅燈亮 CLR P1.1 ;綠燈亮 CLR P1.0 ;黃燈亮 SJMP SS0 ;重新檢測 SS1:JB P1.6,YELLOW ;S0未按,S1未按,轉黃燈亮GREEN:CLR P1.1 ;綠燈亮 SETB P1.2 ;紅燈滅 SETB P1.0 ;黃燈滅 SJMP SS0 RED:CLR P1.2 ;紅燈亮 SETB P1.1 ;綠燈滅 SETB P1.0 ;黃燈滅 SJMP SS0 YELLOW:CLR P1.0 ;黃燈亮 SETB P1.2 ;紅燈滅 SETB P1.1 ;綠燈滅 SJMP SS0 END說明:該程序只是說明位操作指令在分支程序中的應用方法,如果真要實現(xiàn)信號燈的

19、點亮,還要在每段燈亮滅指令后加一段延時程序。 例5 有一巡回檢測報警裝置,需對16路輸入信號進展控制,每路設有一個報警上限值等于或超出此值即報警,置報警標志F0,設16路輸入信號存放在以50H為首地址的內RAM中,16路報警上限值存在以2000H為首地址的ROM中,試編制該程序。 程序如下: START: MOV DPTR,#2000H ;置16路報警上限值首地址 MOV R0 ,#50H ;置16路輸入信號數(shù)據(jù)區(qū)首地址 MOV R7,#0 ;置16路輸入信號的序號0 LOOP : MOV R1,R0 ;檢測信號存R1 MOV A,R7 ;讀輸入信號序號 MOVC A,A+DPTR;查找該序號

20、對應的報警上限值 CJNE A,R1,NEXT ;與對應的輸入信號比較 AJMP ALAM ;輸入信號等于報警上限值,轉報警1字節(jié)操作程序NEXT: JC ALAM ;輸入信號超出報警上限值,轉報警 INC R0 ;輸入信號小于報警上限值,指向下 一路輸入信號 INC R7 ;指向下一路輸入信號序號 CJNE R7,#16,LOOP ;看16路是否全查完? 未完繼續(xù) CLR F0 ;16路全查完,清報警標志 AJMP $ ;暫停 ALAM:SETB F0 ;置報警標志 RET 3.3.3 循環(huán)程序 1循環(huán)構造 在程序設計時,常常遇到需要反復執(zhí)行的某種操作,這時可編寫一個程序段重復執(zhí)行,這就是循

21、環(huán)。循環(huán)程序一般包括4局部,如圖3-6所示。對這4局部的含義,我們以例題的形式加以說明。 例6 編程實現(xiàn)以下數(shù)據(jù)傳送功能:將BUF為起始地址的50個數(shù)取反后,傳送到以DATA為起始地址的內存單元中。 分析:如果采用順序構造編寫,程序會很麻煩,要執(zhí)行50次從源地址中取數(shù)的MOV指令,50次數(shù)據(jù)取反的CPL指令,50次向目的地址送數(shù)的MOV指令。經(jīng)過觀察,我們發(fā)現(xiàn),可以把順序構造中重復執(zhí)行的局部提取出來,編成一個獨立的小程序段即循環(huán)體局部,然后對這個小程序段重復執(zhí)行50次循環(huán)次數(shù),這就構成了循環(huán)。圖3-6 循環(huán)構造 規(guī)定循環(huán)體中各控制變量的初始狀態(tài)。 這是循環(huán)程序需要重復執(zhí)行的局部。對這局部編程的

22、時候要注意兩個問題:指令要具有通用性,程序要便于修改。程序盡可能簡化。 (3)循環(huán)修改 循環(huán)程序每執(zhí)行一次,都要對數(shù)據(jù)的地址指針、循環(huán)次數(shù)等作一次修改,這就是循環(huán)修改。 (4)循環(huán)控制 根據(jù)循環(huán)完畢條件,判斷循環(huán)是否完畢。常用作循環(huán)控制的變量是循環(huán)次數(shù)。參考程序如下: START:MOV R0,#SBUF ;數(shù)據(jù)的源地址 MOV R1,#DATA ;數(shù)據(jù)的目的地址 MOV R7,#50 ;循環(huán)次數(shù) LOOP:MOV A,R0 ; 源地址中數(shù)據(jù)送A CPL A ;取反 MOV R1 , A ;取反后的數(shù)據(jù)送目的地址 INC R0 ;源地址加1,準備取下一個數(shù) INC R1 ;目的地址加1,準備接

23、收下一個數(shù) DJNZ R7 ,LOOP ;循環(huán)完畢?未完畢重新取數(shù) RET 循環(huán)程序按構造分,有單重循環(huán)與多重循環(huán)。在多重循環(huán)中,只允許外重循環(huán)嵌套內重循環(huán);不允許循環(huán)相互穿插,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內部。 2循環(huán)構造的典型應用定時 在單片機控制系統(tǒng)中,常有定時的需要,如定時中斷、定時檢測、定時掃描等。定時功能可以使用定時/計數(shù)器實現(xiàn),但更多的是使用定時程序完成。 定時程序是典型的循環(huán)程序,它通過執(zhí)行一個具有固定延時時間的循環(huán)體來實現(xiàn)時間的推移,因此,又常把定時程序叫做延時程序。定時程序的延時時間不受器件的限制,只要選擇好循環(huán)初值,就可以實現(xiàn)幾秒、幾分、乃至幾年的時間延遲。 (

24、1)單循環(huán)延時 單循環(huán)延時是最簡單的定時程序。如: DELAY: MOV R7,#TIME ;TIME是循環(huán)程序控制變 ;量,可以取任意值 LOOP: NOP NOP NOP DJNZ R7,LOOP 其中的NOP是空操作指令,它不做任何操作,只是消磨時間。該程序段的延時時間可以這樣計算:NOP指令的機器周期是1,DJNZ指令的機器周期是2,因此循環(huán)一次共需5個機器周期。如果單片機的晶振頻率采用12MHz,那么一個機器周期是1s,因此循環(huán)一次的延遲時間是5s。 延時程序中總的延時時間為5TIMEs,根據(jù)程序的需要,TIME可以任意取值不超過8位二進制的表示范圍。因此該程序的最長延時時間是TIM

25、E=0時 5256=1280 s (2)較長時間的延時 單循環(huán)延時的延遲時間較短,為了延長定時時間,可以采用多重循環(huán)的方法。 例7 編寫延時1s子程序,要求:晶振采用12MHz,用三重循環(huán)編寫。 分析:用12MHz晶振,機器周期是1s, 程序如下: DELAY:MOV R7,#20 ;1s D1:MOV R6,#200 ;1s D2:MOV R5,#123 ;1s NOP ;1s DJNZ R5,$ ;2s,共2123s DJNZ R6,D2 ;2s,共2123+2+2 200s,即50ms DJNZ R7,D1 ;2s,共2123+2+2 200+2+120+2=1000062s1s RET

26、 ;2s 在該程序中,改變不同的存放器初值,可以實現(xiàn)不同的定時要求。 (3)以一個根本的延時程序滿足不同的定時要求 如果系統(tǒng)中有多個定時需要,我們可以先設計一個根本的延時程序,通過對這個根本延時程序的調用,實現(xiàn)所需的不同定時。如將例7延時1秒的DELAY作為根本的延時程序,那么實現(xiàn)5秒、10秒的調用情況如下: MOV R0,#5 ;5s LOOP1:ACALL DELAY ;1s DJNZ R0,LOOP1 MOV R0,#10 ;10s LOOP2:ACALL DELAY ;1s DJNZ R0,LOOP2 例8 某單片機溫控系統(tǒng)每隔50ms測一次溫度,測得的8位溫度值存在特殊功能存放器SB

27、UF中,請編程求其1s的平均值,并存于60H中。設1s采樣溫度總和不超過255 程序如下: AVR1S: MOV R2,#0 ;溫度初值為0 MOV R4,#20 ;平均次數(shù)為20 LOOP: MOV A,SBUF ;讀溫度值 ADD A,R2 ; 溫度求和 MOV R2,A ;回存 LCALL DELAY50 ;延時50ms,延時子程序略 DJNZ R4,LOOP ;20次采樣完否?未完繼續(xù) MOV A, R2 ;和存入A MOV B,#20 ;除數(shù)存入B DIV AB ;求均值 MOV 60H,A RET 請嘗試編寫延時50ms子程序。3.4 程序設計實例3.4.1 數(shù)據(jù)極值查找程序 極值

28、查找就是在指定的數(shù)據(jù)區(qū)中挑出最大值或最小值。 例9 從內部RAM30H單元開場存有8個無符號8位二進制數(shù),請編程查找到最大值,并將其存放于40H單元。 分析:假定在比較過程中,用A存放大數(shù),與之逐個比較的另一個數(shù)存放在2AH單元。流程圖見圖3-7。圖3-7最大值查找程序流程圖 程序如下: MOV R1,#30H ;數(shù)據(jù)區(qū)首址 MOV R5,#08H ;數(shù)據(jù)區(qū)長度 MOV A,R1 ;讀第一個數(shù) DEC R5 ;修改數(shù)據(jù)長度 LOOP: INC R1 MOV 2AH,R1 ;讀下一個數(shù) CJNE A,2AH,BJ ;數(shù)值比較 AJMP LOOP1 BJ: JNC LOOP1 ;A值大,轉移 MO

29、V A,R1 ;大數(shù)送A LOOP1:DJNZ R5,LOOP ;繼續(xù) MOV 40H,A ;最大值送40H SJMP $ 3.4.2 數(shù)碼轉換程序 數(shù)碼轉換通常采用子程序調用的方法進展,即由子程序完成具體的轉換功能,而由主程序組織數(shù)據(jù)和安排結果。 例10 在內部RAM的SHU16 單元存有兩位十六進制數(shù),請將其轉換成ASCII碼,并存放于ASCL(低位的ASCII碼)和ASCH(高位的ASCII碼) 兩單元。 主程序如下: MAIN:MOV SP,#5FH ;設堆棧指針 PUSH SHU16 ;16進制數(shù)進棧 ACALL ASC16 ;調轉換子程序 POP ASCL ;第一位轉換結果送ASC

30、L MOV A,SHU16 ;再取原16進制數(shù) SWAP A ;上下半字節(jié)交換 PUSH ACC ;交換后的16進制數(shù)進棧 ACALL ASC16 ;轉換 POP ASCH ;第二位轉換結果送ASCH SJMP $ 子程序如下: ASC16:DEC SP ;跳過斷點保護內容PC DEC SP POP ACC ;彈出轉換數(shù)據(jù) ANL A,#0FH ;屏蔽高位 ADD A, #7 ;修改變址存放器指針 MOVC A, A+PC ;查表 PUSH ACC ;2字節(jié),查表結果進棧 INC SP ;2字節(jié),修改斷點指針回到斷點保護內容 INC SP ;2字節(jié), RET ;1字節(jié), ASCTAB:DB 0

31、12345678 ;ASCII碼表 DB 9ABCDEF END 這是一個很典型的程序,在閱讀時應注意這樣兩個問題: 1該程序強化了堆棧的使用,這對于大家加深理解堆棧的概念十分有利。在程序中用到了兩種使用堆棧的方法: 用堆棧傳遞數(shù)據(jù)。使要轉換的16進制數(shù)在主程序中進棧PUSH SHU16而在子程序中出棧POP ACC,最后再通過堆棧把轉換結果返回主程序 POP ASCL。低位轉換其堆棧的變化見圖3-8; 系統(tǒng)在調用子程序時自動完成的PC入棧操作。由于 要轉換的16進制數(shù)是在主程序中先于斷點值PC ACALL ASC16下一條指令的地址入棧,這樣在 子程序中要取出轉換數(shù)據(jù),就得修改堆棧指針SP,

32、 以指向該數(shù)據(jù)。 2在ASCII碼表中,是以字符串的形式列出的16進制數(shù),但在匯編的過程中,寫入存儲單元的是該字符串的ASCII碼形式。圖3-8 數(shù)碼轉換程序的堆棧變化圖3.4.3課題與實訓4 程序設計一實訓目的 1熟悉匯編語言的根本格式、偽指令的使用方法。 2學習單片機應用程序的設計方法。二課題要求 1將60H69H單元存放的10個無符號數(shù)按照從小到大的順序重新排列。 2選擇課后思考題與習題的局部程序運行并調試出來。三背景知識 可采用冒泡排序法。冒泡排序法把一批數(shù)據(jù)想象成縱向排列,采用自下而上的方法比較相鄰兩個數(shù)據(jù),如果這兩個數(shù)據(jù)的大小順序符合要求,那么保持原樣,否那么交換它們的位置。這樣比

33、較一輪后,最小的數(shù)據(jù)就像氣泡一樣浮到最頂上,故稱冒泡排序法。 實際編程設計時,每一輪操作都從數(shù)據(jù)區(qū)的首地址開場,向末端推進。一般來講,N個數(shù)據(jù)要進展N1輪次比較和交換排序。表3-1表示了60H65H單元存儲數(shù)據(jù)的冒泡排序的執(zhí)行過程。表3-1 冒泡排序過程說明 假定60H65H單元存儲的原始數(shù)據(jù)為無序數(shù)列,從最上面開場進展相鄰兩個數(shù)據(jù)的比較,大的數(shù)據(jù)放上面,小的數(shù)據(jù)放下面。第一輪操作,6個數(shù)據(jù)進展615次比較,最大數(shù)據(jù)58“沉淀到最下面65H單元。第二輪操作58不參加,5個數(shù)據(jù)需比較624次,5個數(shù)據(jù)中的最大值36“沉淀到64H單元。對于本例,經(jīng)過三輪操作就可以完成排序。 采用冒泡排序法,一般應

34、設立一個標志位,在每輪開場時將標志位清0,在操作過程中出現(xiàn)位置交換,標志位置1,每輪完畢時假設標志位為0,那么說明數(shù)據(jù)已經(jīng)有序,可以提前完畢排序,從而提高了效率。圖3-9 冒泡排序流程圖 四程序流程圖3.4.4課題與實訓5 交通燈的設計 一實訓目的 1進一步熟悉單片機I/O接口的線路連接。 2學習順序控制程序的編程技術。 二課題要求 用仿真器的P1口控制4只雙色LED燈,來模擬十字路口交通燈的工作方式, 本次實訓交通燈變化規(guī)律如下:假設一個十字路口是東西南北走向。初始狀態(tài)為東西南北均紅燈。停頓1秒后轉狀態(tài)S1南北綠燈,東西紅燈。延時20秒,轉S2南北綠燈閃3次變黃燈,東西紅燈。再轉S3東西綠燈

35、,南北紅燈。延時20秒,轉S4東西綠燈閃3次變黃燈, 南北紅燈。最后跳轉至S1循環(huán)。 三背景知識 雙色LED燈有三只引腳,工作時,中間引腳接地,另外兩支引腳單獨接高電平時,一種亮紅光,一種亮綠光,兩只引腳同時接高電平時,亮黃光。在本次實訓線路中,P1.0P1.3接雙色LED的綠燈引腳,當P1.0P1.3輸出1時,相應燈亮綠光,P1.4P1.7接雙色LED的紅燈引腳,當P1.4P1.7輸出1時,相應燈亮紅光,如果P1.0和P1.4同時為1,那么RG南亮黃光,其余道理與此一樣。 四硬件電路 (見圖3-10 ) 圖3-10 交通燈電路 ORG 0000HLJMP STARTORG 0100H STA

36、RT:MOV SP,#60H MOV A,#0F0H ;初始狀態(tài)(紅燈)MOV P1,AMOV R2,#10 ;延時1秒 LCALL DELAY S1: MOV A,#69H ;南北綠燈,東西紅燈 MOV P1,A MOV R2,#200 ;延時20秒 LCALL DELAY S2: MOV R3,#03H ;南北綠燈閃3次變黃燈,東西紅燈 GLIS: MOV A,#69H五軟件設計 MOV P1,A MOV R2,#03H LCALL DELAY MOV A,#60H MOV P1,A MOV R2,#03H LCALL DELAY DJNZ R3,GLIS MOV A,#0F9H MOV

37、P1,A MOV R2,#10 ;延時1秒 LCALL DELAY S3: MOV A,#96H ;南北紅燈,東西綠燈 MOV P1,A MOV R2,#200 ;延時20秒 LCALL DELAY S4: MOV R3,#03H ;東西綠燈閃3次變黃燈,南北紅燈GLIS1: MOV A,#96H MOV P1,A MOV R2,#03H LCALL DELAY MOV A,#90H MOV P1,A MOV R2,#03H LCALL DELAY DJNZ R3, GLIS1 MOV A,#0F6H MOV P1,A MOV R2,#10 ;延時1秒 LCALL DELAY LJMP S1D

38、ELAY:MOV R1,#200 ;延時程序 D1:MOV R0,#248 ;延時100毫秒 DJNZ R0,$ DJNZ R1,D1 DJNZ R2,DELAY RET END 六總結與思考 本實訓電路只是用單片機模擬交通燈的管理,真正的交通燈還要考慮到燈的驅動等實際問題。 想一想,如果采用建表方式,程序該如何設計?3.4.5 課題與實訓6 以循環(huán)方式實現(xiàn)流水燈 一實訓目的 1進一步熟悉單片機I/O接口的線路連接。 2學習循環(huán)程序的編程技術。 二課題要求 用單片機的P1口控制8只LED燈,作P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7的依次單燈點亮,間隔0.2秒,接下來

39、8只LED燈全滅1次,間隔0.2秒;然后作P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0的依次單燈點亮,間隔0.2秒,接下來 8只LED燈全滅1次,間隔0.2秒,再從開場狀態(tài)循環(huán),8只LED燈即呈現(xiàn)出流水燈的狀態(tài)。 三背景知識 循環(huán)程序用于需要屢次反復執(zhí)行的一樣操作,因此在編制程序時,首先應該確定的就是有哪些一樣的操作可由循環(huán)局部實現(xiàn)。在該實訓中,我們用數(shù)據(jù)傳送指令向P1.0P1.7一次送數(shù),所以對送出數(shù)據(jù)的處理過程就是一樣的;延時時間都是0.2秒,這也是一樣的,這兩局部都可以用循環(huán)來實現(xiàn)。 在編制具體的循環(huán)程序時,要設置一個存放循環(huán)次數(shù)的存放器,通常選用R2R7中的任何一個

40、來實現(xiàn)R0和R1常用于存放器間接尋址。當然,程序中如果不采用間接尋址方式,R0和R1也可用來存放循環(huán)次數(shù)。程序每循環(huán)一次,循環(huán)次數(shù)存放器內容要減1,當該存放器內容減到0時,表示循環(huán)完畢,這兩個過程可用DJNZ指令實現(xiàn)。 四硬件電路圖3-11 流水燈電路 參考程序如下: ORG 0000H START: MOV A,#0FFH ;設初值 MOV R0,#8 ;移動八次 CLR C ;將CY清0 LOOP1: RLC A ;帶進位位循環(huán)左移 ACALL DELAY ;調延時 DJNZ R0,LOOP1 ;判斷是否左移8次 MOV A,#0FFH ;夠八次,燈全滅 MOV P1,A ACALL DE

41、LAY MOV A,#0FFH ;設初值 MOV R0,#8 ;移動八次 CLR C ;將CY清0五軟件設計 LOOP2: RRC A ;帶進位位循環(huán)右移 MOV P1,A ;送P1口,P1.7燈亮 ACALL DELAY DJNZ R0,LOOP2 ;判斷是否右移8次 MOV A,#0FFH ;夠八次,燈全滅 MOV P1,A ACALL DELAY AJMP START ;重新開場 D1: MOV R6,#200 D2: MOV R7,#123 NOP DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END 六總結與提高 仍采用該實訓電路,每次點亮兩個燈,其它功能不變,程序如何修改?如果只作的循環(huán)閃爍,間隔0.2秒,程序又如何修改?本 章 小 結 用匯編語言編制的源程序構造緊湊、直觀易讀,匯編后生成的目標程序更有運行速度快、占用空間小、實時性強、便于

溫馨提示

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

評論

0/150

提交評論