功能:整点报时,时分秒调整,闹钟的设置,闹钟开关,万年历及其调整,闰年
判断,秒表,芯片:AT89S52,HD7279A
切换到年月日显示当前日期
将日期调整到2008年验证闰年
PCB图
计时开始,黄灯为闹钟就绪灯
万年历从0000年可到9999年
59分59秒了,整点报时灯红灯准备亮起
红灯亮了,整点到了,30S后整点报时灯(红)自动熄灭
下一步验证闹钟,闹钟就绪灯(黄)为开,当前闹钟时间为01时01分
闹钟灯(绿)亮了,其实还有一个在响,关掉闹钟,黄灯和绿灯都被关掉,若不关闭则一分钟后自动关闭,但是闹钟就绪灯不会自动关闭,下图为手动关闭
秒表准备
秒表
秒表停止,计时1S90MS
ORG 0000H LJMP MAINORG 000BH LJMP CLOCKORG 001BH LJMP BRTORG 0030HKEY BIT P1.4CLK BIT P1.5DAT BIT P1.6CS BIT P1.7 ;说明:P1.0为正点报时标志,在正点时亮器,半分钟后自动关闭, ;P1.1为闹钟开关标志,可由键盘设置 ,初始状态为开,亮30秒 ;P1.3,P1.2为闹钟,一分钟后自动关闭,亮的前提是闹钟开关打开 ;P1.4为KEY,P1.7CS ;可通过在正常显示状态下按3键随时关闭闹铃 ;在走时状态下按1键进入时间调整,按3小时加1,按4时加1,再按1切换到分,按3加1,按4减1,按F返回 ;在时钟状态下,按2进入闹钟设置,其它同时间调整 ;在时钟状态下,按3进入闹钟开关,可随时开关闹铃?若不关则1分钟后 自动关闭 ;在时钟状态下按C进入秒表,按D开始,按E停止,按c清零,再按D可重新开始,按f退出秒表 ;在时钟状态下按0显示年月日,按D进入日期调整,可自动识别闰年。MAIN: MOV SP,#60H MOV TMOD,#11H ;定时器0,1工作在方式1 MOV IE,#8AH ;开定时器中断 MOV TH1,#0D8H MOV TL1,#0F0H MOV TL0,#0B0H ;定时器地低位初始化 MOV TH0,#3CH ;定时器高位初始化 MOV 2AH,#14H ;年高位 MOV 2BH,#09H ;年低位 MOV 2CH,#05H ;月 MOV 2DH,#19H ;日 MOV 20H,#17H ;时单位 MOV 21H,#3BH ;分单元 MOV 22H,#30H ;秒单元 MOV 23H,#00H ;定时器计数单元 MOV 50H,#00H ;闹钟时位 MOV 51H,#00H ;闹钟分位 MOV 52H,#00H ;闹钟秒位 SETB TR0 ;开始定时 CLR P1.1 ;闹铃状态开关 SETB P1.0 ;关整点报时灯 SETB P1.3 ;闹铃关 SETB P1.2 ;*******************初始化完毕********************************SS:LCALL CUTIN0 LCALL DISP JB KEY,LK LCALL READ LCALL LDELAY MOV A,28HLP1:JNB KEY,LP1 CJNE A,#01H,NAO ;按1键进入时间设置 LCALL KEY0 SJMP LKNAO:CJNE A,#02H,SWITCH ;按2键键入闹钟设置 LCALL LDELAY LCALL KEY1 SJMP LKSWITCH:CJNE A,#03H,MB ;按3键进入闹钟开关 MOV C,P1.1 CPL C LCALL LONG MOV P1.1,C SJMP LKMB: CJNE A,#0CH,DATE ;按C键进入秒表 LCALL MBWAIT ;按0键进入年月日显示 SJMP LKDATE: CJNE A,#00H,SETD D1: LCALL CUTIN2 LCALL DISPD LCALL SHORT JB KEY,D1 LCALL READ MOV A,28H CJNE A,#0FH,D1 MOV 29H,#98H LCALL SEND MOV 29H,#03FH CALL SEND SJMP SSSETD:CJNE A,#0DH,LK ;按D键进入年月日调整 LCALL KEY2 LK:SJMP SSCUTIN0: MOV 25H,R0 MOV R0,#78H MOV A,22H ACALL BCD MOV A,21H ACALL BCD MOV A,20H ACALL BCD MOV R0,25H RETCUTIN1: MOV 25H,R0 MOV R0,#78H MOV A,42H ACALL BCD MOV A,41H ACALL BCD MOV A,40H ACALL BCD MOV R0,25H RETCUTIN2:MOV 25H,R0 MOV R0,#78H;78H中为日个位 MOV A , 2DH ACALL BCD MOV A ,2CH ACALL BCD MOV A,2BH ACALL BCD MOV A,2AH ACALL BCD MOV R0,25H;7FH中为年千? RETBCD: MOV B,#0AH ;把数据调整为两位BCD码 DIV AB MOV @R0,B INC R0 MOV @R0,A INC R0 RETCLOCK: MOV TL0,#0B0H ;分秒单元进位 MOV TH0,#3CH PUSH PSW PUSH ACC INC 23H MOV A,23H CJNE A,#14H,RET0 MOV 23H,#00H INC 22H JNB P1.1,NZD SETB P1.2 SETB P1.3NZD: MOV A,21H CJNE A,#00H,CLOOPEN: MOV A,22H CJNE A,#1EH,ZD ;正点报时半分钟后关闭 SETB P1.0ZD: CJNE A,#3CH,RET0 MOV 22H,#00H INC 21H SETB P1.2 ;闹1分钟后钟关 SETB P1.3 MOV A,21H CJNE A,#3CH,RET0 MOV 21H,#00H CLR P1.0 INC 20H MOV A,20H CJNE A,#18H,RET0 MOV 20H,#00H MOV A,2CH CJNE A,#02H,OTHERMON LCALL YEAR CJNE A,#00H,NEXT7OTHERMON:LCALL DAYS CJNE A,2DH,NEXT6 MOV 2DH,#01H SJMP ADM CLO: SETB P1.0 SJMP OPENNEXT6: INC 2DH SJMP B0NEXT7: MOV A,2DH CJNE A,#1DH,NEXT6 MOV 2DH,#01HADM: INC 2CH MOV A,2CH CJNE A,#0DH,B0 MOV 2CH,#01H INC 2BH MOV A,2BH CJNE A,#64H,B0 MOV 2BH,#00H INC 2AH MOV A,2AH CJNE A,#64H,B0 MOV 2AH,#00HRET0: JB P1.1, B0 MOV A,20H ;开关为开时判断时间,为关则直接退出中断 CJNE A,50H,B0 MOV A,21H CJNE A,51H,B0 CLR P1.3 ;开闹钟 CLR P1.2B0: POP ACC POP PSWFH: RETIYEAR: MOV A,2BH MOV B,#04H DIV AB MOV A,B CJNE A,#00H,NL MOV A,2BH MOV B,#64H DIV AB MOV A,B CJNE A,#00H,LEAP MOV A,2AH MOV B,#04H DIV AB MOV A,B CJNE A,#00H,NLLEAP: MOV A,#01H SJMP BACKYNL: MOV A,#00HBACKY: RET ;****************************每月天数(按平年计)***************************DAYS: DEC 2CH MOV A,2CH MOV DPTR,#TAB MOVC A,@A+DPTR INC 2CH RET TAB:DB 1FH,1CH,1FH,1EH,1FH,1EH DB 1FH,1FH,1EH,1FH,1EH,1FH ;*********年月日调整************1键切换,3键+1,4键-1,F键返回****************KEY2: LCALL CUTIN2 LCALL DISPD MOV 29H,#88H LCALL SEND MOV 29H,#3FH LCALL SEND JB KEY,KEY2 LCALL READLP2: JNB KEY,LP2 LCALL LDELAY MOV A,28HSYH2: CJNE A,#02H,SYH3 INC 2AH MOV A,2AH CJNE A,#64H,KEY2 MOV 2AH,#00H SJMP KEY2SYH3: CJNE A,#03H,YLK1 DEC 2AH