Xadow - RTC(实时时钟)

有时候,你总是想知道现在几点了。我是否错过了约会,或者是否到了给我三个月大的孩子喂饭的时间。RTC模块可以为你提供一个实时时钟。你可以让控制器询问模块:“嗨,伙计,现在几点了?”同时,别忘了安装一个小型纽扣电池,它可以为你服务超过六个月。
规格
- 实时时钟(RTC)计数秒、分钟、小时、年份日期、月份、星期几以及带有闰年补偿的年份
- 可设置为12小时格式或24小时格式
- 有效期至2100年
- 尺寸:25.43mm x 20.35mm
caution
为了获得稳定的性能,你必须在电池座中放置一个3伏的CR1220锂电池。如果仅使用主电源,模块可能无法正常工作,因为晶体可能无法振荡。
演示
以下示例展示了一个简单的应用程序,用于设置时间并读取时间。
硬件安装:

注意:当将Xadow RTC连接到Xadow主板时,你需要注意连接方向。连接方法是一个Xadow模块的未填角需要连接到另一个模块的直角(参见每个Xadow模块的四个角)。
示例代码如下所示:
#include <Wire.h>
#define DS1337_CTRL_ID 0x68
unsigned char  second,minute,hour;
unsigned char  week,day,month;
unsigned int year;
void setup()
{
    Wire.begin();
    Serial.begin(38400);
    while (!Serial) {
        ; // 等待串口连接,仅适用于Leonardo
    }
    fillByYMD(2013,6,17);//2013年6月17日
    fillByHMS(23,15,43);//23:15 43"
    fillWeek(1);//星期一
    setTime();
}
void loop()
{
    readTime();
    Serial.print(year+2000, DEC);
    Serial.print("/");
    Serial.print(month, DEC);
    Serial.print("/");
    Serial.print(day, DEC);
    Serial.print("  ");
    Serial.print(hour, DEC);
    Serial.print(":");
    Serial.print(minute, DEC);
    Serial.print(":");
    Serial.print(second, DEC);
    Serial.print("    ");
    switch (week)// 友好的星期打印输出
    {
        case 1:
        Serial.print("MON");
        break;
        case 2:
        Serial.print("TUE");
        break;
        case 3:
        Serial.print("WED");
        break;
        case 4:
        Serial.print("THU");
        break;
        case 5:
        Serial.print("FRI");
        break;
        case 6:
        Serial.print("SAT");
        break;
        case 7:
        Serial.print("SUN");
        break;
    }
    Serial.println("  ");
    delay(1000);
}
/*函数:从RTC读取时间和日期*/
void readTime(void)
{
    // 使用Wire库连接到RTC
    // 将寄存器指针重置为零
    Wire.beginTransmission(DS1337_CTRL_ID);
    Wire.write(0x00);
    Wire.endTransmission();
    // 请求7字节数据(秒、分钟、小时、星期、日期、月份、年份)
    Wire.requestFrom(DS1337_CTRL_ID, 7);
    // 其中一些需要掩码,因为某些位是控制位
    second       = bcdToDec(Wire.read() & 0x7f);
    minute       = bcdToDec(Wire.read());
    hour       = bcdToDec(Wire.read() & 0x3f);// 如果是12小时制需要更改
    week  = bcdToDec(Wire.read());
    day = bcdToDec(Wire.read());
    month      = bcdToDec(Wire.read());
    year       = bcdToDec(Wire.read());
}
/*函数:将包括日期的时间写入RTC芯片*/
void  setTime(void)
{
    Wire.beginTransmission(DS1337_CTRL_ID);
    Wire.write(0x00);
    Wire.write(decToBcd(second));// 位7开始时钟
    Wire.write(decToBcd(minute));
    Wire.write(decToBcd(hour));  // 如果需要12小时制需要设置位6
    Wire.write(decToBcd(week));
    Wire.write(decToBcd(day));
    Wire.write(decToBcd(month));
    Wire.write(decToBcd(year));
    Wire.endTransmission();
}
unsigned char decToBcd(unsigned char val)
{
    return ( (val/10*16) + (val%10) );
}
//将二进制编码的十进制转换为普通十进制数字
unsigned char  bcdToDec(unsigned char val)
{
    return ( (val/16*10) + (val%16) );
}
void fillByYMD(unsigned int _year, unsigned char _month, unsigned char _day)
{
    year = _year-2000;
    month = _month;
    day = _day;
}
void fillWeek(unsigned char _dow)
{
    week = _dow;
}
void  fillByHMS(unsigned char _hour, unsigned char _minute, unsigned char _second)
{
    // 分配变量
    hour = _hour;
    minute = _minute;
    second = _second;
}
- 设置时间。将函数参数更改为当前日期/时间。需要注意参数格式。
fillByYMD(2013,6,17);//2013年6月17日
fillByHMS(23,15,43);//23:15 43"
fillWeek(1);//星期一
- 输出结果:

输出时间像时钟一样变化。一旦设置了时间,RTC将不断更新时钟时间数据。然后你需要注释掉如下代码并重新上传。一个实时时钟就出现了。
//setTime();
原理图在线查看器
资源
技术支持与产品讨论
感谢您选择我们的产品!我们致力于为您提供多种支持,以确保您使用我们的产品时拥有流畅的体验。我们提供多个沟通渠道,以满足不同的偏好和需求。
