龙空技术网

学生看过来,教你51单片机和RTC模块构建实时时钟

大方老师进阶上位机 106

前言:

当前各位老铁们对“c语言时钟程序编写”大约比较看重,你们都需要分析一些“c语言时钟程序编写”的相关文章。那么小编也在网络上汇集了一些关于“c语言时钟程序编写””的相关知识,希望小伙伴们能喜欢,各位老铁们一起来学习一下吧!

学生看过来,教你51单片机和RTC模块构建实时时钟

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

在本文中,我们将看到如何将RTC(实时时钟)模块连接到8051微控制器。市场上有不同种类的RTC模块。在本教程中,我们使用DS1307 IC随附的最常见的RTC模块、LCD模块和AT89S52(8051型号)。AT89S52 是 Atmel 制造的一款典型的 8051 微控制器。将RTC模块连接到8051微控制器非常简单。您只需要在 RTC 模块和 8051 之间建立 2 个连接。因此,让我们开始营业吧!

实时时钟模块基本上是一个时间跟踪设备,它给出当前的时间和日期。DS3231 IC附带的RTC模块具有设置报警功能。

关于DS1307 RTC模块的注意事项

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

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

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

希望大家到现在为止都能理解!让我们进入电路图!下面给出的是将RTC模块连接到8051的电路图。

电路图 – RTC 与 8051 接口

电路图 – RTC 8051 接口

如图所示建立连接!现在让我们进入编码部分。

程序/代码说明

下载程序 – 嵌入式 C

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

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

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

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

请浏览我们的教程,了解有关在 4 位模式和 8 位模式下将 LCD 模块连接到 8051 的更多信息

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

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

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

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

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

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

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

说了这么多,大家记得留意下方评论第一条(或者私信我)有干货全套入门课程~

标签: #c语言时钟程序编写