(1)控制功能:
①启动/停止:秒表和时钟选择功能的总开关允许位。没按或偶次按下,关闭时钟和秒表功能选择。单次按下,允许进行秒表和时钟功能选择。
②暂停:秒表或时钟的停止信号。任何时候按下按钮停止秒表倒计时或停止时钟计时和撤销报警信号。
③复位:秒表和时钟复位信号。任何时候按下按钮秒表显示或时钟显示恢复初始状态:00.00.00.0 。
(2)调节功能:
通过6位按钮可以对数码的六位显示进行调整。任何时候都可以分别可以通过HH、HL、MH、ML、SH、SL对时的十位、时的个位、分的十位、分的个位、秒的十位和秒的个位进行调节并设定。
(3)显示功能:
同8个8段数码管进行显示。显示精度为0.01秒;最后一段数码管显示工作状态,“H”代表着是时钟,“E”代表着秒表倒计时。
按时、分、秒显示,采用24h制,如示数为“10.05.22.5H”,时钟显示读数为10时05分22.5秒。示数为“0.05.14.5E”,秒表倒计时显示,读数为5分14.5秒。
(4)秒表/时钟选择功能:
①提供两种模式,秒表倒计时和是时钟计时。
②通过TIME和SECONDS按钮进行选择。
③两种模式初始状态都为00.00.00,倒计时可以使用调节按钮进行设定,时钟功能可以通过调节按钮进行调整时间。
(5)报警功能:
倒计时报警功能,倒计时结束时,报警信号发出,蓝色的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
- /*-------------------------------------------------------------------------------------------*/
- /*-----------初始化函数-----------*/
- MAIN:
- MOV SP,#60H
- MOV R4,#10 ;100ms;时钟
- MOV R5,#10 ;100ms;秒表
- MOV TMOD,#11H
- MOV TL0,#(65535-7986)MOD 256;#9EH ;定时中断子程序。重装定时常数
- MOV TH0,#(65535-7986)/256;#58H ;10ms
- MOV TL1,#(65535-7986)MOD 256;#9EH ;定时中断子程序。重装定时常数
- MOV TH1,#(65535-7986)/256;#58H ;10ms
- /*-------------------------------------------------------------------------------------------*/
- /*-----------调节按键检测-----------*/
- 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
- /*-------------------------------------------------------------------------------------------*/
- /*-----------调节按键处理-----------*/
- SINCL: /*秒的数据处理*/
- 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: /*分的数据处理*/
- 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: /*时的数据处理*/
- MOV A,25H ;时调整
- CJNE A,#2,LH1 ;时的十位不满2时的处理
- INC 24H ;时 >20h
- MOV A,24H
- CJNE A,#4,HINC0L ;是否到达24
- MOV 24H,#0 ;时到24后,数码管清零
- 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 ;没有按下,返回数码按键监测
- LCALL DISP
- JNB SELTS,SELTHC ;模式切换
- K5:
- JB SELTH,TOKSL ;没有按下,返回数码按键监测
- 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 ;定时中断子程序。重装定时常数
- MOV TH0,#(65535-7986)/256;#58H ;10ms
- DJNZ R4,T0INTR ;10msX10=0.1S,未满20次,跳出中断子程序
- MOV R4,#10
- MOV 26H,#76H;最后一位指定显示H
- INC 27H ;1S,秒存储单元内数+1
- MOV A,27H
- CJNE A,#10,T0INTR ;未满10S,跳出中断,返回显示。;满10s,往下执行清零处理,十位+1
- MOV 27H,#0 ;满60S,秒单元清零
- INC 20H ;1S,秒存储单元内数+1
- MOV A,20H
- CJNE A,#10,T0INTR ;未满10S,跳出中断,返回显示。;满10s,往下执行清零处理,十位+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后,数码管清零
- 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 ;定时中断子程序。重装定时常数
- 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
- /*-------------------------------------------------------------------------------------------*/
- /*-----------数码管段值-----------*/
- 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, 下载次数: 166)
|