;=============================================================================== ; ±¾³ÌÐòÓÃÓÚ²âÊÔʵʱʱÖÓÄ£¿éSD2000ϵÁй¦ÄÜ ; ³ÌÐò¹¦ÄÜÈçÏ£º ; 1.ÔÚSD2000ÊÔÑé°åÉÏÏÔʾʵʱʱ¼äµÄСʱºÍ·ÖÖÓë. ; µ¥Æ¬»úÊÇAT89C51£¬Íâ¾§ÕñΪ12Mhz,ÔÚÐËÍþ·«¹«Ë¾µÄSD2000ÆÀ¹À°åÉÏÔËÐС£ ; Last update:2003/04/23 ; ±¾³ÌÐò½ö¹©²Î¿¼£¬ÈçÓÐÎÊÌâÇëÁªÏµ£º³Â¹¤³ 0755-83246178,83220794,fax:83225561 ; 13922865036 chendw@whwave.com.cn http://www.whwave.com.cn ;=============================================================================== ;define the general register ;ʱ¼ä¼Ä´æÆ÷ YEAR EQU 20H ;Äê MONTH EQU 21H ;Ô DAY EQU 22H ;ÈÕ WEEK EQU 23H ;ÐÇÆÚ HOUR EQU 24H ;Сʱ MINUTE EQU 25H ;·ÖÖÓ SECOND EQU 26H ;Ãë FLAG EQU 27H ;ͨÓñêÖ¾¼Ä´æÆ÷ ;BIT0=1, ACK ERR ;BIT0=0,ACK OK ;BIT1=1,TEST MODE ;BIT1=0,NORMAL MODE ;LEDÏÔʾ¼Ä´æÆ÷ DATA_SEG EQU 40H ;ÏÔʾÊý¾Ý1¼Ä´æÆ÷ DATA2 EQU 41H ;ÏÔʾÊý¾Ý2¼Ä´æÆ÷ DATA3 EQU 42H ;ÏÔʾÊý¾Ý3¼Ä´æÆ÷ DATA4 EQU 43H ;ÏÔʾÊý¾Ý4¼Ä´æÆ÷ STACK_A EQU 44H ;ÏÔʾÖжÏʱAµÄ»º´æÆ÷ DIS_REG EQU 45H ;ÏÔʾÊýÂëλÖüĴæÆ÷:1-4 ;µ¥Æ¬»úÓëʵʱʱÖÓ¼äͨÐżĴæÆ÷ TIMETEMP EQU 2FH ;ʱ¼äÊý¾Ý»º´æÆ÷ TIMETX EQU 47H ;ʱ¼äÊý¾Ý·¢ËͼĴæÆ÷ TIMERX EQU 48H ;ʱ¼äÊý¾Ý½ÓÊռĴæÆ÷ ;µ¥Æ¬»úÏòSD2000B/C/D/E(»òSD2001/2)ÄÚµÄNVRAM´æ´¢Ê±¼äʱʹÓõļĴæÆ÷ STORESIGN EQU 50H SRAMADD EQU 51H SRAMNUM EQU 52H STOREYEAR EQU 53H STOREMONTH EQU 54H STOREDAY EQU 55H STOREWEEK EQU 56H STOREHOUR EQU 57H STOREMINUTE EQU 58H STORESECOND EQU 59H ;--------------------------------------------------------------------------- ;define port bit ;¸÷ͨÐÅ¿Úλ´úºÅ SDA EQU P3.4 ;IICµÄSDA¿ÚÏß SCL EQU P3.5 ;IICµÄSCL¿ÚÏß ;=========================================================================== ORG 0000H ;RESET LJMP START ORG 000BH LJMP DISP_LED ;T0ÖжÏÈë¿Ú ;--------------------------------------------------------------------------- ORG 0100H START: CLR A ;¿ªÊ¼³õʼ»¯¸÷¼Ä´æÆ÷ MOV IE,A ;¹ØÖÐ¶Ï MOV P1,A MOV P2,A ;PORT1,PORT2ÖÃ0 MOV P3,#0FFH ;PORT3ÖÃ1 MOV SP,#60H ;¶¨Òå¶ÑÕ» MOV TMOD,#01H ;¶¨Ê±Æ÷0Ϊ16λ¶¨Ê±Æ÷£¬ MOV TH0,#0F0H ;ÖжÏÖÜÆÚΪ4096us MOV TL0,#0H ; MOV DIS_REG,#00H ; CLR FLAG LCALL LONGDELAY ;ÑÓʱ300ms LCALL LONGDELAY ;ÑÓʱ300ms LCALL TIMESTATUS_INT12 ;24Ð¡Ê±ÖÆ SETB EA ;¿ªAT89C51ÖÐ¶Ï SETB TR0 ;T0¿ªÊ¼¼ÆÊý ;----------------------------------------------------------------- GET_TIME: CLR ET0 ;¹Ø±ÕAT89C51µÄTIME0ÖÐ¶Ï LCALL READ_TIME ;¶ÁSD2000ÄÚµÄʵʱʱÖÓÊý¾Ý JNB SECOND.7,NO_TESTMODE LCALL TIME_TESTMODE ;²âÊÔģʽ½áÊø CLR SECOND.7 ;ÃëµÄ×î¸ßλÆÁ±ÎΪ0 NO_TESTMODE: SETB ET0 ;ÔÊÐíAT89C51µÄTIME0ÖÐ¶Ï ;´Ë´¦¿ÉÒÔ¼ÓÄãµÄÆäËû³ÌÐò LCALL LONGDELAY ;DELAY 0.3S NOP NOP LJMP GET_TIME ;=======================¶¨Ê±/¼ÆÊýÆ÷ÖжÏ×Ó³ÌÐò============================== ;¹¦ÄÜ£ºÔÚËÄλLEDÉÏÏÔʾÊý¾Ý | ;Èë¿Ú£ºÏÔʾÊý¾ÝÔÚDATA1£¬DATA2£¬DATA3£¬DATA4ÖÐ | ;³ö¿Ú£ºNONE | ;Ó°Ïì×ÊÔ´£ºA£¬TEMP£¬P1£¬P3,PSW | ;========================================================================== DISP_LED: MOV STACK_A,A CLR EA ;¹ØÖÐ¶Ï COMPARE: MOV A,DIS_REG CJNE A,#01H,COM1 JMP DISBIT1 COM1: CJNE A,#02H,COM2 JMP DISBIT2 COM2: CJNE A,#03H,COM3 JMP DISBIT3 COM3: MOV DIS_REG,#00H JMP DISBIT4 DISBIT1: MOV A,HOUR SWAP A ANL A,#0FH MOV DATA_SEG,A MOV A,#0FFH MOV P3,A MOV A,DATA_SEG MOV DPTR,#TABLE MOVC A,@A+DPTR ;²é±íÈ¡×ÖÐÍÂë MOV P1,A CLR P3.0 ;ÏÔʾµÚһλÊý¾Ý LJMP DISEND DISBIT2: MOV A,HOUR ;Сʱ ANL A,#0FH MOV DATA_SEG,A MOV A,#0FFH MOV P3,A MOV A,DATA_SEG MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P1,A MOV C,SECOND.0 ;ÃëÉÁ˸ MOV P1.7,C CLR P3.1 ;ÏÔʾµÚ¶þλÊý¾Ý LJMP DISEND DISBIT3: MOV A,MINUTE SWAP A ANL A,#0FH MOV DATA_SEG,A MOV A,#0FFH MOV P3,A MOV A,DATA_SEG MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P1,A CLR P3.2 ;ÏÔʾµÚÈýλÊý¾Ý LJMP DISEND DISBIT4: MOV A,MINUTE ;ÏÔʾ·ÖÖÓ ANL A,#0FH MOV DATA_SEG,A MOV A,#0FFH MOV P3,A MOV A,DATA_SEG MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P1,A CLR P3.3 ;ÏÔʾµÚËÄλÊý¾Ý DISEND: INC DIS_REG MOV TH0,#0F0H ;֨װ¶¨Ê±Æ÷0³õÖµ MOV TL0,#000H ; SETB EA ;¿ªÖÐ¶Ï MOV A,STACK_A RETI TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0A7H,0A1H,86H,8EH ;==================¶ÁʵʱʱÖÓʵʱÊý¾Ý¼Ä´æÆ÷×Ó³ÌÐò========================== ;¹¦ÄÜ£º´ÓʵʱʱÖÓ¶ÁÈ뵱ǰʱ¼äÊý¾Ý | ;Èë¿Ú£ºNONE | ;³ö¿Ú£º½ÓÊÕÊý¾Ý·ÅÔÚÄê¡¢Ô¡¢ÈÕ¡¢ÐÇÆÚ¡¢Ê±¡¢·Ö¡¢Ãë¸÷¼Ä´æÆ÷ | ;Ó°Ïì×ÊÔ´£ºA£¬R0,R3,TIMETX,TIMERX,YEAR,MONTH,DAY,WEEK,HOUR,MINUTE,SECOND | ;========================================================================== READ_TIME: RDTIME_LOOP: LCALL IICSTART JB FLAG.1,ERR_IICSTOP ;ÈçSDAÏß±»óéλΪµÍµçƽÔòÍ˳ö MOV TIMETX,#65H ;·¢ËͶÁʱÖÓÊý¾ÝÃüÁî LCALL SENDH_L JB FLAG.0,ERR_IICSTOP ;ACKÐźŲ»Õý³£ÔòÍ˳ö. MOV R0,#YEAR MOV R3,#07H RDTIME1: LCALL RXL_H MOV A,TIMERX MOV @R0,A INC R0 DJNZ R3,RDTIME2 ;¶ÁÍêÒ»¸ö×Ö½ÚÊý¾ÝºóÈ·ÈÏÊý¾Ý´«Êä JMP RDTIME3 ;ÈôΪ×îºóÒ»¸ö×Ö½ÚÊý¾ÝÔòΪNOACK RDTIME2: CALL ACK JMP RDTIME1 RDTIME3: CALL NOACK LCALL IICSTOP CLR HOUR.7 ;СʱµÄ×î¸ßλÔÚ24Ð¡Ê±ÖÆÊ±Ã»ÓÐÓÃ,Èç¹ûÊÇ12Ð¡Ê±ÖÆÇëɾµô´ËÐÐ. RDTIME_RET: RET ERR_IICSTOP: LCALL IICSTOP RET ;============================ACK=========================================== ;¹¦ÄÜ£ºÑÓʱ Èë¿Ú£ºNONE ³ö¿Ú£ºNONE | ;Ó°Ïì×ÊÔ´£º | ;========================================================================== ACK: CLR TIMETEMP.1 LCALL BITOUT RET ;============================ACK=========================================== ;¹¦ÄÜ£ºÑÓʱ Èë¿Ú£ºNONE ³ö¿Ú£ºNONE | ;Ó°Ïì×ÊÔ´£º | ;========================================================================== NOACK: SETB TIMETEMP.1 LCALL BITOUT RET ;===============================±£´æ´íÎó´úÂë=============================== ;¹¦ÄÜ£º±£´æMCUÓëIIC½Ó¿ÚͨÐÅʱµÄ´íÎó״̬ | ;Èë¿Ú£ºTIMETEMP.0=ACKÎ»çÆ½ | ;³ö¿Ú£ºFLAG.0 =´íÎó´úÂë | ;========================================================================== ACK_ERR: JNB TIMETEMP.0,ACK_ERR_RET ;¼ì²éACKÐźÅÊÇ·ñÕý³£ SETB FLAG.0 ;ÖÃACK³ö´í±ê־λ ACK_ERR_RET: RET ;===============================ÆôÓÃIIC×ÜÏß================================ ;¹¦ÄÜ£º¿ªÆôʵʱʱÖÓµÄIIC×ÜÏß ;Èë¿Ú£ºNONE ³ö¿Ú£ºNONE ;Ó°Ïì×ÊÔ´£ºNONE ;========================================================================== IICSTART: CLR FLAG.1 SETB SDA SETB SCL LCALL DELAY JB SDA,IIC_SDAHI SETB FLAG.1 IIC_SDAHI: CLR SDA LCALL DELAY CLR SCL LCALL DELAY RET ;===============================¹Ø±ÕIIC×ÜÏß================================ ;¹¦ÄÜ£º¹Ø±ÕʵʱʱÖÓIIC×ÜÏß ;Èë¿Ú£ºNONE ³ö¿Ú£ºNONE ;Ó°Ïì×ÊÔ´£ºNONE ;========================================================================== IICSTOP:CLR SDA SETB SCL LCALL DELAY SETB SDA LCALL DELAY RET ;============================¶ÌÑÓʱ×Ó³ÌÐò================================== ;¹¦ÄÜ£ºÑÓʱ Èë¿Ú£ºNONE ³ö¿Ú£ºNONE | ;Ó°Ïì×ÊÔ´£ºR7,PSW | ;========================================================================== DELAY: MOV R7,#05H ;´ËÑÓʱÖÁÉÙ10us, DELAY1: NOP DJNZ R7,DELAY1 RET LONGDELAY: ;DELAY 300MS MOV R6,#240 LD0: MOV R7,#250 ;5*250*240 LD1: NOP NOP NOP DJNZ R7,LD1 DJNZ R6,LD0 RET ;============================·¢ËÍÒ»¸ö×Ö½Ú£¬Óɸßλµ½µÍλ·¢ËÍ================ ;¹¦ÄÜ£º´ÓMCU·¢ËÍÒ»¸ö×Ö½Ú¸øÊµÊ±Ê±ÖÓ,Óɸßλµ½µÍλ·¢ËÍ | ;Èë¿Ú£º·¢ËÍÊý¾Ý·ÅÔÚTIMETX ³ö¿Ú£ºNONE | ;Ó°Ïì×ÊÔ´£ºA£¬R2£¬TIMETX | ;========================================================================== SENDH_L:MOV A,TIMETX MOV R2,#08H CLR FLAG.0 SENDH_L1: MOV C,ACC.7 MOV TIMETEMP.1,C LCALL BITOUT RL A DJNZ R2,SENDH_L1 LCALL BITIN LCALL ACK_ERR RET ;==========================·¢ËÍÒ»¸ö×Ö½Ú£¬ÓɵÍλµ½¸ßλ·¢ËÍ================== ;¹¦ÄÜ£º´ÓMCU·¢ËÍÒ»¸ö×Ö½Ú¸øÊµÊ±Ê±ÖÓ,ÓɵÍλµ½¸ßλ·¢ËÍ | ;Èë¿Ú£º·¢ËÍÊý¾Ý·ÅÔÚTIMETX ³ö¿Ú£ºNONE | ;Ó°Ïì×ÊÔ´£ºA£¬R2£¬TIMETX | ;========================================================================== SENDL_H:MOV A,TIMETX MOV R2,#08H CLR FLAG.0 SENDL_H1: MOV C,ACC.0 MOV TIMETEMP.1,C LCALL BITOUT RR A DJNZ R2,SENDL_H1 LCALL BITIN LCALL ACK_ERR RET ;=================================½ÓÊÕÒ»¸ö×Ö½Ú============================= ;¹¦ÄÜ£ºMCU´ÓIIC×ÜÏß½ÓÊÕÒ»¸ö×Ö½Ú,MSBÔÚǰ,LSBÔÚºó | ;Èë¿Ú£ºNONE ³ö¿Ú£º½ÓÊÕÊý¾Ý·ÅÔÚRXBUFÖÐ | ;Ó°Ïì×ÊÔ´£ºA£¬R2£¬TIMEBIT£¬RXBUF | ;========================================================================== RXH_L: MOV R2,#08H RXH_L1: LCALL BITIN MOV C,TIMETEMP.0 MOV ACC.7,C RLC A DJNZ R2,RXH_L1 MOV TIMERX,A RET ;=================================½ÓÊÕÒ»¸ö×Ö½Ú============================= ;¹¦ÄÜ£ºMCU´ÓIIC×ÜÏß½ÓÊÕÒ»¸ö×Ö½Ú,LSBÔÚǰ,MSBÔÚºó | ;Èë¿Ú£ºNONE ³ö¿Ú£º½ÓÊÕÊý¾Ý·ÅÔÚRXBUFÖÐ | ;Ó°Ïì×ÊÔ´£ºA£¬R2£¬TIMEBIT£¬RXBUF | ;========================================================================== RXL_H: MOV R2,#08H RXL_H1: LCALL BITIN MOV C,TIMETEMP.0 RRC A DJNZ R2,RXL_H1 MOV TIMERX,A RET ;================================ËͳöһλÊý================================ ;¹¦ÄÜ£º´ÓMCU·¢ËÍһλÊý¸øÊµÊ±Ê±ÖÓ | ;Èë¿Ú£º·¢ËÍλÊý·ÅÔÚEEPREM.1 ³ö¿Ú£ºNONE | ;Ó°Ïì×ÊÔ´£ºA£¬TIMETEMP | ;========================================================================== BITOUT: MOV C,TIMETEMP.1 MOV SDA,C LCALL DELAY SETB SCL LCALL DELAY CLR SCL LCALL DELAY RET ;=================================¶ÁÈëһλÊý=============================== ;¹¦ÄÜ£ºMCU´ÓʵʱʱÖÓ½ÓÊÕһλÊý | ;Èë¿Ú£ºNONE ³ö¿Ú£º½ÓÊÕλÊý·ÅÔÚTIMETEMP.0 | ;Ó°Ïì×ÊÔ´£ºA£¬TIMETEMP | ;========================================================================== BITIN: SETB SDA SETB SCL LCALL DELAY MOV C,SDA MOV TIMETEMP.0,C CLR SCL CLR SDA LCALL DELAY RET ;============================״̬Òì³£´¦Àí³ÌÐò============================== ;¹¦ÄÜ£ºÔÚ¸ÉÈÅÑÏÖØµÄÇé¿öÏÂ,ʱÖÓ½øÈëÒ쳣״̬µÄ´¦Àí | ;Èë¿Ú£ºNONE ³ö¿Ú£ºNONE | ;Ó°Ïì×ÊÔ´£º A£¬TIMETX | ;========================================================================== TIME_TESTMODE: TIME_TESTMODE_LOOP: LCALL IICSTART JNB FLAG.1,TIME_TESTMODE_1 LJMP ERR_IICSTOP ;SDAÏß±»óéλΪµÍµçƽÔòÍ˳ö TIME_TESTMODE_1: MOV TIMETX,#6EH ;·¢ËͲâÊÔģʽ½áÊøÃüÁî,#6EH LCALL SENDH_L LCALL IICSTOP ; JB FLAG.0,TIME_TESTMODE_LOOP;ACKÐźŲ»Õý³£ÔòÖØÐ´. ; RET ;============================д״̬¼Ä´æÆ÷³ÌÐò============================== ;¹¦ÄÜ£º¶Á/дʵʱʱÖÓ״̬¼Ä´æÆ÷£¬¶ÔÆä½øÐÐÉèÖà | ;Èë¿Ú£ºNONE ³ö¿Ú£ºNONE | ;Ó°Ïì×ÊÔ´£º A£¬TIMETX | ;========================================================================== TIMESTATUS_INT12: LCALL IICSTART JNB FLAG.1,TIME_SETMODE_1 LJMP ERR_IICSTOP ;SDAÏß±»óéλΪµÍµçƽÔòÍ˳ö TIME_SETMODE_1: MOV TIMETX,#62H ;·¢ËÍдʱÖÓ״̬¼Ä´æÆ÷ÃüÁî LCALL SENDH_L JNB FLAG.0,TIME_SETMODE_2 LJMP ERR_IICSTOP ;ACKÐźŲ»Õý³£ÔòÍ˳ö´. TIME_SETMODE_2: MOV TIMETX,#40H ;24Сʱ½øÖÆ£¬ LCALL SENDL_H ;¹Ø±Õ/INT1¼°/INT2½ÅµÄÊä³ö LCALL IICSTOP ; RET END