DS12C887实时时钟
实物图
引脚定义
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
:片选输入,低电平有效。
举例
#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();
}