|
功能:使用DS12887作為時(shí)鐘的發(fā)生和保持電路,DS12887內(nèi)部集成晶振和電池,斷電情況下可運(yùn)行10年左右;同時(shí)其內(nèi)部有128字節(jié)非易失性RAM,可以保持時(shí)鐘和鬧鐘信息;主控電路為AT89S52,p1口用作4位一體數(shù)碼管的動(dòng)態(tài)顯示,p0,p2口作為讀寫DS12887總線,同時(shí)使用了/WR和/RD,p3.0的LED來實(shí)現(xiàn)每秒的閃爍,p3.1控制鬧鐘顯示LED,p2口雖用作地址總線,但只使用了p2.7連接至DS12887的 /CS端,所以使用了p2.0作為蜂鳴器的控制口;p3.3(/INT1)作為DS12887鬧鐘報(bào)警的中斷輸入端口。 顯示模式有:1,僅顯示鬧鐘;2,僅顯示分秒;3,一分鐘之內(nèi)先顯示年份(只顯示后兩位),與星期同時(shí)顯示,再顯示月日,其余時(shí)間顯示時(shí)分. 調(diào)節(jié)按鈕:P3.0,P3.1,P3.4,P3.5分別接4個(gè)按鈕開關(guān),分別定義為"A","T","H","M";按下"A","H"/"M",可分別調(diào)節(jié)鬧鐘的時(shí)分;按下"T","H"/"M",可分別調(diào)節(jié)時(shí)間的時(shí)分;時(shí)間的其他信息在該版本中不可以調(diào)節(jié)。 電路圖: ;以下為源程序:RG_DLY EQU 2H;延時(shí)使用的工作寄存器 RG_KEY EQU 30H;存儲(chǔ)鍵盤值 RG_KN EQU 33H;存儲(chǔ)調(diào)節(jié)年月日星期的次數(shù)按鈕。 RG_BT1 EQU 31H;需要顯示的數(shù)據(jù)暫存RAM RG_BT2 EQU 32HBT_DSP BIT 00H;控制顯示時(shí)間或鬧鐘的標(biāo)志位 BT_ALM BIT 01H;控制鬧鐘是否響鈴的標(biāo)志位 BT_TM2 BIT 02H;控制顯示時(shí)間的模式,1:只顯示時(shí)分,0:還顯示年月日,星期 BT_MNSC BIT 03H;控制顯示時(shí)間的分秒 RG_TSC EQU 40H;時(shí)鐘和鬧鐘暫存RAM,順序同DS12C887中的RAM RG_ASC EQU 41H RG_TMN EQU 42H; RG_AMN EQU 43H; RG_THR EQU 44H RG_AHR EQU 45H RG_WK EQU 46H RG_DAY EQU 47H RG_MTH EQU 48H RG_YR EQU 49H RG_MS EQU 51H RG_IDL EQU 50H ORG 0000H LJMP MAIN
ORG 0013H LJMP SB_ALM ORG 0030H MAIN: MOV SP,#60H SETB BT_DSP CLR BT_ALM CLR BT_TM2 CLR BT_MNSC CLR IT1 SETB EX1 SETB IT0 SETB EX0 SETB EA ;開總中斷 MOV DPTR,#000BH;鬧鐘中斷允許 MOV A,#22H MOVX @DPTR,A ;====--------------------最初寫入DS12887的時(shí)候使用這一條指令。 ;LCALL SB_INI;最初的初始化時(shí)使用的。 ;====-------------------- MOV DPTR,#000AH;判斷是否需要初始化 MOVX A,@DPTR ANL A,#01110000B CJNE A,#20H,INI_MAI LJMP LP1_MAI INI_MAI:LCALL SB_INI ;------------------------------------------------------------------ ;主程序循環(huán)段--開始 ;------------------------------------------------------------------ LP1_MAI:LCALL SB_RD LCALL SB_KEY LP3_MAI:JNB BT_ALM,DSP_MAI ;判斷控制位決定是否鬧鈴 CLR P3.1 CLR P2.0 DSP_MAI: JNB BT_MNSC,DSP2_MAI MOV RG_BT2,RG_TMN MOV RG_BT1,RG_TSC LCALL SB_DSP LJMP RT_MAI DSP2_MAI: JB BT_DSP,TM_MAI;BT_DSP為1,則跳至顯示時(shí)間段 AL_MAI: MOV RG_BT2,RG_AHR;;BT_DSP為0,則顯示鬧鐘 MOV RG_BT1,RG_AMN LCALL SB_DSP LJMP RT_MAI TM_MAI: ;根據(jù)RG_SC的十位來決定時(shí)間顯示的內(nèi)容, MOV A,RG_TSC ANL A,#0F0H SWAP A; 取得秒的十位 JNZ TM3_MAI;每分鐘的開始后,用來控制僅顯示時(shí)分。 CLR BT_TM2 TM3_MAI:JB BT_TM2,TM2_MAI
;======= ;顯示年月日星期 YR_MAI: CJNE A,#2,DAY_MAI MOV RG_BT2,RG_YR MOV RG_BT1,RG_WK ORL RG_BT1,#0F0H LCALL SB_DSP LJMP RT_MAI DAY_MAI:CJNE A,#4,TM2_MAI MOV RG_BT2,RG_MTH MOV RG_BT1,RG_DAY MOV A,RG_MTH ANL A,#0F0H SWAP A JNZ DAY1_MAI ORL RG_BT2,#0F0H DAY1_MAI: MOV A,RG_DAY ANL A,#0F0H SWAP A JNZ DAY2_MAI ORL RG_BT1,#0F0H DAY2_MAI: LCALL SB_DSP LJMP RT_MAI ;顯示時(shí)分 TM2_MAI: MOV A,RG_TSC MOV C,ACC.0 JC XIMIE CLR P3.0 LJMP DIANL XIMIE: SETB P3.0 DIANL: NOP MOV RG_BT2,RG_THR MOV RG_BT1,RG_TMN LCALL SB_DSP ;=====-= RT_MAI: LJMP LP1_MAI ;------------------------------------------------------------------------- ;主程序循環(huán)段--結(jié)束 ;------------------------------------------------------------------------- ;=======按鍵處理子程序 SB_KEY: SETB P3.0 SETB P3.1 SETB P3.4 SETB P3.5 MOV A,P3 ANL A,#33H CJNE A,#33H,DL_KEY LJMP RT_KEY DL_KEY: LCALL SB_DSP;去抖延時(shí) LCALL SB_DSP LCALL SB_DSP LCALL SB_DSP LCALL SB_DSP CJNE A,#33H,KP_KEY LJMP RT_KEY KP_KEY: MOV RG_KEY,A;保留鍵值 CLR BT_ALM;任何按鍵,使鬧鐘停止 SETB P2.0 SETB BT_TM2;任何按鍵,使得一分鐘內(nèi)只顯示時(shí)分,不顯示YEAR,DAY,WEEK ;----僅顯示分秒的控制段-------- MNSC_KEY: CJNE A,#23H,TM_KEY CPL BT_MNSC LJMP RT_KEY ;----------------------------------- TM_KEY: CJNE A,#32H,AL_KEY MOV RG_BT2,RG_THR MOV RG_BT1,RG_TMN LCALL SB_DSP SETB BT_DSP;設(shè)置該位,在主程序中判斷該位為1,則顯示時(shí)間 LJMP RT_KEY AL_KEY: CJNE A,#31H,THR_KEY MOV RG_BT2,RG_AHR MOV RG_BT1,RG_AMN LCALL SB_DSP CLR BT_DSP;設(shè)置該位,在主程序中判斷該位為0,則顯示鬧鐘 LJMP RT_KEY THR_KEY:CJNE A,#12H,TMN_KEY; 校正時(shí)鐘的時(shí) MOV A,RG_THR ADD A,#1 DA A CJNE A,#24H,LP1_KEY CLR A LP1_KEY:MOV RG_THR,A MOV RG_BT2,RG_THR;顯示校正的時(shí)間 MOV RG_BT1,RG_TMN LCALL SB_DSP MOV DPTR,#0004H MOVX @DPTR,A LJMP SB_KEY TMN_KEY:CJNE A,#22H,AHR_KEY MOV A,RG_TMN ADD A,#1 DA A CJNE A,#60H,LP2_KEY CLR A LP2_KEY:MOV RG_TMN,A MOV RG_BT2,RG_THR MOV RG_BT1,RG_TMN LCALL SB_DSP MOV DPTR,#0002H MOVX @DPTR,A LJMP SB_KEY AHR_KEY:CJNE A,#11H,AMN_KEY MOV A,RG_AHR ADD A,#1 DA A CJNE A,#24H,LP3_KEY CLR A LP3_KEY:MOV RG_AHR,A MOV RG_BT2,RG_AHR MOV RG_BT1,RG_AMN LCALL SB_DSP MOV DPTR,#0005H MOVX @DPTR,A LJMP SB_KEY AMN_KEY:CJNE A,#21H,OTH_KEY MOV A,RG_AMN ADD A,#1 DA A CJNE A,#60H,LP4_KEY CLR A LP4_KEY:MOV RG_AMN,A MOV RG_BT2,RG_AHR MOV RG_BT1,RG_AMN LCALL SB_DSP MOV DPTR,#0003H MOVX @DPTR,A LJMP SB_KEY OTH_KEY:CJNE A,#30H,YR_KEY INC R4 CJNE R4,#6,YR_KEY MOV R4,#0 LJMP ERR_KEY YR_KEY: CJNE A,#03H,ERR_KEY CJNE R4,#1,MTH_KEY MOV RG_BT2,#0FFH MOV RG_BT1,RG_YR LCALL SB_DSP MOV A,RG_YR ADD A,#1 DA A MOV DPTR,#0009H MOVX @DPTR,A LCALL SB_DSP RT_KEY: RET ;======鬧鐘子程序,中斷處理程序 SB_ALM: PUSH ACC MOV DPTR,#000CH MOVX A,@DPTR SETB BT_ALM POP ACC RETI ;======初始化DS12C887子程序 SB_INI:PUSH ACC MOV DPTR,#000BH MOV A,#82H MOVX @DPTR,A ;----初始化時(shí)鐘,23:59:50,初始化鬧鐘:00:00:00 MOV DPTR,#0000H MOV A,#50H MOVX @DPTR,A INC DPTR MOV A,#00H MOVX @DPTR,A INC DPTR MOV A,#59H MOVX @DPTR,A INC DPTR MOV A,#00H MOVX @DPTR,A INC DPTR MOV A,#23H MOVX @DPTR,A INC DPTR MOV A,#00H MOVX @DPTR,A ;---初始化星期7(日), 年,月,日2007-7-29 INC DPTR MOV A,#07H MOVX @DPTR,A INC DPTR MOV A,#29H MOVX @DPTR,A INC DPTR MOV A,#07H MOVX @DPTR,A INC DPTR MOV A,#07H MOVX @DPTR,A MOV DPTR,#0032H MOV A,#20H MOVX @DPTR,A NOP MOV DPTR,#000AH MOV A,#20H MOVX @DPTR,A INC DPTR MOV A,#22H MOVX @DPTR,A INC DPTR MOVX A,@DPTR POP ACC RET ;======讀DS12887子程序------
SB_RD: PUSH ACC ;---讀時(shí)分秒的時(shí)鐘, MOV DPTR,#0000H;鬧鐘的秒 MOVX A,@DPTR MOV RG_TSC,A INC DPTR;時(shí)鐘的秒 MOVX A,@DPTR MOV RG_ASC,A INC DPTR;鬧鐘的分 MOVX A,@DPTR MOV RG_TMN,A INC DPTR;時(shí)鐘的分 MOVX A,@DPTR MOV RG_AMN,A INC DPTR;鬧鐘的時(shí) MOVX A,@DPTR MOV RG_THR,A INC DPTR;時(shí)鐘的時(shí) MOVX A,@DPTR MOV RG_AHR,A ;---讀年月日,星期 MOV DPTR,#0006H;讀星期 MOVX A,@DPTR MOV RG_WK,A INC DPTR;讀日 MOVX A,@DPTR MOV RG_DAY,A INC DPTR;讀月 MOVX A,@DPTR MOV RG_MTH,A INC DPTR;讀年 MOVX A,@DPTR MOV RG_YR,A POP ACC RETI ;======顯示子程序 SB_DSP: PUSH ACC MOV R1,#RG_BT2 MOV R6,#10H ;R6寄存器選擇位 MOV R7,#2 LP1_DSP:MOV A,@R1 ANL A,#0F0H SWAP A ORL A,R6 MOV P1,A ;送到P1口 MOV RG_DLY,#10 ;調(diào)延時(shí)子程序 LCALL SB_DLY MOV A,R6 RL A MOV R6,A MOV A,@R1 ANL A,#0FH ORL A,R6 MOV P1,A ;送到P1口 MOV RG_DLY,#10 ;調(diào)延時(shí)子程序 LCALL SB_DLY MOV A,R6 RL A MOV R6,A DEC R1 DJNZ R7,LP1_DSP RT_DSP: POP ACC RET ;=======延時(shí)子程序 SB_DLY: PUSH RG_DLY ; LP1_DLY:PUSH RG_DLY LP2_DLY:PUSH RG_DLY DJNZ R2,$ POP RG_DLY DJNZ R2,LP2_DLY POP RG_DLY DJNZ R2,LP1_DLY POP RG_DLY DJNZ R2,SB_DLY RET END |