DS12C887实时时钟

实物图
2
引脚定义
1
GND、 VCC:直流电源,其中VCC接+5V输入,GND接地,当VCC输入为+5V时,用户可以访问DS12C887内RAM中的数据,并可对其进行读、写操作;当VCC的输入小于+4.25V时,禁止用户对内部RAM进行读、写操作,此时用户不能正确获取芯片内的时间信息;当VCC的输入小于+3V时, DS12C887会自动将电源发换到内部自带的锂电池上。
MOT:模式选择脚,DA12C887有两种工作模式,即Motorola模式和Intel模式,当MOT接VCC时,选用的工作模式是Motorola模式,当MOT接GND时,选用的是Intel模式。本文主要讨论Intel模式。
SQW:方波输出脚,当供电电压VCC大于4.25V时,SQW脚可进行方波输出,此时用户可以通过对控制寄存器编程来得到13种方波信号的输出。
AD0~AD7:复用地址数据总线,该总线采用时分复用技术,在总线周期的前半部分,出现在AD0-AD7上的是地址信息,可用以选通DS12C887内的RAM,总线周期的后半部分出现在AD0-AD7上的数据信息。
AS:地址选通输入脚,在进行读写操作时,AS的上升沿将AD0-AD7上出现的地址信息锁存到DS12C887上,而下一个下降沿清除AD0-AD7上的地址信息,不论是否有效,DS12C887都将执行该操作。
DS/RD:数据选择或读输入脚,该引脚有两种工作模式,当MOT接VCC时,选用Motorola工作模式,在这种工作模式中,每个总线周期的后一部分的DS为高电平,被称为数据选通。在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0-AD7上,以供外部读取。在写操作中,DS的下降沿将使总线 AD0-AD7上的数据锁存在DS12C887中。
R/W:读/写输入端,该管脚也有2种工作模式,当MOT接VCC时,R/W工作在Motorola模式。此时,该引脚的作用是区分进行的是读操作还是写操作,当R/W为高电平时为读操作,R/W为低电平时为写操作;当MOT接GND时,该脚工作在Intle模式,此时该作为写允许输入。
CS:片选输入,低电平有效。
3
举例

#define uchar unsigned char
#define uint unsigned int

sbit dsds = P4 ^ 4;
sbit dsrw = P4 ^ 2;
sbit dsas = P4 ^ 5;
sbit dscs = P2 ^ 0;

//写12C887函数
void write_ds(uchar addr, uchar date)
{
   dscs = 0;
   dsas = 1;
   dsds = 1;
   dsrw = 1;
   P0 = addr; //先写地址
   dsas = 0;
   dsrw = 0;
   P0 = addr; //再写数据
   dsrw = 1;
   dsas = 1;
   dscs = 1;
}

//读12C887函数
uchar read_ds(uchar addr)
{
   uchar ds_date;

   dsas = 1;
   dsds = 1;
   dsrw = 1;
   dscs = 0;
   P0 = addr; //先写地址
   dsas = 0;
   dsds = 0;
   P0 = 0xff;
   ds_date = P0; //再读数据
   dsds = 1;
   dsas = 1;
   dscs = 1;

   return ds_date;
}

//读取12C887数据
void read_time(void)
{
   char hour, minute, second, year, month, date, day;

   year = read_ds(9);
   month = read_ds(8);
   date = read_ds(7);
   day = read_ds(6);
   hour = read_ds(4);
   minute = read_ds(2);
   second = read_ds(0);
}

/*
	首次操作12C887时,寄存器初始化
	配置12C887当前时间(20190716-10:54:07)
	配置12C887闹钟
*/
void set_time(void)
{
   write_ds(0, 7);
   write_ds(1, 0);
   write_ds(2, 54);
   write_ds(3, 0);
   write_ds(4, 10);
   write_ds(5, 0);
   write_ds(6, 3);
   write_ds(7, 16);
   write_ds(8, 7);
   write_ds(9, 19);
}

/*首次上电设置DS12C887时使用,以后不必再调用*/
void init(void)
{
   write_ds(0x0A, 0x20); //打开振荡器
   write_ds(0x0B, 0x26); //设置24小时模式,数据二进制格式
   set_time();
}
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值