学习使用 8051 和 DS1307 RTC 模块构建实时时钟

将 RTC 模块 (DS1307) 与 8051 微控制器连接

我们了解如何将 RTC(实时时钟)模块连接到 8051 微控制器。市场上有不同种类的 RTC 模块。我们使用 DS1307 IC、LCD 模块和 AT89S52附的最常见的 RTC 模块。AT89S52 是 Atmel 制造的典8051 微控制器。将 RTC 模块连接到 8051 微控制器非常简单。只需要在 RTC 模块和 8051 之间建立 2 个连接。

学习使用 8051 和 DS1307 RTC 模块构建实时时钟_第1张图片

 

实时时钟模块基本上是一个时间跟踪设备,它提供当前时间和日期。DS3231 IC 附带的 RTC 模块可以设置警报。

DS1307 RTC 模块注意事项

里我们使用 I2C 协议(双线协议)带有时钟芯片 DS1307 的 RTC 模块。该模块提供诸如秒、分钟、小时、星期几、月份日期、月份和年份等详细信息,包括闰年校正。它可以以 12 小时或 24 小时格式运行。该模块的电流消耗为纳安级。即使是 3V 电池也可以为其供电 10 年,保持时钟准确,无需任何外部电源。

DS1307 有一个 64 字节的存储区,前 8 个字节保留为 RTC 寄存器区,其余 56 个字节分配为通用 RAM。有关当前、日期和时间的详细信息以二进制编码十进制 (BCD) 的形式存储在其寄存器区域中。该模块使用称为 I2C 的串行通信协议与微控制器通信。I2C 总线物理上由 2 条有源线组成。称为SDA和SCL的电线都是双向的。SDA 是串行数据线,SCL 是串行时钟线。连接到总线的每个设备都有自己唯一的设备地址,无论是 MCU 还是 RTC 模块。这些芯片中的每一个都可以用作接收器或发射器,具体取决于功能。

DS1307 将在通信网络中充当从机,控制器只能通过启动起始条件和设备地址来访问从机。我们需要发送寄存器号才能访问里面的值。8051 的接口是简单的 I2C,SDA 和 SCL 引脚连接到 8051 的任意两个引脚。在软件方面,我们使用名为“I2C”的用户定义库进行 I2C 通信。该库允许与 I2C / TWI 设备进行通信。

让我们来看看电路图所以下面给出了将RTC模块连接到8051的电路图。

电路图 - RTC 与 8051 的接口

学习使用 8051 和 DS1307 RTC 模块构建实时时钟_第2张图片

 

程序/代码说明

使用 8051 的 RTC(实时时钟)程序是用嵌入式 C 编写的(使用 Keil 编译器)。

我们首先在程序中包含“ LCD8bit ”库。它是一个用户定义的库,用于在 8 位模式下将微控制器与 LCD 模块连接。在这个库中,我们包含了一些用于初始化 LCD、发送命令和发送要显示的数据的函数。

连接到 LCD 数据管脚的端口和连接到命令管脚的管脚可以在库本身中配置。在这里,我们为数据引脚定义了 port0,为命令引脚定义了 P3.5、P3.6 和 P3.7。

这里使用的另一个用户定义库是“ delay ”,它由名为“ Delay_ms() ”和“ Delay_us() ”的函数组成。Delay_ms(1000) 将暂停程序 1000 毫秒(即一秒),当我们需要暂停程序几微秒时使用 Delay_us(_) 函数。

在这个项目中,我们主要关注RTC 模块接口。如前所述,此处使用名为“ I2C ”的库进行 I2C 通信。I2CStart  ()  函数将启动通信。  I2CSend()是用于发送数据的函数,I2Cread()是用于读取寄存器的函数。

在主程序中定义了两个名为“ readAllReg() ”和“ readSecReg() ”的函数,用于从 RTC 模块中读取时间详细信息。前者用于读取所有寄存器,后者用于单独读取“第二个”寄存器。

在 DS1307 中,字节存储为二进制编码的十进制。因此,在将值写入寄存器之前,我们需要将其转换为 BCD(Binary Coded Decimals)。同样,从寄存器区域读取值后,应将其转换为十进制。Dec_To_BCD()是用于此的函数。

在从 RTC 模块读取值之前,我们必须立即设置时间和日期。用于此的函数是setTime()函数。我们应该将实际时间细节作为参数传递。实际格式类似于setTime(sec,min,hour,dow,dom,month,year); .

在我们的项目中,我们在 24 小时模式下使用 DS1307,然后我们在软件端将其转换为 12 小时模式。因此,通过setTime()函数传递参数时,时间详细信息应为 24 小时模式。

注意:-一次上传程序后,您应该通过注释setTime()函数重新上传代码。否则,每次重置微控制器时, setTime()函数都会破坏当前时间。

学习使用 8051 和 DS1307 RTC 模块构建实时时钟_第3张图片

 

 名为displayTime()的函数用于在 LCD 中显示时间和日期。在函数内部,它将每隔一秒调用一次“readSecreg()”。并且“readAllReg()”函数将每分钟调用一次。一个名为“ a[7] ”的数组在程序开始时全局声明。“readSecReg()”和“readAllReg()”函数将分别每隔一秒和一分钟定期更新这个数组元素。

免费领,单片机入门到高级进阶学习攻略(附教程+工具)
https://blog.csdn.net/HWdanpianji/article/details/121722883?spm=1001.2014.3001.5502

想要一起学习单片机的朋友,评论”我要入门“,有惊喜,加入我们,就可以与导师一对一互动,快速成长
学习使用 8051 和 DS1307 RTC 模块构建实时时钟_第4张图片

你可能感兴趣的:(华维单片机原创经验大全,单片机,单片机实战,时钟小项目,单片机时钟项目)