DS1302驱动程序 - 梦之旅丶梦

时间:2024-03-12 08:14:51

DS1302驱动程序

本文版权:成都至诚恒远物联网技术有限公司  网址: www.heryit.cn  联系电话: 028-87657875 13060063607

DS1302 时钟芯片包含一个实时时钟和31 字节的静态RAM,通过简单的串行 接口与微处理器通讯,提供年月日,时分秒信息。DS1302的驱动程序也比较简单,下面提供DS1302的驱动程序:

//接口定义 请根据所使用处理器和端口修改
#define DS1302_CS                   PB15    //使能线定义
#define DS1302_CLK              PC15    //时钟线定义
#define DS1302_DAT              PC14    //数据线定义

//从ds1302读取一个字节的数据
uint8_t ds1302_read(uint8_t addr)
{
    uint8_t i = 0;
    uint8_t data = 0;

    DS1302_CS = 1;

    for(i=0; i<8; i++)
    {
        if(addr & 0x01) DS1302_DAT = 1;
        else    DS1302_DAT = 0;
        delay(1);
        DS1302_CLK = 1;
        delay(1);
        DS1302_CLK = 0;
        delay(1);
        addr >>= 1;
    }

    //设置数据线为输入模式 请根据所使用处理器和端口修改
    GPIO_SetMode(DS1302_DAT_PORT, DS1302_DAT_PIN, GPIO_PMD_INPUT);
    if(DS1302_DAT == 1) data++;
    delay(1);
    for(i=0; i<7; i++)
    {
        DS1302_CLK = 1;
        delay(1);
        DS1302_CLK = 0;
        delay(1);
        if(DS1302_DAT == 1) data += (1<<(i+1));
        delay(1);
    }
    //设置数据线为输出模式 请根据所使用处理器和端口修改
    GPIO_SetMode(DS1302_DAT_PORT, DS1302_DAT_PIN, GPIO_PMD_OUTPUT);

    DS1302_CS = 0;

    return data;
}

//写入一个字节的数据到ds1302
void ds1302_write(uint8_t addr, uint8_t data)
{
    uint8_t i = 0;

    DS1302_CS = 1;

    for(i=0; i<8; i++)
    {
        if(addr & 0x01) DS1302_DAT = 1;
        else    DS1302_DAT = 0;
        delay(1);
        DS1302_CLK = 1;
        delay(1);
        DS1302_CLK = 0;
        delay(1);
        addr >>= 1;
    }

    for(i=0; i<8; i++)
    {
        if(data & 0x01) DS1302_DAT = 1;
        else    DS1302_DAT = 0;
        delay(1);
        DS1302_CLK = 1;
        delay(1);
        DS1302_CLK = 0;
        delay(1);
        data >>= 1;
    }

    DS1302_CS = 0;
}

//芯片初始化
uint8_t ds1302_init(void)
{
    //初始化端口,请自行修改
    ds1302_gpio_init();
    //检查数据是否丢失(将一个标志数据存于RAM中,下一次上电读到该数据表示时间数据还存在,反之。。。)
    if(ds1302_read(DS1302_BACKUP+1) == DS1302_BACKUP) return 0;
    ds1302_write(DS1302_WP, 0x00);
    ds1302_write(DS1302_CHARGE, 0xA5);
    ds1302_write(DS1302_YEAR, 0x00);
    ds1302_write(DS1302_MON, 0x01);
    ds1302_write(DS1302_DAY, 0x01);
    ds1302_write(DS1302_HOUR, 0x00);
    ds1302_write(DS1302_MIN, 0x00);
    ds1302_write(DS1302_SEC, 0x00);

    return 1;
}

//设置时间
void ds1302_set_time(void)
{
    ds1302_write(DS1302_YEAR, otoh(time.year-2000));
    ds1302_write(DS1302_MON, otoh(time.month));
    ds1302_write(DS1302_DAY, otoh(time.day));
    ds1302_write(DS1302_HOUR, otoh(time.hour));
    ds1302_write(DS1302_MIN, otoh(time.min));
    ds1302_write(DS1302_SEC, otoh(time.sec));
    //保存标志(表示时间已经设置,下一次初始化芯片不需要再初始化时间寄存器)
    ds1302_write(DS1302_BACKUP, DS1302_BACKUP);
}

//读取时间
void ds1302_read_time(void)
{
    time.year = htoo(ds1302_read(DS1302_YEAR+1)) + 2000;
    time.month = htoo(ds1302_read(DS1302_MON+1));
    time.day = htoo(ds1302_read(DS1302_DAY+1));
    time.hour = htoo(ds1302_read(DS1302_HOUR+1));
    time.min = htoo(ds1302_read(DS1302_MIN+1));
    time.sec = htoo(ds1302_read(DS1302_SEC+1));

}