原理图和引脚
DS1302 是美国 DALLAS 公司推出的一种高性能、低功耗、带 RAM 的实时时钟电路,它
可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V~
5.5V。采用三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信
号或 RAM 数据。DS1302 内部有一个 31×8 的用于临时性存放数据的 RAM 寄存器。
三根线
- SCLK同步时钟
- I/O数据输入输出
- RST低电平使能
指令字节
对DS1302进行读写的指令字节共有8位,
第7位固定位“1”
第6位是选择位,1:选择存储RAM中的数据;0:日历时钟数据
第5~2位是地址位
第1位是选择位,1:读操作;0:写操作
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1 | RAM | A4 | A3 | A2 | A1 | A0 | 1:RD |
0: |
时序
写时序:
先写地址指令,后写数据
void ds1302_write(unsigned char addr, unsigned char dat)
{
unsigned char i;
RST = 1;
_nop_();
//写入目标地址:addr
addr = addr & 0xFE; //最低位置零
for (i = 0; i < 8; i ++)
{
SDA = addr & 0x01;//从最低位开始
addr >>= 1;
SCLK = 1;
_nop_();
SCLK = 0;
_nop_();
}
//写入数据:dat
for (i = 0; i < 8; i ++)
{
SDA = dat & 0x01;//从最低位开始
dat >>= 1;
SCLK = 1;
_nop_();
SCLK = 0;
_nop_();
}
RST = 0; //停止DS1302总线
_nop_();
}
读时序:
先写地址指令,后读数据
unsigned char ds1302_read(unsigned char addr)
{
unsigned char i;
unsigned char dat;
RST = 1;
_nop_();
//写入目标地址:addr
addr = addr | 0x01;//最低位置高
for (i = 0; i < 8; i ++)
{
SDA = addr & 0x01;
addr >>= 1;
SCLK = 1;
_nop_();
SCLK = 0;//下降沿,放置数据
_nop_();
}
SCLK = 1;
_nop_();
//输出数据:dat
for (i = 0; i < 8; i ++)
{
dat >>= 1;
if(SDA)
{
dat |= 0x80;
}
else
{
dat &= 0x7f;
}
SCLK = 0;
_nop_();
SCLK = 1;
_nop_();
}
SCLK = 0;
_nop_();
RST = 0; //停止DS1302总线
_nop_();
//解决读取时间是ff的问题
SDA = 0;
return dat;
}
控制地址
读寄存器 | 写寄存器 | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 | 范围 |
81h | 80h | CH | 10秒 | 秒 | 00-59 | |||||
83h | 82h | 10分 | 分 | 00-59 | ||||||
85h | 84h | 12/ | 0 | 10 | 时 | 时 | 1-12/0-23 | |||
AM/ | ||||||||||
87h | 86h | 0 | 0 | 10日 | 日 | 1-31 | ||||
89h | 88h | 0 | 0 | 0 | 10月 | 月 | 1-12 | |||
8Bh | 8Ah | 0 | 0 | 0 | 0 | 0 | 周日 | 1-7 | ||
8Dh | 8Ch | 10年 | 年 | 00-99 | ||||||
8Fh | 8Eh | WP | 0 | 0 | 0 | 0 | 0 | 0 | 0 | — |
DS1302时间格式
什么是BCD码?
BCD码是一种数字编码,特点是像十进制,但其实本质还是十六进制。BCD码只有0-9没有ABCDEF字母
原理
用四位二进制表示一位十进制0-9的数据。例如:12D表示成BCD码就是0001 0010