DS1302实时时钟读写

#include <REGX52.H>

sbit DS1302_SCLK = P3 ^ 6;
sbit DS1302_IO = P3 ^ 4;
sbit DS1302_CE = P3 ^ 5;

unsigned char DS1302_DATETIME[] = {24, 03, 16, 01, 33, 30, 6};
#define DS1302_YEAR 0X8C
#define DS1302_MONTH 0X88
#define DS1302_DATE 0X86
#define DS1302_HOUR 0X84
#define DS1302_MIN 0X82
#define DS1302_SEC 0X80
#define DS1302_DAY 0X8A

unsigned char DS1302_readByte(unsigned char cmd)
{
    unsigned char i;
    unsigned char result = 0x00;

    cmd |= 0x01;
    DS1302_CE = 1;

    for (i = 0; i < 8; i++)
    {
        DS1302_IO = cmd & (0x01 << i); // 从低至高
        DS1302_SCLK = 0;
        DS1302_SCLK = 1;
    }

    for (i = 0; i < 8; i++)
    {
        DS1302_SCLK = 1;
        DS1302_SCLK = 0;
        if (DS1302_IO)
        {
            result |= (0x01 << i);
        }
    }

    DS1302_CE = 0;
    DS1302_IO = 0; // 解决数字显示混乱?
    return result;
}

void DS1302_writeByte(unsigned char cmd, unsigned char content)
{
    unsigned char i;
    DS1302_CE = 1;

    for (i = 0; i < 8; i++)
    {
        DS1302_IO = cmd & (0x01 << i); // 从低至高
        DS1302_SCLK = 1;
        DS1302_SCLK = 0;
    }

    for (i = 0; i < 8; i++)
    {
        DS1302_IO = content & (0x01 << i); // 从低至高
        DS1302_SCLK = 1;
        DS1302_SCLK = 0;
    }

    DS1302_CE = 0;
}

void DS1302_init()
{
    DS1302_CE = 0;
    DS1302_SCLK = 0;
    DS1302_writeByte(0x8E, 0x00); // 写保护解除?
}

/**
 * 将数组DS1302_DATETIME[]的信息写入时钟
*/
void DS1302_setTime()
{
    DS1302_writeByte(DS1302_YEAR, DS1302_DATETIME[0] / 10 * 16 + DS1302_DATETIME[0] % 10);
    DS1302_writeByte(DS1302_MONTH, DS1302_DATETIME[1] / 10 * 16 + DS1302_DATETIME[1] % 10);
    DS1302_writeByte(DS1302_DATE, DS1302_DATETIME[2] / 10 * 16 + DS1302_DATETIME[2] % 10);
    DS1302_writeByte(DS1302_HOUR, DS1302_DATETIME[3] / 10 * 16 + DS1302_DATETIME[3] % 10);
    DS1302_writeByte(DS1302_MIN, DS1302_DATETIME[4] / 10 * 16 + DS1302_DATETIME[4] % 10);
    DS1302_writeByte(DS1302_SEC, DS1302_DATETIME[5] / 10 * 16 + DS1302_DATETIME[5] % 10);
    DS1302_writeByte(DS1302_DAY, DS1302_DATETIME[6] / 10 * 16 + DS1302_DATETIME[6] % 10);
}

/**
 * 获取时间信息并放入数组DS1302_DATETIME[]
*/
void DS1302_getTime()
{
    char tmp = 0;
    tmp = DS1302_readByte(DS1302_YEAR);
    DS1302_DATETIME[0] = tmp / 16 * 10 + tmp % 16;

    tmp = DS1302_readByte(DS1302_MONTH);
    DS1302_DATETIME[1] = tmp / 16 * 10 + tmp % 16;

    tmp = DS1302_readByte(DS1302_DATE);
    DS1302_DATETIME[2] = tmp / 16 * 10 + tmp % 16;

    tmp = DS1302_readByte(DS1302_HOUR);
    DS1302_DATETIME[3] = tmp / 16 * 10 + tmp % 16;

    tmp = DS1302_readByte(DS1302_MIN);
    DS1302_DATETIME[4] = tmp / 16 * 10 + tmp % 16;

    tmp = DS1302_readByte(DS1302_SEC);
    DS1302_DATETIME[5] = tmp / 16 * 10 + tmp % 16;

    tmp = DS1302_readByte(DS1302_DAY);
    DS1302_DATETIME[6] = tmp / 16 * 10 + tmp % 16;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值