1622|0

1668

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

用MSP430连接RTC模块(DS2321)制作数字时钟 [复制链接]

本帖最后由 火辣西米秀 于 2020-9-8 20:11 编辑

使用MSP430连接RTC模块DS3231来制作一款数字时钟,然后在1602液晶显示屏上显示时间和日期。 MSP-EXP430G2是德州仪器提供的开发工具,也称为LaunchPad,用于学习和练习如何使用其微控制器。该电路板属于MSP430产品线,我们可以对所有MSP430系列微控制器进行编程。


所需的材料

●    MSP430开发板

●    DS3231 RTC模块

●    电位器10k

●    LCD模块1602

●    连接导线

●    面包板


什么是RTC?

RTC是一个实时时钟模块。它用于维护大多数电子项目的日期和时间。该模块具有自己的纽扣电池电源,即使主电源被移除或MCU被硬件复位,也可使用该纽扣电池电源维持日期和时间。所以一旦我们在这个模块中设置了日期和时间,它会一直保持下去。RTC的型号很多,如DS1307、DS3231等。


将DS3231 RTC与MSP430进行连接

基于MSP430微控制器的数字时钟的电路图如下。如前所述,DS3231通信方式采用I2C,它包含一个串行时钟(SCL)和一个串行数据(SDA)引脚,该引脚必须连接到我们的MSP430的引脚9上的I2C引脚(引脚 2.1 、SCL)和引脚10(引脚2.2、SDA)。


MSP430能够提供3.3V的Vcc,但我们需要5V来连接LCD和RTC模块。所以,我们将在USB电缆连接器有一个跳线,名为TP1。你可以从那里得到5V。


使用MSP430连接RTC模块的电路图如下:


为RTC模块编程MSP430

在这里我们使用Energia IDE进行编程。它与Arduino IDE相同并易于使用。如果您对MSP430和energia IDE不熟悉,那么请参考链接:使用Energia IDE开发MSP430G2微控制器入门指南 - 闪烁LED。为了连接RTC模块,我们需要这个电路板的库。从此链接下载RTC库,然后进行安装。

我们还需要Wire(用于I2C通信)和liquidcrystal库,它们都预装在Energia IDE中。


本文最后给出了此MSP430数字时钟的完整代码。代码简单易懂。这里我们简单介绍它的几个部分。


首先,我们必须包括必要的库。

下面的库用于RTC模块和MSP430之间的I2C通信。这个库中已经定义了SDA和SCK引脚,所以我们不必单独声明这些引脚。

#include <Wire.h>
复制代码
然后,我们包含了RTClib.h库用于RTC时钟以及LiquidCrystal.h用于LCD功能。

#include "RTClib.h"
#include <LiquidCrystal.h>   
复制代码
之后,我们必须创建一个实例来初始化我们的RTC模块。

RTC_DS3231 rtc;
复制代码
然后制作一个大小为7的数组,并存储所有7天的名称。

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
复制代码
这里是LCD显示器使用的MSP430的引脚声明:(RS(P2.0),EN(P1.4),D4(P1.5),D5(P2.3),D6(P2.4),D7 (P2.5))

LiquidCrystal lcd(8 ,6, 7,11,12,13);   
复制代码

在void setup()中,我们初始化了LCD屏幕和RTC的接口,并指定了显示器的尺寸(宽度和高度),begin()需要在任何其他库命令之前调用。

void setup () {
lcd.begin(16, 2);
   lcd.setCursor(3,0);
  lcd.print("RTC Clock");
  delay(3000);
  lcd.clear();
  rtc.begin();
  //  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
复制代码

注意:在上述函数中,注释的行代码很重要。如果未设置时间和日期,请取消注释该行并上载该程序。此功能在编译时存储计算机的时间,因此请确保您的计算机的时间是正确的。


现在,显示屏上显示的时间是正确的,但出现问题,每次重新启动/复位微控制器时,LCD都会显示您上传代码的时间。这是因为rtc.adjust()函数已经存储了计算机的时间,所以当您重置时,它会从那个时间开始。


 

要解决这个问题,首先用rtc.adjust()函数上传程序,然后取消注释。然后立即评论同一行并再次上传程序。现在,您的日期和时间已经设置完毕,不会因复位微控制器而受到影响。


在循环函数中,我们从RTC模块获取日期和时间,并将其存储在预定义的now变量中,并使用lcd.print()函数将其显示在LCD上。

void loop () {
    DateTime now = rtc.now();
    lcd.clear();
     lcd.setCursor(3,0);
   lcd.print(now.day(), DEC);
    lcd.print("/");….
…….
复制代码

将代码下载到Arduino开发板中,运行效果如下:


代码

本篇文章使用的完整代码如下所示:

#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
LiquidCrystal lcd(8 ,6, 7,11,12,13);
void setup () {
lcd.begin(16, 2);
  lcd.setCursor(3,0);
  lcd.print("RTC Clock");
  delay(3000);
  lcd.clear();
  rtc.begin();
  //  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

void loop () {
    DateTime now = rtc.now();
    lcd.clear();
    lcd.setCursor(3,0);
    Serial.print(now.year(), DEC);
    Serial.print('/');
    lcd.print(now.day(), DEC);
    lcd.print("/");
    lcd.print(now.month(), DEC);
    lcd.print("/");
    lcd.print(now.year(), DEC);
    lcd.setCursor(1,5);
    lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
    lcd.print(",");
    lcd.print(now.hour(), DEC);
    lcd.print(":");
    lcd.print(now.minute(), DEC);
    lcd.print(":");
    lcd.print(now.second(), DEC);
    delay(1000);
}
复制代码
 

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表