当前位置:网站首页 > 技术博客 > 正文

基于ds1302与数码管的可调时钟



        RTC(Real_Time Clock)即实时时钟,它是电子产品中不可或缺的东西。其最直接的作用就是时钟功能。细心的朋友可以发现,当我们的电脑或者手机没联网时,仍然可以正常显示日期与时钟,这就是RTC的功劳。

        RTC的运行无需网络连接,只需一个频率固定的振荡源和一个计数器,就能实现精准的计时。假如有一个振荡源,其每秒固定振荡1000次,那我们就可以用计数器对振荡进行计数,每振荡1000次,代表时间过去了1s,然后复位计数器并开始新的计数,同时,秒寄存器加1。如此循环,就能实现时钟的走时。

21ad4e7542c24f098061485fea6c9146.png

        在单片机的某些使用场景下,RTC时钟是不可或缺的,例如使用了文件系统,就必须启用RTC时钟,用于更新文件的时间。

        STM32内置了RTC时钟模块,只要配置好参数,就能启用RTC。RTC的时钟振荡源可以来自内部也可以来自外部。内部时钟源由HCLK经过分频得到,外部时钟源则由石英晶振提供。

973457b0641540aaa604c7e12f8583a6.png

         内部时钟源是由高频晶振分频得到,所以其精度计时不高,为了准确计时,一般采用外部时钟源。外部时钟源一般选用32.768KHz的石英晶振。这种参数的石英晶振一秒钟能振荡32768次,正好对应2^16。

b98f599ebe9bc4ec1b60da566ec7fa39.jpeg

        然而,即使采用了外部晶振的RTC,其精度仍然是有限的。因为晶振外置,线路上的寄生电容电感、温度都会影响晶振频率,短时间可能看不出误差,但是时间一长,其误差就大了。

        如果想进一步减小RTC的误差,则需要使用RTC时钟芯片。时钟芯片的优势在于其内部带有温度补偿功能,能通过检测环境温度来对晶振进行误差补偿,减小计时误差。且时钟芯片的年、月、日等时间数据单独存储在内部的RAM中,对单片机来说,只要通过串口读取特定寄存器地址的数据就能得到时间参数,而无需再去计算。现在流行的时钟芯片很多,如DS1302、 DS1307。但是这些芯片仍需要外置晶振才能工作,所以仍存在误差。

        所以一种在内部集成晶振的时钟芯片应运而生。DS3231就是这样一种时钟芯片。其精度最高可以达到±2ppm。实测6个月在常温下连续运行,误差不超过1分钟。

61f5e66528d448859fee62d6a3aed26b.png

     DS3231采用快速IIC通信进行数据传输,最高时钟频率400KHz。还带有闹钟,复位等功能。224a5ac113814714a5bbfbb80213de94.png

 DS3231有两种封装,引脚功能一样,16pin的封装只是多了八个空引脚。

如下是其应用电路。9fb591b6e7464754a250edaffc08b806.png

        可以看到该芯片有两个电源输入,一个是VCC,另一个是Vbat。VCC我们可以与单片机共用3.3V电源,Vbat则接到一颗纽扣电池的正极。当单片机供电断开后,DS3231仍能靠纽扣电池供电维持计时功能,但是无法进行IIC通信,也就是不能读取时间数据,恢复VCC供电后,IIC通信随之被唤醒。

        INT是个漏极开路的输出,如果想输出高电平则需要外接上拉电阻,该引脚可连接到单片机IO口作为单片机的外部中断源。

        32kHz是一个固定输出32KHz频率方波的IO口,也可做为单片机的计时源。同为开漏输出。

        RST是芯片的复位脚,如果没有特别需要,可以直接悬空。该芯片无需复位也能直接初始化。

软件部分                                                          

        这里我使用的是STM32F4,F1的芯片也是兼容的,只是需要把头文件改成F1的。IIC通信采用软件模拟。iic的软件模拟可参考文章(),这里我就不详细讲IIC软件模拟的原理了。接下来我们看程序。

1,我使用的是PB8和PB9分别做为IIC的SCL与SDA。如果想使用其他IO,稍微修改下就行。

 

 延时函数,IIC软件模拟需要用到延时函数,这里我采用的是滴答定时器进行延时,需要注意,F1 与F4的延时函数不能共用,因为主频不一样。

 

嘀嗒定时器初始化:在启用延时函数前必须对定时器进行初始化,配置对应的参数。这里我用主频HCLK的八分频做为其定时频率,即21MHz。也就是一秒钟对应定时器的。

 

main函数:初始化延时函数,初始化DS3231 ,讲时间写入DS3231,讲时间读取出来

 

可以通过串口打印,或者其他方式显示出当前时间。

这里我将时间显示到LCD屏幕上。

如果觉得本文有用,就点个赞吧~

版权声明


相关文章:

  • 线程同步的方法 java2025-03-09 20:30:04
  • 抽象类在java中表示一种继承关系?2025-03-09 20:30:04
  • 旁路电容和去耦电容作用和区别2025-03-09 20:30:04
  • js实现数据类型判断2025-03-09 20:30:04
  • mysql触发器 sql2025-03-09 20:30:04
  • python中pop函数的作用2025-03-09 20:30:04
  • jmap和jstack区别2025-03-09 20:30:04
  • 同义句转换器手机版2025-03-09 20:30:04
  • java axis webservice2025-03-09 20:30:04
  • oracle视图怎么用2025-03-09 20:30:04