
1 通过键设置当前时间。
2 可设定闹钟,到时报警,一个发光管闪烁(1次/秒),有复位键停止报警。
3 可切换显示闹钟时间和当前时间。
二、系统硬件设计说明及原理图
1系统总体方案
1)由于要显示数字时间,所以需要6位数码管。
2)时间的定时用时钟电路,修改时间和定时用手动按键控制,报警通过喇叭和发光二极管显示。
3)ATC51单片机加上外围器件(2个3位共阳数码管,8个限流电阻,一个发光二极管和一个蜂鸣器)和应用程序(proteus软件和KEIL编译软件),构成相应的应用系统。
2系统设计原理图
通过S1、S2、S3和S4四个按键,对时间进行修改和闹钟的设置,S0控制闹钟的启动和停止。
按下S1键显示闹钟,松开后显示时间;按下S4键进入时间修改模式,再按S4键时间的时加1,按S2分加1,调整结束后按下S1恢复正常显示;按下S3键进入闹钟修改模式,再按S3键闹钟的时加1,按S2分加1,调整结束后按下S1恢复正常显示。
三、程序流程图及源程序
1.流程图
2.源程序
ORG 0000H
LJMP START
ORG 000BH
LJMP TIME
;********初始化*********
START: MOV SP, #50H
MOV 20H,#00H ;定义秒
MOV 21H,#00H ;定义分
MOV 22H,#00H ;定义时
MOV 23H,#01H ;定义闹钟分钟
MOV 24H,#01H ;定义闹钟小时
MOV 25H,#00H
MOV 26H,#01H
MOV 30H,#00H ;BCD SECOND
MOV 31H,#00H
MOV 32H,#00H ;BCD MINUTE
MOV 33H,#00H
MOV 34H,#00H ;BCD HOUR
MOV 35H,#00H
MOV 36H,#01H
MOV 37H,#00H
MOV 38H,#01H
MOV 39H,#00H
MOV 50H,#00H ;按键次数
MOV TMOD,#01H ;16位计数器
MOV TH0, #03CH ;赋初值
MOV TL0, #0B0H
MOV IE, #87H ;中断允许
SETB TR0 ;启动T0
MOV R2,#14H
MOV P2,#0FFH
;*********主程序**********
MAIN: JB P1.4,GB
LCALL TIMEPRO ;调用闹钟判断
GB: LCALL DISPLAY1 ;调用时间显示
JB P1.3,M1 ;P1.3=1时转移 S4没有按下
LCALL SETTIME ;调用SETTIME调时子程序
LJMP MAIN
M1: JB P1.2,M2 ;P1 g.2=1时转移 S3
LCALL SETATIME ;调用SETATIME子程序
LJMP MAIN
M2: JB P1.0,M4 ;P1.0=1时转移 S1
LCALL LOOKATIME ;调用LOOKATIME显示闹钟子程序
M4: LJMP MAIN
;*********延时子程序********
DELAY: MOV R4,#030H
DL00: MOV R5,#0FFH
DL11: MOV R6,#9H
DL12: DJNZ R6,DL12
DJNZ R5,DL11
DJNZ R4,DL00
RET
;***********时间调整*******
SETTIME: ;设置时间
L0: LCALL DISPLAY1
MM1: JB P1.3,L1 ;P1.3=1时转移
MOV C,P1.3
JC MM1
LCALL DELAY1 ;延时
JC MM1
MSTOP1: MOV C,P1.3 ;P1.3为0时转移
JNC MSTOP1
LCALL DELAY1 ;延时
MOV A,50H
INC 50H
CJNE A,#00H,HJ1
LJMP L0
HJ1: MOV C,P1.3
JNC MSTOP1
INC 22H ;小时自加一
MOV A,22H
CJNE A,#18H,GO12 ;小时计数循环
MOV 22H,#00H ;复位
MOV 34H,#00H
MOV 35H,#00H
LJMP L0
L1: JB P1.1,L2 ;P1.1=1时转移
MOV C,P1.1
JC L1
LCALL DELAY1 ;延时
JC L1
MSTOP2: MOV C,P1.1 ;P1.1=0时转移
JNC MSTOP2
LCALL DELAY1 ;延时
MOV C,P1.1
JNC MSTOP2
INC 21H ;分钟加一
MOV A,21H
CJNE A,#3CH,GO11 ;分钟计数循环
MOV 21H,#00H ; 复位
MOV 32H,#00H
MOV 33H,#00H
LJMP L0
GO11: MOV B,#0AH
DIV AB
MOV 32H,B ; 将A的低4位存入32单元
MOV 33H,A ; 将A的高4位存入33单元
LJMP L0
GO12: MOV B,#0AH
DIV AB
MOV 34H,B ;将A的低4位存入34单元
MOV 35H,A ; 将A的高4位存入35单元
LJMP L0
L2: JB P1.0,L0 ; P1.0=1时转移
MOV C,P1.0
JC L2
LCALL DELAY1 ;延时
MOV C,P1.0
JC L2
STOP1: MOV C,P1.0 ; P1.0=0时转移
JNC STOP1
LCALL DELAY1 ;延时
MOV C,P1.0
JNC STOP1
MOV 50H,#00H
LJMP MAIN
;*******设置闹钟*******
SETATIME:LCALL DISPLAY2 ; 调用DISPLAY2显示闹钟
N0: LCALL DISPLAY2
MM2: JB P1.2,N1 ;P1.2=1时转移
MOV C,P1.2
JC MM2
LCALL DELAY1 ; 延时
JC MM2
MSTOP3: MOV C,P1.2 ; P1.2=0时转移
JNC MSTOP3
LCALL DELAY1 ; 延时
MOV A,50H
INC 50H
CJNE A,#00H,HJ2
LJMP N0
HJ2: MOV C,P1.2
JNC MSTOP3
INC 24H ;小时加一
MOV A,24H
CJNE A,#24,GO22 ;小时计数循环
MOV 24H,#00H ;复位
MOV 38H,#00H
MOV 39H,#00H
LJMP N0
N1: JB P1.1,N2 ;P1.1=1时转移
MOV C,P1.1
JC N1
LCALL DELAY1 ;延时
JC N1
MSTOP4: MOV C,P1.1 ;P1.1=0时转移
JNC MSTOP4
LCALL DELAY1 ;延时
MOV C,P1.1
JNC MSTOP4
INC 23H ;分钟加一
MOV A,23H
CJNE A,#60,GO21 ;分钟计数循环
MOV 23H,#00H ;复位
MOV 36H,#00H
MOV 37H,#00H
LJMP N0
GO21: MOV B,#0AH
DIV AB
MOV 36H,B ;将A的低4位存入36单元
MOV 37H,A ;将A的高4位存入37单元
LJMP N0
GO22: MOV B,#0AH
DIV AB
MOV 38H,B ;将A的低4位存入38单元
MOV 39H,A ;将A的高4位存入39单元
LJMP N0
N2: JB P1.0 ,N0 ;P1.0=1时转移
MOV C,P1.0
JC N2
LCALL DELAY1 ;延时
MOV C,P1.0
JC N2
STOP2: MOV C,P1.0
JNC STOP2
LCALL DELAY1
MOV C,P1.0
JNC STOP2
MOV 50H,#00H
LJMP MAIN
;*******闹钟判断*****************
TIMEPRO: MOV A,21H
MOV B,23H
CJNE A,B,BK ;判断定时闹钟的分钟
MOV A,22H
MOV B,24H
CJNE A,B,BK ;判断定时闹钟的小时
SETB 25H.0
MOV C,25H.0
LCALL TIMEOUT ;调用TIMEOUT
BK:RET
;**************喇叭报警*****************
TIMEOUT:
X1: LCALL BZ ;调用喇叭响应程序
CLR 25H.0 ;调用喇叭响应程序结束
LCALL DELAY ;延时
CLR 25H.0
LJMP DISPLAY1
BZ:MOV C,25H.1
MOV P1.6,C
CLR P1.7
MOV R7,#0FFH ;喇叭响应时间
T2: MOV R6,#0FFH
T3: DJNZ R6,T3
DJNZ R7,T2
SETB P1.7
RET
;*************显示闹钟时间************
LOOKATIME:LCALL DISPLAY2
MM: JNB P1.0,LOOKATIME
LCALL DELAY1
LJMP MAIN
DELAY1: MOV R4,#14H ;时间延时
DL001: MOV R5,#0FFH
DL111: DJNZ R5,DL111
DJNZ R4,DL001
RET
;***********定时**************
TIME: PUSH ACC ;保护现场
PUSH PSW
MOV TH0,#03CH ;初值
MOV TL0,#0B0H
DJNZ R2,RET0
MOV R2,#14H
MOV A,20H
CPL 25H.1
CLR C
INC A ;秒自加一
CJNE A,#3CH,GO1 ;秒计数循环
MOV 20H,#0 ;复位
MOV 30H,#0
MOV 31H,#0
MOV A,21H
INC A ;分钟自加一
CJNE A,#3CH,GO2 ;分钟计数循环
MOV 21H,#0H ;复位
MOV 32H,#0
MOV 33H,#0
MOV A,22H
INC A ;小时自加一
CJNE A,#18H,GO3 ;小时计数循环
MOV 22H,#00H ;复位
MOV 34H,#0
MOV 35H,#0
AJMP RET0
GO1: MOV 20H,A
MOV B,#0AH
DIV AB
MOV 31H,A ;将A的低4位存入31单元
MOV 30H,B ;将A的高4位存入30单元
AJMP RET0
GO2: MOV 21H,A
MOV B,#0AH
DIV AB
MOV 33H,A ;将A的低4位存入33单元
MOV 32H,B ;将A的高4位存入32单元
AJMP RET0
GO3: MOV 22H,A
MOV B,#0AH
DIV AB
MOV 35H,A ;将A的低4位存入35单元
MOV 34H,B ;将A的高4位存入34单元
AJMP RET0
RET0: POP PSW ;恢复现场
POP ACC
RETI
;********显示子程序**********
DISPLAY1: MOV R0,#30H
MOV R3,#0FEH
MOV A,R3
PLAY1: MOV P2,A
MOV A,@R0 ;取要显示的数据
MOV DPTR,#DSEG1 ;指向字形段码首地址
MOVC A,@A+DPTR
CJNE R0,#34H,PA
ORL A,#80H
PA:CJNE R0,#32H,PB
ORL A,#80H
PB:CPL A ;查表取字形段码
MOV P0,A ;指向P0口
LCALL DL1
MOV P2,#0FFH
MOV A,R3 ;判断是否显示到最低位
RL A ;左移一位
JNB ACC.6,LD1
INC R0 ;缓冲器地址加一
MOV R3,A
LJMP PLAY1
LD1: RET
DISPLAY2: PUSH ACC ;保护现场
PUSH PSW
MOV R0,#36H
MOV R3,#0FBH
MOV A,R3
PLAY2: MOV P2,A
MOV A,@R0 ;取要显示的数据
MOV DPTR,#DSEG1 ;指向字形段码首地址
MOVC A,@A+DPTR
CJNE R0,#38H,PP
ORL A,#80H
PP:CPL A ;查表取字形段码
MOV P0,A ;指向P0口
LCALL DL1 ;调用DL1
MOV P2,#0FFH
MOV A,R3 ;判断是否显示到最低位
RL A ;左移一位
JNB ACC.6,LD2
INC R0 ;缓冲器地址加一
MOV R3,A
LJMP PLAY2 ;调用PLAY2
LD2: POP PSW
POP ACC ;恢复现场
RET
;******DELAY*******
DL1: MOV R7,#20H
DL: MOV R6,#20H
DL6: DJNZ R6,$
DJNZ R7,DL
RET
DSEG1: DB 3FH,06H,5BH,4FH,66H ;七段码表
DB 6DH,7DH,07H,7FH,6FH
END
5 课程设计体会
通过单片机课程设计之后,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我们还学会了如何去培养创新精神和严谨的科学作风,从而不断地战胜自己,超越自己。更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。
