RTC (DS1307)与单片机的接口及其编程

RTC是一种电子设备,在计算机中起着至关重要的作用实时嵌入式系统设计.它提供了精确的时间和日期在各种应用程序,如系统时钟,学生考勤系统和闹钟等,保持当前时间的跟踪,并提供一致的结果,各自的任务。本文介绍了RTC与8051单片机的接口和内部寄存器的基本访问。

RTC接口与8051单片机
RTC接口与8051单片机

RTC编程和接口

RTC与8051微控制器的接口类似于所有其他类型的“实时时钟”接口。让我们来看看简单的RTC接口8051单片机以及其中涉及的编程程序。


步骤1:选择RTC设备

实时嵌入式世界中有各种各样的RTC芯片,它们根据不同的标准进行分类,如封装类型、电源电压和引脚配置等。几种类型的RTC设备是;

  • 双线串行接口(I2C总线)
  • 三线串行接口(USB BUS)
  • 四线串行接口(SPI总线)

首先,我们需要根据需求分类选择RTC设备类型,如I2C总线RTC或SPI总线RTC或其他,适合与各自的微控制器接口。然后,我们可以根据应用的要求,如电池寿命,合适的封装和时钟频率,选择RTC器件的特性。让我们考虑两线接口RTC采用8051单片机DS1307等

Step2: RTC设备的内部寄存器和地址

RTC代表实时时钟,根据晶体频率提供年、月、周、日、小时、分和秒。RTC由内置用于数据存储的RAM存储器.将电池连接到RTC设备,在主电源故障时提供备用电池。

RTC DB1307配置:

RTC内部块和引脚图
RTC内部块和引脚图

A0, a1, a2:为RTC DB1307芯片的地址引脚,用于与主设备通信。我们可以通过RTC接口控制8个设备8051单片机通过A0, A1, A2位使用I2C协议。

VCC和GND:VCC为电源引脚,GND为接地引脚。该设备在1.8V至5.5V范围内工作。

VBT:VBT是电池电源引脚。电池电源必须保持在2V到3.5V之间。

sci:SCL是一个串行时钟引脚,用于同步串行接口上的数据。

SDL:它是一个串行输入输出引脚。它用于在串行接口上传输和接收数据。

打卡:这是一个可选的方波输出引脚。

OSC0和OSC1:这些是晶体振荡器引脚,用于向RTC设备提供时钟信号。标准石英晶体频率为22.768 khz。

设备寻址:

I2C总线协议允许同时有多个从设备。每个从设备必须包含自己的地址来表示。主设备通过地址与特定的从设备通信。RTC设备地址为“0xA2”,其中“1010”由制造商提供,A0、A1、A2为用户自定义地址,用于通信上的8个RTC设备I2C总线协议

设备地址
设备地址

R/W位用于RTC中进行读写操作。R/W=0表示写操作,R/W=1表示读操作。

RTC读取操作地址= " 0xA3 "

RTC写操作地址= " 0xA2 "

内存寄存器和地址:

RTC寄存器位于00h至0Fh的地址位置,RAM内存寄存器位于08h至3fh的地址位置,如图所示。RTC寄存器用于提供日历功能和每天的驾驶时间,并显示周末。

内存寄存器和地址
内存寄存器和地址

控制/状态寄存器:

DB1307由两个额外的寄存器组成,例如control/status1和control/status2,用于控制实时时钟和中断

控制/ Register1现状:

控制状态Register1
控制状态Register1
  • TEST1=0正常模式

=1 ext时钟测试模式

  • STOP=0 RTC启动

=1 RTC停止

  • TESTC=0 power on reset disabled

= power on reset enabled

控制/ Register2现状:

控制状态Register2
控制状态Register2
  • TI/TP= 0 INT一直处于活动状态

=1 INT激活所需时间

  • AF=0告警不匹配

告警匹配

  • TF=0定时器不溢出

=1定时器溢出

  • ALE=0禁用告警中断

=1开启告警中断

  • TIE=0定时器中断禁用

=1定时器中断启用

Step3: RTC ds1307与8051的接口

RTC可以是接口到微控制器通过使用不同的串行总线协议,如I2C和SPI协议在它们之间提供通信联系。bob的是什么网站如图所示,实时时钟与8051单片机采用I2C总线协议接口。I2C是一种双向串行协议,它由SCL和SDA等两条线组成,用于在连接到总线的设备之间传输数据。8051微控制器没有内置RTC器件,因此我们通过一个外部连接串行通信bob的是什么网站保证组成数据。

RTC接口与8051单片机
RTC接口与8051单片机

I2C器件有漏极输出,因此上拉电阻必须通过电压源连接到I2C母线上。如果电阻没有连接到SCL和SDL线,总线将无法工作。

步骤4:RTC数据帧格式

由于与8051单片机的RTC接口使用I2C总线,因此数据传输以字节或包的形式进行,每个字节后面都有一个确认。

传输数据帧:

在发送模式下,主设备按地址位选择从设备后,解除启动条件。地址位为7位,表示从设备为ds1307地址。串行数据和串行时钟在SCL和SDL线上传输。START和STOP条件被识别为串行传输的开始和结束。接收和发送操作之后是R/W位。

传输数据帧
传输数据帧

开始:首先,由主机发起的数据传输序列生成启动条件。

7位地址:在此之后,主站以两个8位格式发送从站地址,而不是一个16位地址。

控制/状态寄存器地址:控制/状态寄存器地址用于允许控制状态寄存器。

控制/ Register1现状:控制状态register1用于使能RTC设备

控制/ Register2现状:它用于启用和禁用中断。

R / W:如果读写位低,则执行写操作。

应答:如果从设备进行写操作,则接收端向微控制器发送1位ACK。

站:在从设备上完成写操作后,单片机将停止条件发送给从设备。

接收数据帧:

接收数据帧
接收数据帧

开始:首先,由主机发起的数据传输序列生成启动条件。

7位地址:在此之后,主站以两个8位格式发送从站地址,而不是一个16位地址。

控制/状态寄存器地址:控制/状态寄存器地址用于允许控制状态寄存器。

Control/Status Register1:用于使能RTC设备的控制状态Register1

控制/ Register2现状:它用于启用和禁用中断。

R / W:如果读写位高,则执行读操作。

应答:如果从设备进行写操作,则接收端向微控制器发送1位ACK。

站:在从设备上完成写操作后,单片机将停止条件发送给从设备。

步骤5:RTC编程

从主到从的写操作:

  1. 从主服务器向从服务器发出启动条件
  2. 在SDL线上以写模式传输从地址
  3. 发送控制寄存器地址
  4. 发送控件/状态register1值
  5. 发送control/status register2值
  6. 发送类似分、秒、小时的日期
  7. 发送停止位

# include < reg51.h >

sbit sci = P2 ^ 5;
sbit SDA = P2 ^ 6;
空白开始();
Void write (unsigned char);
延迟(unsigned char);

void main ()

开始();
写(0 xa2);/ / / /奴隶地址
写(0 x00);//控制寄存器地址
写(0 x00);//控制寄存器1值//
写(0 x00);//control regiter2 value //
写(0 x28);/ / / /秒的价值
写(0x50);//分钟值
写(0 x02); / / / /小时值

无效的start ()

SDA = 1;//处理数据//
sci = 1;//时钟高//
延迟(100);
SDA = 0;//发送数据//
延迟(100);
sci = 0;//时钟信号低//

无效写入(unsigned char d)

无符号char k, j=0×80;
(k = 0; k < 8; k + +)

SDA =(曹磊);
J = > > 1;
sci = 1;
延迟(4);
sci = 0;

SDA = 1;
sci = 1;
延迟(2);
c = SDA;
延迟(2);
sci = 0;

无效延迟(int p)

unsignedinta, b;
(= 0; < 255; + +);/ / / /延迟函数
(b = 0; b < p, b + +);

从Slave到Master的Read操作:

# include < reg51.h >
sbit sci = P2 ^ 5;
sbit SDA = P2 ^ 6;
空白开始();
Void write(ussigned char);
无效的read ();
无效的ack ();
无效延迟(unsigned char);
void main ()

开始();
write(0xA3);//读模式下的从地址
read ();
ack ();
秒=价值;

无效的start ()

SDA = 1;//处理数据//
sci = 1;//时钟高//
延迟(100);
SDA = 0;//发送数据//
延迟(100);
sci = 0;//时钟信号低//

无效写入(unsigned char d)

无符号char k, j=0×80;
(k = 0; k < 8; k + +)

SDA =(曹磊);
J = > > 1;
sci = 1;
延迟(4);
sci = 0;

SDA = 1;
sci = 1;
延迟(2);
c = SDA;
延迟(2);
sci = 0;

无效延迟(int p)

unsignedinta, b;
(= 0; < 255; + +);/ / / /延迟函数
(b = 0; b < p, b + +);

Void read ()

无符号char j, z=0×00, q=0×80;
SDA = 1;
(j = 0; < 8; j + +)

sci = 1;
延迟(100);
国旗= SDA;
如果(标志= = 1)

z = (z | q);
q = q > > 1;
延迟(100);
sci = 0;

无效的ack ()

SDA = 0;//SDA行变为low//
sci = 1;//时钟从高到低
延迟(100);
sci = 0;

这些是RTC与8051单片机接口的必要步骤。除了这些步骤之外,本文还讨论了用于传输和接收数据的数据帧,以便用户通过适当的编程来理解。有关这个概念的任何进一步帮助,你可以在下面留下评论。

3评论

  1. afnas 说:

    我需要完整的程序接口8051与RTC。你能帮帮我吗

  2. RANJITH P 说:

    你好,先生,我得到警告,如果我把代码放在keil软件。你能帮帮我吗

  3. Sravanthi 说:

    我需要rtc ds1307与8051接口的完整代码,并将其显示在lcd上

添加评论