使用MSP430连接RTC模块DS3231来制作一款数字时钟,然后在1602液晶显示屏上显示时间和日期。 MSP-EXP430G2是德州仪器提供的开发工具,也称为LaunchPad,用于学习和练习如何使用其微控制器。该电路板属于MSP430产品线,我们可以对所有MSP430系列微控制器进行编程。
所需的材料
● MSP430开发板
● DS3231 RTC模块
● 电位器10k
● LCD模块1602
● 连接导线
● 面包板
什么是RTC?
RTC是一个实时时钟模块。它用于维护大多数电子项目的日期和时间。该模块具有自己的纽扣电池电源,即使主电源被移除或MCU被硬件复位,也可使用该纽扣电池电源维持日期和时间。所以一旦我们在这个模块中设置了日期和时间,它会一直保持下去。RTC的型号很多,如DS1307、DS3231等。
基于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模块的电路图如下:
在这里我们使用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);
}
复制代码