蓝桥杯单片机训练[4]---DS1302时钟芯片


DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。

单片机与DS1302通过SPI协议进行通信,LSB先行,由于举办方会提供SPI驱动,里面读写时序给的很明白,关于SPI协议这里就不具体讲了,我们下面只关注如何使用这个芯片。

RTC寄存器如下:

蓝桥杯单片机训练[4]---DS1302时钟芯片


注意:
(1)DS1302采用的BCD码,写入和读出时需要进行转化!
(2)CH为时钟暂停标志,置0时钟开始计时
(3)WP为写保护位,置0时才可以写入数据


我们需要实现的功能简单来说就两个

   1.初始化时间

   2.读取时间


1.我们想要配置初始时间,首先要将写保护(WP)关掉,即将8Eh地址最高位置零,然后就可以愉快的往时分秒寄存器写相应时间啦,这时要非常注意,上面RTC寄存器数据是以BCD码进行存储的,因此必须将我们的数转为BCD码。

举个栗子,我们平常接触到的十进制数23,等价于20+3,而其BCD码直接就是0x23,就是把十位和各位分别放到高四位和低四位。

初始化代码如下:

void Ds1302_write(u8 h,u8 m,u8 s)
{
	Write_Ds1302_Byte(0x8e,0x00);     //关闭写保护
	Write_Ds1302_Byte(0x84,h/10*16+h%10); //时
	Write_Ds1302_Byte(0x82,m/10*16+m%10); //分
	Write_Ds1302_Byte(0x80,s/10*16+s%10); //秒
	Write_Ds1302_Byte(0x8e,0x80);    //开启写保护
}

以BCD码写入数据大概也就执行上面一次,而我们从寄存器把时间读回来却一直都是BCD码,非常不方便,一次还得整个函数:

u8 bcd_to_dat(u8 n) //传入BCD码返回十进制数
{
	u8 t1,t2;
	t1=n/16,t2=n%16;
	t1=t1*10+t2;
	return t1;
}

好了,在上面进行时间的初始化后,我们就可以愉快的读取时间啦,这里时分秒被保存在全局变量中,方面调用。

void read_Ds1302()
{
	H=bcd_to_dat(Read_Ds1302_Byte (0x85));
	M=bcd_to_dat(Read_Ds1302_Byte (0x83));
	S=bcd_to_dat(Read_Ds1302_Byte (0x81));

}


上面只介绍了实时时钟的一种简单用法,用来读时间足矣





上一篇:串行接口读位数据,保证先移位读入位数据,保证第1次读入第一位数,第8次读入第8位数据,这样第8位数据读完才不会发生再次移位。写函数容易理解不重点分析


下一篇:实时时钟芯片DS1302