本设计为一秒表,可显示小时、分钟、秒的功能。程序开始运行时,数码管不显示任何内容。按下启停键时 ,开始从0时0分0秒以每秒为单位开始计时,可以从00时00分00秒计时到23时59分59秒,到达时间后开始重新从00时00分00秒开始计时。每按一下启停键,将在启动暂停之间切换。清零按键,无论是在运行还是暂停情况下,按下清零键,将时分秒都清零。
- DAT EQU 30H ;显示缓存首地址
- SCANLED EQU 38H ;动态扫描位
- SEC EQU 39H ;秒
- MIN EQU 3AH ;分
- HOUR EQU 3BH ;时
- CLK EQU 3CH ;中断次数
- DUAN EQU P2.0 ;段码锁存
- WEI EQU P2.1 ;位码锁存
- KEYS EQU P3.2 ;启停键
- KEYC EQU P3.3 ;清零键
- ORG 0000H
- LJMP MAIN
- ORG 000BH
- LJMP T0ISR ;50ms定时
- ORG 001BH
- LJMP T1ISR ;扫描显示
- ORG 0030H
- MAIN:
- MOV SP,#5FH ;栈顶
- MOV TMOD,#11H ;定时器模式为1
- MOV TH0,#03CH ;50毫秒定时
- MOV TL0,#0B0H
- MOV TH1,#0ECH ;5毫秒定时
- MOV TL1,#078H
- SETB ET0
- SETB ET1
- SETB TR1
- SETB EA
- MOV SCANLED,#0 ;初始化变量
- MOV 30H,#10H
- MOV 31H,#10H
- MOV 32H,#10H
- MOV 33H,#10H
- MOV 34H,#10H
- MOV 35H,#10H
- MOV 36H,#10H
- MOV 37H,#10H
- MOV SEC,#0
- MOV MIN,#0
- MOV HOUR,#0
- LOOP:
- JB P3.2,LOOP1 ;启停
- LCALL DELAY ;延时去抖
- JB P3.2,LOOP1 ;再次检测
- JNB P3.2,[ DISCUZ_CODE_1 ]nbsp; ;等待键抬起
- CPL TR0 ;启停计时
- SJMP LOOP
- LOOP1:
- JB P3.3,LOOP ;清零
- LCALL DELAY
- JB P3.3,LOOP
- JNB P3.3,$
- MOV SEC,#0 ;清零时间变量
- MOV MIN,#0
- MOV HOUR,#0
- LCALL DISCHG
- SJMP LOOP
- ;------------------
- ;十六进制转换为BCD
- HBCD:
- MOV B,#10
- DIV AB
- SWAP A
- ORL A,B
- RET
- ;--------------------
- ;延时约10毫秒
- DELAY:
- MOV R3,#50
- DELAY1:
- MOV R4,#100
- DJNZ R4,$
- DJNZ R3,DELAY1
- RET
- ;--------------------
- ;定时器0中断服务程序,计时功能
- T0ISR:
- PUSH ACC
- CLR TR0
- MOV TH0,#3CH ;重赋初值
- MOV TL0,#0B0H
- SETB TR0
- INC CLK ;中断次数加1
- MOV A,CLK
- CJNE A,#20,T0ISRE ;20次中断到?
- MOV CLK,#0 ;中断次数变量清零
- INC SEC ;秒加1
- MOV A,SEC
- CJNE A,#60,T0ISRE ;60秒到?
- MOV SEC,#0 ;秒变量清零
- INC MIN ;分加1
- MOV A,MIN
- CJNE A,#60,T0ISRE ;60分到?
- MOV MIN,#0 ;分变量清零
- INC HOUR ;小时加1
- MOV A,HOUR
- CJNE A,#24,T0ISRE ;24小时到?
- MOV SEC,#0 ;时分秒均清零
- MOV MIN,#0
- MOV HOUR,#0
- T0ISRE:
- LCALL DISCHG ;将时分秒转换为BCD码供显示
- POP ACC
- RETI
- ;--------------------
- DISCHG:
- MOV A,HOUR ;小时转换为BCD码,存入30H31H
- LCALL HBCD
- PUSH ACC
- ANL A,#0FH
- MOV 31H,A
- POP ACC
- ANL A,#0F0H
- SWAP A
- MOV 30H,A
- MOV A,MIN ;分转换位BCD码,存入33H34H
- LCALL HBCD
- PUSH ACC
- ANL A,#0FH
- MOV 34H,A
- POP ACC
- ANL A,#0F0H
- SWAP A
- MOV 33H,A
- MOV A,SEC ;秒转换为BCD码存入36H37H
- LCALL HBCD
- PUSH ACC
- ANL A,#0FH
- MOV 37H,A
- POP ACC
- ANL A,#0F0H
- SWAP A
- MOV 36H,A
- MOV 32H,#11H
- MOV 35H,#11H
- RET
- ;--------------------
- ;定时器1中断服务程序,用于动态扫描数码管显示
- T1ISR:
- PUSH ACC
- CLR TR1
- MOV TH1,#0ECH ;重装初值
- MOV TL1,#78H
- SETB TR1
- MOV DPTR,#LEDTAB ;段码表首地址
- T100:
- MOV R0,#DAT ;取显示缓存数据
- MOV A,SCANLED ;取显示当前位置
- ADD A,R0 ;求具体显示地址
- MOV R0,A
- MOV P0,#00H ;消隐
- SETB WEI ;置高位锁存
- MOV A,SCANLED ;取当前显示位置
- JNZ T101
- MOV P0,#01H ;等于0为第一位
- SJMP T1DIS
- T101:
- DEC A
- JNZ T102
- MOV P0,#02H ;等于1为第二位
- SJMP T1DIS
- T102:
- DEC A
- JNZ T103
- MOV P0,#04H ;等于2为第三位
- SJMP T1DIS
- T103:
- DEC A
- JNZ T104
- MOV P0,#08H ;等于3为第四位
- SJMP T1DIS
- T104:
- DEC A
- JNZ T105
- MOV P0,#10H ;等于4为第五位
- SJMP T1DIS
- T105:
- DEC A
- JNZ T106
- MOV P0,#20H ;等于5为第六位
- SJMP T1DIS
- T106:
- DEC A
- JNZ T107
- MOV P0,#40H ;等于6为第七位
- SJMP T1DIS
- T107:
- MOV P0,#80H ;等于7为第八位
- T1DIS:
- CLR WEI ;位锁存拉低
- MOV A,@R0
- MOVC A,@A+DPTR ;取段码
- SETB DUAN ;段锁存拉高
- MOV P0,A ;送段码
- CLR DUAN ;段锁存拉低
- INC SCANLED ;显示位地址加1
- MOV A,SCANLED
- CJNE A,#8,T1END ;共8位
- MOV SCANLED,#0
- T1END:
- POP ACC
- RETI
- ;--------------------
- LEDTAB:
- DB 0C0H ;"0" 00H
- DB 0F9H ;"1" 01H
- DB 0A4H ;"2" 02H
- DB 0B0H ;"3" 03H
- DB 99H ;"4" 04H
- DB 92H ;"5" 05H
- DB 82H ;"6" 06H
- DB 0F8H ;"7" 07H
- DB 80H ;"8" 08H
- DB 90H ;"9" 09H
- DB 88H ;"A" 0AH
- DB 83H ;"B" 0BH
- DB 0C6H ;"C" 0CH
- DB 0A1H ;"D" 0DH
- DB 86H ;"E" 0EH
- DB 8EH ;"F" 0FH
- DB 0FFH ;" " 10H
- DB 0BFH ;'-' 11H
- ;--------------------
- END
复制代码
全部资料51hei下载地址:
数码管显示秒表(有清零按键).zip
(67.96 KB, 下载次数: 87)
|