DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
单片机与DS1302通过SPI协议进行通信,LSB先行,由于举办方会提供SPI驱动,里面读写时序给的很明白,关于SPI协议这里就不具体讲了,我们下面只关注如何使用这个芯片。
RTC寄存器如下:
注意:
(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)); }
上面只介绍了实时时钟的一种简单用法,用来读时间足矣