ds1302也是一个经典芯片,到今天因该用的还是挺多的。简言之,他是一个拥有不易失记忆存储和累加器的芯片,加上特定频率晶振就可以计时。

性能特性

某家厂的手册

通信

有三个管脚,clk,rst,data用于通信

当rst为1时开始操作。

命令

上升沿进行写命令

故且可以这么叫吧,在操作之前需要制定操作指向的寄存器和指定操作

有一个写保护控制位,当为1时保护

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define DS1302_SECOND_WRITE 0x80
#define DS1302_SECOND_READ 0x81
#define DS1302_MINUTE_WRITE 0x82
#define DS1302_MINUTE_READ 0x83
#define DS1302_HOUR_WRITE 0x84
#define DS1302_HOUR_READ 0x85
#define DS1302_DATE_WRITE 0x86
#define DS1302_DATE_READ 0x87
#define DS1302_MONTH_WRITE 0x88
#define DS1302_MONTH_READ 0x89
#define DS1302_WEEK_WRITE 0x8A
#define DS1302_WEEK_READ 0x8B
#define DS1302_YEAR_WRITE 0x8C
#define DS1302_YEAR_READ 0x8D
#define DS1302_CONTROL_WRITE 0x8E
#define DS1302_CONTROL_READ 0x8F

是有趣的是他有多出来的几个储存位,可以利用起来

操作

写入命令后可以进行写入或者读取,写在clk上升沿,读在clk下降沿

代码示例

说实话写出来的话都可以作库了

比特读写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
unsigned char Ds1302ReadByte()
{
unsigned char res = 0x00;
for (int i = 0; i < 8; i++)
{
res = DS1302_DATA << i | res;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return res;
}

void Ds1302WriteByte(int d)
{
for (int i = 0; i < 8; i++)
{
if (d % 2)
{
DS1302_DATA = 1;
}
else
{
DS1302_DATA = 0;
}
DS1302_CLK = 1;
DS1302_CLK = 0;
d = d >> 1;
}
}

完整操作函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
unsigned char Ds1302Read(unsigned char addr)
{
DS1302_RST = 0;
DS1302_CLK = 1;
DS1302_RST = 1;
Ds1302WriteByte(addr);
DS1302_RST = 0;
return Ds1302ReadByte();
}

void Ds1302Write(unsigned char addr, unsigned char data_hex)
{
DS1302_RST = 0;
DS1302_CLK = 1;
DS1302_RST = 1;
Ds1302WriteByte(addr);
Ds1302WriteByte(data_hex);
DS1302_RST = 0;
}