版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
單片機的編程技術第1頁,課件共70頁,創(chuàng)作于2023年2月
單片機與一般集成電路的區(qū)別在于可編程應用,程序是單片機應用系統(tǒng)的靈魂。
3.1程序設計的方法和技巧3.1.1程序設計流程
由于匯編語言是面向機器的語言,因此對單片機系統(tǒng)進行程序設計時必須考慮硬件資源的配置。當硬件系統(tǒng)設計完成后,可從以下幾方面進行程序設計:第2頁,課件共70頁,創(chuàng)作于2023年2月1.分析問題——針對現(xiàn)有條件,明確在程序設計時應該“做什么”2.確定算法——解決“怎樣做”的問題3.繪制程序流程圖——用圖形的方法描繪解決問題的思路
(常用的程序流程圖符號如圖3-1所示)
4.分配內存單元——確定程序和數(shù)據(jù)區(qū)的起始地址5.編寫源程序——用指令的形式將程序流程圖實現(xiàn)出來6.匯編——用開發(fā)機或仿真器將源程序轉換成機器碼,便于單片機識別7.在線仿真調試——查錯、改錯,對程序進行優(yōu)化。第3頁,課件共70頁,創(chuàng)作于2023年2月常用的程序流程圖符號如圖3-1所示。
圖3-1常用的程序流程圖符號第4頁,課件共70頁,創(chuàng)作于2023年2月3.1.2匯編語言編程技巧
盡量采用模塊化程序設計方法;
這種設計方法是把一個完整的程序分成若干個功能相對獨立的、較小的程序模塊,對各個程序模塊分別進行設計、編制程序和調試,最后把各個調試好的程序模塊裝配起來進行聯(lián)調,最終成為一個有實用價值的程序。模塊化程序設計的優(yōu)點是:對單個程序模塊設計和調試比較方便、容易完成,一個模塊可以被多個任務共用。盡量采用循環(huán)結構和子程序結構
;
采用循環(huán)結構和子程序結構,可以使程序的總容量減小,提高程序的效率,節(jié)省內存。第5頁,課件共70頁,創(chuàng)作于2023年2月盡量少用無條件轉移指令
;
少用無條件轉移指令,可以保證程序的條理更加清晰,從而減少錯誤發(fā)生。充分利用累加器;
累加器是主程序和子程序之間信息傳遞的橋梁,利用累加器傳遞入口參數(shù)或返回參數(shù)比較方便。這時,一般不要把累加器內容壓入堆棧。對于通用子程序要保護現(xiàn)場;
由于子程序的通用性,除了保護子程序入口參數(shù)的寄存器內容外,還要對子程序中用到的其它寄存器內容一并入棧保護。
對于中斷處理,還要保護程序狀態(tài)字
在中斷處理程序中,既要保護處理程序中用到的寄存器內容,還要保護程序狀態(tài)字PSW。否則,當中斷服務程序執(zhí)行結束返回主程序時,整個程序的執(zhí)行可能會被打亂。第6頁,課件共70頁,創(chuàng)作于2023年2月
80C51單片機匯編語言的語句行由4個字段組成,匯編程序能對這種格式正確地進行識別。這4個字段的格式為:
[標號:]操作碼[操作數(shù)]
[;注釋]
括號內的部分可根據(jù)實際情況取舍,各字段之間要用分隔符分隔??捎米鞣指舴姆栍忻疤?、空格、逗號、分號等。如:
MAIN:MOVA,#68H;A←68H3.1.3匯編語言的語句格式第7頁,課件共70頁,創(chuàng)作于2023年2月1.標號
標號是指令的符號地址。有了標號,程序中的其它語句才能很方便地訪問該語句。有關標號的規(guī)定為:標號要由1~8個ASCII碼字符組成,但必須以字母開
頭,其余字符可以是字母、數(shù)字或其它特定字符。不能使用匯編語言已經(jīng)定義了的符號作為標號,如指令
助記符MOV、偽指令記憶符END以及寄存器的符號名
稱R1等。標號后邊必須跟冒號。同一標號在一個程序中只能定義一次,不能重復定義。第8頁,課件共70頁,創(chuàng)作于2023年2月2.操作碼
操作碼用于規(guī)定語句執(zhí)行的操作。它用指令助記符或偽指令助記符表示,是匯編語句中唯一不能空缺的部分。3.操作數(shù)
操作數(shù)用于給指令的操作提供數(shù)據(jù)或地址。在一條語句中,可能沒有操作數(shù),也可能只有1個操作數(shù),還可能同時包含2~3個操作數(shù)。各操作數(shù)之間要以逗號分隔。操作數(shù)一般以下面幾種形式出現(xiàn):常數(shù)工作寄存器名特殊功能寄存器名第9頁,課件共70頁,創(chuàng)作于2023年2月
標號名符號“$”,表示程序計數(shù)器PC的當前值。如:
SJMP$表達式4.注釋
注釋不屬于語句的功能部分,它只是對語句的解釋說明,只要用“;”開頭,就表明以下為注釋內容。使用注釋可使程序文件的編制顯得更加清楚,便于編程人員的閱讀和維護。注釋的長度不限,一行不夠可以換行接著書寫,但換行后仍要以“;”開頭。第10頁,課件共70頁,創(chuàng)作于2023年2月
用戶根據(jù)系統(tǒng)要求用匯編語言或高級語言編好的程序,叫源程序。3.2.1源程序的編輯和匯編
由于通用微型計算機的普及,現(xiàn)在單片機應用系統(tǒng)的程序設計都借助于通用微型計算機。全過程可概括為“機器編輯→交叉匯編→串行傳送”三個部驟,如圖3-2所示。
3.2源程序的編制第11頁,課件共70頁,創(chuàng)作于2023年2月1.編輯
將源程序輸入計算機并進行修改的過程就是編輯。編輯工作一般在通用微型計算機上利用各種編輯軟件完成,故又稱其為機器編輯。編輯完成后,生成一個由匯編指令和偽指令共同組成的ASCII碼文件,其擴展名為“.ASM”。圖3-2單片機匯編語言程序的生成過程
第12頁,課件共70頁,創(chuàng)作于2023年2月
計算機只能識別機器語言,但程序編制人員通常以匯編語言或高級語言編制源程序。這樣,要讓計算機能聽從程序編制人員的指揮,就必須要將匯編語言或高級語言轉換成機器語言,供計算機識別,這個過程稱為匯編(或編譯)。
匯編工作常由匯編軟件來完成。匯編軟件通常具有指令的錯誤識別與提示能力,為編程者迅速查找源程序中的錯誤提供了方便。在匯編過程中,我們只能發(fā)現(xiàn)源程序中的語法錯誤和一般性的邏輯錯誤,但不能檢查程序結構上的錯誤。如果有錯誤,匯編軟件會報告,指出錯誤位置及錯誤類型。程序錯誤被糾正后,要重新進行編譯調試,直至程序匯編無誤為止?,F(xiàn)在常用的匯編方法是交叉匯編,即用PC機中的匯編程序去匯編80C51單片機中的源程序。匯編后生成的機器碼稱為目標程序,擴展名為“.OBJ”。該目標程序可通過PC機的串行通信接口直接傳送到開發(fā)系統(tǒng)的RAM中。
2.匯編第13頁,課件共70頁,創(chuàng)作于2023年2月
在前面的課題與實訓環(huán)節(jié)中用到的ORG和END命令就是典型的偽指令,它們是為下一步的匯編工作提供起始地址和結束地址的。
我們知道,匯編語言程序的機器匯編是由計算機自動完成的,因此在源程序中應該有向匯編程序發(fā)出的命令。
這種在源程序中出現(xiàn),通知匯編程序應該如何完成匯編工作的指令,就是偽指令。
下面介紹80C51單片機常用的偽指令。
3.2.2偽指令第14頁,課件共70頁,創(chuàng)作于2023年2月1.ORG(Origin)匯編起始命令格式為:ORG16位地址或標號該命令總是出現(xiàn)在源程序的開始位置。用來規(guī)定目標程序(即此命令后面的程序或數(shù)據(jù)塊)的起始地址。ORG后面通常是16位地址,也可以是已定義的標號地址或表達式。如ORG1000H。在程序中如果不用ORG規(guī)定起始地址,則匯編得到的目標程序將從0000H開始存放。在一個源程序中,ORG指令可以多次使用,但要求地址值要由小到大依序排列,且不能出現(xiàn)空間上的重疊。2.END匯編結束命令格式為:END
該命令用于中止源程序的匯編工作。END是匯編語言源程序的結束標志,因此在整個源程序中只能有一條END指令,且位于程序的最后。如果END命令出現(xiàn)在源程序中間,對其后面的源程序,計算機將不予匯編。第15頁,課件共70頁,創(chuàng)作于2023年2月3.EQU(Equate)等值命令格式為:
標號名EQU表達式該命令用來給標號賦值。賦值以后,其標號值在整個程序中有效。例如:
DATEQU30H4.DB(DefineByte)定義字節(jié)命令格式為:
[標號:]DB字節(jié)數(shù)據(jù)表該命令用于從標號指定的地址開始,連續(xù)存放字節(jié)數(shù)據(jù)表,常與查表指令MOVC配合使用。其中字節(jié)數(shù)據(jù)表可以是一個或多個字節(jié)數(shù)據(jù)、字符串或表達式。例如:
DB“hello”第16頁,課件共70頁,創(chuàng)作于2023年2月5.DW(DefineWord)定義字命令格式為:
[標號:]DW字數(shù)據(jù)表該命令用于從標號指定的地址開始,連續(xù)存放16位字數(shù)據(jù)表。該數(shù)據(jù)表在程序存儲器中存放的格式為:高8位存放在低地址單元,低8位存放在高地址單元。例如:ORG1000HTABLE:DW1234H,66H……匯編后,(1000H)=12H,(1001H)=34H,(1002H)=00H,(1003H)=66H。DB和DW定義的數(shù)據(jù)表,數(shù)的個數(shù)不能超過80個。如遇數(shù)目較多時,可以使用多個定義命令。在80C51程序設計中,常用DB來定義數(shù)據(jù),DW來定義地址。
第17頁,課件共70頁,創(chuàng)作于2023年2月6.BIT定義位命令格式為:標號名BIT位地址該命令用來將位地址賦值給指定的標號名。例如:KAIGUANBITP1.0將P1.0的位地址賦值給標號KAIGUAN,在后面編程時就可以用KAIGUAN來代替P1.0。7.DS(DefineStorage)定義空間命令格式為:
[標號:]DS表達式該命令用于從指定單元開始,預留一定數(shù)目的字節(jié)單元作存儲區(qū),供程序運行使用。第18頁,課件共70頁,創(chuàng)作于2023年2月
程序結構通常分為三種形式:順序結構、分支結構、循環(huán)結構。形式如圖3-3所示。
圖3-3三種程序結構3.3基本程序結構第19頁,課件共70頁,創(chuàng)作于2023年2月
順序程序是最簡單的程序結構,它既無分支,又無循環(huán),在執(zhí)行時單片機是按程序中指令的順序逐條進行的。
編程注意事項:
正確選擇程序存放的地址:通常主程序起始地址在0100H之后,但由于80C51單片機上電后從0000H開始執(zhí)行,所以必須在0000H設一條轉移指令,轉至主程序首址。
要注意檢查所用指令是否合法,在沒有把握的情況下,最好查一下指令表。如,下面的指令是非法的:
MOVX2002H,2000H
為使程序運行結束時不至于跑飛,可在程序最后加一條暫停指令,如:SJMP$。
3.3.1順序程序第20頁,課件共70頁,創(chuàng)作于2023年2月例1將地址為2000H、2001H、2002H的片外數(shù)據(jù)存儲單元的內容分別傳送到2002H、2003H和2004H單元中去。
ORG0000HAJMP0100H;轉到主程序起始地址
ORG0100HMOVDPTR,#2002H;最后一個數(shù)據(jù)的起始地址
MOVXA,@DPTR;2002H單元的數(shù)據(jù)送AMOVDPTR,#2004H;最后一個數(shù)據(jù)的目的地址
MOVX@DPTR,A;2002H單元的數(shù)據(jù)送2004H單元
MOVDPTR,#2001H;中間數(shù)據(jù)的起始地址第21頁,課件共70頁,創(chuàng)作于2023年2月
MOVXA,@DPTR;2001H單元的數(shù)據(jù)送AMOVDPTR,#2003H;中間數(shù)據(jù)的目的地址
MOVX@DPTR,A;2001H單元的數(shù)據(jù)送2003H單元
MOVDPTR,#2000H;第一個數(shù)據(jù)的起始地址
MOVXA,@DPTR;2000H單元的數(shù)據(jù)送AMOVDPTR,#2002H;第一個數(shù)據(jù)的目的地址
MOVX@DPTR,A;2000H單元的數(shù)據(jù)送2002H單元
SJMP$END<想一想>還可以怎樣修改?
第22頁,課件共70頁,創(chuàng)作于2023年2月
例2已知30H單元存有8位二進制數(shù)的BCD碼,請將其轉換為共陰顯示的字形碼,然后從P1口輸出。設這些字形碼存放在標號為TABLE的存儲單元。程序如下:
ORG0000HAJMPMAIN;轉到主程序起始地址
ORG0100HMAIN:MOVDPTR,#TABLE;字形碼表首地址送DPTRMOVA,30H;取數(shù)
MOVCA,@A+DPTR;查表取值送AMOVP1,A;字形碼送P1SJMP$TABLE:DB3FH,06H,5BH,4FH,66H;0~4共陰字形碼
DB6DH,7DH,07H,7FH,6FH;5~9共陰字形碼
END2.查表程序第23頁,課件共70頁,創(chuàng)作于2023年2月
通常情況下,程序是順序執(zhí)行的,但我們也可以根據(jù)需要,在程序中安排一些控制轉移指令,改變程序的執(zhí)行方向,這就是分支程序。分支程序可以分為單分支和多分支等情況。
單分支程序結構如圖3-3(b)所示。
當條件滿足時順序執(zhí)行程序段A,否則執(zhí)
行程序段B。
多分支結構如圖3-4所示。先將分支
按序號排列,然后按照分支的值來實現(xiàn)
多分支選擇。
圖3-4多分支結構3.3.2 分支程序第24頁,課件共70頁,創(chuàng)作于2023年2月
分支程序在單片機系統(tǒng)中應用較多,在編程時有許多技巧,設計要點如下:
(1)先建立可供條件轉移指令測試的條件。
(2)選用合適的條件轉移指令。
(3)在轉移的目的地址處設定標號。
第25頁,課件共70頁,創(chuàng)作于2023年2月
3已知內RAM30H單元存有一個ASCII碼,試對其進行判斷,如果是“$”(24H),將其存入40H,否則存入31H單元。
程序如下:
ORG0000H
AJMPMAIN
ORG0100H
MAIN:MOVA,30H
CJNEA,#24H,DY31;不是“$”,轉去ZY31
MOV40H,A;是“$”,存入40H單元
AJMPEND0
DY31:MOV31H,A;不是$,存入31H單元
END0:SJMP$
END1.單分支程序第26頁,課件共70頁,創(chuàng)作于2023年2月(1) 位操作程序
例4已知某信號燈電路如圖3-5,試編程實現(xiàn)如下功能:
⑴S0單獨按下,紅燈亮,其余燈滅;
⑵S1單獨按下,綠燈亮,其余燈滅;
⑶S0、S1均按下,紅、綠、黃燈全亮;
⑷都不按下黃燈亮。
圖3-5某信號燈電路參考程序如下:
ORG0000HLJMPSTARTORG0100HSTART:ORLP1,#11000111B;P1.6、P1.7設為輸入,紅綠黃燈滅2.多分支程序第27頁,課件共70頁,創(chuàng)作于2023年2月
SS0:JBP1.7,SS1;S0未按,轉判S1JBP1.6,RED;S0按下,S1未按,轉紅燈亮
DL:CLRP1.2;紅燈亮
CLRP1.1;綠燈亮
CLRP1.0;黃燈亮
SJMPSS0;重新檢測
SS1:JBP1.6,YELLOW;S0未按,S1未按,轉黃燈亮GREEN:CLRP1.1;綠燈亮
SETBP1.2;紅燈滅
SETBP1.0;黃燈滅
SJMPSS0RED:CLRP1.2;紅燈亮
SETBP1.1;綠燈滅
SETBP1.0;黃燈滅
SJMPSS0
第28頁,課件共70頁,創(chuàng)作于2023年2月YELLOW:CLRP1.0;黃燈亮
SETBP1.2;紅燈滅
SETBP1.1;綠燈滅
SJMPSS0END說明:該程序只是說明位操作指令在分支程序中的應用方法,如果真要實現(xiàn)信號燈的點亮,還要在每段燈亮滅指令后加一段延時程序。第29頁,課件共70頁,創(chuàng)作于2023年2月
例5有一巡回檢測報警裝置,需對16路輸入信號進行控制,每路設有一個報警上限值(等于或超出此值即報警,置報警標志F0),設16路輸入信號存放在以50H為首地址的內RAM中,16路報警上限值存在以2000H為首地址的ROM中,試編制該程序。
程序如下:
START:MOVDPTR,#2000H;置16路報警上限值首地址
MOVR0,#50H;置16路輸入信號數(shù)據(jù)區(qū)首地址
MOVR7,#0;置16路輸入信號的序號0LOOP:
MOVR1,@R0;檢測信號存R1MOVA,R7;讀輸入信號序號
MOVCA,@A+DPTR;查找該序號對應的報警上限值
CJNEA,R1,NEXT;與對應的輸入信號比較
AJMPALAM;輸入信號等于報警上限值,轉報警(1)字節(jié)操作程序第30頁,課件共70頁,創(chuàng)作于2023年2月NEXT:JCALAM;輸入信號超出報警上限值,轉報警
INCR0;輸入信號小于報警上限值,指向下一路輸入信號
INCR7;指向下一路輸入信號序號
CJNER7,#16,LOOP;看16路是否全查完?未完繼續(xù)
CLRF0;16路全查完,清報警標志
AJMP$;暫停ALAM:SETBF0;置報警標志
RET第31頁,課件共70頁,創(chuàng)作于2023年2月3.3.3循環(huán)程序
1.循環(huán)結構在程序設計時,常常遇到需要反復執(zhí)行的某種操作,這時可編寫一個程序段重復執(zhí)行,這就是循環(huán)。循環(huán)程序一般包括4部分,如圖3-6所示。對這4部分的含義,我們以例題的形式加以說明。
例6編程實現(xiàn)以下數(shù)據(jù)傳送功能:將BUF為起始地址的50個數(shù)取反后,傳送到以DATA為起始地址的內存單元中。
第32頁,課件共70頁,創(chuàng)作于2023年2月分析:如果采用順序結構編寫,程序會很麻煩,要執(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)結構第33頁,課件共70頁,創(chuàng)作于2023年2月
1.初始化
規(guī)定循環(huán)體中各控制變量的初始狀態(tài)。
2.循環(huán)體
這是循環(huán)程序需要重復執(zhí)行的部分。對這部分編程的時候要注意兩個問題:指令要具有通用性,程序要便于修改。程序盡可能簡化。第34頁,課件共70頁,創(chuàng)作于2023年2月
(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ù)。第35頁,課件共70頁,創(chuàng)作于2023年2月參考程序如下:
START:MOVR0,#SBUF;數(shù)據(jù)的源地址
MOVR1,#DATA;數(shù)據(jù)的目的地址
MOVR7,#50;循環(huán)次數(shù)
LOOP:MOVA,@R0;源地址中數(shù)據(jù)送ACPLA;取反
MOV@R1,A;取反后的數(shù)據(jù)送目的地址
INCR0;源地址加1,準備取下一個數(shù)
INCR1;目的地址加1,準備接收下一個數(shù)
DJNZR7,LOOP;循環(huán)結束?未結束重新取數(shù)
RET
循環(huán)程序按結構分,有單重循環(huán)與多重循環(huán)。在多重循環(huán)中,只允許外重循環(huán)嵌套內重循環(huán);不允許循環(huán)相互交叉,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內部。
第36頁,課件共70頁,創(chuàng)作于2023年2月
2.循環(huán)結構的典型應用——定時
在單片機控制系統(tǒng)中,常有定時的需要,如定時中斷、定時檢測、定時掃描等。定時功能可以使用定時/計數(shù)器實現(xiàn),但更多的是使用定時程序完成。定時程序是典型的循環(huán)程序,它通過執(zhí)行一個具有固定延時時間的循環(huán)體來實現(xiàn)時間的推移,因此,又常把定時程序叫做延時程序。定時程序的延時時間不受器件的限制,只要選擇好循環(huán)初值,就可以實現(xiàn)幾秒、幾分、乃至幾年的時間延遲。
第37頁,課件共70頁,創(chuàng)作于2023年2月(1)單循環(huán)延時單循環(huán)延時是最簡單的定時程序。如:
DELAY:MOVR7,#TIME;TIME是循環(huán)程序控制變
;量,可以取任意值
LOOP:NOPNOPNOPDJNZR7,LOOP
其中的NOP是空操作指令,它不做任何操作,只是消磨時間。該程序段的延時時間可以這樣計算:NOP指令的機器周期是1,DJNZ指令的機器周期是2,因此循環(huán)一次共需5個機器周期。如果單片機的晶振頻率采用12MHz,則一個機器周期是1μs,因此循環(huán)一次的延遲時間是5μs。第38頁,課件共70頁,創(chuàng)作于2023年2月
延時程序中總的延時時間為5×TIME(μs),根據(jù)程序的需要,TIME可以任意取值(不超過8位二進制的表示范圍)。因此該程序的最長延時時間是(TIME=0時)
5×256=1280(μs)
(2)較長時間的延時
單循環(huán)延時的延遲時間較短,為了延長定時時間,可以采用多重循環(huán)的方法。
例7編寫延時1s子程序,要求:晶振采用12MHz,用三重循環(huán)編寫。
分析:用12MHz晶振,機器周期是1μs,程序如下:
DELAY:MOVR7,#20;1μsD1:MOVR6,#200;1μsD2:MOVR5,#123;1μs
第39頁,課件共70頁,創(chuàng)作于2023年2月
NOP;1μsDJNZR5,$;2μs,共(2×123)μsDJNZR6,D2;2μs,共〔(2×123+2+2)
×200〕μs,即50msDJNZR7,D1;2μs,共〔(2×123+2+2)
×200+2+1〕×20+2=1000062μs≈1sRET;2μs
在該程序中,改變不同的寄存器初值,可以實現(xiàn)不同的定時要求。
(3)以一個基本的延時程序滿足不同的定時要求
如果系統(tǒng)中有多個定時需要,我們可以先設計一個基本的延時程序,通過對這個基本延時程序的調用,實現(xiàn)所需的不同定時。如將例7延時1秒的DELAY作為基本的延時程序,則實現(xiàn)5秒、10秒的調用情況如下:第40頁,課件共70頁,創(chuàng)作于2023年2月
MOVR0,#5;5sLOOP1:ACALLDELAY;1sDJNZR0,LOOP1……MOVR0,#10;10sLOOP2:ACALLDELAY;1sDJNZR0,LOOP2……
例8已知某單片機溫控系統(tǒng)每隔50ms測一次溫度,測得的8位溫度值存在特殊功能寄存器SBUF中,請編程求其1s的平均值,并存于60H中。(設1s采樣溫度總和不超過255)程序如下:
AVR1S:MOVR2,#0;溫度初值為0MOVR4,#20;平均次數(shù)為20第41頁,課件共70頁,創(chuàng)作于2023年2月
LOOP:MOVA,SBUF;讀溫度值
ADDA,R2;溫度求和
MOVR2,A;回存
LCALLDELAY50;延時50ms,延時子程序略
DJNZR4,LOOP;20次采樣完否?未完繼續(xù)
MOVA,R2;和存入AMOVB,#20;除數(shù)存入BDIVAB;求均值
MOV60H,ARET
請嘗試編寫延時50ms子程序。第42頁,課件共70頁,創(chuàng)作于2023年2月3.4程序設計實例3.4.1數(shù)據(jù)極值查找程序
極值查找就是在指定的數(shù)據(jù)區(qū)中挑出最大值或最小值。
例9從內部RAM30H單元開始存有8個無符號8位二進制數(shù),請編程查找到最大值,并將其存放于40H單元。
分析:假定在比較過程中,用A存放大數(shù),與之逐個比較的另一個數(shù)存放在2AH單元。流程圖見圖3-7。圖3-7最大值查找程序流程圖第43頁,課件共70頁,創(chuàng)作于2023年2月
程序如下:
MOVR1,#30H;數(shù)據(jù)區(qū)首址
MOVR5,#08H;數(shù)據(jù)區(qū)長度
MOVA,@R1;讀第一個數(shù)
DECR5;修改數(shù)據(jù)長度
LOOP:INCR1MOV2AH,@R1;讀下一個數(shù)
CJNEA,2AH,BJ;數(shù)值比較
AJMPLOOP1BJ:JNCLOOP1;A值大,轉移
MOVA,@R1;大數(shù)送ALOOP1:DJNZR5,LOOP;繼續(xù)
MOV40H,A;最大值送40HSJMP$第44頁,課件共70頁,創(chuàng)作于2023年2月
3.4.2數(shù)碼轉換程序
數(shù)碼轉換通常采用子程序調用的方法進行,即由子程序完成具體的轉換功能,而由主程序組織數(shù)據(jù)和安排結果。例10在內部RAM的SHU16單元存有兩位十六進制數(shù),請將其轉換成ASCII碼,并存放于ASCL(低位的ASCII碼)和ASCH(高位的ASCII碼)兩單元。
主程序如下:
MAIN:MOVSP,#5FH;設堆棧指針
PUSHSHU16;16進制數(shù)進棧
ACALLASC16;調轉換子程序
POPASCL;第一位轉換結果送ASCLMOVA,SHU16;再取原16進制數(shù)
SWAPA;高低半字節(jié)交換
PUSHACC;交換后的16進制數(shù)進棧
ACALLASC16;轉換
POPASCH;第二位轉換結果送ASCHSJMP$第45頁,課件共70頁,創(chuàng)作于2023年2月
子程序如下:
ASC16:DECSP;跳過斷點保護內容PCDECSPPOPACC;彈出轉換數(shù)據(jù)
ANLA,#0FH;屏蔽高位
ADDA,#7;修改變址寄存器指針
MOVCA,@A+PC;查表
PUSHACC;2字節(jié),查表結果進棧
INCSP;2字節(jié),修改斷點指針回到斷點保護內容
INCSP;2字節(jié),
RET;1字節(jié),
ASCTAB:DB'012345678';ASCII碼表
DB'9ABCDEF'END第46頁,課件共70頁,創(chuàng)作于2023年2月
這是一個很典型的程序,在閱讀時應注意這樣兩個問題:
(1)該程序強化了堆棧的使用,這對于大家加深理解堆棧的概念十分有利。在程序中用到了兩種使用堆棧的方法:
用堆棧傳遞數(shù)據(jù)。使要轉換的16進制數(shù)在主程序中進棧(PUSHSHU16)而在子程序中出棧(POPACC),最后再通過堆棧把轉換結果返回主程序(POPASCL)。低位轉換其堆棧的變化見圖3-8;系統(tǒng)在調用子程序時自動完成的PC入棧操作。由于要轉換的16進制數(shù)是在主程序中先于斷點值PC
(ACALLASC16下一條指令的地址)入棧,這樣在子程序中要取出轉換數(shù)據(jù),就得修改堆棧指針SP,以指向該數(shù)據(jù)。第47頁,課件共70頁,創(chuàng)作于2023年2月
(2)在ASCII碼表中,是以字符串的形式列出的16進制數(shù),但在匯編的過程中,寫入存儲單元的是該字符串的ASCII碼形式。圖3-8數(shù)碼轉換程序的堆棧變化圖第48頁,課件共70頁,創(chuàng)作于2023年2月3.4.3課題與實訓4程序設計一.實訓目的
1.熟悉匯編語言的基本格式、偽指令的使用方法。
2.學習單片機應用程序的設計方法。二.課題要求
1.將60H~69H單元存放的10個無符號數(shù)按照從小到大的順序重新排列。
2.選擇課后思考題與習題的部分程序運行并調試出來。三.背景知識
可采用冒泡排序法。冒泡排序法把一批數(shù)據(jù)想象成縱向排列,采用自下而上的方法比較相鄰兩個數(shù)據(jù),如果這兩個數(shù)據(jù)的大小順序符合要求,則保持原樣,否則交換它們的位置。這樣比較一輪后,最小的數(shù)據(jù)就像氣泡一樣浮到最頂上,故稱冒泡排序法。第49頁,課件共70頁,創(chuàng)作于2023年2月
實際編程設計時,每一輪操作都從數(shù)據(jù)區(qū)的首地址開始,向末端推進。一般來講,N個數(shù)據(jù)要進行N-1輪次比較和交換排序。表3-1表示了60H~65H單元存儲數(shù)據(jù)的冒泡排序的執(zhí)行過程。表3-1冒泡排序過程說明第50頁,課件共70頁,創(chuàng)作于2023年2月
假定60H~65H單元存儲的原始數(shù)據(jù)為無序數(shù)列,從最上面開始進行相鄰兩個數(shù)據(jù)的比較,大的數(shù)據(jù)放上面,小的數(shù)據(jù)放下面。第一輪操作,6個數(shù)據(jù)進行6-1=5次比較,最大數(shù)據(jù)58“沉淀”到最下面(65H單元)。第二輪操作58不參加,5個數(shù)據(jù)需比較6-2=4次,5個數(shù)據(jù)中的最大值36“沉淀”到64H單元。對于本例,經(jīng)過三輪操作就可以完成排序。采用冒泡排序法,一般應設立一個標志位,在每輪開始時將標志位清0,在操作過程中出現(xiàn)位置交換,標志位置1,每輪結束時若標志位為0,則說明數(shù)據(jù)已經(jīng)有序,可以提前結束排序,從而提高了效率。第51頁,課件共70頁,創(chuàng)作于2023年2月圖3-9冒泡排序流程圖
四.程序流程圖第52頁,課件共70頁,創(chuàng)作于2023年2月3.4.4課題與實訓5交通燈的設計
一.實訓目的
1.進一步熟悉單片機I/O接口的線路連接。
2.學習順序控制程序的編程技術。
二.課題要求
用仿真器的P1口控制4只雙色LED燈,來模擬十字路口交通燈的工作方式,本次實訓交通燈變化規(guī)律如下:假設一個十字路口是東西南北走向。初始狀態(tài)為東西南北均紅燈。停頓1秒后轉狀態(tài)S1(南北綠燈,東西紅燈)。延時20秒,轉S2(南北綠燈閃3次變黃燈,東西紅燈)。再轉S3(東西綠燈,南北紅燈)。延時20秒,轉S4(東西綠燈閃3次變黃燈,南北紅燈)。最后跳轉至S1循環(huán)。第53頁,課件共70頁,創(chuàng)作于2023年2月
三.背景知識
雙色LED燈有三只引腳,工作時,中間引腳接地,另外兩支引腳單獨接高電平時,一種亮紅光,一種亮綠光,兩只引腳同時接高電平時,亮黃光。在本次實訓線路中,P1.0~P1.3接雙色LED的綠燈引腳,當P1.0~P1.3輸出1時,相應燈亮綠光,P1.4~P1.7接雙色LED的紅燈引腳,當P1.4~P1.7輸出1時,相應燈亮紅光,如果P1.0和P1.4同時為1,則RG南亮黃光,其余道理與此相同。四.硬件電路
(見圖3-10
)
圖3-10交通燈電路第54頁,課件共70頁,創(chuàng)作于2023年2月ORG0000H LJMPSTART ORG0100H START:MOVSP,#60HMOVA,#0F0H;初始狀態(tài)(紅燈) MOVP1,A MOVR2,#10;延時1秒
LCALLDELAYS1:MOVA,#69H;南北綠燈,東西紅燈
MOVP1,A MOVR2,#200;延時20秒
LCALLDELAYS2:MOVR3,#03H;南北綠燈閃3次變黃燈,東西紅燈
GLIS:MOVA,#69H
五.軟件設計第55頁,課件共70頁,創(chuàng)作于2023年2月
MOVP1,A MOVR2,#03H LCALLDELAY MOVA,#60H MOVP1,A MOVR2,#03H LCALLDELAY DJNZR3,GLIS MOVA,#0F9H MOVP1,A MOVR2,#10;延時1秒
LCALLDELAYS3:MOVA,#96H;南北紅燈,東西綠燈
MOVP1,A MOVR2,#200;延時20秒
LCALLDELAY第56頁,課件共70頁,創(chuàng)作于2023年2月
S4:MOVR3,#03H;東西綠燈閃3次變黃燈,南北紅燈GLIS1:MOVA,#96H MOVP1,A MOVR2,#03H LCALLDELAY MOVA,#90H MOVP1,A MOVR2,#03H LCALLDELAY DJNZR3,GLIS1 MOVA,#0F6H MOVP1,A MOVR2,#10;延時1秒
LCALLDELAY LJMPS1第57頁,課件共70頁,創(chuàng)作于2023年2月DELAY:MOVR1,#200;延時程序
D1:MOVR0,#248;延時100毫秒
DJNZR0,$DJNZR1,D1DJNZR2,DELAYRETEND
六.總結與思考
本實訓電路只是用單片機模擬交通燈的管理,真正的交通燈還要考慮到燈的驅動等實際問題。
想一想,如果采用建表方式,程序該如何設計?第58頁,課件共70頁,創(chuàng)作于2023年2月3.4.5課題與實訓6以循環(huán)方式實現(xiàn)流水燈
一.實訓目的
1.進一步熟悉單片機I/O接口的線路連接。
2.學習循環(huán)程序的編程技術。二.課題要求
用單片機的P1口控制8只LED燈,作P1.0→P1.1→P1.2→P1.3→P1.4→P1.5→P1.6→P1.7的依次單燈點亮,間隔0.2秒,接下來8只LED燈全滅1次,間隔0.2秒;然后作P1.7→P1.6→P1.5→P1.4→P1.3→P1.2→P1.1→P1.0的依次單燈點亮,間隔0.2秒,接下來8只LED燈全滅1次,間隔0.2秒,再從開始狀態(tài)循環(huán),8只LED燈即呈現(xiàn)出流水燈的狀態(tài)。第59頁,課件共70頁,創(chuàng)作于2023年2月
三.背景知識
循環(huán)程序用于需要多次反復執(zhí)行的相同操作,因此在編制程序時,首先應該確定的就是有哪些相同的操作可由循環(huán)部分實現(xiàn)。在該實訓中,我們用數(shù)據(jù)傳送指令向P1.0→P1.7一次送數(shù),所以對送出數(shù)據(jù)的處理過程就是相同的;延時時間都是0.2秒,這也是相同的,這兩部分都可以用循環(huán)來實現(xiàn)。
在編制具體的循環(huán)程序時,要設置一個存放循環(huán)次數(shù)的寄存器,通常選用R2~R7中的任何一個來實現(xiàn)(R0和R1常用于寄存器間接尋址。當然,程序中如果不采用間接尋址方式,R0和R1也可用來存放循環(huán)次數(shù))。程序每循環(huán)一次,循環(huán)次數(shù)寄存器內容要減1,當該寄存器內容減到0時,表示循環(huán)結束,這兩個過程可用DJNZ指令實現(xiàn)。第60頁,課件共70頁,創(chuàng)作于2023年2月
四.硬件電路圖3-11流水燈電路第61頁,課件共70頁,創(chuàng)作于2023年2月
參考程序如下:
ORG0000HSTART:MOV
A,#0FFH;設初值
MOV
R0,#8;移動八次
CLR
C;將CY清0LOOP1:RLC
A;帶進位位循環(huán)左移
MOV
P1,A;送P1口,P1.0燈亮
ACALL
DELAY;調延時
DJNZR0,
LOOP1;判斷是否左移8次
MOV
A,#0FFH;夠八次,燈全滅
MOV
P1,AACALL
DELAYMOV
A,#0FFH;設初值
MOV
R0,#8;移動八次
CLR
C;將CY清0五.軟件設計第62頁,課件共70頁,創(chuàng)作于2023年2月
LOOP2:RRC
A;帶進位位循環(huán)右移
MOV
P1,A;送P1口,P1.7燈亮
ACALL
DELAYDJNZ
R0,LOOP2;判斷是否右移8次
MOV
A,#0FFH;夠八次,燈全滅
MOV
P1,AACALL
DELAYAJMP
START;重新開始
DELAY:MOV
R5,#4;延時0.2秒
D1:MOV
R6,#200D2:MOV
R7,#123NOPDJNZ
R7,$DJNZ
R6,D2
第63頁,課件共70頁,創(chuàng)作于2023年2月
DJNZ
R5,
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 探索 3 物聯(lián)網(wǎng)的定位技術 課件 2024-2025學年蘇科版(2023) 初中信息技術八年級上冊
- 5年中考3年模擬試卷初中道德與法治九年級下冊01第1課時走向世界大舞臺
- 校園消防安全隱患排查表
- 人教版小學四年級下冊音樂教案1
- 2024-2025學年專題20.4 電動機-九年級物理人教版含答案
- (統(tǒng)考版)2023版高考化學一輪復習第八章水溶液中的離子平衡第1講弱電解質的電離平衡學生用書
- 交地居間協(xié)議樣本
- 保險代理居間介紹合同范本
- 產業(yè)園區(qū)砂石料配送合同
- 化妝品專柜運輸管理協(xié)議
- 部編版(2024版)七年級歷史上冊第12課《大一統(tǒng)王朝的鞏固》精美課件
- 構建安全生產風險管控“六項機制”工作實施方案
- 雨季施工安全措施
- 2024年安全月全員消防安全知識培訓
- 2024年遼寧沈陽水務集團限公司社會公開招聘24公開引進高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- 消防設施操作員之消防設備中級技能自測模擬預測題庫(名校卷)
- 高中物理必修三第九章《靜電場及其應用》測試題(有答案解析)
- 安全標準化建設事件事故管理事故事件統(tǒng)計分析臺賬
- 2023年中國(教育部)留學服務中心招聘考試真題及答案
- 三視圖的形成及其對應關系
- PCB制造成本參數(shù)
評論
0/150
提交評論