在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 6位LED顯示單片機(jī)控制電子鐘/計(jì)數(shù)器

            6位LED顯示單片機(jī)控制電子鐘/計(jì)數(shù)器

            作者: 時間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
            這是我們設(shè)計(jì)的單片機(jī)電子鐘/計(jì)時器學(xué)習(xí)板,它采用6位LED數(shù)碼管顯示時、分、秒,以24小時計(jì)時方式??梢酝ㄟ^按鍵實(shí)現(xiàn)時分調(diào)整、秒表/時鐘功能轉(zhuǎn)換、省電(關(guān)閉顯示)等功能。我們能提供的完整的匯編語言源程序清單及電路原理設(shè)計(jì)圖有助于學(xué)習(xí)者進(jìn)行分析和進(jìn)行實(shí)驗(yàn)驗(yàn)證

            產(chǎn)品1:6位LED顯示單片機(jī)控制電子鐘/計(jì)數(shù)器成品板成品每套84元

            本文引用地址:http://www.biyoush.com/article/201611/317464.htm

            硬件參數(shù)板上資源:MCU STC89C52、6位Led顯示、3位按鍵。電源部分為5V直流電壓,需要穩(wěn)壓、濾波電路,不能接反!

            51單片機(jī)做的電子鐘在很多地方都有介紹, 對于單片機(jī)學(xué)習(xí)者來說這個程序基本上是一道門檻,掌握了電子鐘程序, 基本上可以說51單片機(jī)就掌握了80%。常見的電子鐘程序由顯示部分、計(jì)算部分、時鐘調(diào)整部分構(gòu)成,本產(chǎn)品硬件上完全支持倒計(jì)時器,客戶只要自己修改程序就能實(shí)現(xiàn)倒計(jì)時功能。

            為了實(shí)現(xiàn)LED顯示器的數(shù)字顯示,可以采用靜態(tài)顯示法和動態(tài)顯示法。由于靜態(tài)顯示法需要數(shù)據(jù)鎖存器等硬件,接口復(fù)雜一些。考慮時鐘顯示只有六位,且系統(tǒng)沒有其它復(fù)雜的處理任務(wù),所以決定采用動態(tài)掃描法實(shí)現(xiàn)LED的顯示。單片機(jī)采用易購的AT89S51系列,這樣單片機(jī)可具有足夠的空余硬件資源實(shí)現(xiàn)其它的擴(kuò)充功能,硬件系統(tǒng)的總體構(gòu)成如下圖所示:視頻演示http://xie-gang.com/SZDZZ.htm視頻演示

            該板采用AT89S51單片機(jī),最小化應(yīng)用設(shè)計(jì),采用共陽七段LED顯示器,P0口輸出段碼數(shù)據(jù),P2.0~P2.5做列掃描輸出,P1.0,P1.2,P1.3,接三個按鍵開關(guān),用以調(diào)時及功能設(shè)置。為了提高共陽數(shù)碼管的驅(qū)動電壓,用9012做電源驅(qū)動輸出。采用12M晶振,有利于提高秒計(jì)時的精度。

            本設(shè)計(jì)中,計(jì)時采用定時器T0中斷完成,其余狀態(tài)循環(huán)調(diào)用顯示子程序,當(dāng)端口開關(guān)按下時,轉(zhuǎn)入相應(yīng)功能程序。其主程序執(zhí)行流程圖見下左圖:



            數(shù)碼管顯示的數(shù)據(jù)存放在內(nèi)存單元70H~75H中。其中70H~71H存放秒數(shù)據(jù),72H~73H存放分?jǐn)?shù)據(jù),74H~75H存放時數(shù)據(jù),每一地址單元內(nèi)均為十進(jìn)制BCD碼。由于采用軟件動態(tài)掃描實(shí)現(xiàn)數(shù)據(jù)顯示功能,顯示用十進(jìn)制BCD碼數(shù)據(jù)的對應(yīng)段碼存放在ROM表中。顯示時,先取出70H~~75H某一地址中的數(shù)據(jù),然后查得對應(yīng)的顯示用段碼,并從P0口輸出,P2口將對應(yīng)的數(shù)碼管選中供電,就能顯示該地址單元的數(shù)據(jù)值。

            定時器T0用于時間計(jì)時。定時溢出中斷周期可分別設(shè)為50mst和10ms。中斷進(jìn)入后,先判斷是時鐘計(jì)時還是秒表計(jì)時,時鐘計(jì)時累計(jì)中斷20次(即1s)時,對秒計(jì)數(shù)單元進(jìn)行加1操作,秒表計(jì)時每10ms進(jìn)行加1操作。時鐘計(jì)數(shù)單元地址分別在70H~71H(秒)、76H~77H(分)和78H~79H(時),最大計(jì)時值為23時59分59秒。而秒表計(jì)數(shù)單元地址也在70H~~71H(0.01毫秒)、76H~~77H(秒)和78H~~79H(分),最大計(jì)時值為99分59.99秒。7AH單元內(nèi)存放“熄滅符”數(shù)據(jù)(#0AH)。在計(jì)數(shù)單元中采用十進(jìn)制BCD碼計(jì)數(shù),滿60(秒表功能時有100)進(jìn)位,T0中斷服務(wù)程序執(zhí)行流程見上圖右

            T1中斷服務(wù)程序用于指示調(diào)整單元數(shù)字的亮閃。在時間調(diào)整狀態(tài)下,每過0.3S將對應(yīng)單元的顯示數(shù)據(jù)換成“熄滅符”數(shù)據(jù)(#0AH)。這樣在調(diào)整時間時,對應(yīng)調(diào)整單元的顯示數(shù)據(jù)會間隔閃亮。

            調(diào)時功能程序的設(shè)計(jì)方法是:按下P1.0口按鍵,若按下時間短于1 s則進(jìn)入省電狀態(tài)(數(shù)碼管不亮,時鐘不停);否則進(jìn)入調(diào)分狀態(tài),等待操作,此時計(jì)時器停止走動。當(dāng)再按下按鈕時,若按下時間短于0.5s,則時間加1分;若按下時間長于0.5s,則進(jìn)入[小]時調(diào)整狀態(tài)。在[小]時調(diào)整狀態(tài)下,當(dāng)按鍵按下的時間長于0.5s時,退出調(diào)整狀態(tài),時鐘繼續(xù)走動。P1.1口按鍵在調(diào)時狀態(tài)下可實(shí)現(xiàn)減1功能。

            使用方法:按下K1按鍵,如果按下時間小于1秒,就會進(jìn)入省電模式,這時數(shù)碼管熄滅但是時鐘仍然運(yùn)行。如果按下K1按鍵時間大于1秒,就會進(jìn)入調(diào)分狀態(tài),此時計(jì)時器停止走動等待操作,這時中間的兩位00會閃爍,這時當(dāng)按下K1按鍵時間小于0.5秒時,時間信息就會加1(單位分鐘);若時間大于0.5秒,這時左邊的兩位00會閃爍,進(jìn)入小時調(diào)整,在小時調(diào)整狀態(tài)下按下S6按鍵時間小于0.5秒時,時間信息就會加1(單位小時),如果按下按鍵時間大于0.5S時,就會退出調(diào)整狀態(tài),時鐘繼續(xù)走動。

            配件:采用PL2303芯片的USB轉(zhuǎn)TTL串口模塊每個15元含一根4芯杜邦連接線

            你還可以另外購買我們的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ū)動),然后在STC編程軟件界面中選擇單片機(jī)型號STC89C52RC,選擇COM6(具體按電腦實(shí)際虛擬出的串口號)波特率選擇9600,點(diǎn)擊“OPEN FILE”選擇你的燒寫文件,點(diǎn)擊“下載”按鈕,然后接通超聲波測距成品學(xué)習(xí)板的電源,3秒左右就能完成程序下載并運(yùn)行。

            以下是部分匯編源程序,購買我們產(chǎn)品后我們可以通過電子郵件將完整的單片機(jī)匯編源程序和燒寫文件發(fā)送給客戶。;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;; AT89S51時鐘程序 ;;(該程序不全,不要直接使用。購買產(chǎn)品后提供全部程序和圖紙)
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;
            ; 定時器T0、T1溢出周期為50MS,T0為秒計(jì)數(shù)用, T1為調(diào)整時閃爍用,
            ; P1.0、P1.1、P1.2為調(diào)整按鈕,P0口 為字符輸出口,采用共陽顯示管。
            ;
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;; 中斷入口程序 ;
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;
            ORG 0000H ;程序執(zhí)行開始地址
            LJMP START ;跳到標(biāo)號START執(zhí)行
            ORG 0003H ;外中斷0中斷程序入口
            RETI ;外中斷0中斷返回
            ORG 000BH ;定時器T0中斷程序入口
            LJMP INTT0 ;跳至INTTO執(zhí)行
            ORG 0013H ;外中斷1中斷程序入口
            RETI ;外中斷1中斷返回
            ORG 001BH ;定時器T1中斷程序入口
            LJMP INTT1 ;跳至INTT1執(zhí)行
            ORG 0023H ;串行中斷程序入口地址
            RETI ;串行中斷程序返回
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;; 主 程 序 ;;
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;
            START: LCALL ST ;上電顯示年月日及班級學(xué)號
            MOV R0,#70H ;清70H-7AH共11個內(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位定時器
            MOV TL0,#0B0H ;50MS定時初值(T0計(jì)時用)
            MOV TH0,#3CH ;50MS定時初值
            MOV TL1,#0B0H ;50MS定時初值(T1閃爍定時用)
            MOV TH1,#3CH ;50MS定時初值
            SETB EA ;總中斷開放
            SETB ET0 ;允許T0中斷
            SETB TR0 ;開啟T0定時器
            MOV R4,#14H ;1秒定時用初值(50MS×20)
            START1: LCALL DISPLAY ;調(diào)用顯示子程序
            JNB P1.0,SETMM1 ;P1.0口為0時轉(zhuǎn)時間調(diào)整程序
            JNB P1.1,FUNSS ; 秒表功能,P1.1按鍵調(diào)時時作減1加能
            JNB P1.2,FUNPT ;STOP,PUSE,CLR
            SJMP START1 ;P1.0口為1時跳回START1
            SETMM1: LJMP SETMM ;轉(zhuǎn)到時間調(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個內(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ì)時程序 ;;
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;T0中斷服務(wù)程序
            INTT0: PUSH ACC ;累加器入棧保護(hù)
            PUSH PSW ;狀態(tài)字入棧保護(hù)
            CLR ET0 ;關(guān)T0中斷允許
            CLR TR0 ;關(guān)閉定時器T0
            JB 03H,FSS
            MOV A,#0B7H ;中斷響應(yīng)時間同步修正
            ADD A,TL0 ;低8位初值修正
            MOV TL0,A ;重裝初值(低8位修正值)
            MOV A,#3CH ;高8位初值修正
            ADDC A,TH0 ;
            MOV TH0,A ;重裝初值(高8位修正值)
            SETB TR0 ;開啟定時器T0
            DJNZ R4, OUTT0 ;20次中斷未到中斷退出
            ADDSS: MOV R4,#14H ;20次中斷到(1秒)重賦初值
            MOV R0,#71H ;指向秒計(jì)時單元(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秒時中斷退出
            ACALL CLR0 ;大于或等于60秒時對秒計(jì)時單元清0
            MOV R0,#77H ;指向分計(jì)時單元(76H-77H)
            ACALL ADD1 ;分計(jì)時單元加1分鐘
            MOV A,R3 ;分?jǐn)?shù)據(jù)放入A
            CLR C ;清進(jìn)位標(biāo)志
            CJNE A,#60H,ADDHH ;
            ADDHH: JC OUTT0 ;小于60分時中斷退出
            ACALL CLR0 ;大于或等于60分時分計(jì)時單元清0
            MOV R0,#79H ;指向小時計(jì)時單元(78H-79H)
            ACALL ADD1 ;小時計(jì)時單元加1小時
            MOV A,R3 ;時數(shù)據(jù)放入A
            CLR C ;清進(jìn)位標(biāo)志
            JB 03H,OUTT0 ;秒表時最大數(shù)為99
            CJNE A,#24H,HOUR ;
            HOUR: JC OUTT0 ;小于24小時中斷退出
            ACALL CLR0 ;大于或等于24小時小時計(jì)時單元清0
            OUTT0: MOV 72H,76H ;中斷退出時將分、時計(jì)時單元數(shù)據(jù)移
            MOV 73H,77H ;入對應(yīng)顯示單元
            MOV 74H,78H ;
            MOV 75H,79H ;
            POP PSW ;恢復(fù)狀態(tài)字(出棧)
            POP ACC ;恢復(fù)累加器
            SETB ET0 ;開放T0中斷
            RETI ;中斷返回
            ;秒表計(jì)時程序(10MS加1),低2位為0.1、0.01秒,中間2位為秒,最高位為分。
            ;最大計(jì)數(shù)值為99
            FSS: MOV A,#0F7H ;中斷響應(yīng)時間同步修正,重裝初值(10ms)
            ADD A,TL0 ;低8位初值修正
            MOV TL0,A ;重裝初值(低8位修正值)
            MOV A,#0D8H ;高8位初值修正
            ADDC A,TH0 ;
            MOV TH0,A ;重裝初值(高8位修正值)
            SETB TR0 ;開啟定時器T0
            MOV R0,#71H ;指向秒計(jì)時單元(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ù)據(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 ;子程序返回
            》》》》》》》》》》》省略》》》》》
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;; 延時程序 ;;
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;
            ;1MS延時程序,LED顯示程序用
            DL1MS: MOV R6,#14H

            #############################################################################################################################################

            產(chǎn)品2:采用AT89C2051的6位LED電子鐘(計(jì)數(shù)器)

            一、原理說明:

            1、顯示原理:

            顯示部分主要器件為2位共陽紅色數(shù)碼管,驅(qū)動采用PNP型三極管驅(qū)動,各端口配有限流電阻,驅(qū)動方式為掃描,占用P1.0~P1.6端口。冒號部分采用4個Φ3.0的紅色發(fā)光,驅(qū)動方式為獨(dú)立端口驅(qū)動,占用P1.7端口。

            2、鍵盤原理:

            按鍵S1~S3采用復(fù)用的方式與顯示部分的P3.5、P3.4、P3.2口復(fù)用。其工作方式為,在相應(yīng)端口輸出高電平時讀取按鍵的狀態(tài)并由單片機(jī)支除抖動并賦予相應(yīng)的鍵值。

            3、迅響電路及輸入、輸出電路原理:

            迅響電路由有源蜂鳴器和PNP型三極管組成。其工作原理是當(dāng)PNP型三極管導(dǎo)通后有源蜂鳴器立即發(fā)出定頻聲響。驅(qū)動方式為獨(dú)立端口驅(qū)動,占用P3.7端口。
            輸出電路是與迅響電路復(fù)合作用的,其電路結(jié)構(gòu)為有源蜂鳴器,5.1K定值電阻R6,排針J3并聯(lián)。當(dāng)有源蜂鳴器無迅響時J3輸出低電平,當(dāng)有源蜂鳴器發(fā)出聲響時J3輸出高電平,J3可接入數(shù)字電路等各種需要。驅(qū)動方式為迅響復(fù)合輸出,不占端口。

            輸入電路是與迅響電路復(fù)合作用的,其電路結(jié)構(gòu)是在迅響電路的PNP型三極管的基極電路中接入排針J2。引腳排針可改變單片機(jī)I/O口的電平狀態(tài),從而達(dá)到輸入的目的。驅(qū)動方式為復(fù)合端口驅(qū)動,占用P3.7端口。

            4、單片機(jī)系統(tǒng):

            本產(chǎn)品采用AT89C2051為核心器件(AT89C2051燒寫程序必須借助專用編程器,我們提供的單片機(jī)已經(jīng)寫入程序),并配合所有的必須的電路,只具有上電復(fù)位的功能,無手動復(fù)位功能。

            二、使用說明:

            1、功能按鍵說明: S1為功能選擇按鍵,S2為功能擴(kuò)展按鍵,S3為數(shù)值加一按鍵。
            2、功能及操作說明:操作時,連續(xù)短時間(小于1秒)按動S1,即可在以上的6個功能中連續(xù)循環(huán)。中途如果長按(大于2秒)S1,則立即回到時鐘功能的狀態(tài)。

            1、時鐘功能:上電后即顯示10:10:00 ,寓意十全十美。
            2、校時功能:短按一次S1,即當(dāng)前時間和冒號為閃爍狀態(tài),按動S2則小時位加1,按動S3則分鐘位加1,秒時不可調(diào)。
            3、鬧鐘功能:短按二次S1,顯示狀態(tài)為22:10:00,冒號為長亮。按動S2剛小時位加1,按動S3則分鐘位加1,秒時不可調(diào)。當(dāng)按動小時位超過23時則會顯示--:--:--,這個表示關(guān)閉鬧鐘功能。鬧鈴聲為蜂鳴器長鳴3秒鐘。
            4、倒計(jì)時功能:短按三次S1,顯示狀態(tài)為 0,冒號為長滅。按動S2則從低位依此顯示高位,按動S3則相應(yīng)位加1,當(dāng)S2按到第6次時會在所設(shè)定的時間狀態(tài)下開始倒計(jì)時,再次按動S2將再次進(jìn)入調(diào)整功能,并且停止倒計(jì)時。
            5、秒表功能:短按四次S1,顯示狀態(tài)為00:00:00,冒號為長亮。按動S2則開始秒表計(jì)時,再次按動S2則停止計(jì)時,當(dāng)停止計(jì)時的時候按動S3則秒表清零。
            6、計(jì)數(shù)器功能:短按五次S1,顯示狀態(tài)為00:00:00,冒號為長滅,按動S2則計(jì)數(shù)器加1,按動S3則計(jì)數(shù)器清零。

            采用AT89C2051的6位LED電子鐘(計(jì)數(shù)器)散件每套28元

            以下是部分C語言源程序,購買產(chǎn)品后可以向我們索要完整的單片機(jī)C語言源程序、燒寫文件和說明書。

            #include

            code senen_seg[10]={0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0}; //P1.7(冒號)口高電平

            bit key1_enter=0,key2_enter=0,key3_enter=0,countdown_mark=0,stopwatch_mark=0,count_mark=0,bell_mark=0; //狀態(tài)標(biāo)志
            unsigned char program=0,program_variable=0,count_bit=0,count=0;
            unsigned char hour=10,minute=10,second=0; //時間變量
            unsigned char delayed_hour=22,delayed_minute=10,delayed_second=0; //定時變量
            unsigned char count_hour=0,count_minute=0,count_second=0; //計(jì)時計(jì)數(shù)變量
            unsigned int count_time=0,count_count=0;

            void delay(unsigned int t) //延時子程序
            {
            unsigned int i,j;
            for(i=0;ifor(j=0;j<10;j++)
            ;
            }

            void time0_init(void){ //定時計(jì)數(shù)0器初始化
            EA=0;
            TR0=0;
            TMOD=0x02;
            TH0=0x4;
            TL0=0x4;
            ET0=1;
            TR0=1;
            EA=1;
            }

            static void timer0_isr(void) interrupt TF0_VECTOR using 1 //定時計(jì)數(shù)0器中斷函數(shù)
            {
            count_time++; //時鐘計(jì)時程序
            if(count_time>=4020){
            count_time=0;
            second++;
            if(second>=60){
            second=0;
            minute++;
            if(minute>=60){
            minute=0;
            hour++;
            if(hour>=24)hour=0;
            }
            }
            }
            if(delayed_hour==hour && delayed_minute==minute && second<4) P3_7=0;
            else P3_7=1;
            if(countdown_mark==1){ //倒計(jì)時程序
            count_count++;
            if(count_count>=4000 && (count_second!=0|count_minute!=0|count_hour!=0)){
            count_count=0;
            count_second--;
            if(count_second>=60){
            count_second=59;
            count_minute--;
            if(count_minute>=60){
            count_minute=59;
            count_hour--;
            if(count_hour>=100) count_hour=99;
            }
            }
            }
            if(count_second==0&&count_minute==0&&count_hour==0&&count_count<=12000) P3_7=0;
            else P3_7=1;
            if(count_count>=15000) count_count=14000;
            }
            if(stopwatch_mark==1){ //秒表程序
            count_count++;
            if(count_count>=40){
            count_count=0;
            count_second++;
            if(count_second>=100){
            count_second=0;
            count_minute++;
            if(count_minute>=60){
            count_minute=0;
            count_hour++;
            if(count_hour>=60) count_hour=0;
            }
            }
            }
            }
            }

            unsigned char show_key (void){
            unsigned char x=0,y=0;
            switch (program){
            case 0: P1&=senen_seg[second%10]; //時鐘秒的個位
            break;
            case 1: if(count_time>=2000) P1&=senen_seg[second%10]; //校正秒的個位
            break;
            case 2: if(delayed_hour==24) P1=0xfe; //鬧鐘秒的個位
            else P1&=senen_seg[delayed_second%10];
            break;
            case 3: if(count_bit>=0) P1&=senen_seg[count_second%10];//倒計(jì)時秒的個位
            else P1=0xff;
            break;
            case 4: P1&=senen_seg[count_second%10]; //秒表秒的個位
            break;
            case 5: P1&=senen_seg[count_second%10]; //計(jì)數(shù)器個位
            break;
            }
            P3_3=0;
            delay(10);
            if(P3_5==0){ //功能鍵1識別
            key1_enter=1;
            if(count<=254)count++;
            }
            if(P3_4==0) key2_enter=1; //功能鍵2識別
            if(P3_2==0) key3_enter=1; //功能鍵3識別
            P3_3=1;
            P1|=0xff;

            switch (program){
            case 0: P1&=senen_seg[second/10]; //時鐘秒的十位
            break;
            case 1: if(count_time>=2000) P1&=senen_seg[second/10]; //校正秒的十位
            break;
            case 2: if(delayed_hour==24) P1=0xfe; //鬧鐘秒的十位
            else P1&=senen_seg[delayed_second/10];
            break;
            case 3: if(count_bit>=1) P1&=senen_seg[count_second/10];//倒計(jì)時秒的十位
            else P1=0xff;
            break;
            case 4: P1&=senen_seg[count_second/10]; //秒表秒的十位
            break;
            case 5: P1&=senen_seg[count_second/10]; //計(jì)數(shù)器十位
            break;
            }
            P3_1=0;
            delay(10);
            P3_1=1;
            P1|=0xff;

            switch (program){
            case 0: P1&=senen_seg[minute%10]; //時鐘分的個位
            break;
            case 1: if(count_time>=2000) P1&=senen_seg[minute%10]; //校正分的個位
            break;
            case 2: if(delayed_hour==24) P1=0xfe; //鬧鐘分的個位
            else P1&=senen_seg[delayed_minute%10];
            break;
            case 3: if(count_bit>=2) P1&=senen_seg[count_minute%10];//倒計(jì)時分的個位
            else P1=0xff;
            break;
            case 4: P1&=senen_seg[count_minute%10]; //秒表分的個位
            break;
            case 5: P1&=senen_seg[count_minute%10]; //計(jì)數(shù)器百位
            break;
            }
            P3_2=0;
            delay(10);
            P3_2=1;
            P1|=0xff;

            switch (program){
            case 0: P1&=senen_seg[minute/10]; //時鐘秒的個位
            break;
            case 1: if(count_time>=2000) P1&=senen_seg[minute/10]; //校正秒的個位
            break;
            case 2: if(delayed_hour==24) P1=0xfe; //鬧鐘秒的個位
            else P1&=senen_seg[delayed_minute/10];
            break;
            case 3: if(count_bit>=3) P1&=senen_seg[count_minute/10];//倒計(jì)時秒的個位
            else P1=0xff;
            break;
            case 4: P1&=senen_seg[count_minute/10]; //秒表秒的個位
            break;
            case 5: P1&=senen_seg[count_minute/10]; //計(jì)數(shù)器千位
            break;
            }
            P3_5=0;
            delay(10);
            P3_5=1;
            P1|=0xff;

            switch (program){
            case 0: P1&=senen_seg[hour%10]; //時鐘時的個位
            break;
            case 1: if(count_time>=2000) P1&=senen_seg[hour%10]; //校正時的個位
            break;
            case 2: if(delayed_hour==24) P1=0xfe; //鬧鐘時的個位
            else P1&=senen_seg[delayed_hour%10];
            break;
            case 3: if(count_bit>=4) P1&=senen_seg[count_hour%10];//倒計(jì)時時的個位
            else P1=0xff;
            break;
            case 4: P1&=senen_seg[count_hour%10]; //秒表時的個位
            break;
            case 5: P1&=senen_seg[count_hour%10]; //計(jì)數(shù)器萬位
            break;
            }
            P3_0=0;
            delay(10);
            if(P3_4==1 && key2_enter==1){
            x=3; //確認(rèn)功能鍵2識別,返回3
            key2_enter=0;
            }
            P3_0=1;
            P1|=0xff;

            switch (program){
            case 0: P1&=senen_seg[hour/10]; //時鐘時的個位
            break;
            case 1: if(count_time>=2000) P1&=senen_seg[hour/10]; //校正時的個位
            break;
            case 2: if(delayed_hour==24) P1=0xfe; //鬧鐘時的個位
            else P1&=senen_seg[delayed_hour/10];
            break;
            case 3: if(count_bit>=5)P1&=senen_seg[count_hour/10]; //倒計(jì)時時的個位
            else P1=0xff;
            break;
            case 4: P1&=senen_seg[count_hour/10]; //秒表時的個位
            break;
            case 5: P1&=senen_seg[count_hour/10]; //計(jì)數(shù)器萬位
            break;
            }
            P3_4=0;
            delay(10);
            if(P3_5==1 && key1_enter==1){ //確認(rèn)功能鍵1識別,執(zhí)行退出或進(jìn)入下一個功能
            if(count>=127) x=1; //確認(rèn)功能鍵1為長按,返回1
            else x=2; //確認(rèn)功能鍵1為短按,返回2
            key1_enter=0;
            count=0;
            }
            if(P3_2==1 && key3_enter==1){
            x=4; //確認(rèn)功能鍵3識別,返回4
            key3_enter=0;
            }
            P3_4=1;
            P1|=0xff;
            if(program<=1 && count_time>=2000) P1&=0xff; //校時和顯示功能時鐘時冒號閃爍
            if(program<=1 && count_time<=2000) P1&=0x7f;
            if(program==2) P1&=0x7f; //設(shè)置鬧鐘功能時冒號長亮
            if(program==3) P1&=0xff; //設(shè)置倒計(jì)時功能時冒號長滅
            if(program==4) P1&=0x7f; //設(shè)置秒表功能時冒號長亮
            if(program==5) P1&=0xff; //設(shè)置計(jì)數(shù)時冒號長滅
            y=x;
            x=0;
            return y;
            }

            void main(){ //主程序
            P1=0xff;
            P3=0xff;
            time0_init();
            while(1){
            switch(program){
            case 0: while(program==0){ //時鐘菜單
            switch(show_key()){
            case 0: break;
            case 1: program=0;
            break;
            case 2: program=1;
            break;
            }
            }
            break; //校時菜單
            case 1: while(program==1){
            switch(show_key()){
            case 0: break;
            case 1: program=0;
            break;
            case 2: program=2;
            break;
            case 3: hour++;
            if(hour>=24)hour=0;
            break;
            case 4: minute++;
            if(minute>=60)minute=0;
            break;
            }
            }
            break;
            case 2: while(program==2){ //鬧鐘菜單
            switch(show_key()){
            case 0: break;
            case 1: program=0;
            break;
            case 2: program=3;
            break;
            case 3: delayed_hour++;
            if(delayed_hour>=25)delayed_hour=0;
            break;
            case 4: delayed_minute++;
            if(delayed_minute>=60)delayed_minute=0;
            break;
            }
            }
            break;
            case 3: while(program==3){ //倒計(jì)時菜單
            switch(show_key()){
            case 0: break;
            case 1: program=0;
            break;
            case 2: program=4;
            break;
            case 3: count_bit++;
            if(count_bit>=7)count_bit=0;
            break;
            case 4: switch(count_bit){
            case 0: count_second+=1;
            break;
            case 1: count_second+=10;
            break;
            case 2: count_minute+=1;
            break;
            case 3: count_minute+=10;
            break;
            case 4: count_hour+=1;
            break;
            case 5: count_hour+=10;
            break;
            case 6: break;
            }
            if(count_hour>=100) count_hour-=100;
            if(count_minute>=60) count_minute-=60;
            if(count_second>=60) count_second-=60;
            break;
            }
            if(count_bit==6) countdown_mark=1;
            else countdown_mark=0;
            }
            break;
            case 4: count_hour=0; //秒表菜單
            count_minute=0;
            count_second=0;
            while(program==4){
            switch(show_key()){
            case 0: break;
            case 1: program=0;
            break;
            case 2: program=5;
            break;
            case 3: stopwatch_mark=~stopwatch_mark;
            break;
            case 4: if(stopwatch_mark==0){
            count_hour=0;
            count_minute=0;
            count_second=0;
            }
            break;
            }
            }
            break; //計(jì)數(shù)器菜單
            case 5: count_hour=0;
            count_minute=0;
            count_second=0;
            while(program==5){
            switch(show_key()){
            case 0: break;
            case 1: program=0;
            break;
            case 2: program=0;
            break;
            case 3: count_second++;
            if(count_second>=100){
            count_second=0;
            count_minute++;
            if(count_minute>=100){
            count_minute=0;
            count_hour++;
            if(count_hour>=100)count_hour=0;
            }
            }
            break;
            case 4: count_hour=0;
            count_minute=0;
            count_second=0;
            break;
            }
            if(P3_7==0){
            while(P3_7==0) show_key();
            count_second++;
            if(count_second>=100){
            count_second=0;
            count_minute++;
            if(count_minute>=100){
            count_minute=0;



            評論


            技術(shù)專區(qū)

            關(guān)閉