《基于任務(wù)驅(qū)動的單片機(jī)應(yīng)用教程》課件第8章_第1頁
《基于任務(wù)驅(qū)動的單片機(jī)應(yīng)用教程》課件第8章_第2頁
《基于任務(wù)驅(qū)動的單片機(jī)應(yīng)用教程》課件第8章_第3頁
《基于任務(wù)驅(qū)動的單片機(jī)應(yīng)用教程》課件第8章_第4頁
《基于任務(wù)驅(qū)動的單片機(jī)應(yīng)用教程》課件第8章_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

任務(wù)8數(shù)碼秒表的設(shè)計8.1任務(wù)內(nèi)容與分析

8.2任務(wù)實(shí)施8.3任務(wù)相關(guān)知識

8.1任務(wù)內(nèi)容與分析

1.任務(wù)內(nèi)容

任務(wù)8以數(shù)碼秒表為例,介紹利用單片機(jī)控制數(shù)碼管,實(shí)現(xiàn)靜態(tài)顯示和動態(tài)移動掃描顯示,以及定時器/計數(shù)器、中斷技術(shù)的進(jìn)一步綜合應(yīng)用。

2.任務(wù)分析

用兩個數(shù)碼管分別顯示秒表的十位和個位,顯示時間為0~59s。滿60s時,秒表自動清零并重新從0開始顯示。采用共陰極數(shù)碼管。圖8-1為數(shù)碼秒表電路原理圖。在任務(wù)7中我們知道了8051定時器/計數(shù)器最大可計數(shù)到65?536。若系統(tǒng)時鐘頻率是12MHz,則最大定時時間為65.536ms;若系統(tǒng)時鐘頻率是6MHz,則最大定時時間為

65.536ms×2?=?131.072ms。那怎么能實(shí)現(xiàn)1s呢?我們可以用定時器定時50ms,這樣中斷一次即為50ms,然后用軟件(存儲單元)累計中斷次數(shù),當(dāng)中斷滿20次時,即可計滿

1s(50ms×20=10000ms=1s)。圖8-1數(shù)碼秒表電路原理圖再用另一個存儲單元存儲秒,每計滿1s,將該單元的值加1,計滿60時清0。將該秒單元拆分成個位數(shù)和十位數(shù),然后分別用兩只數(shù)碼管分別顯示個位數(shù)和十位數(shù)。數(shù)碼秒表的基本設(shè)計思路就是這樣。

8.2任務(wù)實(shí)施

下面一起實(shí)現(xiàn)數(shù)碼秒表,在這重點(diǎn)學(xué)習(xí)單片機(jī)控制數(shù)碼管顯示及定時器/計數(shù)器較長時間的定時設(shè)計。

步驟1:硬件電路如圖8-1所示。

步驟2:繪制程序流程圖。程序設(shè)計思路:在設(shè)計較復(fù)雜的程序時,首先根據(jù)設(shè)計的總體要求劃分出各功能程序模塊,分別確定主程序、子程序及中斷服務(wù)程序結(jié)構(gòu);其次,對各程序模塊占用的單片機(jī)資源進(jìn)行統(tǒng)一調(diào)配,對各模塊間的邏輯關(guān)系進(jìn)行細(xì)化,優(yōu)化程序結(jié)構(gòu),設(shè)計出各模塊程序結(jié)構(gòu)流程圖;最后依據(jù)流程圖編制具體程序。任務(wù)8程序劃分為主程序、秒計時程序兩大模塊,其中主程序除完成初始化外主要由動態(tài)顯示程序構(gòu)成,秒計時由定時器中斷服務(wù)子程序構(gòu)成。

為便于對占用資源的總體調(diào)配,現(xiàn)列出秒表程序所占用單片機(jī)存儲資源分配列表,如表8-1所示。

1?s的定時采用定時器T0方式1來實(shí)現(xiàn),每50ms中斷一次,每中斷一次計數(shù)單元40H內(nèi)容加1,若計滿20次,秒計數(shù)單元41H內(nèi)容加1。41H單元中的數(shù)據(jù)采用壓縮BCD碼按十進(jìn)制計數(shù),將該單元中的數(shù)據(jù)拆成個位和十位兩個十進(jìn)制數(shù)據(jù)后分別送至顯示緩沖區(qū)的30H和31H單元。這樣兩位LED數(shù)碼管顯示的時間就由顯示緩沖區(qū)31H、30H單元中的數(shù)據(jù)決定,動態(tài)顯示每位的持續(xù)時間為1ms,采用1ms軟件延時。

根據(jù)程序設(shè)計思路繪制程序流程圖,如圖8-2所示。圖8-2數(shù)碼秒表程序設(shè)計流程圖步驟3:根據(jù)流程圖編制源程序。具體如下:

//*************數(shù)碼秒表程序******************//

;程序名:數(shù)碼秒表程序SECWATCH.A

;程序功能:簡易秒表

MSECEQU40H

SECEQU41H

ORG0000H

AJMPSTART

ORG000BH

AJMPCONT;轉(zhuǎn)秒表計時定時器中斷服務(wù)程序

ORG0030H

START: MOVTMOD,#01H

;?T0方式1定時

MOVTH0,#3CH

;裝T0計數(shù)初值

MOVTL0,#0B0H

MOVMSEC,#14H

;?50ms計數(shù)單元初值

MOVSEC,#00H

;秒計數(shù)單元初值

MOVSP,#3FH

;堆棧指針初值

MOV30H,#00H

;顯示緩沖單元清零

MOV31H,#00H

SETBET0

;開中斷

SETBEA

SETBTR0

;開定時器T0

AGIN: LCALLDISP;調(diào)用顯示子程序

AJMPAGIN

;**********顯示子程序********

DISP: MOVR2,#02H ;?LED顯示位數(shù)送R2

MOVR4,#02H ;從最右端LED開始顯示

MOVR0,#30H

;顯示緩沖區(qū)首地址送R0

MOVA,@R0 ;秒顯示內(nèi)容送A

MOVDPTR,#TAB ;字型表首地址

DISP1: MOVCA,@A+DPTR

;查表取字型碼

MOVP0,A

;字型碼送P0口

MOVA,R4

;取位選控制字

MOVP2,A

;送P2口

ACALLDELAY_1MS

;延時1ms

RRA

;位選移位

MOVR4,A

;保存位選控制字

INCR0

;取下一位緩沖區(qū)顯示數(shù)據(jù)

MOVA,@R0

DJNZR2,DISP1;位掃描次數(shù)判斷

RET

TAB: DB3FH,06H,5BH,4FH,66H,6DH;

“0~9”共陰極字型碼

DB7DH,07H,7FH,6FH

;**********定時器T0中斷服務(wù)子程序CONT*********

;入口參數(shù):秒計數(shù)單元SEC

;出口參數(shù):秒單元SEC,顯示緩沖區(qū)30H、31H

CONT: PUSHACC

;保護(hù)現(xiàn)場

MOVTH0,#3CH

;重裝初始值

MOVTL0,#0B0H

DJNZMSEC,EXIT

;判斷1秒到否

MOVMSEC,#!4H;到1秒,重置50ms計數(shù)初值

INCSEC

;秒單元計數(shù)值加1

CJNESEC,#60,CHAIFEN ;判斷60s到否

MOVSEC,#00H

;秒計數(shù)單元清0

CHAIFEN:MOVA,SEC

;秒計數(shù)單元內(nèi)容拆分

MOVB,#10

DIVAB

MOV31H,A

;十位送顯示緩沖區(qū)31H

MOV32H,B;個位送顯示緩沖區(qū)30H

EXIT: POPACC;恢復(fù)現(xiàn)場

RETI

;*********1ms延時子程序***************

DELAY_1MS:MOVR7,#02H;延時1ms子程序

DL1: MOVR6,#0FFH

DL2: DJNZR6,DL2

DJNZR7,DL1

RET

END

8.3任務(wù)相關(guān)知識

8.3.1LED數(shù)碼管

七段LED數(shù)碼管(下面簡稱為數(shù)碼管)是由8個發(fā)光二極管組成的。當(dāng)發(fā)光二極管導(dǎo)通時,相應(yīng)的一個筆畫或一個點(diǎn)就發(fā)光,可用于顯示數(shù)字0~9和部分簡單字符。數(shù)碼管引腳和顯示的0~9數(shù)字如圖8-3所示。圖8-3數(shù)碼管引腳和顯示的0~9數(shù)字?jǐn)?shù)碼管從結(jié)構(gòu)上可分為“共陽極”和“共陰極”兩種。

(1)共陽極數(shù)碼管:是將8個發(fā)光二極管的陽極連接在一起,作為公共控制端(com),如圖8-4(a)所示。要想點(diǎn)亮共陽極數(shù)碼管,公共端需接高電平。當(dāng)某段控制端為低電平時,該段對應(yīng)的二極管導(dǎo)通并點(diǎn)亮。

(2)共陰極數(shù)碼管:是將8個發(fā)光二極管的陰極連接在一起,作為公共控制端(com),如圖8-4(b)所示。要想點(diǎn)亮共陰極數(shù)碼管,公共端需接低電平,當(dāng)a~dp段控制端為高電平時,該端對應(yīng)的發(fā)光二極管導(dǎo)通并點(diǎn)亮,這樣通過點(diǎn)亮不同的段,可顯示出各種數(shù)字或字符。如顯示數(shù)字1時,從圖8-3可以看出,“1”是由b、c段構(gòu)成,即只要b、c兩端接低電平,其他各端接高電平即可。圖8-4數(shù)碼管內(nèi)部結(jié)構(gòu)圖

【例8-1】用89S51控制一只數(shù)碼管顯示數(shù)字“1”。

解選用共陰極數(shù)碼管,因?yàn)橹挥幸恢粩?shù)碼管,所以可將該管com端接地,P1口控制段端,電路如圖8-5所示。圖8-5單片機(jī)控制一只數(shù)碼管電路問題:若將01H送至單片機(jī)的P1口,數(shù)碼管上會顯示“1”嗎?

答:不會,因?yàn)殡娐分袉纹瑱C(jī)P1口的P1.0,P1.1,…,P1.6,P1.7依次與共陰極數(shù)碼管的a,b,…,f,dp端相連接,com端接地。如果要顯示數(shù)字“1”,則數(shù)碼管的b、c段點(diǎn)亮,其他段熄滅,需向P1口傳送數(shù)據(jù)00000110B(06H),該數(shù)據(jù)就是與字符“1”相對應(yīng)的顯示字型編碼,見表8-2。依此類推,可以推出共陽極數(shù)碼管和共陰極數(shù)碼管顯示0~9字符的字型編碼,如表8-3所示。有興趣的話,還可以推算出“A、B、C、D、E、F、H、L、P、R、U、Y、-、.”等字符。根據(jù)表8-2,查得“1”的編碼為06H,例8-1的程序可以這樣編寫:

ORG0000H

AJMPMAIN ;跳轉(zhuǎn)到主程序

ORG0030H

MAIN: MOVP1,#06H ;將“1”的段碼送給P1口

AJMPMAIN

END8.3.2ROM查表指令

1.以DPTR內(nèi)容為基址

MOVCA,@A+DPTR ;A←((A)+(DPTR))

該指令先將基址(DPTR)和變址(A)求和,獲得的16位和作為程序存儲器的地址,然后將該地址單元的內(nèi)容傳送到累加器A中。

【例8-2】已知(3055H)=66H,查表指令及其執(zhí)行示意過程如圖8-6所示。圖8-6例8-2查表指令及其執(zhí)行示意過程

2.以PC內(nèi)容為基址

MOVCA,@A+PC ;A←((A)+(PC))

該指令為單字節(jié)指令,執(zhí)行該指令時PC的內(nèi)容增1,以增1后的當(dāng)前值去執(zhí)行16位無符號數(shù)加法,將獲得的基址與變址之和作為16位的程序存儲器地址,然后傳送該地址的內(nèi)容到累加器A中。8.3.3數(shù)碼管靜態(tài)顯示和動態(tài)顯示

1.靜態(tài)顯示

靜態(tài)顯示的特點(diǎn)是每個數(shù)碼管的段選必須接一個8位數(shù)據(jù)線來保持顯示的字形碼。當(dāng)送入一次字形碼后,顯示字形可一直保持,直到送入新字形碼為止。這種方法的優(yōu)點(diǎn)是占用CPU時間少,顯示時便于監(jiān)測和控制。缺點(diǎn)是硬件電路較復(fù)雜,成本較高。例8-3中數(shù)碼管采用的就是靜態(tài)顯示方式。

【例8-3】手動00~99計數(shù)器的設(shè)計。

解在AT89S51單片機(jī)的P3.4引腳接一個輕觸開關(guān),作為手動計數(shù)的按鈕,用單片機(jī)的P2.0~P2.7接一個共陰極數(shù)碼管,作為00~99計數(shù)的個位數(shù)顯示,用單片機(jī)的P0.0~P0.7接一個共陰極數(shù)碼管,作為00~99計數(shù)的十位數(shù)顯示。硬件電路圖如圖8-7所示。圖8-7手動00~99計數(shù)器硬件電路圖程序設(shè)計思路:

(1)單片機(jī)對按鍵識別的過程處理。

(2)單片機(jī)對正確識別的按鍵進(jìn)行計數(shù),計數(shù)滿時又從零開始計數(shù)。

(3)單片機(jī)對計得的數(shù)值要進(jìn)行數(shù)碼顯示。若計得的數(shù)是十進(jìn)制數(shù),含有十位和個位,我們要把十位和個位拆開,分別送出相應(yīng)的十位和個位數(shù)值到對應(yīng)的數(shù)碼管上顯示。如何拆開十位和個位?我們可以把所計得的數(shù)值對10求余,即可得個位數(shù)字,對10整除,即可得到十位數(shù)字。

(4)通過查表方式,分別顯示出個位和十位數(shù)字。

程序流程如圖8-8所示。圖8-8手動00~99計數(shù)器程序流程圖編寫源程序:根據(jù)程序流程圖,編寫的源程序具體如下:

;*************手動00~99計數(shù)器*************

;程序名:手動00~99計數(shù)器SCOUNT.A

;程序功能:手動實(shí)現(xiàn)00~99的計數(shù)

CountEQU30H ;定義計數(shù)單元

SP1 BITP3.4 ;定義按鍵

ORG0000H

AJMPSTART

ORG0030H

START: MOVCount,#00H ;計數(shù)單元清0

ACALLDISPLAY ;數(shù)碼顯示“00”

WAIT1: JBSP1,WAIT1

ACALLDELAY_10MS

WAIT2: JBSP1,WAIT2

INCCount

MOVA,Count

CJNEA,#100,NEXT

LJMPSTART

NEXT: ACALLDISPLAY

AJMPWAIT1

;**********顯示子程序***********

DISPLAY:MOVA,Count

MOVB,#10

DIVAB

MOVDPTR,#TABLE

MOVCA,@A+DPTR MOVP0,A ;送個位數(shù)顯示

MOVA,B

MOVCA,@A+DPTR

MOVP2,A ;送十位數(shù)顯示

RET

;******10ms延時子程序*****************

DELAY_10MS: MOVR6,#20

D1: MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

TAB: DB 3FH,06H,5BH,4FH,66H,6DH

;“0~9”共陰極字型碼

DB7DH,07H,7FH,6FH

END

2.動態(tài)顯示

動態(tài)顯示就是一種按位輪流點(diǎn)亮各位數(shù)碼管的顯示方式,即在某一時段,只讓其中一位數(shù)碼管“位選通”有效,并送出相應(yīng)的字型顯示編碼。此時,其他位的數(shù)碼管因“位選通”無效而都處于熄滅狀態(tài),下一時段按順序選通另外一位數(shù)碼管,并送出相應(yīng)的字型顯示編碼,依此規(guī)律循環(huán)下去,即可使各位數(shù)碼管分別間斷地顯示出相應(yīng)的字符。動態(tài)顯示也稱掃描顯示方式。雖然在同一時刻只有一位顯示器在點(diǎn)亮,但由于人眼的“視覺駐留效應(yīng)”和LED熄滅時的余輝,只要能保證每位數(shù)碼管顯示間斷的時間間隔小于眼睛的駐留時間,就可以給人一種連續(xù)顯示的視覺效果。

動態(tài)顯示的特點(diǎn)是將所有位數(shù)碼管的段選線并聯(lián)在一起,由位選線控制是哪一位數(shù)碼管有效。

【例8-4】用單片機(jī)控制6個LED數(shù)碼管固定顯示“012345”。

解(1)電路設(shè)計與制作。若采用靜態(tài)顯示方式控制6個LED數(shù)碼管,則需要單片機(jī)提供6個8位并行I/O口,并對單片機(jī)I/O進(jìn)行擴(kuò)展,這將大大增加硬件電路的復(fù)雜性和硬件成本。鑒于此,采用圖8-9所示的動態(tài)顯示電路連接方式。將各位共陰極數(shù)碼管相應(yīng)的段選控制端并聯(lián)在一起,僅用一個P1口控制,用六同相驅(qū)動器74LS07驅(qū)動;將各位數(shù)碼管的公共端(也稱做“位選端”)由P2口控制,用六反相驅(qū)動器74LS04驅(qū)動。圖8-9六位數(shù)碼管動態(tài)顯示電路

(2)編寫在6個LED數(shù)碼管上固定顯示“012345”6個數(shù)字的軟件流程。

為了在6個數(shù)碼管上同時顯示“012345”6個數(shù)字,可在內(nèi)部RAM中開辟一個顯示緩沖區(qū),依次存放所要顯示的數(shù)據(jù)。例如:將“012345”6個數(shù)字預(yù)先分別存放到內(nèi)部RAM的30H~35H單元中,存放格式如下:

單元地址:30H31H32H33H34H35H

單元內(nèi)容:00H01H02H03H04H05H

流程圖如圖8-10所示。圖8-10在6個數(shù)碼管上穩(wěn)定顯示“012345”的動態(tài)顯示流程圖

(3)編寫在6個數(shù)碼管上固定顯示“012345”6個數(shù)字的

程序。

//********多位數(shù)碼管顯示程序****************

;程序名:MULTILED.A

;程序功能:在6個數(shù)碼管上穩(wěn)定顯示“012345”

;要顯示的數(shù)據(jù)0~5存放在內(nèi)部RAM的30H~32H單元中

ORG0000H

AJMPSTART

ORG0030H

START: MOVR0,#30H;顯示數(shù)據(jù)緩沖區(qū)首地址送R0

MOVR3,#01H;確定顯示位碼初值,使最

右邊位點(diǎn)亮

MOVDPTR,#TAB;?DPTR指向字型碼表首

地址

LOOP: MOVA,@R0 ;取欲顯示的數(shù)據(jù)

MOVCA,@A+DPTR;查表取出字型碼

MOVP1,A ;送顯示字型碼

ACALLDELAY_1MS;延時1ms

MOVA,R3

JBACC.5,ELD1;判斷是否掃描到第六個數(shù)碼管

RLA;未到,掃描碼左移1位

MOVR3,A;保存掃描碼

INCR0;指向下1個顯示段數(shù)據(jù)地址

AJMPLOOP

ELD1:AJMPSTART;循環(huán),固定顯示

DELAY_1MS: MOVR7,#02H;延時1ms子程序

DL1: MOVR6,#0FFH

DL2: DJNZR6,DL2

DJNZR7,DL1

RET

TAB: DB3FH,06H,5BH,4FH,66H,6DH;

“0~9”共陰極字型碼

DB7DH,07H,7FH,6FH

END

【例8-5】在圖8-9所示硬件電路基礎(chǔ)上控制6個LED數(shù)碼管移動顯示字符HELLO。

解在6個數(shù)碼管上移動顯示“HELLO”字樣,顯示過程如圖8-11所示。只要能依次顯示出6屏不同的內(nèi)容,就可以達(dá)到移動顯示的效果。圖8-11字符HELLO移動顯示過程每屏顯示數(shù)據(jù)之間都對應(yīng)一定的排列順序,將所有在顯示屏上將要出現(xiàn)的顯示字符按順序排列為如下格式:

×××××HELLO× ;×表示無顯示

可見,第1屏顯示的前六位數(shù)據(jù)為“×××××H”,第2屏顯示的六位數(shù)據(jù)為“××××HE”,依次類推,第6屏顯示數(shù)據(jù)為“HELLO×”。根據(jù)例8-1,可以推出HELLO的字型編碼,見表8-4。如果把與以上11個顯示數(shù)據(jù)相對應(yīng)的顯示字型編碼,按表8-4的排列順序存放在存儲器中,并設(shè)顯示單元首地址為LED,定義表格如下:

LED:DB00H,00H,00H,00H,00H,76H,79H

DB38H,38H,3FH,00H每一屏顯示6個字符,那么第1屏顯示字型編碼的首地址設(shè)置為LED,第2屏顯示碼的首地址為LED+1,第3屏顯示碼的首地址為LED+2,依次類推,可以得到第i屏顯示碼的首地址為LED+i-1。

根據(jù)以上分析,編寫程序流程如圖8-12所示。圖8-12例8-5程序流程圖根據(jù)流程圖,編寫出如下程序:

//*********6位數(shù)碼管移動顯示程序*************

;程序名:MOVELED.A

;程序功能:在6個數(shù)碼管上移動顯示“HELLO”

;入口參數(shù):要顯示的數(shù)據(jù)0~5存放在內(nèi)部RAM的30H~32H單元中

ORG0000H

AJMPSTART

ORG0030H

START:MOVR4,#06H ;顯示屏數(shù)

MOVR6,#100 ;每屏掃描顯示次數(shù)

MOVDPTR,#LED;顯示碼首地址

NEXT1: ACALLSCANLED;第1屏掃描1

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論