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