功能:整點(diǎn)報(bào)時(shí),時(shí)分秒調(diào)整,鬧鐘的設(shè)置,鬧鐘開關(guān),萬年歷及其調(diào)整,閏年
判斷,秒表,芯片:AT89S52,HD7279A
切換到年月日顯示當(dāng)前日期
將日期調(diào)整到2008年驗(yàn)證閏年
PCB圖
計(jì)時(shí)開始,黃燈為鬧鐘就緒燈
萬年歷從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
;說明: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
;可通過在正常顯示狀態(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
終于做完了,硬件:














