DS1302 特征
- 实时时钟显示秒、分钟、小时、月、月、日、周、年的秒、分钟、小时,最多可获得2100年的飞跃补偿。
- 31 x 8电池支持通用RAM。
- 最小针数系列I/O。
- 2.0V至5.5V全面运作。
- 2.0V时使用少于300nA。
- 单字节或多字节(突发模式)数据传输,用于读取或写入时钟或RAM数据。
- 8PinDIP或可选的8Pin,所以表面安装。
- 简单的3线接口。
- TTL兼容(V CC=5V)。
- 可选工业温度范围:-40°C至85°C。
- DS1202兼容。
- 承销商实验室(UL®认可)
(建议大家去看DS1302的芯片手册。)
典型连接电路和结构简图
可以看到DS132由电源控制,输入移位寄存器,命令和控制逻辑,延时时钟,31×8 RAM和晶振输入模块构成。
引脚说明
值得注意的是当使用有源晶振时,只接X1引脚,而X2引脚悬空。
Vcc2 为主供电。 在没有主电源的情况下,VCC1连接到备份源,以维护时间和日期。 DS1302是从较大的VCC1或VCC2运行的。 当VCC2大于VCC1时 0.2V,VCC2为DS1302供电。 当VCC2小于VCC1时,VCC1为DS1302供电。
地址/命令字节
当对DS1320进行读操作时,需要发送地址字节,而进行写操作时,则需要发送地址和命令字节。
A4 A3 A2 A1 A0 是表示的是DS1320内部地址编号,如 下一部分的读写操作地址。81H — 10000001B 对应上图的地址字节。第1位因为是读操作,所以为1,第1位到第5位表示地址为00000,第六位为RAM/CK,这里我们选择时钟,第七位固定为1。可以对照下一部分的读写操作地址联系一下。
读写操作地址
大家可能疑惑的是10 Seconds 是什么意思?其实就是十位。例如:58 — 十位为 5 各位为 8。
写保护寄存器
WP:0允许写入,1禁止写入。
涓流充电寄存器
慢充电寄存器,用于管理对备用电源的充电
TCS:当4位TCS=1010时,才允许使用涓流充电寄存器,其他任何状态都将禁止使用涓流充电器。
DS:两DS位用于选择连接在VCC2和VCC1间的二极管数目。
读写发送的时序
时序图分析:找开始点,结束点和转折点。
在最下面有参考的 bilibili网址,老师讲的特别好,所以就不再赘述。
代码阐述
我们这里用蓝桥杯竞赛提供的底层驱动参考代码。
.h 文件声明函数
#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
#endif
#include <reg52.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
需要特别注意的是,在写地址和数据前需要对总线初始化
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
同时结束读操作时,需要对总线进行如下操作。
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
如若没有则传输错误。
参考文献
DS1302芯片手册
https://www.bilibili.com/video/av37386236