2018/4/30
1.功能
1.可以计算2100年之前的秒,分,时,日,日期,星期,月,年的能力
2.在其内部有着31个字节的静态RAM,提供用户使用
3.采用串行数据传送,采用SPI三线接口
4.工作电压(2.0v--5.5v),工作温度:-40c--85c
5.可以采用双电源进行供应
2.SPI 总线
SPI(Secial Peripheral Interface) 串行外围接口
信号类型:
1.MOSI:主机输出,从机输入
2.MISO:主机输入,从机输出
3.SCLK:时钟信号
4./cs(RST):复位功能
2.DS1302引脚设置
1.特点:
有着两个VCC(内部电源和外部电源),SLCK,IO,RST模拟了SPI总线
x1,x2连接的是两个32.768KHZ晶振
3.DS1302片内RAM介绍(重点)
1.在DS1302中有着一个控制寄存器,12个日历,时钟寄存器和31个可读写RAM
注:D7位固定为1,D6位选择RAM/CK(选择是片内RAM还是日历,时钟寄存器),D5到D1为用于读写的时间寄存器或者片内RAM.
对于时钟寄存器的具体介绍图解:
注:时钟均由BCD码进行写入,从低位写入高位
4.片内RAM
1.操作方式:单字节方式和多字节方式
2.奇数为读操作,偶数为写操作
5.相关代码详解(写入是以两位为一个单元,控制命令和数据,读取以一位为一个单元,数据)
0.时序图分析
1.写操作
void Ds1302Write(uchar addr, uchar dat)//写入控制位和数据位
{
uchar n;
RST = 0;
_nop_();//延时一个机器周期
SCLK = 0;//先将SCLK置低电平。//低电平进行写入
_nop_();
RST = 1; //然后将RST(CE)置高电平。
_nop_();
for (n=0; n<8; n++)//开始传送八位地址命令
{
DSIO=addr&0x01;
addr>>=1;//数据右移
SCLK=1;//数据上升沿 开始读取数据
_nop_();
SCLK=0;//数据在下降沿 开始写入数据
_nop_();
}
for (n=0; n<8; n++)//写入8位数据
{
DSIO = dat & 0x01;//从最低位开始传送
dat >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
_nop_();
}
RST = 0;//传送数据结束
_nop_();
}
2.读操作
uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1;//然后将RST(CE)置高电平。
_nop_();
for(n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
dat1 = DSIO;//从最低位开始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
RST = 0;
_nop_(); //以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
3.初始化
void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能
for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
}
Ds1302Write(0x8E,0x80); //打开写保护功能
}
4.读取时钟信息
void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
{
TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
}
}