三线通信
(不称为一种通信协议,只是因为此芯片由三根线接在板子上)
DS1302可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V,采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31*8的用于临时存放数据的RAM寄存器。
原理图如下:
RTC寄存器地址(控制指令字):
位7:必须为逻辑1,为0则不能把数据写入DS1302;
位6:为0存取日历时钟数据,为1存取RAM数据;
位5~1:指示操作单元地址;
位0:为0进行写操作,为1进行读操作。
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。(即先写入地址,然后下一个SCLK时钟上升沿写入数据或者下一个SCLK下降沿读出数据,均为从最低位到最高位)
相关寄存器地址及定义:
由表格知,BIT7~BIT0位被分为两部分,因此,以秒为例,在写入或读出时,十位和个位要分别读写。
Write_DS1302(0X8E,0X00); //使处于可操作状态
或者
Write_DS1302(0X8E,0X80); //使处于不可操作状态(写操作见后面)
DS1302写操作:
写字节函数:
void Write_Byte(uchar temp)
{
uchar i;
for(i=0;i<8;i++)
{
SCK=0;
SDA=temp&0X01;
temp>>=1;
SCK=1;
}
}
DS1302写函数:
void Write_DS1302(uchar address,uchar dat)
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
Write_Byte(address);
Write_Byte((dat/10)<<4|(dat%10));
}
DS1302读操作:
DS1302读函数:
uchar Read_DS1302(uchar address)
{
uchar i,temp,dat1,dat2;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
Write_Byte(address);
for(i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)temp|=0X80;
SCK=1;
}
SDA=0;
dat1=temp/16;
dat2=temp%16;
temp=dat1*10+dat2;
return temp;
}
利用上面的读写函数,我们可以写出下面的初始化函数,给DS1302一个初始时间值,以及在主函数中调用DS1302数值获取函数,使此刻时间显示在数码管上并不断进行计时。
DS1302初始化:
void DS1302_Init(void)
{
uchar i;
uchar add=0X80;
Write_DS1302(0X8E,0X00); //使处于可操作状态
for(i=0;i<7;i++)
{
Write_DS1302(add,Init_Time[i]);
add=add+2;
}
Write_DS1302(0X8E,0X80); //使处于不可操作状态
}
DS1302数值获取:
void DS1302_Get(void)
{
uchar i;
uchar add=0X81;
Write_DS1302(0X8E,0X00); //使处于可操作状态
for(i=0;i<7;i++)
{
shijian[i]=Read_DS1302(add);
add=add+2;
}
Write_DS1302(0X8E,0X80); //使处于不可操作状态
}