實時時鐘 -- “RTC”的使用
一、實時時鐘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_add0x82
#define ds1302_hr_add0x84
#define ds1302_date_add0x86
#define ds1302_month_add0x88
#define ds1302_day_add0x8a
#define ds1302_year_add 0x8c
#define ds1302_control_add0x8e
#define ds1302_charger_add0x90
#define ds1302_clkburst_add0xbe
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晶片的看法。