(1)控制功能:
①啟動/停止:秒表和時鐘選擇功能的總開關允許位。沒按或偶次按下,關閉時鐘和秒表功能選擇。單次按下,允許進行秒表和時鐘功能選擇。
②暫停:秒表或時鐘的停止信號。任何時候按下按鈕停止秒表倒計時或停止時鐘計時和撤銷報警信號。
③復位:秒表和時鐘復位信號。任何時候按下按鈕秒表顯示或時鐘顯示恢復初始狀態(tài):00.00.00.0 。
(2)調節(jié)功能:
通過6位按鈕可以對數(shù)碼的六位顯示進行調整。任何時候都可以分別可以通過HH、HL、MH、ML、SH、SL對時的十位、時的個位、分的十位、分的個位、秒的十位和秒的個位進行調節(jié)并設定。
(3)顯示功能:
同8個8段數(shù)碼管進行顯示。顯示精度為0.01秒;最后一段數(shù)碼管顯示工作狀態(tài),“H”代表著是時鐘,“E”代表著秒表倒計時。
按時、分、秒顯示,采用24h制,如示數(shù)為“10.05.22.5H”,時鐘顯示讀數(shù)為10時05分22.5秒。示數(shù)為“0.05.14.5E”,秒表倒計時顯示,讀數(shù)為5分14.5秒。
(4)秒表/時鐘選擇功能:
①提供兩種模式,秒表倒計時和是時鐘計時。
②通過TIME和SECONDS按鈕進行選擇。
③兩種模式初始狀態(tài)都為00.00.00,倒計時可以使用調節(jié)按鈕進行設定,時鐘功能可以通過調節(jié)按鈕進行調整時間。
(5)報警功能:
倒計時報警功能,倒計時結束時,報警信號發(fā)出,藍色的LED亮。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- /*-------------------------------------------------------------------------------------------*/
- /*-----------按鍵定義-----------*/
- STRT EQU P1.6 ;啟動
- STP EQU P1.7 ;停止
- CLRR EQU P3.0 ;復位
- SELTS EQU P3.6 ;時鐘
- SELTH EQU P3.7 ;秒表
- SECL EQU P1.0 ;秒個位
- SECH EQU P1.1 ;秒十位
- MINL EQU P1.2 ;分
- MINH EQU P1.3 ;
- HOURL EQU P1.4 ;時
- HOURH EQU P1.5 ;
- /*-------------------------------------------------------------------------------------------*/
- ORG 0000H
- SJMP MAIN
- ORG 000BH ;T0定時器入口
- AJMP T0INT0
- ORG 001BH ;T1定時器入口
- AJMP T1INT1
- ORG 30H
- /*-------------------------------------------------------------------------------------------*/
- /*-----------初始化函數(shù)-----------*/
- MAIN:
- MOV SP,#60H
- MOV R4,#10 ;100ms;時鐘
- MOV R5,#10 ;100ms;秒表
- MOV TMOD,#11H
- MOV TL0,#(65535-7986)MOD 256;#9EH ;定時中斷子程序。重裝定時常數(shù)
- MOV TH0,#(65535-7986)/256;#58H ;10ms
- MOV TL1,#(65535-7986)MOD 256;#9EH ;定時中斷子程序。重裝定時常數(shù)
- MOV TH1,#(65535-7986)/256;#58H ;10ms
- /*-------------------------------------------------------------------------------------------*/
- /*-----------調節(jié)按鍵檢測-----------*/
- KSL:
- LCALL DISP ;秒個調整按鍵
- JB SECL,KSH ;沒有按下的處理,即SECL為高電平。
- LCALL DISP
- JNB SECL,$-3 ;消除抖動
- AJMP SINCL
- KSH: LCALL DISP ;秒10調整按鍵
- JB SECH,KML
- LCALL DISP
- JNB SECH,$-3
- AJMP SINCH
- KML: JB MINL,KMH ;分個調整按鍵
- LCALL DISP
- JNB MINL,$-3
- AJMP MINCL
- KMH: JB MINH,KHL ;分10調整按鍵
- LCALL DISP
- JNB MINH,$-3
- AJMP MINCH
- KHL:
- JB HOURL,KHH ;時個調整按鍵
- LCALL DISP
- JNB HOURL,$-3
- AJMP HINCL
- KHH: JB HOURH,K1 ;時10調整按鍵
- LCALL DISP
- JNB HOURH,$-3
- AJMP HINCH
- /*-------------------------------------------------------------------------------------------*/
- /*-----------調節(jié)按鍵處理-----------*/
- SINCL: /*秒的數(shù)據(jù)處理*/
- INC 20H ;秒個位的調整 +1
- MOV A,20H
- CJNE A,#10,SINC0L ;
- MOV 20H,#0 ;滿10的處理
- SINC0L: AJMP KSL ;返回KSL按鍵處理
- SINCH:
- INC 21H
- MOV A,21H
- CJNE A,#6,SINC0H ;60s
- MOV 21H,#0
- SINC0H: AJMP KSH
- MINCL: /*分的數(shù)據(jù)處理*/
- INC 22H ;分調整
- MOV A,22H
- CJNE A,#10,MINC0L ;60min
- MOV 22H,#0
- MINC0L: AJMP KML
- MINCH:
- INC 23H ;分調整
- MOV A,23H
- CJNE A,#6,MINC0H ;60min
- MOV 23H,#0
- MINC0H: AJMP KMH
- HINCL: /*時的數(shù)據(jù)處理*/
- MOV A,25H ;時調整
- CJNE A,#2,LH1 ;時的十位不滿2時的處理
- INC 24H ;時 >20h
- MOV A,24H
- CJNE A,#4,HINC0L ;是否到達24
- MOV 24H,#0 ;時到24后,數(shù)碼管清零
- HINC0L: AJMP KHL
- LH1:
- INC 24H ;時<20h
- MOV A,24H
- CJNE A,#10,HINC0L ;24h
- MOV 24H,#0
- HINCH:
- INC 25H ;時調整
- MOV A,25H
- CJNE A,#3,HINC0H ;24h
- MOV 25H,#0
- HINC0H: AJMP KHH
- /*-------------------------------------------------------------------------------------------*/
- /*-----------控制按鍵掃描-----------*/
- K1: LCALL DISP ;開始鍵
- JB STRT,K2 ;
- LCALL DISP
- JNB STRT,$-3
- AJMP START
- K2: JB STP,K3 ;暫停鍵
- LCALL DISP
- JNB STP,STOP ;消抖處理
- K3:
- JB CLRR,K4 ;沒有按下,轉到K4
- LCALL DISP
- JNB CLRR,CLEAR ;清零鍵
- AJMP KSL
- K4:
- JB SELTS,K5 ;沒有按下,返回數(shù)碼按鍵監(jiān)測
- LCALL DISP
- JNB SELTS,SELTHC ;模式切換
- K5:
- JB SELTH,TOKSL ;沒有按下,返回數(shù)碼按鍵監(jiān)測
- LCALL DISP
- JNB SELTH,SELTSC ;模式切換
- AJMP KSL
- TOKSL:
- AJMP KSL
- /*-------------------------------------------------------------------------------------------*/
- /*-----------控制按鍵處理-----------*/
- START:
- ;打開中斷總開關
- CPL EA
- AJMP K1
- STOP:
- CLR TR0 ;暫停
- CLR TR1
- SETB P1.6;停止報警
- AJMP K2
- CLEAR:
- CLR TR0 ;清零
- CLR TR1
- MOV A,#0
- MOV 20H,A
- MOV 21H,A
- MOV 22H,A
- MOV 23H,A
- MOV 24H,A
- MOV 25H,A
- MOV 26H,A
- MOV 27H,A
- AJMP K3
- SELTHC: ;時鐘模式選擇
- SETB TR0
- SETB ET0
- CLR ET1
- CLR TR1
- AJMP K4
- SELTSC: ;秒表模式選擇
- SETB TR1
- SETB ET1
- SETB P3.1;清除報警燈
- CLR ET0
- CLR TR0
- AJMP K5
- /*-------------------------------------------------------------------------------------------*/
- /*---------T0中斷處理---------*/
- T0INT0:
- MOV TL0,#(65535-7986)MOD 256;#9EH ;定時中斷子程序。重裝定時常數(shù)
- MOV TH0,#(65535-7986)/256;#58H ;10ms
- DJNZ R4,T0INTR ;10msX10=0.1S,未滿20次,跳出中斷子程序
- MOV R4,#10
- MOV 26H,#76H;最后一位指定顯示H
- INC 27H ;1S,秒存儲單元內(nèi)數(shù)+1
- MOV A,27H
- CJNE A,#10,T0INTR ;未滿10S,跳出中斷,返回顯示。;滿10s,往下執(zhí)行清零處理,十位+1
- MOV 27H,#0 ;滿60S,秒單元清零
- INC 20H ;1S,秒存儲單元內(nèi)數(shù)+1
- MOV A,20H
- CJNE A,#10,T0INTR ;未滿10S,跳出中斷,返回顯示。;滿10s,往下執(zhí)行清零處理,十位+1
- MOV 20H,#0 ;滿60S,秒單元清零
- ;秒十位+1
- INC 21H ;秒10位
- MOV A,21H
- CJNE A,#6,T0INTR ;6
- MOV 21H,#0
- INC 22H ;分個+1
- MOV A,22H
- CJNE A,#10,T0INTR
- MOV 22H,#0
- INC 23H ;分十+1
- MOV A,23H
- CJNE A,#6,T0INTR
- MOV 23H,#0
- MOV A,25H
- CJNE A,#2,L1 ;時的十位不滿2時的處理
- ;時的十位滿2的處理
- INC 24H
- MOV A,24H
- CJNE A,#4,T0INTR ;是否到達24
- ;時到24后,數(shù)碼管清零
- MOV A,#0
- MOV 20H,A
- MOV 21H,A
- MOV 22H,A
- MOV 23H,A
- MOV 24H,A
- MOV 25H,A
- RETI
- ;子程序
- L1: INC 24H
- MOV A,24H
- CJNE A,#10,T0INTR
- MOV 24H,#0 ;時的個位清零
- INC 25H ;時的十位+1
- MOV A,28H
- T0INTR: RETI
- /*-------------------------------------------------------------------------------------------*/
- /*-----------T1中斷處理-----------*/
- T1INT1:
- MOV TL1,#(65535-7986)MOD 256;#9EH ;定時中斷子程序。重裝定時常數(shù)
- MOV TH1,#(65535-7986)/256;#58H ;10ms
- DJNZ R5,T0INTR ;不滿10次,跳轉
- MOV R5,#10
- MOV A,27H
- CJNE A,#0,TLSL;判斷0.01s是否為0
- MOV A,20H
- CJNE A,#0,TSL ;判斷秒的個位是否為0
- MOV A,21H
- CJNE A,#0,TSH ;判斷秒的十位是否為0
- MOV A,22H
- CJNE A,#0,TML ;判斷分的個位是否為0
- MOV A,23H
- CJNE A,#0,TMH ;判斷分的十位是否為0
- MOV A,24H
- CJNE A,#0,THL ;判斷時的個位是否為0
- MOV A,25H
- CJNE A,#0,THH ;判斷時的十位是否為0
- CLR P3.1 ;計時結束的標志
- RETI;返回中斷處
- TLSL: ;0.01s不為0,進行-1
- DEC 27H
- MOV 26H,#79H;最后一位指定顯示E
- RETI
- TSL: ;秒個位不為0,進行-1
- DEC 20H
- MOV 26H,#79H;最后一位指定顯示E
- MOV 27H,#9
- RETI
- TSH: ;秒十位不為0,進行-1,個位為9
- DEC 21H
- MOV 26H,#79H;最后一位指定顯示E
- MOV 27H,#9
- MOV 20H,#9
- RETI
- TML:
- DEC 22H
- MOV 26H,#79H;最后一位指定顯示E
- MOV 27H,#9
- MOV 21H,#5
- MOV 20H,#9
- RETI
- TMH:
- DEC 23H
- MOV 26H,#79H;最后一位指定顯示E
- MOV 27H,#9
- MOV 22H,#9
- MOV 21H,#5
- MOV 20H,#9
- RETI
- THL:
- DEC 24H
- MOV 26H,#79H;最后一位指定顯示E
- MOV 27H,#9
- MOV 23H,#5
- MOV 22H,#9
- MOV 21H,#5
- MOV 20H,#9
- RETI
- THH:
- DEC 25H
- MOV 26H,#79H;最后一位指定顯示E
- MOV 27H,#9
- MOV 24H,#9
- MOV 23H,#5
- MOV 22H,#9
- MOV 21H,#5
- MOV 20H,#9
- RETI
- /*-------------------------------------------------------------------------------------------*/
- /*-----------顯示處理-----------*/
- DISP:
- MOV A,26H
- MOV P0,A ;顯示
- CLR P2.0
- ACALL DLY
- SETB P2.0
- MOV A,27H ;0.1S
- ACALL SEG7
- MOV P0,A
- CLR P2.1
- ACALL DLY
- SETB P2.1
- MOV A,20H ;秒個位
- ACALL SEG7
- MOV P0,A ;顯示秒個位
- SETB P0.7
- CLR P2.2
- ACALL DLY
- SETB P2.2
- MOV A,21H ;秒十位
- ACALL SEG7
- MOV P0,A
- CLR P2.3
- ACALL DLY
- SETB P2.3
- MOV A,22H ;分個位
- ACALL SEG7
- MOV P0,A
- SETB P0.7
- CLR P2.4
- ACALL DLY
- SETB P2.4
- MOV A,23H ;分十位
- ACALL SEG7
- MOV P0,A
- CLR P2.5
- ACALL DLY
- SETB P2.5
- MOV A,24H ;時個位
- ACALL SEG7
- MOV P0,A
- SETB P0.7
- CLR P2.6
- ACALL DLY
- SETB P2.6
- MOV A,25H ;時十位
- ACALL SEG7
- MOV P0,A
- CLR P2.7
- ACALL DLY
- SETB P2.7
- RET
- /*-------------------------------------------------------------------------------------------*/
- /*-----------延時部分-----------*/
- DLY10: MOV R3,#30
- D0: ACALL DLY
- DJNZ R3,D0
- RET
- DLY: MOV R7,#2
- D1: MOV R6,#40
- DJNZ R6,$
- DJNZ R7,D1
- RET
- /*-------------------------------------------------------------------------------------------*/
- /*-----------數(shù)碼管段值-----------*/
- SEG7:
- INC A
- MOVC A,@A+PC
- RET
- DB 03FH ;0 共陰
- DB 006H ;1
- DB 05BH ;2
- DB 04FH ;3
- DB 066H ;4
- DB 06DH ;5
- DB 07DH ;6
- DB 007H ;7
- DB 07FH ;8
- DB 06FH ;9
- END
復制代碼
全部資料51hei下載地址:
秒表 時鐘.zip
(121.36 KB, 下載次數(shù): 166)
2020-6-20 11:02 上傳
點擊文件名下載附件
|