|
DS12C887自帶電池,并且芯片內(nèi)部具有一定的掉電保存RAM,而且價格也還可以,因此使用的比較多。DS12C887地址與數(shù)據(jù)總線復(fù)用,因此與51接口方便,51的ALE接入DS12C887的ALE,51的讀信號RD接入DS12C887的DS,51的寫信號WR接入D12C887的RW即可。驅(qū)動代碼如下:
- #define YEANUM 6
- #define MONNUM 5
- #define DAYNUM 4
- #define WEENUM 3
- #define HOUNUM 2
- #define MINNUM 1
- #define SECNUM 0
- extern unsigned char idata time[];
- // DS12C887寄存器定義
- #define RTCSECOND (*(volatile unsigned char xdata *)DS12C887ADR)
- #define RTCSECONDALRM (*(volatile unsigned char xdata *)(DS12C887ADR+1))
- #define RTCMINUTE (*(volatile unsigned char xdata *)(DS12C887ADR+2))
- #define RTCMINUTEALRM (*(volatile unsigned char xdata *)(DS12C887ADR+3))
- #define RTCHOUR (*(volatile unsigned char xdata *)(DS12C887ADR+4))
- #define RTCHOURALRM (*(volatile unsigned char xdata *)(DS12C887ADR+5))
- #define RTCWEEK (*(volatile unsigned char xdata *)(DS12C887ADR+6))
- #define RTCDAY (*(volatile unsigned char xdata *)(DS12C887ADR+7))
- #define RTCMONTH (*(volatile unsigned char xdata *)(DS12C887ADR+8))
- #define RTCYEAR (*(volatile unsigned char xdata *)(DS12C887ADR+9))
- #define RTCREGA (*(volatile unsigned char xdata *)(DS12C887ADR+10))
- #define RTCREGB (*(volatile unsigned char xdata *)(DS12C887ADR+11))
- #define RTCREGC (*(volatile unsigned char xdata *)(DS12C887ADR+12))
- #define RTCCENTURY (*(volatile unsigned char xdata *)(DS12C887ADR+50))
- unsigned char idata time[7];
- void DS12C887Init(void)
- {
- // 關(guān)閉RTC
- RTCREGA = 0x70; // 寄存器A
- // 芯片停止工作, BIN模式, 24小時制, 在此期間初始化初始化時標(biāo)寄存器
- RTCREGB = 0x86; // 寄存器B, 時標(biāo)寄存器用二進(jìn)制表示,為24小時工作模式
- RTCSECOND = time[SECNUM]; // 0秒
- RTCSECONDALRM = 0xff; // 秒鬧
- RTCMINUTE = time[MINNUM]; // 0分
- RTCMINUTEALRM = 0xff; // 分鬧
- RTCHOUR = time[HOUNUM]; // 0時
- RTCHOURALRM = 0xff; // 時鬧
- RTCWEEK = time[WEENUM]; // 星期一
- RTCDAY = time[DAYNUM]; // 一日
- RTCMONTH = time[MONNUM]; // 一月
- RTCYEAR = time[YEANUM]; // 05年
- RTCCENTURY = 0x20; // 20世紀(jì)
- time[0] = RTCREGC; // 寄存器C, 清楚C標(biāo)志
- RTCREGA = 0x20; // 開啟RTC
- RTCREGB = 0x06; // 芯片處于正常工作狀態(tài), BIN模式
- }
- void ReadTime(void)
- {
- do{
- CLR_DOG;
- time[0] = RTCREGA; // 判斷DS12C887是否處于更新周期
- } while(time[0]&0x80);
- time[SECNUM] = RTCSECOND;
- time[SECNUM] = RTCSECOND; // 秒
- time[MINNUM] = RTCMINUTE; // 分
- time[HOUNUM] = RTCHOUR; // 時
- time[WEENUM] = RTCWEEK; // 星期
- time[DAYNUM] = RTCDAY; // 日
- time[MONNUM] = RTCMONTH; // 月
- time[YEANUM] = RTCYEAR; // 年
- }
- void WriteTime(void)
- {
- // 關(guān)閉RTC
- RTCREGA = 0x70; // 寄存器A
- RTCSECOND = time[SECNUM]; // 秒
- RTCMINUTE = time[MINNUM]; // 分
- RTCHOUR = time[HOUNUM]; // 時
- RTCWEEK = time[WEENUM]; // 星期
- RTCDAY = time[DAYNUM]; // 日
- RTCMONTH = time[MONNUM]; // 月
- RTCYEAR = time[YEANUM]; // 年
- RTCREGA = 0x20; // 開啟RTC
- }
- // 設(shè)置定時時間
- void SetAlarmClock(unsigned char hour, unsigned char minute, unsigned char second)
- {
- unsigned char tmp;
- // 關(guān)閉RTC
- RTCREGA = 0x70; // 寄存器A
- // 芯片停止工作, BIN模式, 24小時制, 在此期間初始化初始化時標(biāo)寄存器
- RTCREGB = 0x84; // 寄存器B
- RTCSECONDALRM = second; // 秒鬧
- RTCMINUTEALRM = minute; // 分鬧
- RTCHOURALRM = hour; // 時鬧
- tmp = RTCREGC; // 寄存器C, 清楚C標(biāo)志
- RTCREGA = 0x20; // 開啟RTC
- RTCREGB = 0x02; // 芯片處于正常工作狀態(tài), BCD模式
- // BCD模式方便讀出顯示
- }
復(fù)制代碼
|
|