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));
}