6位LED顯示單片機(jī)控制電子鐘/計(jì)數(shù)器
掃描二維碼
隨時(shí)隨地手機(jī)看文章
這是我們?cè)O(shè)計(jì)的單片機(jī)電子鐘/計(jì)時(shí)器學(xué)習(xí)板,它采用6位LED數(shù)碼管顯示時(shí)、分、秒,以24小時(shí)計(jì)時(shí)方式??梢酝ㄟ^(guò)按鍵實(shí)現(xiàn)時(shí)分調(diào)整、秒表/時(shí)鐘功能轉(zhuǎn)換、省電(關(guān)閉顯示)等功能。我們能提供的完整的匯編語(yǔ)言源程序清單及電路原理設(shè)計(jì)圖有助于學(xué)習(xí)者進(jìn)行分析和進(jìn)行實(shí)驗(yàn)驗(yàn)證。
硬件參數(shù)板上資源:MCU STC89C52、6位Led顯示、3位按鍵。電源部分為5V直流電壓,需要穩(wěn)壓、濾波電路,不能接反!
51單片機(jī)做的電子鐘在很多地方都有介紹, 對(duì)于單片機(jī)學(xué)習(xí)者來(lái)說(shuō)這個(gè)程序基本上是一道門(mén)檻,掌握了電子鐘程序, 基本上可以說(shuō)51單片機(jī)就掌握了80%。常見(jiàn)的電子鐘程序由顯示部分、計(jì)算部分、時(shí)鐘調(diào)整部分構(gòu)成,本產(chǎn)品硬件上完全支持倒計(jì)時(shí)器,客戶只要自己修改程序就能實(shí)現(xiàn)倒計(jì)時(shí)功能。
為了實(shí)現(xiàn)LED顯示器的數(shù)字顯示,可以采用靜態(tài)顯示法和動(dòng)態(tài)顯示法。由于靜態(tài)顯示法需要數(shù)據(jù)鎖存器等硬件,接口復(fù)雜一些??紤]時(shí)鐘顯示只有六位,且系統(tǒng)沒(méi)有其它復(fù)雜的處理任務(wù),所以決定采用動(dòng)態(tài)掃描法實(shí)現(xiàn)LED的顯示。單片機(jī)采用易購(gòu)的AT89S51系列,這樣單片機(jī)可具有足夠的空余硬件資源實(shí)現(xiàn)其它的擴(kuò)充功能,硬件系統(tǒng)的總體構(gòu)成如下圖所示:視頻演示
http://xie-gang.com/SZDZZ.htm視頻演示
該板采用AT89S51單片機(jī),最小化應(yīng)用設(shè)計(jì),采用共陽(yáng)七段LED顯示器,P0口輸出段碼數(shù)據(jù),P2.0~P2.5做列掃描輸出,P1.0,P1.2,P1.3,接三個(gè)按鍵開(kāi)關(guān),用以調(diào)時(shí)及功能設(shè)置。為了提高共陽(yáng)數(shù)碼管的驅(qū)動(dòng)電壓,用9012做電源驅(qū)動(dòng)輸出。采用12M晶振,有利于提高秒計(jì)時(shí)的精度。
本設(shè)計(jì)中,計(jì)時(shí)采用定時(shí)器T0中斷完成,其余狀態(tài)循環(huán)調(diào)用顯示子程序,當(dāng)端口開(kāi)關(guān)按下時(shí),轉(zhuǎn)入相應(yīng)功能程序。其主程序執(zhí)行流程圖見(jiàn)下左圖:
數(shù)碼管顯示的數(shù)據(jù)存放在內(nèi)存單元70H~75H中。其中70H~71H存放秒數(shù)據(jù),72H~73H存放分?jǐn)?shù)據(jù),74H~75H存放時(shí)數(shù)據(jù),每一地址單元內(nèi)均為十進(jìn)制BCD碼。由于采用軟件動(dòng)態(tài)掃描實(shí)現(xiàn)數(shù)據(jù)顯示功能,顯示用十進(jìn)制BCD碼數(shù)據(jù)的對(duì)應(yīng)段碼存放在ROM表中。顯示時(shí),先取出70H~~75H某一地址中的數(shù)據(jù),然后查得對(duì)應(yīng)的顯示用段碼,并從P0口輸出,P2口將對(duì)應(yīng)的數(shù)碼管選中供電,就能顯示該地址單元的數(shù)據(jù)值。
定時(shí)器T0用于時(shí)間計(jì)時(shí)。定時(shí)溢出中斷周期可分別設(shè)為50mst和10ms。中斷進(jìn)入后,先判斷是時(shí)鐘計(jì)時(shí)還是秒表計(jì)時(shí),時(shí)鐘計(jì)時(shí)累計(jì)中斷20次(即1s)時(shí),對(duì)秒計(jì)數(shù)單元進(jìn)行加1操作,秒表計(jì)時(shí)每10ms進(jìn)行加1操作。時(shí)鐘計(jì)數(shù)單元地址分別在70H~71H(秒)、76H~77H(分)和78H~79H(時(shí)),最大計(jì)時(shí)值為23時(shí)59分59秒。而秒表計(jì)數(shù)單元地址也在70H~~71H(0.01毫秒)、76H~~77H(秒)和78H~~79H(分),最大計(jì)時(shí)值為99分59.99秒。7AH單元內(nèi)存放“熄滅符”數(shù)據(jù)(#0AH)。在計(jì)數(shù)單元中采用十進(jìn)制BCD碼計(jì)數(shù),滿60(秒表功能時(shí)有100)進(jìn)位,T0中斷服務(wù)程序執(zhí)行流程見(jiàn)上圖右
T1中斷服務(wù)程序用于指示調(diào)整單元數(shù)字的亮閃。在時(shí)間調(diào)整狀態(tài)下,每過(guò)0.3S將對(duì)應(yīng)單元的顯示數(shù)據(jù)換成“熄滅符”數(shù)據(jù)(#0AH)。這樣在調(diào)整時(shí)間時(shí),對(duì)應(yīng)調(diào)整單元的顯示數(shù)據(jù)會(huì)間隔閃亮。
調(diào)時(shí)功能程序的設(shè)計(jì)方法是:按下P1.0口按鍵,若按下時(shí)間短于1 s則進(jìn)入省電狀態(tài)(數(shù)碼管不亮,時(shí)鐘不停);否則進(jìn)入調(diào)分狀態(tài),等待操作,此時(shí)計(jì)時(shí)器停止走動(dòng)。當(dāng)再按下按鈕時(shí),若按下時(shí)間短于0.5s,則時(shí)間加1分;若按下時(shí)間長(zhǎng)于0.5s,則進(jìn)入[小]時(shí)調(diào)整狀態(tài)。在[小]時(shí)調(diào)整狀態(tài)下,當(dāng)按鍵按下的時(shí)間長(zhǎng)于0.5s時(shí),退出調(diào)整狀態(tài),時(shí)鐘繼續(xù)走動(dòng)。P1.1口按鍵在調(diào)時(shí)狀態(tài)下可實(shí)現(xiàn)減1功能。
使用方法:按下K1按鍵,如果按下時(shí)間小于1秒,就會(huì)進(jìn)入省電模式,這時(shí)數(shù)碼管熄滅但是時(shí)鐘仍然運(yùn)行。如果按下K1按鍵時(shí)間大于1秒,就會(huì)進(jìn)入調(diào)分狀態(tài),此時(shí)計(jì)時(shí)器停止走動(dòng)等待操作,這時(shí)中間的兩位00會(huì)閃爍,這時(shí)當(dāng)按下K1按鍵時(shí)間小于0.5秒時(shí),時(shí)間信息就會(huì)加1(單位分鐘);若時(shí)間大于0.5秒,這時(shí)左邊的兩位00會(huì)閃爍,進(jìn)入小時(shí)調(diào)整,在小時(shí)調(diào)整狀態(tài)下按下S6按鍵時(shí)間小于0.5秒時(shí),時(shí)間信息就會(huì)加1(單位小時(shí)),如果按下按鍵時(shí)間大于0.5S時(shí),就會(huì)退出調(diào)整狀態(tài),時(shí)鐘繼續(xù)走動(dòng)。
配件:采用PL2303芯片的USB轉(zhuǎn)TTL串口模塊 每個(gè)15元 含一根4芯杜邦連接線
你還可以另外購(gòu)買(mǎi)我們的PL2303模塊,就能實(shí)現(xiàn)STC芯片的在線程序下載。只要連接3根線:一根串口入R連接單片機(jī)的P3.1TXD、一根串口出D連接單片機(jī)的P3.0 RXD、一根地線-連接單片機(jī)的電源地即可。
然后將PL2303的USB轉(zhuǎn)串口模塊插入電腦的USB口(已經(jīng)安裝好2303的驅(qū)動(dòng)),然后在STC編程軟件界面中選擇單片機(jī)型號(hào)STC89C52RC,選擇COM6(具體按電腦實(shí)際虛擬出的串口號(hào))波特率選擇9600,點(diǎn)擊“OPEN FILE”選擇你的燒寫(xiě)文件,點(diǎn)擊“下載”按鈕,然后接通超聲波測(cè)距成品學(xué)習(xí)板的電源,3秒左右就能完成程序下載并運(yùn)行。
以下是部分匯編源程序,購(gòu)買(mǎi)我們產(chǎn)品后我們可以通過(guò)電子郵件將完整的單片機(jī)匯編源程序和燒寫(xiě)文件發(fā)送給客戶。 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; AT89S51時(shí)鐘程序 ;;(該程序不全,不要直接使用。購(gòu)買(mǎi)產(chǎn)品后提供全部程序和圖紙)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; 定時(shí)器T0、T1溢出周期為50MS,T0為秒計(jì)數(shù)用, T1為調(diào)整時(shí)閃爍用,
; P1.0、P1.1、P1.2為調(diào)整按鈕,P0口 為字符輸出口,采用共陽(yáng)顯示管。
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中斷入口程序 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ORG 0000H ;程序執(zhí)行開(kāi)始地址
LJMP START ;跳到標(biāo)號(hào)START執(zhí)行
ORG 0003H ;外中斷0中斷程序入口
RETI ;外中斷0中斷返回
ORG 000BH ;定時(shí)器T0中斷程序入口
LJMP INTT0 ;跳至INTTO執(zhí)行
ORG 0013H ;外中斷1中斷程序入口
RETI ;外中斷1中斷返回
ORG 001BH ;定時(shí)器T1中斷程序入口
LJMP INTT1 ;跳至INTT1執(zhí)行
ORG 0023H ;串行中斷程序入口地址
RETI ;串行中斷程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
START: LCALL ST ;上電顯示年月日及班級(jí)學(xué)號(hào)
MOV R0,#70H ;清70H-7AH共11個(gè)內(nèi)存單元
MOV R7,#0BH ;
CLEARDISP: MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARDISP ;
MOV 20H,#00H ;清20H(標(biāo)志用)
MOV 7AH,#0AH ;放入"熄滅符"數(shù)據(jù)
MOV TMOD,#11H ;設(shè)T0、T1為16位定時(shí)器
MOV TL0,#0B0H ;50MS定時(shí)初值(T0計(jì)時(shí)用)
MOV TH0,#3CH ;50MS定時(shí)初值
MOV TL1,#0B0H ;50MS定時(shí)初值(T1閃爍定時(shí)用)
MOV TH1,#3CH ;50MS定時(shí)初值
SETB EA ;總中斷開(kāi)放
SETB ET0 ;允許T0中斷
SETB TR0 ;開(kāi)啟T0定時(shí)器
MOV R4,#14H ;1秒定時(shí)用初值(50MS×20)
START1: LCALL DISPLAY ;調(diào)用顯示子程序
JNB P1.0,SETMM1 ;P1.0口為0時(shí)轉(zhuǎn)時(shí)間調(diào)整程序
JNB P1.1,FUNSS ; 秒表功能,P1.1按鍵調(diào)時(shí)時(shí)作減1加能
JNB P1.2,FUNPT ;STOP,PUSE,CLR
SJMP START1 ;P1.0口為1時(shí)跳回START1
SETMM1: LJMP SETMM ;轉(zhuǎn)到時(shí)間調(diào)整程序SETMM
FUNSS: LCALL DS20MS
JB P1.1,START1
WAIT11: JNB P1.1,WAIT11
CPL 03H
MOV 70H,#00H
MOV 71H,#00H
MOV 76H,#00H
MOV 77H,#00H
MOV 78H,#00H
MOV 79H,#00H
AJMP START1
FUNPT: LCALL DS20MS
JB P1.2,START1
WAIT22: JNB P1.2,WAIT21
CLR ET0
CLR TR0
WAIT33: JB P1.2,WAIT31
LCALL DS20MS
JB P1.2,WAIT33
WAIT66: JNB P1.2,WAIT61
MOV R0,#70H ;清70H-79H共10個(gè)內(nèi)存單元
MOV R7,#0AH ;
CLEARP: MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARP ;
WAIT44: JB P1.2,WAIT41
LCALL DS20MS
JB P1.2,WAIT44
WAIT55: JNB P1.2,WAIT51
SETB ET0
SETB TR0
AJMP START1
WAIT21: LCALL DISPLAY
AJMP WAIT22
WAIT31: LCALL DISPLAY
AJMP WAIT33
WAIT41: LCALL DISPLAY
AJMP WAIT44
WAIT51: LCALL DISPLAY
AJMP WAIT55
WAIT61: LCALL DISPLAY
AJMP WAIT66
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 1秒計(jì)時(shí)程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中斷服務(wù)程序
INTT0: PUSH ACC ;累加器入棧保護(hù)
PUSH PSW ;狀態(tài)字入棧保護(hù)
CLR ET0 ;關(guān)T0中斷允許
CLR TR0 ;關(guān)閉定時(shí)器T0
JB 03H,FSS
MOV A,#0B7H ;中斷響應(yīng)時(shí)間同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重裝初值(低8位修正值)
MOV A,#3CH ;高8位初值修正
ADDC A,TH0 ;
MOV TH0,A ;重裝初值(高8位修正值)
SETB TR0 ;開(kāi)啟定時(shí)器T0
DJNZ R4, OUTT0 ;20次中斷未到中斷退出
ADDSS: MOV R4,#14H ;20次中斷到(1秒)重賦初值
MOV R0,#71H ;指向秒計(jì)時(shí)單元(71H-72H)
ACALL ADD1 ;調(diào)用加1程序(加1秒操作)
MOV A,R3 ;秒數(shù)據(jù)放入A(R3為2位十進(jìn)制數(shù)組合)
CLR C ;清進(jìn)位標(biāo)志
CJNE A,#60H,ADDMM ;
ADDMM: JC OUTT0 ;小于60秒時(shí)中斷退出
ACALL CLR0 ;大于或等于60秒時(shí)對(duì)秒計(jì)時(shí)單元清0
MOV R0,#77H ;指向分計(jì)時(shí)單元(76H-77H)
ACALL ADD1 ;分計(jì)時(shí)單元加1分鐘
MOV A,R3 ;分?jǐn)?shù)據(jù)放入A
CLR C ;清進(jìn)位標(biāo)志
CJNE A,#60H,ADDHH ;
ADDHH: JC OUTT0 ;小于60分時(shí)中斷退出
ACALL CLR0 ;大于或等于60分時(shí)分計(jì)時(shí)單元清0
MOV R0,#79H ;指向小時(shí)計(jì)時(shí)單元(78H-79H)
ACALL ADD1 ;小時(shí)計(jì)時(shí)單元加1小時(shí)
MOV A,R3 ;時(shí)數(shù)據(jù)放入A
CLR C ;清進(jìn)位標(biāo)志
JB 03H,OUTT0 ;秒表時(shí)最大數(shù)為99
CJNE A,#24H,HOUR ;
HOUR: JC OUTT0 ;小于24小時(shí)中斷退出
ACALL CLR0 ;大于或等于24小時(shí)小時(shí)計(jì)時(shí)單元清0
OUTT0: MOV 72H,76H ;中斷退出時(shí)將分、時(shí)計(jì)時(shí)單元數(shù)據(jù)移
MOV 73H,77H ;入對(duì)應(yīng)顯示單元
MOV 74H,78H ;
MOV 75H,79H ;
POP PSW ;恢復(fù)狀態(tài)字(出棧)
POP ACC ;恢復(fù)累加器
SETB ET0 ;開(kāi)放T0中斷
RETI ;中斷返回
;秒表計(jì)時(shí)程序(10MS加1),低2位為0.1、0.01秒,中間2位為秒,最高位為分。
;最大計(jì)數(shù)值為99
FSS: MOV A,#0F7H ;中斷響應(yīng)時(shí)間同步修正,重裝初值(10ms)
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重裝初值(低8位修正值)
MOV A,#0D8H ;高8位初值修正
ADDC A,TH0 ;
MOV TH0,A ;重裝初值(高8位修正值)
SETB TR0 ;開(kāi)啟定時(shí)器T0
MOV R0,#71H ;指向秒計(jì)時(shí)單元(71H-72H)
ACALL ADD1 ;調(diào)用加1程序(加1秒操作)
CLR C ;
MOV A,R3 ;
JZ FSS1 ;加1后為00,C=0
SETB C ;加1后不為00,C=1
FSS1: AJMP ADDMM ;
》》》》》》》》》》》省略》》》》》
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 加1子 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ADD1: MOV A,@R0 ;取當(dāng)前計(jì)時(shí)單元數(shù)據(jù)到A
DEC R0 ;指向前一地址
SWAP A ;A中數(shù)據(jù)高四位與低四位交換
ORL A,@R0 ;前一地址中數(shù)據(jù)放入A中低四位
ADD A,#01H ;A加1操作
DA A ;十進(jìn)制調(diào)整
MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高四位變0
MOV @R0,A ;放回前一地址單元
MOV A,R3 ;取回R3中暫存數(shù)據(jù)
INC R0 ;指向當(dāng)前地址單元
SWAP A ;A中數(shù)據(jù)高四位與低四位交換
ANL A,#0FH ;高四位變0
MOV @R0,A ;數(shù)據(jù)放入當(dāng)削地址單元中
RET ;子程序返回
》》》》》》》》》》》省略》》》》》
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延時(shí)程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;1MS延時(shí)程序,LED顯示程序用
DL1MS: MOV R6,#14H