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

下載本文檔

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

文檔簡介

單片機的編程技術(shù)第1頁,共70頁,2023年,2月20日,星期一

單片機與一般集成電路的區(qū)別在于可編程應(yīng)用,程序是單片機應(yīng)用系統(tǒng)的靈魂。

3.1程序設(shè)計的方法和技巧3.1.1程序設(shè)計流程

由于匯編語言是面向機器的語言,因此對單片機系統(tǒng)進行程序設(shè)計時必須考慮硬件資源的配置。當(dāng)硬件系統(tǒng)設(shè)計完成后,可從以下幾方面進行程序設(shè)計:第2頁,共70頁,2023年,2月20日,星期一1.分析問題——針對現(xiàn)有條件,明確在程序設(shè)計時應(yīng)該“做什么”2.確定算法——解決“怎樣做”的問題3.繪制程序流程圖——用圖形的方法描繪解決問題的思路

(常用的程序流程圖符號如圖3-1所示)

4.分配內(nèi)存單元——確定程序和數(shù)據(jù)區(qū)的起始地址5.編寫源程序——用指令的形式將程序流程圖實現(xiàn)出來6.匯編——用開發(fā)機或仿真器將源程序轉(zhuǎn)換成機器碼,便于單片機識別7.在線仿真調(diào)試——查錯、改錯,對程序進行優(yōu)化。第3頁,共70頁,2023年,2月20日,星期一常用的程序流程圖符號如圖3-1所示。

圖3-1常用的程序流程圖符號第4頁,共70頁,2023年,2月20日,星期一3.1.2匯編語言編程技巧

盡量采用模塊化程序設(shè)計方法;

這種設(shè)計方法是把一個完整的程序分成若干個功能相對獨立的、較小的程序模塊,對各個程序模塊分別進行設(shè)計、編制程序和調(diào)試,最后把各個調(diào)試好的程序模塊裝配起來進行聯(lián)調(diào),最終成為一個有實用價值的程序。模塊化程序設(shè)計的優(yōu)點是:對單個程序模塊設(shè)計和調(diào)試比較方便、容易完成,一個模塊可以被多個任務(wù)共用。盡量采用循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)

;

采用循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu),可以使程序的總?cè)萘繙p小,提高程序的效率,節(jié)省內(nèi)存。第5頁,共70頁,2023年,2月20日,星期一盡量少用無條件轉(zhuǎn)移指令

;

少用無條件轉(zhuǎn)移指令,可以保證程序的條理更加清晰,從而減少錯誤發(fā)生。充分利用累加器;

累加器是主程序和子程序之間信息傳遞的橋梁,利用累加器傳遞入口參數(shù)或返回參數(shù)比較方便。這時,一般不要把累加器內(nèi)容壓入堆棧。對于通用子程序要保護現(xiàn)場;

由于子程序的通用性,除了保護子程序入口參數(shù)的寄存器內(nèi)容外,還要對子程序中用到的其它寄存器內(nèi)容一并入棧保護。

對于中斷處理,還要保護程序狀態(tài)字

在中斷處理程序中,既要保護處理程序中用到的寄存器內(nèi)容,還要保護程序狀態(tài)字PSW。否則,當(dāng)中斷服務(wù)程序執(zhí)行結(jié)束返回主程序時,整個程序的執(zhí)行可能會被打亂。第6頁,共70頁,2023年,2月20日,星期一

80C51單片機匯編語言的語句行由4個字段組成,匯編程序能對這種格式正確地進行識別。這4個字段的格式為:

[標(biāo)號:]操作碼[操作數(shù)]

[;注釋]

括號內(nèi)的部分可根據(jù)實際情況取舍,各字段之間要用分隔符分隔??捎米鞣指舴姆栍忻疤?、空格、逗號、分號等。如:

MAIN:MOVA,#68H;A←68H3.1.3匯編語言的語句格式第7頁,共70頁,2023年,2月20日,星期一1.標(biāo)號

標(biāo)號是指令的符號地址。有了標(biāo)號,程序中的其它語句才能很方便地訪問該語句。有關(guān)標(biāo)號的規(guī)定為:標(biāo)號要由1~8個ASCII碼字符組成,但必須以字母開

頭,其余字符可以是字母、數(shù)字或其它特定字符。不能使用匯編語言已經(jīng)定義了的符號作為標(biāo)號,如指令

助記符MOV、偽指令記憶符END以及寄存器的符號名

稱R1等。標(biāo)號后邊必須跟冒號。同一標(biāo)號在一個程序中只能定義一次,不能重復(fù)定義。第8頁,共70頁,2023年,2月20日,星期一2.操作碼

操作碼用于規(guī)定語句執(zhí)行的操作。它用指令助記符或偽指令助記符表示,是匯編語句中唯一不能空缺的部分。3.操作數(shù)

操作數(shù)用于給指令的操作提供數(shù)據(jù)或地址。在一條語句中,可能沒有操作數(shù),也可能只有1個操作數(shù),還可能同時包含2~3個操作數(shù)。各操作數(shù)之間要以逗號分隔。操作數(shù)一般以下面幾種形式出現(xiàn):常數(shù)工作寄存器名特殊功能寄存器名第9頁,共70頁,2023年,2月20日,星期一

標(biāo)號名符號“$”,表示程序計數(shù)器PC的當(dāng)前值。如:

SJMP$表達式4.注釋

注釋不屬于語句的功能部分,它只是對語句的解釋說明,只要用“;”開頭,就表明以下為注釋內(nèi)容。使用注釋可使程序文件的編制顯得更加清楚,便于編程人員的閱讀和維護。注釋的長度不限,一行不夠可以換行接著書寫,但換行后仍要以“;”開頭。第10頁,共70頁,2023年,2月20日,星期一

用戶根據(jù)系統(tǒng)要求用匯編語言或高級語言編好的程序,叫源程序。3.2.1源程序的編輯和匯編

由于通用微型計算機的普及,現(xiàn)在單片機應(yīng)用系統(tǒng)的程序設(shè)計都借助于通用微型計算機。全過程可概括為“機器編輯→交叉匯編→串行傳送”三個部驟,如圖3-2所示。

3.2源程序的編制第11頁,共70頁,2023年,2月20日,星期一1.編輯

將源程序輸入計算機并進行修改的過程就是編輯。編輯工作一般在通用微型計算機上利用各種編輯軟件完成,故又稱其為機器編輯。編輯完成后,生成一個由匯編指令和偽指令共同組成的ASCII碼文件,其擴展名為“.ASM”。圖3-2單片機匯編語言程序的生成過程

第12頁,共70頁,2023年,2月20日,星期一

計算機只能識別機器語言,但程序編制人員通常以匯編語言或高級語言編制源程序。這樣,要讓計算機能聽從程序編制人員的指揮,就必須要將匯編語言或高級語言轉(zhuǎn)換成機器語言,供計算機識別,這個過程稱為匯編(或編譯)。

匯編工作常由匯編軟件來完成。匯編軟件通常具有指令的錯誤識別與提示能力,為編程者迅速查找源程序中的錯誤提供了方便。在匯編過程中,我們只能發(fā)現(xiàn)源程序中的語法錯誤和一般性的邏輯錯誤,但不能檢查程序結(jié)構(gòu)上的錯誤。如果有錯誤,匯編軟件會報告,指出錯誤位置及錯誤類型。程序錯誤被糾正后,要重新進行編譯調(diào)試,直至程序匯編無誤為止?,F(xiàn)在常用的匯編方法是交叉匯編,即用PC機中的匯編程序去匯編80C51單片機中的源程序。匯編后生成的機器碼稱為目標(biāo)程序,擴展名為“.OBJ”。該目標(biāo)程序可通過PC機的串行通信接口直接傳送到開發(fā)系統(tǒng)的RAM中。

2.匯編第13頁,共70頁,2023年,2月20日,星期一

在前面的課題與實訓(xùn)環(huán)節(jié)中用到的ORG和END命令就是典型的偽指令,它們是為下一步的匯編工作提供起始地址和結(jié)束地址的。

我們知道,匯編語言程序的機器匯編是由計算機自動完成的,因此在源程序中應(yīng)該有向匯編程序發(fā)出的命令。

這種在源程序中出現(xiàn),通知匯編程序應(yīng)該如何完成匯編工作的指令,就是偽指令。

下面介紹80C51單片機常用的偽指令。

3.2.2偽指令第14頁,共70頁,2023年,2月20日,星期一1.ORG(Origin)匯編起始命令格式為:ORG16位地址或標(biāo)號該命令總是出現(xiàn)在源程序的開始位置。用來規(guī)定目標(biāo)程序(即此命令后面的程序或數(shù)據(jù)塊)的起始地址。ORG后面通常是16位地址,也可以是已定義的標(biāo)號地址或表達式。如ORG1000H。在程序中如果不用ORG規(guī)定起始地址,則匯編得到的目標(biāo)程序?qū)?000H開始存放。在一個源程序中,ORG指令可以多次使用,但要求地址值要由小到大依序排列,且不能出現(xiàn)空間上的重疊。2.END匯編結(jié)束命令格式為:END

該命令用于中止源程序的匯編工作。END是匯編語言源程序的結(jié)束標(biāo)志,因此在整個源程序中只能有一條END指令,且位于程序的最后。如果END命令出現(xiàn)在源程序中間,對其后面的源程序,計算機將不予匯編。第15頁,共70頁,2023年,2月20日,星期一3.EQU(Equate)等值命令格式為:

標(biāo)號名EQU表達式該命令用來給標(biāo)號賦值。賦值以后,其標(biāo)號值在整個程序中有效。例如:

DATEQU30H4.DB(DefineByte)定義字節(jié)命令格式為:

[標(biāo)號:]DB字節(jié)數(shù)據(jù)表該命令用于從標(biāo)號指定的地址開始,連續(xù)存放字節(jié)數(shù)據(jù)表,常與查表指令MOVC配合使用。其中字節(jié)數(shù)據(jù)表可以是一個或多個字節(jié)數(shù)據(jù)、字符串或表達式。例如:

DB“hello”第16頁,共70頁,2023年,2月20日,星期一5.DW(DefineWord)定義字命令格式為:

[標(biāo)號:]DW字?jǐn)?shù)據(jù)表該命令用于從標(biāo)號指定的地址開始,連續(xù)存放16位字?jǐn)?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程序設(shè)計中,常用DB來定義數(shù)據(jù),DW來定義地址。

第17頁,共70頁,2023年,2月20日,星期一6.BIT定義位命令格式為:標(biāo)號名BIT位地址該命令用來將位地址賦值給指定的標(biāo)號名。例如:KAIGUANBITP1.0將P1.0的位地址賦值給標(biāo)號KAIGUAN,在后面編程時就可以用KAIGUAN來代替P1.0。7.DS(DefineStorage)定義空間命令格式為:

[標(biāo)號:]DS表達式該命令用于從指定單元開始,預(yù)留一定數(shù)目的字節(jié)單元作存儲區(qū),供程序運行使用。第18頁,共70頁,2023年,2月20日,星期一

程序結(jié)構(gòu)通常分為三種形式:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。形式如圖3-3所示。

圖3-3三種程序結(jié)構(gòu)3.3基本程序結(jié)構(gòu)第19頁,共70頁,2023年,2月20日,星期一

順序程序是最簡單的程序結(jié)構(gòu),它既無分支,又無循環(huán),在執(zhí)行時單片機是按程序中指令的順序逐條進行的。

編程注意事項:

正確選擇程序存放的地址:通常主程序起始地址在0100H之后,但由于80C51單片機上電后從0000H開始執(zhí)行,所以必須在0000H設(shè)一條轉(zhuǎn)移指令,轉(zhuǎn)至主程序首址。

要注意檢查所用指令是否合法,在沒有把握的情況下,最好查一下指令表。如,下面的指令是非法的:

MOVX2002H,2000H

為使程序運行結(jié)束時不至于跑飛,可在程序最后加一條暫停指令,如:SJMP$。

3.3.1順序程序第20頁,共70頁,2023年,2月20日,星期一例1將地址為2000H、2001H、2002H的片外數(shù)據(jù)存儲單元的內(nèi)容分別傳送到2002H、2003H和2004H單元中去。

ORG0000HAJMP0100H;轉(zhuǎn)到主程序起始地址

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頁,2023年,2月20日,星期一

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頁,2023年,2月20日,星期一

例2已知30H單元存有8位二進制數(shù)的BCD碼,請將其轉(zhuǎn)換為共陰顯示的字形碼,然后從P1口輸出。設(shè)這些字形碼存放在標(biāo)號為TABLE的存儲單元。程序如下:

ORG0000HAJMPMAIN;轉(zhuǎn)到主程序起始地址

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頁,2023年,2月20日,星期一

通常情況下,程序是順序執(zhí)行的,但我們也可以根據(jù)需要,在程序中安排一些控制轉(zhuǎn)移指令,改變程序的執(zhí)行方向,這就是分支程序。分支程序可以分為單分支和多分支等情況。

單分支程序結(jié)構(gòu)如圖3-3(b)所示。

當(dāng)條件滿足時順序執(zhí)行程序段A,否則執(zhí)

行程序段B。

多分支結(jié)構(gòu)如圖3-4所示。先將分支

按序號排列,然后按照分支的值來實現(xiàn)

多分支選擇。

圖3-4多分支結(jié)構(gòu)3.3.2 分支程序第24頁,共70頁,2023年,2月20日,星期一

分支程序在單片機系統(tǒng)中應(yīng)用較多,在編程時有許多技巧,設(shè)計要點如下:

(1)先建立可供條件轉(zhuǎn)移指令測試的條件。

(2)選用合適的條件轉(zhuǎn)移指令。

(3)在轉(zhuǎn)移的目的地址處設(shè)定標(biāo)號。

第25頁,共70頁,2023年,2月20日,星期一

3已知內(nèi)RAM30H單元存有一個ASCII碼,試對其進行判斷,如果是“$”(24H),將其存入40H,否則存入31H單元。

程序如下:

ORG0000H

AJMPMAIN

ORG0100H

MAIN:MOVA,30H

CJNEA,#24H,DY31;不是“$”,轉(zhuǎn)去ZY31

MOV40H,A;是“$”,存入40H單元

AJMPEND0

DY31:MOV31H,A;不是$,存入31H單元

END0:SJMP$

END1.單分支程序第26頁,共70頁,2023年,2月20日,星期一(1) 位操作程序

例4已知某信號燈電路如圖3-5,試編程實現(xiàn)如下功能:

⑴S0單獨按下,紅燈亮,其余燈滅;

⑵S1單獨按下,綠燈亮,其余燈滅;

⑶S0、S1均按下,紅、綠、黃燈全亮;

⑷都不按下黃燈亮。

圖3-5某信號燈電路參考程序如下:

ORG0000HLJMPSTARTORG0100HSTART:ORLP1,#11000111B;P1.6、P1.7設(shè)為輸入,紅綠黃燈滅2.多分支程序第27頁,共70頁,2023年,2月20日,星期一

SS0:JBP1.7,SS1;S0未按,轉(zhuǎn)判S1JBP1.6,RED;S0按下,S1未按,轉(zhuǎn)紅燈亮

DL:CLRP1.2;紅燈亮

CLRP1.1;綠燈亮

CLRP1.0;黃燈亮

SJMPSS0;重新檢測

SS1:JBP1.6,YELLOW;S0未按,S1未按,轉(zhuǎn)黃燈亮GREEN:CLRP1.1;綠燈亮

SETBP1.2;紅燈滅

SETBP1.0;黃燈滅

SJMPSS0RED:CLRP1.2;紅燈亮

SETBP1.1;綠燈滅

SETBP1.0;黃燈滅

SJMPSS0

第28頁,共70頁,2023年,2月20日,星期一YELLOW:CLRP1.0;黃燈亮

SETBP1.2;紅燈滅

SETBP1.1;綠燈滅

SJMPSS0END說明:該程序只是說明位操作指令在分支程序中的應(yīng)用方法,如果真要實現(xiàn)信號燈的點亮,還要在每段燈亮滅指令后加一段延時程序。第29頁,共70頁,2023年,2月20日,星期一

例5有一巡回檢測報警裝置,需對16路輸入信號進行控制,每路設(shè)有一個報警上限值(等于或超出此值即報警,置報警標(biāo)志F0),設(shè)16路輸入信號存放在以50H為首地址的內(nèi)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;查找該序號對應(yīng)的報警上限值

CJNEA,R1,NEXT;與對應(yīng)的輸入信號比較

AJMPALAM;輸入信號等于報警上限值,轉(zhuǎn)報警(1)字節(jié)操作程序第30頁,共70頁,2023年,2月20日,星期一NEXT:JCALAM;輸入信號超出報警上限值,轉(zhuǎn)報警

INCR0;輸入信號小于報警上限值,指向下一路輸入信號

INCR7;指向下一路輸入信號序號

CJNER7,#16,LOOP;看16路是否全查完?未完繼續(xù)

CLRF0;16路全查完,清報警標(biāo)志

AJMP$;暫停ALAM:SETBF0;置報警標(biāo)志

RET第31頁,共70頁,2023年,2月20日,星期一3.3.3循環(huán)程序

1.循環(huán)結(jié)構(gòu)在程序設(shè)計時,常常遇到需要反復(fù)執(zhí)行的某種操作,這時可編寫一個程序段重復(fù)執(zhí)行,這就是循環(huán)。循環(huán)程序一般包括4部分,如圖3-6所示。對這4部分的含義,我們以例題的形式加以說明。

例6編程實現(xiàn)以下數(shù)據(jù)傳送功能:將BUF為起始地址的50個數(shù)取反后,傳送到以DATA為起始地址的內(nèi)存單元中。

第32頁,共70頁,2023年,2月20日,星期一分析:如果采用順序結(jié)構(gòu)編寫,程序會很麻煩,要執(zhí)行50次從源地址中取數(shù)的MOV指令,50次數(shù)據(jù)取反的CPL指令,50次向目的地址送數(shù)的MOV指令。經(jīng)過觀察,我們發(fā)現(xiàn),可以把順序結(jié)構(gòu)中重復(fù)執(zhí)行的部分提取出來,編成一個獨立的小程序段(即循環(huán)體部分),然后對這個小程序段重復(fù)執(zhí)行50次(循環(huán)次數(shù)),這就構(gòu)成了循環(huán)。圖3-6循環(huán)結(jié)構(gòu)第33頁,共70頁,2023年,2月20日,星期一

1.初始化

規(guī)定循環(huán)體中各控制變量的初始狀態(tài)。

2.循環(huán)體

這是循環(huán)程序需要重復(fù)執(zhí)行的部分。對這部分編程的時候要注意兩個問題:指令要具有通用性,程序要便于修改。程序盡可能簡化。第34頁,共70頁,2023年,2月20日,星期一

(3)循環(huán)修改

循環(huán)程序每執(zhí)行一次,都要對數(shù)據(jù)的地址指針、循環(huán)次數(shù)等作一次修改,這就是循環(huán)修改。

(4)循環(huán)控制

根據(jù)循環(huán)結(jié)束條件,判斷循環(huán)是否結(jié)束。常用作循環(huán)控制的變量是循環(huán)次數(shù)。第35頁,共70頁,2023年,2月20日,星期一參考程序如下:

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,準(zhǔn)備取下一個數(shù)

INCR1;目的地址加1,準(zhǔn)備接收下一個數(shù)

DJNZR7,LOOP;循環(huán)結(jié)束?未結(jié)束重新取數(shù)

RET

循環(huán)程序按結(jié)構(gòu)分,有單重循環(huán)與多重循環(huán)。在多重循環(huán)中,只允許外重循環(huán)嵌套內(nèi)重循環(huán);不允許循環(huán)相互交叉,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部。

第36頁,共70頁,2023年,2月20日,星期一

2.循環(huán)結(jié)構(gòu)的典型應(yīng)用——定時

在單片機控制系統(tǒng)中,常有定時的需要,如定時中斷、定時檢測、定時掃描等。定時功能可以使用定時/計數(shù)器實現(xiàn),但更多的是使用定時程序完成。定時程序是典型的循環(huán)程序,它通過執(zhí)行一個具有固定延時時間的循環(huán)體來實現(xiàn)時間的推移,因此,又常把定時程序叫做延時程序。定時程序的延時時間不受器件的限制,只要選擇好循環(huán)初值,就可以實現(xiàn)幾秒、幾分、乃至幾年的時間延遲。

第37頁,共70頁,2023年,2月20日,星期一(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頁,2023年,2月20日,星期一

延時程序中總的延時時間為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頁,2023年,2月20日,星期一

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)中有多個定時需要,我們可以先設(shè)計一個基本的延時程序,通過對這個基本延時程序的調(diào)用,實現(xiàn)所需的不同定時。如將例7延時1秒的DELAY作為基本的延時程序,則實現(xiàn)5秒、10秒的調(diào)用情況如下:第40頁,共70頁,2023年,2月20日,星期一

MOVR0,#5;5sLOOP1:ACALLDELAY;1sDJNZR0,LOOP1……MOVR0,#10;10sLOOP2:ACALLDELAY;1sDJNZR0,LOOP2……

例8已知某單片機溫控系統(tǒng)每隔50ms測一次溫度,測得的8位溫度值存在特殊功能寄存器SBUF中,請編程求其1s的平均值,并存于60H中。(設(shè)1s采樣溫度總和不超過255)程序如下:

AVR1S:MOVR2,#0;溫度初值為0MOVR4,#20;平均次數(shù)為20第41頁,共70頁,2023年,2月20日,星期一

LOOP:MOVA,SBUF;讀溫度值

ADDA,R2;溫度求和

MOVR2,A;回存

LCALLDELAY50;延時50ms,延時子程序略

DJNZR4,LOOP;20次采樣完否?未完繼續(xù)

MOVA,R2;和存入AMOVB,#20;除數(shù)存入BDIVAB;求均值

MOV60H,ARET

請嘗試編寫延時50ms子程序。第42頁,共70頁,2023年,2月20日,星期一3.4程序設(shè)計實例3.4.1數(shù)據(jù)極值查找程序

極值查找就是在指定的數(shù)據(jù)區(qū)中挑出最大值或最小值。

例9從內(nèi)部RAM30H單元開始存有8個無符號8位二進制數(shù),請編程查找到最大值,并將其存放于40H單元。

分析:假定在比較過程中,用A存放大數(shù),與之逐個比較的另一個數(shù)存放在2AH單元。流程圖見圖3-7。圖3-7最大值查找程序流程圖第43頁,共70頁,2023年,2月20日,星期一

程序如下:

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值大,轉(zhuǎn)移

MOVA,@R1;大數(shù)送ALOOP1:DJNZR5,LOOP;繼續(xù)

MOV40H,A;最大值送40HSJMP$第44頁,共70頁,2023年,2月20日,星期一

3.4.2數(shù)碼轉(zhuǎn)換程序

數(shù)碼轉(zhuǎn)換通常采用子程序調(diào)用的方法進行,即由子程序完成具體的轉(zhuǎn)換功能,而由主程序組織數(shù)據(jù)和安排結(jié)果。例10在內(nèi)部RAM的SHU16單元存有兩位十六進制數(shù),請將其轉(zhuǎn)換成ASCII碼,并存放于ASCL(低位的ASCII碼)和ASCH(高位的ASCII碼)兩單元。

主程序如下:

MAIN:MOVSP,#5FH;設(shè)堆棧指針

PUSHSHU16;16進制數(shù)進棧

ACALLASC16;調(diào)轉(zhuǎn)換子程序

POPASCL;第一位轉(zhuǎn)換結(jié)果送ASCLMOVA,SHU16;再取原16進制數(shù)

SWAPA;高低半字節(jié)交換

PUSHACC;交換后的16進制數(shù)進棧

ACALLASC16;轉(zhuǎn)換

POPASCH;第二位轉(zhuǎn)換結(jié)果送ASCHSJMP$第45頁,共70頁,2023年,2月20日,星期一

子程序如下:

ASC16:DECSP;跳過斷點保護內(nèi)容PCDECSPPOPACC;彈出轉(zhuǎn)換數(shù)據(jù)

ANLA,#0FH;屏蔽高位

ADDA,#7;修改變址寄存器指針

MOVCA,@A+PC;查表

PUSHACC;2字節(jié),查表結(jié)果進棧

INCSP;2字節(jié),修改斷點指針回到斷點保護內(nèi)容

INCSP;2字節(jié),

RET;1字節(jié),

ASCTAB:DB'012345678';ASCII碼表

DB'9ABCDEF'END第46頁,共70頁,2023年,2月20日,星期一

這是一個很典型的程序,在閱讀時應(yīng)注意這樣兩個問題:

(1)該程序強化了堆棧的使用,這對于大家加深理解堆棧的概念十分有利。在程序中用到了兩種使用堆棧的方法:

用堆棧傳遞數(shù)據(jù)。使要轉(zhuǎn)換的16進制數(shù)在主程序中進棧(PUSHSHU16)而在子程序中出棧(POPACC),最后再通過堆棧把轉(zhuǎn)換結(jié)果返回主程序(POPASCL)。低位轉(zhuǎn)換其堆棧的變化見圖3-8;系統(tǒng)在調(diào)用子程序時自動完成的PC入棧操作。由于要轉(zhuǎn)換的16進制數(shù)是在主程序中先于斷點值PC

(ACALLASC16下一條指令的地址)入棧,這樣在子程序中要取出轉(zhuǎn)換數(shù)據(jù),就得修改堆棧指針SP,以指向該數(shù)據(jù)。第47頁,共70頁,2023年,2月20日,星期一

(2)在ASCII碼表中,是以字符串的形式列出的16進制數(shù),但在匯編的過程中,寫入存儲單元的是該字符串的ASCII碼形式。圖3-8數(shù)碼轉(zhuǎn)換程序的堆棧變化圖第48頁,共70頁,2023年,2月20日,星期一3.4.3課題與實訓(xùn)4程序設(shè)計一.實訓(xùn)目的

1.熟悉匯編語言的基本格式、偽指令的使用方法。

2.學(xué)習(xí)單片機應(yīng)用程序的設(shè)計方法。二.課題要求

1.將60H~69H單元存放的10個無符號數(shù)按照從小到大的順序重新排列。

2.選擇課后思考題與習(xí)題的部分程序運行并調(diào)試出來。三.背景知識

可采用冒泡排序法。冒泡排序法把一批數(shù)據(jù)想象成縱向排列,采用自下而上的方法比較相鄰兩個數(shù)據(jù),如果這兩個數(shù)據(jù)的大小順序符合要求,則保持原樣,否則交換它們的位置。這樣比較一輪后,最小的數(shù)據(jù)就像氣泡一樣浮到最頂上,故稱冒泡排序法。第49頁,共70頁,2023年,2月20日,星期一

實際編程設(shè)計時,每一輪操作都從數(shù)據(jù)區(qū)的首地址開始,向末端推進。一般來講,N個數(shù)據(jù)要進行N-1輪次比較和交換排序。表3-1表示了60H~65H單元存儲數(shù)據(jù)的冒泡排序的執(zhí)行過程。表3-1冒泡排序過程說明第50頁,共70頁,2023年,2月20日,星期一

假定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)過三輪操作就可以完成排序。采用冒泡排序法,一般應(yīng)設(shè)立一個標(biāo)志位,在每輪開始時將標(biāo)志位清0,在操作過程中出現(xiàn)位置交換,標(biāo)志位置1,每輪結(jié)束時若標(biāo)志位為0,則說明數(shù)據(jù)已經(jīng)有序,可以提前結(jié)束排序,從而提高了效率。第51頁,共70頁,2023年,2月20日,星期一圖3-9冒泡排序流程圖

四.程序流程圖第52頁,共70頁,2023年,2月20日,星期一3.4.4課題與實訓(xùn)5交通燈的設(shè)計

一.實訓(xùn)目的

1.進一步熟悉單片機I/O接口的線路連接。

2.學(xué)習(xí)順序控制程序的編程技術(shù)。

二.課題要求

用仿真器的P1口控制4只雙色LED燈,來模擬十字路口交通燈的工作方式,本次實訓(xùn)交通燈變化規(guī)律如下:假設(shè)一個十字路口是東西南北走向。初始狀態(tài)為東西南北均紅燈。停頓1秒后轉(zhuǎn)狀態(tài)S1(南北綠燈,東西紅燈)。延時20秒,轉(zhuǎn)S2(南北綠燈閃3次變黃燈,東西紅燈)。再轉(zhuǎn)S3(東西綠燈,南北紅燈)。延時20秒,轉(zhuǎn)S4(東西綠燈閃3次變黃燈,南北紅燈)。最后跳轉(zhuǎn)至S1循環(huán)。第53頁,共70頁,2023年,2月20日,星期一

三.背景知識

雙色LED燈有三只引腳,工作時,中間引腳接地,另外兩支引腳單獨接高電平時,一種亮紅光,一種亮綠光,兩只引腳同時接高電平時,亮黃光。在本次實訓(xùn)線路中,P1.0~P1.3接雙色LED的綠燈引腳,當(dāng)P1.0~P1.3輸出1時,相應(yīng)燈亮綠光,P1.4~P1.7接雙色LED的紅燈引腳,當(dāng)P1.4~P1.7輸出1時,相應(yīng)燈亮紅光,如果P1.0和P1.4同時為1,則RG南亮黃光,其余道理與此相同。四.硬件電路

(見圖3-10

)

圖3-10交通燈電路第54頁,共70頁,2023年,2月20日,星期一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

五.軟件設(shè)計第55頁,共70頁,2023年,2月20日,星期一

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頁,2023年,2月20日,星期一

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頁,2023年,2月20日,星期一DELAY:MOVR1,#200;延時程序

D1:MOVR0,#248;延時100毫秒

DJNZR0,$DJNZR1,D1DJNZR2,DELAYRETEND

六.總結(jié)與思考

本實訓(xùn)電路只是用單片機模擬交通燈的管理,真正的交通燈還要考慮到燈的驅(qū)動等實際問題。

想一想,如果采用建表方式,程序該如何設(shè)計?第58頁,共70頁,2023年,2月20日,星期一3.4.5課題與實訓(xùn)6以循環(huán)方式實現(xiàn)流水燈

一.實訓(xùn)目的

1.進一步熟悉單片機I/O接口的線路連接。

2.學(xué)習(xí)循環(huán)程序的編程技術(shù)。二.課題要求

用單片機的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頁,2023年,2月20日,星期一

三.背景知識

循環(huán)程序用于需要多次反復(fù)執(zhí)行的相同操作,因此在編制程序時,首先應(yīng)該確定的就是有哪些相同的操作可由循環(huán)部分實現(xiàn)。在該實訓(xùn)中,我們用數(shù)據(jù)傳送指令向P1.0→P1.7一次送數(shù),所以對送出數(shù)據(jù)的處理過程就是相同的;延時時間都是0.2秒,這也是相同的,這兩部分都可以用循環(huán)來實現(xiàn)。

在編制具體的循環(huán)程序時,要設(shè)置一個存放循環(huán)次數(shù)的寄存器,通常選用R2~R7中的任何一個來實現(xiàn)(R0和R1常用于寄存器間接尋址。當(dāng)然,程序中如果不采用間接尋址方式,R0和R1也可用來存放循環(huán)次數(shù))。程序每循環(huán)一次,循環(huán)次數(shù)寄存器內(nèi)容要減1,當(dāng)該寄存器內(nèi)容減到0時,表示循環(huán)結(jié)束,這兩個過程可用DJNZ指令實現(xiàn)。第60頁,共70頁,2023年,2月20日,星期一

四.硬件電路圖3-11流水燈電路第61頁,共70頁,2023年,2月20日,星期一

參考程序如下:

ORG0000HSTART:MOV

A,#0FFH;設(shè)初值

MOV

R0,#8;移動八次

CLR

C;將CY清0LOOP1:RLC

A;帶進位位循環(huán)左移

MOV

P1,A;送P1口,P1.0燈亮

ACALL

DELAY;調(diào)延時

DJNZR0,

LOOP1;判斷是否左移8次

MOV

A,#0FFH;夠八次,燈全滅

MOV

P1,AACALL

DELAYMOV

A,#0FFH;設(shè)初值

MOV

R0,#8;移動八次

CLR

C;將CY清0五.軟件設(shè)計第62頁,共70頁,2023年,2月20日,星期一

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頁,2023年,2月20日,星期一

DJNZ

R5,

溫馨提示

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

評論

0/150

提交評論