单片机学习小组
直播中

李平

7年用户 1205经验值
私信 关注

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




回帖(1)

yuechuqingyun

2024-8-18 16:48:42
请教楼主,地56行的CLR_DOG是什么操作指令吗?keil编译的时候为什么会报错呢?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分