新闻  |   论坛  |   博客  |   在线研讨会
DS12C887的C51驱动
tvb2058 | 2007-09-16 10:58:51    阅读:3542   发布文章

DS12C887的C51驱动

                                      

    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模式方便读出显示
}

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客