功能:整點(diǎn)報(bào)時(shí),時(shí)分秒調(diào)整,鬧鐘的設(shè)置,鬧鐘開關(guān),萬(wàn)年歷及其調(diào)整,閏年
判斷,秒表,芯片:AT89S52,HD7279A
切換到年月日顯示當(dāng)前日期
將日期調(diào)整到2008年驗(yàn)證閏年
PCB圖
計(jì)時(shí)開始,黃燈為鬧鐘就緒燈
萬(wàn)年歷從0000年可到9999年
59分59秒了,整點(diǎn)報(bào)時(shí)燈紅燈準(zhǔn)備亮起
紅燈亮了,整點(diǎn)到了,30S后整點(diǎn)報(bào)時(shí)燈(紅)自動(dòng)熄滅
下一步驗(yàn)證鬧鐘,鬧鐘就緒燈(黃)為開,當(dāng)前鬧鐘時(shí)間為01時(shí)01分
鬧鐘燈(綠)亮了,其實(shí)還有一個(gè)蜂鳴器在響,關(guān)掉鬧鐘,黃燈和綠燈都被關(guān)掉,若不關(guān)閉則一分鐘后自動(dòng)關(guān)閉,但是鬧鐘就緒燈不會(huì)自動(dòng)關(guān)閉,下圖為手動(dòng)關(guān)閉
秒表準(zhǔn)備
秒表
秒表停止,計(jì)時(shí)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 ;說(shuō)明:P1.0為正點(diǎn)報(bào)時(shí)標(biāo)志,在正點(diǎn)時(shí)亮器,半分鐘后自動(dòng)關(guān)閉, ;P1.1為鬧鐘開關(guān)標(biāo)志,可由鍵盤設(shè)置 ,初始狀態(tài)為開,亮30秒 ;P1.3,P1.2為鬧鐘,一分鐘后自動(dòng)關(guān)閉,亮的前提是鬧鐘開關(guān)打開 ;P1.4為KEY,P1.7CS ;可通過(guò)在正常顯示狀態(tài)下按3鍵隨時(shí)關(guān)閉鬧鈴 ;在走時(shí)狀態(tài)下按1鍵進(jìn)入時(shí)間調(diào)整,按3小時(shí)加1,按4時(shí)加1,再按1切換到分,按3加1,按4減1,按F返回 ;在時(shí)鐘狀態(tài)下,按2進(jìn)入鬧鐘設(shè)置,其它同時(shí)間調(diào)整 ;在時(shí)鐘狀態(tài)下,按3進(jìn)入鬧鐘開關(guān),可隨時(shí)開關(guān)鬧鈴?若不關(guān)則1分鐘后 自動(dòng)關(guān)閉 ;在時(shí)鐘狀態(tài)下按C進(jìn)入秒表,按D開始,按E停止,按c清零,再按D可重新開始,按f退出秒表 ;在時(shí)鐘狀態(tài)下按0顯示年月日,按D進(jìn)入日期調(diào)整,可自動(dòng)識(shí)別閏年。 MAIN: MOV SP,#60H MOV TMOD,#11H ;定時(shí)器0,1工作在方式1 MOV IE,#8AH ;開定時(shí)器中斷 MOV TH1,#0D8H MOV TL1,#0F0H MOV TL0,#0B0H ;定時(shí)器地低位初始化 MOV TH0,#3CH ;定時(shí)器高位初始化 MOV 2AH,#14H ;年高位 MOV 2BH,#09H ;年低位 MOV 2CH,#05H ;月 MOV 2DH,#19H ;日 MOV 20H,#17H ;時(shí)單位 MOV 21H,#3BH ;分單元 MOV 22H,#30H ;秒單元 MOV 23H,#00H ;定時(shí)器計(jì)數(shù)單元 MOV 50H,#00H ;鬧鐘時(shí)位 MOV 51H,#00H ;鬧鐘分位 MOV 52H,#00H ;鬧鐘秒位 SETB TR0 ;開始定時(shí) CLR P1.1 ;鬧鈴狀態(tài)開關(guān) SETB P1.0 ;關(guān)整點(diǎn)報(bào)時(shí)燈 SETB P1.3 ;鬧鈴關(guān) 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鍵進(jìn)入時(shí)間設(shè)置 LCALL KEY0 SJMP LK NAO:CJNE A,#02H,SWITCH ;按2鍵鍵入鬧鐘設(shè)置 LCALL LDELAY LCALL KEY1 SJMP LK SWITCH:CJNE A,#03H,MB ;按3鍵進(jìn)入鬧鐘開關(guān) MOV C,P1.1 CPL C LCALL LONG MOV P1.1,C SJMP LK MB: CJNE A,#0CH,DATE ;按C鍵進(jìn)入秒表 LCALL MBWAIT ;按0鍵進(jìn)入年月日顯示 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鍵進(jìn)入年月日調(diào)整 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中為日個(gè)位 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 ;把數(shù)據(jù)調(diào)整為兩位BCD碼 DIV AB MOV @R0,B INC R0 MOV @R0,A INC R0 RET CLOCK: MOV TL0,#0B0H ;分秒單元進(jìn)位 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 ;正點(diǎn)報(bào)時(shí)半分鐘后關(guān)閉 SETB P1.0 ZD: CJNE A,#3CH,RET0 MOV 22H,#00H INC 21H SETB P1.2 ;鬧1分鐘后鐘關(guān) 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 ;開關(guān)為開時(shí)判斷時(shí)間,為關(guān)則直接退出中斷 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 ;****************************每月天數(shù)(按平年計(jì))*************************** 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 ;*********年月日調(diào)整************1鍵切換,3鍵+1,4鍵-1,F(xiàn)鍵返回**************** 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 ;開啟定時(shí)器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 ;發(fā)送讀鍵盤指令 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 ;************校時(shí)子程序********** 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 ;************鬧鐘設(shè)置子程序************ MOV 40H,50H ACALL SKEY MOV 51H,41H MOV 50H,40H SETB P1.2 SETB P1.3 RET ;**********延時(shí)子程序****** LDELAY: MOV 53H,#0AFH LDLY1: MOV 54H,#0AFH LDLY: DJNZ 54H,LDLY DJNZ 53H,LDLY1 RET END 終于做完了,硬件: