DS12C887自带电池,并且芯片内部具有一定的掉电保存RAM,而且价格也还可以,因此使用的比较多。DS12C887地址与数据总线复用,因此与51接口方便,51的ALE接入DS12C887的ALE,51的读信号RD接入DS12C887的DS,51的写信号WR接入D12C887的RW即可。驱动代码如下:
- #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)
- {
- // 关闭RTC
- RTCREGA = 0x70; // 寄存器A
- // 芯片停止工作, BIN模式, 24小时制, 在此期间初始化初始化时标寄存器
- RTCREGB = 0x86; // 寄存器B, 时标寄存器用二进制表示,为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世纪
- time[0] = RTCREGC; // 寄存器C, 清楚C标志
- RTCREGA = 0x20; // 开启RTC
- RTCREGB = 0x06; // 芯片处于正常工作状态, 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)
- {
- // 关闭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
- }
- // 设置定时时间
- void SetAlarmClock(unsigned char hour, unsigned char minute, unsigned char second)
- {
- unsigned char tmp;
- // 关闭RTC
- RTCREGA = 0x70; // 寄存器A
- // 芯片停止工作, BIN模式, 24小时制, 在此期间初始化初始化时标寄存器
- RTCREGB = 0x84; // 寄存器B
- RTCSECONDALRM = second; // 秒闹
- RTCMINUTEALRM = minute; // 分闹
- RTCHOURALRM = hour; // 时闹
- tmp = RTCREGC; // 寄存器C, 清楚C标志
- RTCREGA = 0x20; // 开启RTC
- RTCREGB = 0x02; // 芯片处于正常工作状态, BCD模式
- // BCD模式方便读出显示
- }
复制代码
|