u 原理图
u 程序框图:
调用显示子程序
u 程序清单:
;***************
;蓝球S表计时器;
;CPU:AT89C51
;2008年6月10日
;***************
LEDBUF EQU 30H ;显示码缓存区
HOUR EQU 40H
MINUTE EQU 41H
SECOND EQU 42H
KEY_STAR_12 EQU P1.0
KEY_GOON EQU P1.1
KEY_STOP EQU P1.2
KEY_STAR_24 EQU P1.3
LE_573 EQU P1.4 ;74HC573使能端
SPEKER EQU P1.5 ;报警器
COM1 EQU P3.5
COM2 EQU P3.4
COM3 EQU P3.3
COM4 EQU P3.2
M_12BIT BIT 20H.0 ;12m正计时标志位
S_24BIT BIT 20H.1 ;24s倒计时标志位
STOPBIT BIT 20H.2 ;停止标志位
GOONBIT BIT 20H.3 ;继续标志位
ALLOVERBIT BIT 20H.4 ;计时完标志位
C100us EQU 43H
TICK EQU 10000 ;置中断次数
T100us EQU 256-100 ;置定时器初始值
LJMP START ;跳转至主程序
ORG 000BH ;定时器0中断入口
T0INT:
PUSH PSW ;状态保护
PUSH ACC
MOV A,C100us+1
JZ GOON ;计数值是否为0
DEC C100us
GOON:
DEC C100us+1
MOV A,C100us
ORL A,C100us+1
JNZ EXIT
MOV C100us,#HIGH(TICK) ;重置计数值
MOV C100us+1,#LOW(TICK)
JB _24BIT,GOT0_24SDEC ;S_24BIT为1,即为显示24S倒计时
INC SECOND ;秒值加一
AJMP RECORDE_TIMECONTINUE
GOT0_24SDEC:
DEC SECOND ;秒值减1
MOV A,SECOND
JNZ EXIT
CLR S_24BIT ;计时完毕,报警
CLR SPEKER
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB SPEKER ;报警
MOV SECOND,#0 ;计时单元清0
MOV MINUTE,#0
MOV HOUR,#0
CLR TR0
CLR EA
SETB ALLOVERBIT
AJMP EXIT ;24s倒计时完成
RECORDE_TIMECONTINUE:
MOV A,SECOND
CJNE A,#60,EXIT ;判断秒值是否为60
MOV SECOND,#0 ;秒值为60,则清0
INC MINUTE ;分值加一
MOV A,#12
XRL A,MINUTE
JNZ EXIT
CLR M_12BIT ;计时完毕,报警
CLR SPEKER
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB SPEKER ;报警
MOV SECOND,#0 ;计时单元清0
MOV MINUTE,#0
MOV HOUR,#0 ;12分钟正计时完成
SETB ALLOVERBIT
EXIT:
POP ACC
POP PSW
RETI
;****************
;延时子程序
;****************
DELAY: ;延时子程序
MOV R7,#0FFH
DELAYLOOP:
DJNZ R7,DELAYLOOP
DJNZ R6,DELAYLOOP
RET
;****************
;扫键功能子程序
;****************
;判断是否有控制键按下,是哪一个键按下
SCAN_KEY:
JNB KEY_STAR_24,GOT0_STAR_24
JNB KEY_STAR_12,GOT0_STAR_12 ;通道切换,开机不计时,必须要按通道选择才记时
JNB KEY_STOP,GOTO_STOP
JNB KEY_GOON,GOTO_GOON
AJMP EXIT_SCAN_KEY
;24S倒计时按键
GOT0_STAR_24:
LCALL DELAY
JB KEY_STAR_24,EXIT_SCAN_KEY
GOT0_STAR_24_HERE:
; LCALL DISPLAY
JNB KEY_STAR_24,GOT0_STAR_24_HERE
AJMP EXIT_SCAN_KEY
;12分钟正计时按键
GOT0_STAR_12:
LCALL DELAY
JB KEY_STAR_12,EXIT_SCAN_KEY
GOT0_STAR_12_HERE:
; LCALL DISPLAY
JNB KEY_STAR_12,GOT0_STAR_12_HERE
AJMP EXIT_SCAN_KEY
;暂停键
GOTO_STOP:
LCALL DELAY
JB KEY_STOP,EXIT_SCAN_KEY
GOTO_STOP_HERE:
; LCALL DISPLAY
JNB KEY_STOP,GOTO_STOP_HERE
AJMP EXIT_SCAN_KEY
;继续键
GOTO_GOON:
LCALL DELAY
JB KEY_GOON,EXIT_SCAN_KEY
GOTO_GOON_HERE:
; JNB KEY_GOON,GOTO_GOON_HERE
SETB GOONBIT
AJMP EXIT_SCAN_KEY
EXIT_SCAN_KEY:
RET
;****************
;显示子程序
;****************
DISPLAY:
MOV A,HOUR ;显示小时值十位
MOV B,#10
DIV AB
CALL T0LED
MOV LEDBUF,A ;将十位值送显示码缓存区
MOV A,B ;显示小时值个位
CALL T0LED
ORL A,#80H ;显示小数点
MOV LEDBUF+1,A ;送显示码缓存区
MOV A,MINUTE ;显示分钟值十位
MOV B,#10
DIV AB
CALL T0LED
MOV LEDBUF+2,A ;将十位值送显示码缓存区
MOV A,B 显示分钟个位值
CALL T0LED
ORL A,#80H ;显示小数点
MOV LEDBUF+3,A ;送显示码缓存区
MOV A,SECOND
MOV B,#10 ;显示秒十位值
DIV AB
CALL T0LED
MOV LEDBUF+4,A ;送显示码缓存区
MOV A,B
CALL T0LED
MOV LEDBUF+5,A
DISPLAYLED:
MOV R0,#LED
MOV R1,#6 ;共6个八段管
MOV R2,#0110011B ;位扫描码初值
LOOP:
MOV A,#0
MOV P0,A ;关所有八段管
MOV A,@R0
CLR LE_573
MOV P0,A
SETB LE_573
MOV A,R2
MOV P3,A ;显示一位八段管
MOV R6,#01H
CALL DELAY
MOV A,R2 ;显示下一位
RR A
MOV R2,A
INC R0
DJNZ R1,LOOP
RET
;******************
;将字段码转换显示码
;******************
T0LED:
MOV P0,A
MOV A,@R0
MOV P0,A
MOV A,R2
MOV P3,A
MOV DPTR,#LEDMAP ;将字段码转换显示码
MOVC A,@A+DPTR
RET
;****************
;主程序
;****************
START:
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV 20H,#0
MOV 30H,#0
MOV 40H,#0
MOV 41H,#0
MOV 42H,#0
MOV TMOD,#02H 定时器工作方式2
MOV TH0,#T100us 定时器初始值
MOV TL0,#T100us
MOV IE,#10000010B ;EA=1,IT0=1
MOV HOUR,#0 ;显示初始值
MOV MINUTE,#0
MOV SECOND,#0
MOV C100us,#HIGH(TICK)
MOV C100us+1,#LOW(TICK)
; SETB TR0 启动定时器0
CIRCLE:
LCALL SCAN_KEY
JB S_24BIT,GOT0_24S
JB M_12BIT,CIRCLE_LOOP
CLR EA
CLR TR0
MOV LEDBUF,#0
LCALL DISPLAY ;无键按下,循环显示全0
AJMP CIRCLE
;进入24S倒计时模式
GOT0_24S:
MOV HOUR,#0 ;显示初始值
MOV MINUTE,#0
MOV SECOND,#24
CIRCLE_LOOP:
LCALL DISPLAY ;调用显示子程序,等待中断
;扫暂停键和继续键
JNB KEY_STOP,GOTO_STOP_WORK
JNB KEY_GOON,GOTO_GOON_WORK
AJMP WORK_SCAN_KEYOVER
;暂停键
GOTO_STOP_WORK:
LCALL DELAY
JB KEY_STOP,WORK_SCAN_KEYOVER
GOTO_STOP_HERE_WORK:
CLR EA
CLR TR0
; LCALL DISPLAY
JNB KEY_STOP,GOTO_STOP_HERE_WORK ;如果暂停,则停止计数
SETB STOPBIT
CLR EA
CLR TR0
AJMP WORK_SCAN_KEYOVER
;继续键
GOTO_GOON_WORK:
LCALL DELAY
JB KEY_GOON,WORK_SCAN_KEYOVER
GOTO_GOON_HERE_WORK:
CLR EA
CLR TR0
; LCALL DISPLAY
JNB KEY_GOON,GOTO_GOON_HERE_WORK
SETB GOONBIT
SETB EA
SETB TR0
WORK_SCAN_KEYOVER:
JBC ALLOVERBIT,CIRCLE ;如果一个计时流程完,则进入主循环
LJMP CIRCLE_LOOP ;如果一个计时流程未完,则进入子循环
;************
;字段码
;************
LEDMAP:
DB 3FH,06H,5BH,4FH ;八段数码管显示码
DB 66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H
END
u 程序框图:
调用显示子程序
u 程序清单:
;***************
;蓝球S表计时器;
;CPU:AT89C51
;2008年6月10日
;***************
LEDBUF EQU 30H ;显示码缓存区
HOUR EQU 40H
MINUTE EQU 41H
SECOND EQU 42H
KEY_STAR_12 EQU P1.0
KEY_GOON EQU P1.1
KEY_STOP EQU P1.2
KEY_STAR_24 EQU P1.3
LE_573 EQU P1.4 ;74HC573使能端
SPEKER EQU P1.5 ;报警器
COM1 EQU P3.5
COM2 EQU P3.4
COM3 EQU P3.3
COM4 EQU P3.2
M_12BIT BIT 20H.0 ;12m正计时标志位
S_24BIT BIT 20H.1 ;24s倒计时标志位
STOPBIT BIT 20H.2 ;停止标志位
GOONBIT BIT 20H.3 ;继续标志位
ALLOVERBIT BIT 20H.4 ;计时完标志位
C100us EQU 43H
TICK EQU 10000 ;置中断次数
T100us EQU 256-100 ;置定时器初始值
LJMP START ;跳转至主程序
ORG 000BH ;定时器0中断入口
T0INT:
PUSH PSW ;状态保护
PUSH ACC
MOV A,C100us+1
JZ GOON ;计数值是否为0
DEC C100us
GOON:
DEC C100us+1
MOV A,C100us
ORL A,C100us+1
JNZ EXIT
MOV C100us,#HIGH(TICK) ;重置计数值
MOV C100us+1,#LOW(TICK)
JB _24BIT,GOT0_24SDEC ;S_24BIT为1,即为显示24S倒计时
INC SECOND ;秒值加一
AJMP RECORDE_TIMECONTINUE
GOT0_24SDEC:
DEC SECOND ;秒值减1
MOV A,SECOND
JNZ EXIT
CLR S_24BIT ;计时完毕,报警
CLR SPEKER
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB SPEKER ;报警
MOV SECOND,#0 ;计时单元清0
MOV MINUTE,#0
MOV HOUR,#0
CLR TR0
CLR EA
SETB ALLOVERBIT
AJMP EXIT ;24s倒计时完成
RECORDE_TIMECONTINUE:
MOV A,SECOND
CJNE A,#60,EXIT ;判断秒值是否为60
MOV SECOND,#0 ;秒值为60,则清0
INC MINUTE ;分值加一
MOV A,#12
XRL A,MINUTE
JNZ EXIT
CLR M_12BIT ;计时完毕,报警
CLR SPEKER
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB SPEKER ;报警
MOV SECOND,#0 ;计时单元清0
MOV MINUTE,#0
MOV HOUR,#0 ;12分钟正计时完成
SETB ALLOVERBIT
EXIT:
POP ACC
POP PSW
RETI
;****************
;延时子程序
;****************
DELAY: ;延时子程序
MOV R7,#0FFH
DELAYLOOP:
DJNZ R7,DELAYLOOP
DJNZ R6,DELAYLOOP
RET
;****************
;扫键功能子程序
;****************
;判断是否有控制键按下,是哪一个键按下
SCAN_KEY:
JNB KEY_STAR_24,GOT0_STAR_24
JNB KEY_STAR_12,GOT0_STAR_12 ;通道切换,开机不计时,必须要按通道选择才记时
JNB KEY_STOP,GOTO_STOP
JNB KEY_GOON,GOTO_GOON
AJMP EXIT_SCAN_KEY
;24S倒计时按键
GOT0_STAR_24:
LCALL DELAY
JB KEY_STAR_24,EXIT_SCAN_KEY
GOT0_STAR_24_HERE:
; LCALL DISPLAY
JNB KEY_STAR_24,GOT0_STAR_24_HERE
AJMP EXIT_SCAN_KEY
;12分钟正计时按键
GOT0_STAR_12:
LCALL DELAY
JB KEY_STAR_12,EXIT_SCAN_KEY
GOT0_STAR_12_HERE:
; LCALL DISPLAY
JNB KEY_STAR_12,GOT0_STAR_12_HERE
AJMP EXIT_SCAN_KEY
;暂停键
GOTO_STOP:
LCALL DELAY
JB KEY_STOP,EXIT_SCAN_KEY
GOTO_STOP_HERE:
; LCALL DISPLAY
JNB KEY_STOP,GOTO_STOP_HERE
AJMP EXIT_SCAN_KEY
;继续键
GOTO_GOON:
LCALL DELAY
JB KEY_GOON,EXIT_SCAN_KEY
GOTO_GOON_HERE:
; JNB KEY_GOON,GOTO_GOON_HERE
SETB GOONBIT
AJMP EXIT_SCAN_KEY
EXIT_SCAN_KEY:
RET
;****************
;显示子程序
;****************
DISPLAY:
MOV A,HOUR ;显示小时值十位
MOV B,#10
DIV AB
CALL T0LED
MOV LEDBUF,A ;将十位值送显示码缓存区
MOV A,B ;显示小时值个位
CALL T0LED
ORL A,#80H ;显示小数点
MOV LEDBUF+1,A ;送显示码缓存区
MOV A,MINUTE ;显示分钟值十位
MOV B,#10
DIV AB
CALL T0LED
MOV LEDBUF+2,A ;将十位值送显示码缓存区
MOV A,B 显示分钟个位值
CALL T0LED
ORL A,#80H ;显示小数点
MOV LEDBUF+3,A ;送显示码缓存区
MOV A,SECOND
MOV B,#10 ;显示秒十位值
DIV AB
CALL T0LED
MOV LEDBUF+4,A ;送显示码缓存区
MOV A,B
CALL T0LED
MOV LEDBUF+5,A
DISPLAYLED:
MOV R0,#LED
MOV R1,#6 ;共6个八段管
MOV R2,#0110011B ;位扫描码初值
LOOP:
MOV A,#0
MOV P0,A ;关所有八段管
MOV A,@R0
CLR LE_573
MOV P0,A
SETB LE_573
MOV A,R2
MOV P3,A ;显示一位八段管
MOV R6,#01H
CALL DELAY
MOV A,R2 ;显示下一位
RR A
MOV R2,A
INC R0
DJNZ R1,LOOP
RET
;******************
;将字段码转换显示码
;******************
T0LED:
MOV P0,A
MOV A,@R0
MOV P0,A
MOV A,R2
MOV P3,A
MOV DPTR,#LEDMAP ;将字段码转换显示码
MOVC A,@A+DPTR
RET
;****************
;主程序
;****************
START:
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV 20H,#0
MOV 30H,#0
MOV 40H,#0
MOV 41H,#0
MOV 42H,#0
MOV TMOD,#02H 定时器工作方式2
MOV TH0,#T100us 定时器初始值
MOV TL0,#T100us
MOV IE,#10000010B ;EA=1,IT0=1
MOV HOUR,#0 ;显示初始值
MOV MINUTE,#0
MOV SECOND,#0
MOV C100us,#HIGH(TICK)
MOV C100us+1,#LOW(TICK)
; SETB TR0 启动定时器0
CIRCLE:
LCALL SCAN_KEY
JB S_24BIT,GOT0_24S
JB M_12BIT,CIRCLE_LOOP
CLR EA
CLR TR0
MOV LEDBUF,#0
LCALL DISPLAY ;无键按下,循环显示全0
AJMP CIRCLE
;进入24S倒计时模式
GOT0_24S:
MOV HOUR,#0 ;显示初始值
MOV MINUTE,#0
MOV SECOND,#24
CIRCLE_LOOP:
LCALL DISPLAY ;调用显示子程序,等待中断
;扫暂停键和继续键
JNB KEY_STOP,GOTO_STOP_WORK
JNB KEY_GOON,GOTO_GOON_WORK
AJMP WORK_SCAN_KEYOVER
;暂停键
GOTO_STOP_WORK:
LCALL DELAY
JB KEY_STOP,WORK_SCAN_KEYOVER
GOTO_STOP_HERE_WORK:
CLR EA
CLR TR0
; LCALL DISPLAY
JNB KEY_STOP,GOTO_STOP_HERE_WORK ;如果暂停,则停止计数
SETB STOPBIT
CLR EA
CLR TR0
AJMP WORK_SCAN_KEYOVER
;继续键
GOTO_GOON_WORK:
LCALL DELAY
JB KEY_GOON,WORK_SCAN_KEYOVER
GOTO_GOON_HERE_WORK:
CLR EA
CLR TR0
; LCALL DISPLAY
JNB KEY_GOON,GOTO_GOON_HERE_WORK
SETB GOONBIT
SETB EA
SETB TR0
WORK_SCAN_KEYOVER:
JBC ALLOVERBIT,CIRCLE ;如果一个计时流程完,则进入主循环
LJMP CIRCLE_LOOP ;如果一个计时流程未完,则进入子循环
;************
;字段码
;************
LEDMAP:
DB 3FH,06H,5BH,4FH ;八段数码管显示码
DB 66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H
END