实时时钟 -- “RTC”的使用

2019-04-15 18:24发布

一、实时时钟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芯片的看法。