"); //-->
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模式方便读出显示
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。