天南地北客
发表于: 2018-6-27 16:55:01 | 显示全部楼层

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


所需的材料

●    MSP430开发板

●    DS3231 RTC模块

●    电位器10k

●    LCD模块1602

●    连接导线

●    面包板


什么是RTC?

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

DS3231-RTC-Module.jpg


将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模块的电路图如下:

Circuit-diagram-for-Interfacing-RTC-module-DS3231-with-MSP430-Digital-Clock.png


为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引脚,所以我们不必单独声明这些引脚。

  1. #include <Wire.h>
复制代码

然后,我们包含了RTClib.h库用于RTC时钟以及LiquidCrystal.h用于LCD功能。

  1. #include "RTClib.h"
  2. #include <LiquidCrystal.h>   
复制代码

之后,我们必须创建一个实例来初始化我们的RTC模块。

  1. RTC_DS3231 rtc;
复制代码

然后制作一个大小为7的数组,并存储所有7天的名称。

  1. 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))

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

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

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

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


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


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


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

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

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

Interfacing-RTC-module-DS3231-with-MSP430-Digital-Clock.jpg


代码

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

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

  16. void loop () {
  17.     DateTime now = rtc.now();
  18.     lcd.clear();
  19.     lcd.setCursor(3,0);
  20.     Serial.print(now.year(), DEC);
  21.     Serial.print('/');
  22.     lcd.print(now.day(), DEC);
  23.     lcd.print("/");
  24.     lcd.print(now.month(), DEC);
  25.     lcd.print("/");
  26.     lcd.print(now.year(), DEC);
  27.     lcd.setCursor(1,5);
  28.     lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  29.     lcd.print(",");
  30.     lcd.print(now.hour(), DEC);
  31.     lcd.print(":");
  32.     lcd.print(now.minute(), DEC);
  33.     lcd.print(":");
  34.     lcd.print(now.second(), DEC);
  35.     delay(1000);
  36. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 26 | 回复: 45



手机版|

GMT+8, 2024-12-4 01:11 , Processed in 0.036146 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表