1. 程式人生 > >實時時鐘 -- “RTC”的使用

實時時鐘 -- “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晶片的看法。