18.时钟芯片DS1302

三线通信

(不称为一种通信协议,只是因为此芯片由三根线接在板子上)
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);			//使处于不可操作状态
}

猜你喜欢

转载自blog.csdn.net/qq_44628230/article/details/104445120