数码管倒计时电路的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数码管倒计时电路的设计
LED数码管倒计时电路采用24H计时方式,时分秒用6位数码管显示,分、秒之间为闪烁位,每0.5秒闪烁一次。
该电路采用AT89C51单片机,可按需求设计计时数。
数码管时钟电路如图1所示,其采用AT89C51单片机,LED先是采用动态扫描方式实现,P1口输出段码数据,P3.3~P3.5口接三八译码器作扫描输出,P0.0~P0.6口接按钮开关,为了提高秒计时的精确性,采用12MHz晶振。
1.主程序
本设计中的计时采用定时器T0中断完成,其余状态循环调用显示子程序,当P0.6端口开关按下时,转入调时功能程序。
2.显示子程序
数码管显示的数据存放在内存单元40H~45H中,其中40H~41H存放秒数据,42H~43H 存放分数据,44H~45H存放时数据,每一地址单元内均为十进制BCD码。
由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。
显示时,先取出40H~45H某一地址中的数据,然后查得对应的显示用段码从P1口输出。
P3.3~P3.5口将对应的数码管选中,就能显示该地址单元的数据值。
3.定时器T0中断服务程序
定时器T0用于时间计时。
定时溢出中断周期设为50ms,中断累计20次(即1秒)时对秒计数单元进行加1操作。
时间计数单元地址分别在40H~41H(s),46H~77H(min),78H~79H(h),20H单元内存放“熄灭符”数据。
在计数单元中采用十进制BCD码计数,满60进位。
4.设置计时数程序
设置计时数程序的设计方法是,P0.0~P0.5分别对应秒个位秒十位,分个位分十位,时个位时十位,P0.6设置位,当P0.6为0时,进入设置状态,各位清0,设置结束,按P0.6开始计时。
5.汇编程序清单
ORG 0000H
LJMP START
ORG 000BH
LJMP ZM0
;*****************************
; 主程序
;*****************************
START: MOV TMOD,#11H ;设置定时器为0工作方试1
MOV TL0,#0B0H
MOV TH0,#3CH ;设置定时器0为50ms
SETB EA ;开总中断
SETB ET0 ;开定时器0中断
MOV DPTR,#TAB ;表格地址
MOV 20H,#0FFH ;设置闪烁位
MOV 40H,#00H ;秒个位
MOV 41H,#00H ;秒十位
MOV 42H,#00H ;分个位
MOV 43H,#00H ;分十位
MOV 44H,#00H ;时个位
MOV 45H,#00H ;时十位
MOV 50H,#0C0H ;秒个位显示码
MOV 51H,#0C0H ;秒十位显示码
MOV 52H,#0C0H ;分个位显示码
MOV 53H,#0C0H ;分十位显示码
MOV 54H,#0C0H ;时个位显示码
MOV 55H,#0C0H ;时十位显示码
MOV R2,#20 ;计数用,20*50ms为一秒
SETB TR0 ;定时器0开始计时
MAIN: ACALL DISPLAY ;显示
JB P0.6,MAIN ;调整键按下
ACALL DISP ;除抖
JB P0.6,MAIN
ACALL SETTIME ;进入调时
SJMP MAIN
;****************************
; 计时中断0
;****************************
ZM0: PUSH ACC ;保护现场
PUSH PSW
CLR ET0 ;关闭总中断
CLR TR0 ;关计时器0中断
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL0
MOV TL0,A
MOV TH0,#3DH
SETB TR0 ;开计时器0
DEC R2 ;闪烁位每0.5秒闪烁一次
MOV A,R2
MOV b,#10
DIV AB
MOV A,B
CJNE A,#0,NEXT ;到0.5秒了吗
CPL 06h ;闪烁位取反
NEXT: CJNE R2,#0,OUT ;到一秒钟对40H至45H各位进行调整MOV R2,#20
MOV R0,#40H ;秒数减一
ACALL DEC1
MOV R3,41H
CJNE R3,#255,OUT
ACALL CLS
MOV R0,#42H
ACALL DEC1 ;秒数数到0时,分数减一
MOV R3,43H
CJNE R3,#255,OUT
ACALL CLS
MOV R0,#44H ;分数减到0时,小时数减一
ACALL DEC1
MOV R3,45H
CJNE R3,#255,OUT
MOV 40H,#00H ;秒个位归0
MOV 41H,#00H ;秒十位归0
MOV 42H,#00H ;分个位归0
MOV 43H,#00H ;分十位归0
MOV 44H,#00H ;时个位归0
MOV 45H,#00H ;时十位归0
MOV 20H,#0BFH
ACALL OUT1 ;BCD码化为显示码CLR TR0
CLR TR0 ;关闭计时器0
SJMP MAIN ;都减为0时,程序结果,等待下一次设置时间
OUT: MOV R5,#6
;将40H至45H的BCD码译为相应的显示码存放在50H至55H中MOV R0,#45H
MOV R1,#55H
BIAN: MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A
DEC R0
DEC R1
DJNZ R5,BIAN
POP ACC
POP PSW
SETB ET0
RETI
;**************************
; 减一程序
;**************************
DEC1: CJNE @R0,#0,OUTT ;对相应的十位与个位进行减一处理
MOV @R0,#9
INC R0
DEC @R0
DEC R0
RET
OUTT: DEC @R0
RET
;**************************
; 归位程序
;**************************
CLS: MOV @R0,#9
INC R0
MOV @R0,#5
RET
;***************************
; BCD码化为显示码程序
;***************************
OUT1: MOV R5,#6 ;将40H至45H的BCD码译为相应的显示码存放在50H至55H中
MOV R0,#45H
MOV R1,#55H
BIAN1: MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A
DEC R0
DEC R1
DJNZ R5,BIAN1
RET
;**********************************
; 设置计时数程序
;**********************************
SETTIME:
CLR TR0 ;关闭计时器
ACALL DISPLAY
MOV 40H,#00H ;秒个位归0
MOV 41H,#00H ;秒十位归0
MOV 42H,#00H ;分个位归0
MOV 43H,#00H ;分十位归0
MOV 44H,#00H ;时个位归0
MOV 45H,#00H ;时十位归0
MOV 20H,#0BFH
ACALL OUT1 ;BCD码化为显示码
ACALL DISP ;除抖
JB P0.6,REI1
SELF: JNB P0.6,SELF ;等待键释放
PUSH ACC ;保护现场
PUSH PSW
MOV TL0,#0B0H ;重置计数器
MOV TH0,#3CH
WAIT: ACALL DISPLAY ;等待设置健按下
MOV A,P0
CPL A
JZ WAIT
ACALL DISP ;除抖
MOV A,P0
CPL A
JZ WAIT
MOV B,A ;保存数据
SELF1: MOV A,P0 ;等待健释放
CJNE A,#0FFH,SELF1
MOV A,B ;计算是哪个键按下,对相应的内存加一
MOV R1,#3FH
CLR C
AGAIN: RRC A
INC R1
JNC AGAIN
INC @R1
MOV B,R1
ACALL SETTIME0 ;对时间数据作相应的调整
ACALL OUT1 ;BCD码化为显示码
MOV R1,B
CJNE R1,#46H,W AIT ;p0.6再次为0时,开始计时
REI1: POP ACC
POP PSW
SETB TR0
RET ;返回
;*********************************
; 调整程序
;**********************************
SETTIME0:
MOV A,40H ;秒个位满10归0
CJNE A,#10,SET1
MOV 40H,#0
SET1: MOV A,41H ;秒十位满6归0
CJNE A,#6,SET2
MOV 41H,#0
SET2: MOV A,42H ;分个位满10归0
CJNE A,#10,SET3
MOV 42H,#0
SET3: MOV A,43H ;分十位满6归0
CJNE A,#6,SET4
MOV 43H,#0
SET4: MOV A,44H ;时个位满4归0
CJNE A,#4,SET5
MOV 44H,#0
SET5: MOV A,45H ;时十位满3归0 CJNE A,#3,SET6
MOV 45H,#0
SET6: RET
;**********************************
; 显示程序
;**********************************
DISPLAY:
MOV P1,50H ;显示秒个位
MOV P3,#0
ACALL DISP
MOV P1,#0FFH
MOV P1,51H ;显示秒十位
MOV P3,#8
ACALL DISP
MOV P1,#0FFH
MOV P1,20H ;显示闪烁位
MOV P3,#16
ACALL DISP
MOV P1,#0FFH
MOV P1,52H ;显示分个位
MOV P3,#24
ACALL DISP
MOV P1,#0FFH
MOV P1,53H ;显示分十位
MOV P3,#32
ACALL DISP
MOV P1,#0FFH
MOV P1,20H ;显示闪烁位
MOV P3,#40
ACALL DISP
MOV P1,#0FFH
MOV P1,54H ;显示时个位
MOV P3,#48
ACALL DISP
MOV P1,#0FFH
MOV P1,55H ;显示时十位
MOV P3,#56
ACALL DISP
MOV P1,#0FFH
RET
;*******************************
; 0.5ms延时程序
;*******************************
DISP: MOV 30H,#5
DD: MOV 31H,#50
DJNZ 31H,$
DJNZ 30H,DD
RET
;*************************************
; 表格
;*************************************
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;0至9的共阳显示码END。