实时时钟 -- “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的驱动程序(仅供参考)

数据地址如下所示:

实时时钟 -- “RTC”的使用_第1张图片

要改变时分秒的值,首先要知道它的地址。在上图中可以找到对应数据的地址,然后根据地址改变它的值。

#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

时序图如下所示,

实时时钟 -- “RTC”的使用_第2张图片

程序仅供参考:

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

时序图如下所示,

实时时钟 -- “RTC”的使用_第3张图片

程序仅供参考:

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

时序图如下所示,

实时时钟 -- “RTC”的使用_第4张图片

程序仅供参考:

(例-写入时分秒)

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

时序图如下所示,

实时时钟 -- “RTC”的使用_第5张图片

程序仅供参考:

(例-读出时分秒)

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芯片的看法。



你可能感兴趣的:(51单片机,RTC,实时时钟,DS1302的时序图,DS1302驱动程序)