;===============================================================================; S3530 VER3.0; 本程序用于測試實時時鐘s3530; 程序功能如下:; 1. 關(guān)閉/INT1及/INT2的中斷輸出; 2. 初始化時間(寫時間數(shù)據(jù)); 3. 在BREAKPOINT1設(shè)斷點時,讀時間循環(huán); 4. 全速執(zhí)行時,LED四位分別顯示小時和分鐘的值;; 注: 單片機是AT89C51,外晶振為12Mhz,在興威帆公司的S3530評估板上運行; Last update:2003/05/13; 本程序僅供參考,如有問題請聯(lián)系:陳工?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 ;星期 DATE EQU 23H ;日 HOUR EQU 24H ;小時 MINUTE EQU 25H ;分鐘 SECOND EQU 26H ;秒 FLAG EQU 27H ;通用標(biāo)志寄存器 ;BIT0=1, ACK ERR ;BIT0=0 ,ACK OK;LED顯示寄存器DATA_SEG EQU40H;顯示數(shù)據(jù)寄存器 DIS_REG EQU 41H ;顯示數(shù)碼位置寄存器:1-4 STACK_A EQU 42H ;顯示中斷時A的緩存器;單片機與實時時鐘間通信寄存器 TIMETEMP EQU 2FH ;時間標(biāo)志寄存器 TIMETX EQU 47H ;時間數(shù)據(jù)發(fā)送寄存器 TIMERX EQU 48H ;時間數(shù)據(jù)接收寄存器;---------------------------------------------------------------------------;define port bit;各通信口位代號 SDA EQU P3.4 ;IIC的SDA口線 SCL EQU P3.5 ;IIC的SCL口線;=========================================================================== ORG 0000H ;RESET LJMP START ORG 000BH LJMP LED_DISPLAY ;T0中斷入口;--------------------------------------------------------------------------- ORG 0100HSTART: CLR A ;開始初始化各寄存器 MOV IE,A ;關(guān)中斷 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 ;清除標(biāo)志位 LCALL LONGDELAY ;延時300ms LCALL LONGDELAY ;延時300ms LCALL TIMESTATUS_INT12 ;設(shè)置S3530時間狀態(tài)寄存器 SETB EA ;開AT89C51中斷 SETB TR0 ;T0開始計數(shù)INTI_TIME:MOVYEAR,#02H ;設(shè)定各時間寄存器初始時間MOVMONTH,#07HMOVDAY,#15HMOVDATE,#01HMOVHOUR,#17HMOVMINUTE,#59HMOVSECOND,#50H CLR ET0 ;關(guān)閉AT89C51的TIME0中斷 LCALL WRITE_TIME ;將初始時間值寫入時鐘內(nèi) SETB ET0 ;允許AT89C51的TIME0中斷;-----------------------------------------------------------------GET_TIME: CLR ET0 ;關(guān)閉AT89C51的TIME0中斷 LCALL READ_TIME ;讀S3530內(nèi)的實時時鐘數(shù)據(jù) SETB ET0 ;允許AT89C51的TIME0中斷BREAKPOINT1: NOP ;設(shè)斷點 LCALL LONGDELAY ;延時300ms,這里可以是你的程序JMPGET_TIME;=======================定時/計數(shù)器中斷子程序==============================;功能:在四位LED上顯示數(shù)據(jù) |;入口:顯示數(shù)據(jù)在DATA1,DATA2,DATA3,DATA4中 |;出口:NONE |;影響資源:A,TEMP,P1,P3,PSW |;==========================================================================LED_DISPLAY: MOV STACK_A,A CLR EA ;關(guān)中斷COMPARE: MOV A,DIS_REG CJNE A,#01H,COM1 JMP DISBIT1COM1: CJNE A,#02H,COM2 JMP DISBIT2COM2: CJNE A,#03H,COM3 JMP DISBIT3COM3: MOV DIS_REG,#00H JMP DISBIT4DISBIT1:MOVA,HOURSWAPAANLA,#0FHMOVDATA_SEG,A MOV A,#0FFH MOV P3,AMOVA,DATA_SEGMOVDPTR,#TABLEMOVCA,@A+DPTR;查表取字型碼MOVP1,ACLRP3.0;顯示第一位數(shù)據(jù) LJMP DISENDDISBIT2: MOVA,HOUR ;小時ANLA,#0FHMOVDATA_SEG,A MOV A,#0FFH MOV P3,AMOVA,DATA_SEGMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP1,A MOV C,SECOND.0 ;秒閃爍 MOV P1.7,CCLRP3.1;顯示第二位數(shù)據(jù) LJMP DISENDDISBIT3:MOVA,MINUTESWAPAANLA,#0FHMOV DATA_SEG,A MOV A,#0FFH MOV P3,AMOVA,DATA_SEGMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP1,ACLRP3.2;顯示第三位數(shù)據(jù) LJMP DISENDDISBIT4:MOVA,MINUTE ;顯示分鐘ANLA,#0FHMOVDATA_SEG,A MOV A,#0FFH MOV P3,AMOVA,DATA_SEGMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP1,ACLRP3.3;顯示第四位數(shù)據(jù)DISEND: INC DIS_REG MOVTH0,#0F0H;重裝定時器0初值MOVTL0,#000H ; SETB EA ;開中斷 MOV A,STACK_A RETITABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0A7H,0A1H,86H,8EH;==================讀實時時鐘實時數(shù)據(jù)寄存器子程序==========================;功能:從實時時鐘讀入當(dāng)前時間數(shù)據(jù) |;入口:NONE |;出口:接收數(shù)據(jù)放在年、月、日、星期、時、分、秒各寄存器 |;影響資源:A,R0,R3,TIMETX,TIMERX,YEAR,MONTH,DAY,WEEK,HOUR,MINUTE,SECOND |;==========================================================================READ_TIME:LCALLIICSTART JB FLAG.1,ERR_IICSTOP ;如SDA線被箝位為低電平則退出MOVTIMETX,#65H ;發(fā)送讀時鐘數(shù)據(jù)命令LCALLSENDH_L JB FLAG.0,ERR_IICSTOP ;ACK信號不正常則退出.MOVR0,#YEARMOVR3,#07HRDTIME1:LCALLRXL_HMOVA,TIMERXMOV@R0,AINCR0 DJNZR3,RDTIME2 ;讀完一個字節(jié)數(shù)據(jù)后確認數(shù)據(jù)傳輸 JMP RDTIME3 ;若為最后一個字節(jié)數(shù)據(jù)則為NOACKRDTIME2: CALL ACK JMP RDTIME1RDTIME3: CALL NOACK LCALL IICSTOP CLR HOUR.7 ;小時的最高位在24小時制時沒有用,如果是12小時制請刪掉此行. CLR SECOND.7 ;秒的最高位屏蔽為0RDTIME_RET: RETERR_IICSTOP: LCALL IICSTOP RET;======================寫實時時鐘內(nèi)部實時數(shù)據(jù)寄存器程序=====================;功能:將設(shè)定年、月、日、星期、時、分、秒數(shù)據(jù)寫入實時時鐘 |;入口:發(fā)送數(shù)據(jù)放在年、月、日、星期、時、分、秒各寄存器 |;出口:NONE |;影響資源:A,R0,R1,TXBUF,YEAR,MONTH,DATE,DAY,HOUR,MINUTE,SECOND |;==========================================================================WRITE_TIME:LCALLIICSTART JNB FLAG.1,TIME_WRITE_1 LJMP ERR_IICSTOP ;SDA線被箝位為低電平則退出TIME_WRITE_1:MOVTIMETX,#64H;發(fā)送寫實時數(shù)據(jù)1命令,#64HLCALLSENDH_L JNB FLAG.0,TIME_WRITE_2 LJMP ERR_IICSTOP ;ACK信號不正常則退出?TIME_WRITE_2:MOVR0,#YEARMOVR1,#07HWRTIME1:MOVA,@R0MOVTIMETX,ALCALLSENDL_HINCR0DJNZR1,WRTIME1LCALLIICSTOPRET;============================ACK===========================================;功能:延時 肟冢篘ONE 出口:NONE |;影響資源: |;==========================================================================ACK: CLR TIMETEMP.1 LCALL BITOUT RET;============================ACK===========================================;功能:延時 入口:NONE 出口:NONE |;影響資源: |;==========================================================================NOACK: SETB TIMETEMP.1 LCALL BITOUT RET;===============================保存錯誤代碼===============================;功能:保存MCU與IIC接口通信時的錯誤狀態(tài) |;入口:TIMETEMP.0=ACK位值? |;出口:FLAG.0 =錯誤代碼 |;==========================================================================ACK_ERR: JNB TIMETEMP.0,ACK_ERR_RET ;檢查ACK信號是否正常 SETB FLAG.0 ;置ACK出錯標(biāo)志位ACK_ERR_RET: RET;===============================啟用IIC總線================================;功能:開啟實時時鐘的IIC總線;入口:NONE 出口:NONE;影響資源:NONE;==========================================================================IICSTART: CLR FLAG.1SETBSDASETBSCLLCALLDELAY JB SDA,IIC_SDAHI SETB FLAG.1IIC_SDAHI:CLRSDA LCALL DELAYCLRSCL LCALL DELAY RET;===============================關(guān)閉IIC總線================================;功能:關(guān)閉實時時鐘IIC總線;入口:NONE 出口:NONE;影響資源:NONE;==========================================================================IICSTOP:CLRSDASETBSCLLCALLDELAYSETBSDALCALLDELAYRET;============================發(fā)送一個字節(jié),由高位到低位發(fā)送================;功能:從MCU發(fā)送一個字節(jié)給實時時鐘,由高位到低位發(fā)送 |;入口:發(fā)送數(shù)據(jù)放在TIMETX 出口:NONE |;影響資源:A,R2,TIMETX |;==========================================================================SENDH_L:MOVA,TIMETXMOVR2,#08H CLR FLAG.0SENDH_L1: MOVC,ACC.7 MOVTIMETEMP.1,CLCALLBITOUTRLADJNZR2,SENDH_L1 LCALL BITIN LCALL ACK_ERR RET;==========================發(fā)送一個字節(jié),由低位到高位發(fā)送==================;功能:從MCU發(fā)送一個字節(jié)給實時時鐘,由低位到高位發(fā)送 |;入口:發(fā)送數(shù)據(jù)放在TIMETX 出口:NONE |;影響資源:A,R2,TIMETX |;==========================================================================SENDL_H:MOVA,TIMETXMOVR2,#08H CLR FLAG.0SENDL_H1: MOVC,ACC.0 MOVTIMETEMP.1,C LCALLBITOUTRRADJNZR2,SENDL_H1 LCALL BITIN LCALL ACK_ERRRET;=================================接收一個字節(jié)=============================;功能:MCU從IIC總線接收一個字節(jié),MSB在前,LSB在后 |;入口:NONE 出口:接收數(shù)據(jù)放在RXBUF中 |;影響資源:A,R2,TIMEBIT,RXBUF |;==========================================================================RXH_L:MOVR2,#08HRXH_L1: LCALLBITIN MOVC,TIMETEMP.0 MOVACC.7,CRLCADJNZR2,RXH_L1 MOV TIMERX,A RET;=================================接收一個字節(jié)=============================;功能:MCU從IIC總線接收一個字節(jié),LSB在前,MSB在后 |;入口:NONE 出口:接收數(shù)據(jù)放在RXBUF中 |;影響資源:A,R2,TIMEBIT,RXBUF |;==========================================================================RXL_H:MOVR2,#08HRXL_H1: LCALLBITIN MOVC,TIMETEMP.0RRCADJNZR2,RXL_H1 MOV TIMERX,A RET;================================送出一位數(shù)================================;功能:從MCU發(fā)送一位數(shù)給實時時鐘 |;入口:發(fā)送位數(shù)放在EEPREM.1 出口:NONE |;影響資源:A,TIMETEMP |;==========================================================================BITOUT: MOVC,TIMETEMP.1MOVSDA,CLCALLDELAYSETBSCLLCALLDELAYCLRSCL LCALL DELAYRET;=================================讀入一位數(shù)===============================;功能:MCU從實時時鐘接收一位數(shù) |;入口:NONE 出口:接收位數(shù)放在TIMETEMP.0 |;影響資源:A,TIMETEMP |;==========================================================================BITIN: SETBSDA SETB SCLLCALLDELAYMOVC,SDA MOVTIMETEMP.0,CCLRSCL CLR SDA LCALL DELAYRET;============================短延時子程序==================================;功能:延時 入口:NONE 出口:NONE |;影響資源:R7,PSW |;==========================================================================DELAY:MOVR7,#05HDELAY1:NOPDJNZR7,DELAY1RETLONGDELAY: ;DELAY 300MS MOV R6,#240LD0: MOV R7,#250 ;5*250*240LD1: NOP NOP NOP DJNZ R7,LD1 DJNZ R6,LD0 RET;============================寫狀態(tài)寄存器程序==============================;功能:讀/寫實時時鐘狀態(tài)寄存器,對其進行設(shè)置 |;入口:NONE 出口:NONE |;影響資源: A,TIMETX |;==========================================================================TIMESTATUS_INT12: LCALL IICSTART JNB FLAG.1,TIME_SETMODE_1 LJMP ERR_IICSTOP ;SDA線被箝位為低電平則退出TIME_SETMODE_1:MOVTIMETX,#62H ;發(fā)送寫時鐘狀態(tài)寄存器命令LCALLSENDH_L JNB FLAG.0,TIME_SETMODE_2 LJMP ERR_IICSTOP ;ACK信號不正常則退出?TIME_SETMODE_2:MOVTIMETX,#40H ;24小時進制,LCALLSENDL_H ;關(guān)閉/INT1及/INT2腳的輸出 LCALL IICSTOP ; RET END |