一、实时时钟DS1302简介
1. DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路。
2. 特点
a> DS1302可以对年月日周时分秒计数。时间最多计时到2100年。
b> 工作电压:2.0 ~ 5.5 V。
c> 内部有31 x 8 RAM存放临时数据。
d> 工作温度:-40 ~ 85℃。
e> 通过三根线通信。
f> 双电源供电(Vcc2为主电源,Vcc1为后备电源)。
g> 晶振为32.768KHz。
3. 电源供电
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电,否则Vcc1给DS1302供电。
二、DS1302的驱动程序(仅供参考)
数据地址如下所示:
要改变时分秒的值,首先要知道它的地址。在上图中可以找到对应数据的地址,然后根据地址改变它的值。
#define ds1302_sec_add0x80
#define ds1302_min_add 0x82
#define ds1302_hr_add 0x84
#define ds1302_date_add 0x86
#define ds1302_month_add 0x88
#define ds1302_day_add 0x8a
#define ds1302_year_add 0x8c
#define ds1302_control_add 0x8e
#define ds1302_charger_add 0x90
#define ds1302_clkburst_add 0xbe
1. Write Byte
时序图如下所示,
程序仅供参考:
void ds1302_write_byte(unsigned char addr, unsigned char byte)
{
unsigned char i;
addr &= 0xfe;
SCK = 0;
RST = 0;
RST = 1;
for(i = 0; i < 8; i++)
{
IO = addr & 0x01;
SCK = 0;
SCK = 1;
addr >>= 1;
}
for(i = 0; i < 8; i++)
{
IO = byte & 0x01;
SCK = 0;
SCK = 1;
byte >>= 1;
}
SCK = 0;
RST = 0;
}
2. Read Byte
时序图如下所示,
程序仅供参考:
unsigned char ds1302_read_byte(unsigned char addr)
{
unsigned char i;
unsigned char temp;
addr |= 0x01;
SCK = 0;
RST = 0;
RST = 1;
for(i = 0; i < 8; i++)
{
IO = addr & 0x01;
SCK = 0;
SCK = 1;
addr >>= 1;
}
for(i = 0; i < 8; i++)
{
SCK = 1;
SCK = 0;
temp >>= 1;
if(IO)
{
temp += 0x80;
}
}
RST = 0;
return temp;
}
3.Write Data
时序图如下所示,
程序仅供参考:
(例-写入时分秒)
void ds1302_write_time()
{
unsigned char i;
unsigned char temp;
unsigned char temp1;
for(i = 0; i < 3; i++)
{
temp = timebuf[i] / 10;
temp1 = timebuf[i] % 10;
writebuf[i] = (temp << 4) | temp1;
}
ds1302_write_byte(ds1302_control_add,0x00);
ds1302_write_byte(ds1302_hr_add,writebuf[0]);
ds1302_write_byte(ds1302_min_add,writebuf[1]);
ds1302_write_byte(ds1302_sec_add,writebuf[2]);
ds1302_write_byte(ds1302_control_add,0x80);
}
4.
Read Data
时序图如下所示,
程序仅供参考:
(例-读出时分秒)
void ds1302_read_time()
{
unsigned char i;
readbuf[0] = ds1302_read_byte(ds1302_hr_add);
readbuf[1] = ds1302_read_byte(ds1302_min_add);
readbuf[2] = ds1302_read_byte(ds1302_sec_add);
readbuf[3] = ds1302_read_byte(ds1302_year_add);
readbuf[4] = ds1302_read_byte(ds1302_month_add);
readbuf[5] = ds1302_read_byte(ds1302_date_add);
readbuf[6] = ds1302_read_byte(ds1302_day_add);
for(i = 0; i < 7; i++)
{
disbuf[i] = ((readbuf[i] >> 4) * 10) + (readbuf[i] & 0x0f);
}
}
我们可以使用DS1302来计时并读取时间,这样可以减少单片机的负担。使用DS1302计时也十分精确,并且还可以在断电的时候使用备用电池保存时间数据。对于时间的处理也是十分的好,比如闰年的计算等。这是我自己对DS1302芯片的看法。