功能:整点报时,时分秒调整,闹钟的设置,闹钟开关,万年历及其调整,闰年
判断,秒表,芯片:AT89S52,HD7279A
切换到年月日显示当前日期
将日期调整到2008年验证闰年
PCB图
计时开始,黄灯为闹钟就绪灯
万年历从0000年可到9999年
59分59秒了,整点报时灯红灯准备亮起
红灯亮了,整点到了,30S后整点报时灯(红)自动熄灭
下一步验证闹钟,闹钟就绪灯(黄)为开,当前闹钟时间为01时01分
闹钟灯(绿)亮了,其实还有一个蜂鸣器在响,关掉闹钟,黄灯和绿灯都被关掉,若不关闭则一分钟后自动关闭,但是闹钟就绪灯不会自动关闭,下图为手动关闭
秒表准备
秒表
秒表停止,计时1S90MS
ORG 0000H LJMP MAIN ORG 000BH LJMP CLOCK ORG 001BH LJMP BRT ORG 0030H KEY BIT P1.4 CLK BIT P1.5 DAT BIT P1.6 CS 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,28H LP1:JNB KEY,LP1 CJNE A,#01H,NAO ;按1键进入时间设置 LCALL KEY0 SJMP LK NAO:CJNE A,#02H,SWITCH ;按2键键入闹钟设置 LCALL LDELAY LCALL KEY1 SJMP LK SWITCH:CJNE A,#03H,MB ;按3键进入闹钟开关 MOV C,P1.1 CPL C LCALL LONG MOV P1.1,C SJMP LK MB: CJNE A,#0CH,DATE ;按C键进入秒表 LCALL MBWAIT ;按0键进入年月日显示 SJMP LK DATE: 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 SS SETD:CJNE A,#0DH,LK ;按D键进入年月日调整 LCALL KEY2 LK:SJMP SS CUTIN0: MOV 25H,R0 MOV R0,#78H MOV A,22H ACALL BCD MOV A,21H ACALL BCD MOV A,20H ACALL BCD MOV R0,25H RET CUTIN1: MOV 25H,R0 MOV R0,#78H MOV A,42H ACALL BCD MOV A,41H ACALL BCD MOV A,40H ACALL BCD MOV R0,25H RET CUTIN2: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中为年千? RET BCD: MOV B,#0AH ;把数据调整为两位BCD码 DIV AB MOV @R0,B INC R0 MOV @R0,A INC R0 RET CLOCK: 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.3 NZD: MOV A,21H CJNE A,#00H,CLO OPEN: MOV A,22H CJNE A,#1EH,ZD ;正点报时半分钟后关闭 SETB P1.0 ZD: 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,NEXT7 OTHERMON:LCALL DAYS CJNE A,2DH,NEXT6 MOV 2DH,#01H SJMP ADM CLO: SETB P1.0 SJMP OPEN NEXT6: INC 2DH SJMP B0 NEXT7: MOV A,2DH CJNE A,#1DH,NEXT6 MOV 2DH,#01H ADM: 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,#00H RET0: JB P1.1, B0 MOV A,20H ;开关为开时判断时间,为关则直接退出中断 CJNE A,50H,B0 MOV A,21H CJNE A,51H,B0 CLR P1.3 ;开闹钟 CLR P1.2 B0: POP ACC POP PSW FH: RETI YEAR: 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,NL LEAP: MOV A,#01H SJMP BACKY NL: MOV A,#00H BACKY: 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 READ LP2: JNB KEY,LP2 LCALL LDELAY MOV A,28H SYH2: CJNE A,#02H,SYH3 INC 2AH MOV A,2AH CJNE A,#64H,KEY2 MOV 2AH,#00H SJMP KEY2 SYH3: CJNE A,#03H,YLK1 DEC 2AH MOV A,2AH CJNE A,#0FFH,KEY2 MOV 2AH,#63H SJMP KEY2 YLK1: CJNE A,#01H,KEY2 YLK: LCALL CUTIN2 LCALL DISPD MOV 29H,#88H LCALL SEND MOV 29H,#0CFH LCALL SEND LCALL SHORT LCALL LDELAY JB KEY,YLK LCALL READ LP3: JNB KEY,LP3 LCALL LDELAY MOV A,28H SYL2: CJNE A,#02H,SYL3 INC 2BH MOV A,2BH CJNE A,#64H,YLK MOV 2BH,#00H SJMP YLK SYL3: CJNE A,#03H,MK1 DEC 2BH MOV A,2BH CJNE A,#0FFH,YLK MOV 2BH,#63H LCALL SHORT SJMP YLK MK1 : CJNE A,#01H,YLK SM: LCALL DISPD MOV 29H,#88H LCALL SEND MOV 29H,#0F3H LCALL SEND LCALL CUTIN2 LCALL DISPD JB KEY,SM LCALL READ LP4: JNB KEY,LP4 LCALL LDELAY MOV A,28H SETM2: CJNE A,#02H,SETM3 INC 2CH MOV A,2CH CJNE A,#0DH,SM MOV 2CH,#01H SJMP SM SETM3: CJNE A,#03H,DK1 DEC 2CH MOV A,2CH CJNE A,#00H,SM MOV 2CH,#0CH SJMP SM DK1: CJNE A,#01H,SM DK: LCALL CUTIN2 LCALL DISPD MOV 29H,#88H LCALL SEND MOV 29H,#0FCH LCALL SEND JB KEY,DK LCALL READ LCALL LDELAY LP5: JNB KEY,LP5 MOV A,28H SD2: CJNE A,#02H,SD3 MOV A,2CH CJNE A,#02H,OTHER1 LCALL YEAR CJNE A,#01H,OTHER1 INC 2DH MOV A,2DH CJNE A,#1EH,DK MOV 2DH,#01H SJMP DK OTHER1: LCALL DAYS CJNE A,2DH,AD MOV 2DH,#01H SJMP DK AD: INC 2DH SJMP DK SD3: CJNE A,#03H,FK0 DEC 2DH LCALL SHORT MOV A,2DH CJNE A,#00H,DK MOV A,2CH CJNE A,#02H,OTHER2 LCALL YEAR CJNE A,#01H,NEXT4 MOV 2DH,#1DH LCALL SHORT SJMP DK NEXT4: MOV 2DH,#1CH DBK: LJMP DK OTHER2: LCALL DAYS MOV 2DH,A LJMP DK FK0: CJNE A,#01H,FK LJMP KEY2 FK: CJNE A,#0FH,DBK MOV 29H,#88H LCALL SEND MOV 29H,#0FFH LCALL SEND MOV 29H,#98H LCALL SEND MOV 29H,#03FH LCALL SEND RET ;************秒表********* MBWAIT: MOV 78H,#00H ;D键开始 MOV 79H,#00H ; E键停止 MOV 7AH,#00H ; 按C键清零 MOV 7BH,#00H ; 再按D键重新开始 MOV 7CH,#00H ;F键退出 MOV 7DH,#00H MOV 7EH,#00H MOV 7FH,#00H LCALL DISPD JB KEY,MBWAIT LCALL READ MOV A,28H CJNE A,#0DH,MBWAIT KAISHI: SETB TR1 ;开启定时器T1 WAIT0: LCALL DISPD JB KEY,WAIT0 ; 等按键,按E停止 LCALL READ MOV A,28H CJNE A,#0EH,WAIT0 CLR TR1 WAIT1: LCALL DISPD JB KEY,WAIT1 ;按F键清零 LCALL READ MOV A,28H CJNE A,#0CH,WAIT1 MOV 78H,#00H MOV 79H,#00H MOV 7AH,#00H MOV 7BH,#00H MOV 7CH,#00H MOV 7DH,#00H MOV 7EH,#00H MOV 7FH,#00H WAIT2: LCALL DISPD JB KEY,WAIT2 LCALL READ MOV A,28H CJNE A,#0DH,WAIT3 ; 按D键重新开始,其他键退出秒表 SJMP KAISHI WAIT3: CJNE A,#0FH,WAIT2 ;按E键退出秒表 EXIT: MOV 29H,#98H LCALL SEND MOV 29H,#3FH LCALL SEND RET DISPM:CALL DISP MOV 29H,#88H LCALL SEND MOV 29H,#0F3H LCALL SEND RET DISPH:CALL DISP MOV 29H,#88H LCALL SEND MOV 29H,#0CFH LCALL SEND RET DISPD:MOV 29H,#98H LCALL SEND MOV 29H,#0FFH LCALL SEND LCALL DISP MOV 29H,#0CEH CALL SEND MOV 29H,7EH ACALL SEND MOV 29H,#0CFH LCALL SEND MOV 29H,7FH LCALL SEND RET DISP:MOV R1,#78H MOV R4,#0C8H MOV R2,#06 DISP_LOOP:MOV 29H,R4 LCALL SEND MOV 29H,@R1 LCALL SEND INC R4 INC R1 DJNZ R2,DISP_LOOP RET SEND: MOV R3,#08H CLR CS LCALL LONG SEND_LOOP:MOV C,29H.7 MOV DAT,C SETB CLK LCALL SHORT CLR CLK LCALL SHORT MOV A,29H RL A MOV 29H,A DJNZ R3,SEND_LOOP CLR DAT RET BRT: MOV TL1,#0F0H MOV TH1,#0D8H ;初值,10ms中断一次 PUSH PSW PUSH ACC INC 78H MOV A,78H CJNE A,#0AH,FH1 MOV 78H,#00H INC 79H MOV A,79H CJNE A,#0AH,FH1 MOV 79H,#00H INC 7AH MOV A,7AH CJNE A,#0AH,FH1 MOV 7AH,#00H INC 7BH MOV A,7BH CJNE A,#06H,FH1 MOV 7BH,#00H INC 7CH MOV A,7CH CJNE A,#0AH,FH1 MOV 7CH,#00H INC 7DH MOV A,7DH CJNE A,#06H,FH1 MOV 7DH,#00H INC 7EH MOV A,7EH CJNE A,#0AH,FH1 INC 7FH MOV A,7FH CJNE A,#0AH,FH1 MOV 7FH,#00H FH1: POP ACC POP PSW RETI LONG: MOV 70H,#25 ; 50uS DELAY_LOOP: DJNZ 70H,DELAY_LOOP RET SHORT: MOV 70H,#4 ; 8uS SHORT_LP: DJNZ 70H,SHORT_LP RET READ: MOV 29H,#15H ;发送读键盘指令 ACALL SEND LCALL LONG LCALL RESE LCALL LONG RET RESE: MOV 71H,#8 ; =8 SETB DAT ; P1.2(DATA) CALL LONG ; RECEIVE_LOOP: SETB CLK ; CLK CALL SHORT ; MOV A,28H ; RL A MOV 28H,A MOV C,DAT ; MOV 28H.0,C CLR CLK ; CLK CALL SHORT DJNZ 71H,RECEIVE_LOOP; 8 CLR DAT ; DAT RET SKEY:MOV 42H,#00H LCALL CUTIN1 LCALL DISPH JB KEY,SKEY LCALL READ LCALL LDELAY LP6:JNB KEY,LP6 MOV A,28H HK2:CJNE A,#02H,HK3 INC 40H MOV A,40H CJNE A,#18H,NEXT0 MOV 40H,#00H NEXT0:AJMP SKEY HK3: CJNE A,#03H,K1 DEC 40H MOV A,40H CJNE A,#0FFH,NEXT1 MOV 40H,#17H NEXT1:AJMP SKEY K1:CJNE A,#01H,NEXT1 TURNTO:LCALL CUTIN1 LCALL DISPM JB KEY,TURNTO LCALL READ LCALL LDELAY LP7: JNB KEY,LP7 MOV A,28H MK2: CJNE A,#02H,MK3 INC 41H MOV A,41H CJNE A,#3CH,TURNTO MOV 41H,#00H NEXT2: LCALL SHORT AJMP TURNTO MK3: CJNE A,#03H,F4 DEC 41H LCALL SHORT MOV A,41H CJNE A,#0FFH,TURNTO MOV 41H,#3BH AJMP TURNTO F4: CJNE A,#01H,BACK AJMP SKEY BACK: CJNE A,#0FH,TURNTO MOV 29H,#88H LCALL SEND MOV 29H,#0FFH LCALL SEND RET ;************校时子程序********** KEY0: MOV 41H,21H MOV 40H,20H CLR TR0 MOV 23H,#00H ACALL SKEY MOV 22H,42H MOV 21H,41H MOV 20H,40H MOV TH0,#3CH MOV TL0,#0B0H SETB TR0 RET KEY1: MOV 41H,51H ;************闹钟设置子程序************ MOV 40H,50H ACALL SKEY MOV 51H,41H MOV 50H,40H SETB P1.2 SETB P1.3 RET ;**********延时子程序****** LDELAY: MOV 53H,#0AFH LDLY1: MOV 54H,#0AFH LDLY: DJNZ 54H,LDLY DJNZ 53H,LDLY1 RET END 终于做完了,硬件: