单片机学习小组
登录
直播中
李平
7年用户
1207经验值
私信
关注
DS12C887的C51驱动代码
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
ti
me[];
// 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 SetAl
ARM
Clock(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编译的时候为什么会报错呢?
请教楼主,地56行的CLR_DOG是什么操作指令吗?keil编译的时候为什么会报错呢?
举报
更多回帖
rotate(-90deg);
回复
相关帖子
ds12c887
C51
时钟芯片
ds12c887
的
C51
驱动
程序
262
DS12C887
时钟复位用_源
代码
11
DS12C887
时钟
17
DS12C887
pdf datasheet
173
ds12c887
1497
基于
51
单片机的
DS12C887
实时时钟例程源
代码
5
proteus仿真
DS12C887
7006
ds12c887
芯片怎样初始化_
ds12c887
初始化程序分享
9916
ds12c887
程序
4148
购买
ds12c887
设计的时钟
1622
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分