当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 将实时时钟(RTC)DS3231与8051微控制器配合使用

将实时时钟(RTC)DS3231与8051微控制器配合使用 时间:2021-03-19      来源:原创

您可能会看到使用1.5V电池运行的挂钟或使用锂或氧化银运行的数字手表。但是,有趣的是,如果您想在实时应用程序中对时钟进行滴答,唯一的解决方案是使用RTC(实时时钟)获取日期和时间。

在上一教程中,我解释了如何将RTC DS3231与微控制器一起使用以及如何在LCD上显示日期和时间。

在本文中,我将展示如何使用8051串行通信在PC上显示日期和时间

DS3231的RTC原理图

使用串行通信将RTC DS3231与8051微控制器接口

DS3231的RTC代码

该嵌入式C程序评估带8051微控制器的DS3231 RTC的工作状况,并在PC上显示时间和日期。

#include&lt; reg51.h&gt; <font> </ font>
#include“ header.h” <font> </ font>
无符号char stringvalue [ 20 ] ; //要在PC上显示的字符串<font> </ font>
void main ()<字体> < / font >
{<字体> < / font >
<字体> < / font >
Baudrate_9600 ; // 9600波特率(8个数据位,1个起始位和1个停止位)// <font> </ font>
msdelay 2000 ; <字体> < / font >
PC_Write “ DS3231 RTC与8051 \ r \ n”接口<字体> < / font >
PC_Write “ Codrey.com撰写” <字体> < / font >
PC_Write “ \ r \ n” ; <字体> < / font >
msdelay 2000 ; <字体> < / font >
PC_Write “ \ r \ n” ; <字体> < / font >
PC_Write “正在初始化DS3231 RTC” ; <字体> < / font >
PC_Write “ \ r \ n \ r \ n” ; <字体> < / font >
Initialize_RTC ; //初始化RTC DS3231 <font> </ font>
时刻设定10 20 25 0 0 ; //设置小时,分钟,第二个<font> </ font>
的setDate 2 23 05 18 ; //设置Day,Date,Month,Year <font> </ font>
1 <字体> < / font >
{<字体> < / font >
ReadTime ; //从DS3231获取时间<font> </ font>
ReadDate (); //获取日,月和年<font> </ font>
} <字体> < / font >
}

以下代码段显示了用于RTC寄存器的宏。这些地址对应于DS3231的从站地址,格式为秒,分钟,小时,秒,日期,月和年,小时。

#include&lt; reg51.h&gt; <font> </ font>
#define RTC_Address 0x68 // ds3231的从站地址<font> </ font>
<字体> < / font >
#define DS3231_Read(RTC_Address&lt;&lt; 1)| 0x01)//读取RTC的地址<font> </ font>
#define DS3231_Write((RTC_Address&lt;&lt; 1)&amp; 0xFE)//为RTC写地址<font> </ font>
<字体> < / font >
#定义日期0x04 <font> </ font>
#define month 0x05 <font> </ font>
#define year 0x06 <font> </ font>
#定义第二个0x00 <font> </ font>
#定义分钟0x01 <font> </ font>
#define hour 0x02 <font> </ font>
#define control_Register 0x0E <font> </ font>
#define day 0x03 <font> </ font>
#define Status_Register 0x0F <font> </ font>
#define _24_hour_format 0 <font> </ font>
#define _12_hour_format 1 <font> </ font>
#define am 0 <font> </ font>
#define pm 1

以下代码显示了用于与8051进行i2c通信的宏。

#include&lt; reg51.h&gt; <font> </ font>
#define SDA_OUT P1 = 0x00 //将端口1配置为输出<font> </ font>
#define SDA_IN P1 = 0XFF //将端口1配置为输入<font> </ font>
比特SCL = P1 ^ 4 ; //将SCL连接到8051的端口1.4 <font> </ font>
比特SDA = P1 ^ 5 ; // SDA连接到8051的端口1.5 <font> </ font>
#define SCL_ENABLE SCL = 1 //使SCL为HIGH <font> </ font>
#define SCL_DISABLE SCL = 0 //将SCL设为<font> </ font>
#define SDA_ENABLE SDA = 1 //使SDA为HIGH <font> </ font>
#define SDA_DISABLE SDA = 0 //将SDA设为低

以下代码说明了与8051和RTC串行通信

#include&lt; reg51.h&gt; <font> </ font>
void PC_Write unsigned char * str ; <字体> < / font >
void PC_Write_SendByte unsigned char d ; <字体> < / font >
无效msdelay int ; <字体> < / font >
<字体> < / font >
/ *向PC终端发送字符串的功能* / <字体> < / font >
void PC_Write const unsigned char * str <字体> < / font >
{ <字体> < / font >
1 )<字体> < / font >
{ <字体> < / font >
如果* str == '\ 0' 中断; <字体> < / font >
PC_Write_SendByte * str ++ ; <字体> < / font >
msdelay 10 ; <字体> < / font >
} <字体> < / font >
} <字体> < / font >
/ * A向PC发送单个字节的功能* / < font > < / font >
<字体> < / font >
void PC_Write_SendByte unsigned char d )<字体> < / font >
{ <字体> < / font >
SBUF = d; //将单字节放入SBUF(串行缓冲区存储器)中<font> </ font>
TI == 0 ; //等待直到字节从串行缓冲区传输到PC <font> </ font>
TI = 0 ; //清除TI标志以将下一个字节发送到SBUF <font> </ font>
} <字体> < / font >
/ *此函数将RTC的整数值转换为ascii值* / < font > < / font >
/ *此函数的目的是将RTC的整数值转换为字符串* / < font > < / font >
<字体> < / font >
/ *注意:LCD仅显示字符串* / <字体> < / font >
<字体> < / font >
void Convert_Int_To_String unsigned int intvalue,unsigned char * inttoascii )<字体> < / font >
{<字体> < / font >
无符号char i = 0 ,k = 0 ,finalstring [ 10 ] <字体> < / font >
无符号字符g1 = 0 ,g2 = 0 ; <字体> < / font >
<字体> < / font >
{<字体> < / font >
finalstring [ i ] = intvalue%10 + 0x30 ; / *将整数转换为ascii格式* / <字体> < / font >
整数值=整数值/ 10 ; / *除以整数值* / < font > < / font >
i ++; / *增加计数* / <字体> < / font >
} while intvalue!= 0 ; / *循环直到所有整数都转换为ascii * / < font > < / font >
<字体> < / font >
<字体> < / font >
G1 =异1 ; G1&GT; = 0 ; g1-- / *反向为原始ASCII格式阵列* / <字体> < / FONT >
{ <字体> < / font >
inttoascii [ g2 ] = finalstring [ g1 ] ; <字体> < / font >
g2 ++; <字体> < / font >
如果g1 == 0 )<字体> < / font >
休息; <字体> < / font >
} <字体> < / font >
inttoascii [ g2 ] = '\ 0' ; / *将Null用作最后一个字符* / <字体> < / font >
} <字体> < / font >
<字体> < / font >
/ *此函数产生每秒9600位的波特率* / < font > < / font >
<字体> < / font >
/ *在PC超级终端上显示串行字符* / <字体> < / font >
<字体> < / font >
void Baudrate_9600 void )<字体> < / font >
{<字体> < / font >
/ * -------------------------------------- <font> </ font>
在<font> </ font>上设置9600波特的串行端口
11.0592 MHz。<font> </ font>
------------------- ------------------- * / <字体> < / font >
SCON = 0x50 ; / *设置串行控制寄存器* / <字体> < / font >
TMOD | = 0x20 ; / *在定时器模式下配置定时器寄存器* / < font > < / font >
TH1 = 0xFD ; / *定时器1的高字节* / <字体> < / font >
TR1 = 1 / *这将在运行模式下启动计时器1 * / < font > < / font >
P3 = 0X03 ; / *设置TXD引脚* / <字体> < / font >
}

头文件已创建,用于访问全局变量。

#include&lt; reg51.h&gt; <font> </ font>
extern void msdelay int milli_sec ; <字体> < / font >
extern无效Baudrate_9600 void ; <字体> < / font >
extern void Convert_Int_To_String unsigned int intvalue,unsigned char * inttoascii ; <字体> < / font >
extern void PC_Write unsigned char * str ; <字体> < / font >
extern void PC_Write_SendByte unsigned char d ; <字体> < / font >
extern无符号字符Convert_BCD_DECIMAL unsigned char val ; <字体> < / font >
extern无符号字符Convert_DECIMAL_BCD unsigned char val ; <字体> < / font >
外部无符号字符字符串值[ 20 ] ; <字体> < / font >
外部未签名字符RTCsec,RTChour,RTCmonth,RTCyear,RTCday,RTCdate,RTCmin; <字体> < / font >
extern无效msdelay int milli_sec ; <字体> < / font >
/ *使用for循环延迟生成毫秒* /

延迟功能已用于设置一些延迟,以便逐字节发送到PC。

void msdelay int milli_sec )<字体> < / font >
{<字体> < / font >
无符号char j; <字体> < / font >
for ; milli_sec&gt; 0 ; milli_sec-- )<字体> < / font >
{<字体> < / font >
对于j = 255 ; j&gt; 0 ; j-- ; <字体> < / font >
对于j = 232 ; j&gt; 0 ; j-- ; <字体> < / font >
} <字体> < / font >
}

变形模拟

将实时时钟(RTC)DS3231与8051微控制器配合使用-Proteus原理图

结论

我希望您了解如何使用实时时钟(RTC)在串行终端上显示日期和时间。

有多种方法可以监视数据。它可能是LCD,PC或串行调试器。

此DS3231 RTC代码已在8051微控制器上进行了测试。日期和时间将以9600波特率显示在串行终端上。该软件可以是油灰,实时,码头灯和超级终端等。

上一篇:什么是嵌入式系统及其工作

下一篇:RTC DS3231与8051微控制器的接口

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部