Arduino与Proteus仿真实例-PCF8523实时时钟驱动仿真

PCF8523实时时钟驱动仿真

PCF8523 是一款针对低功耗优化的 CMOS1 实时时钟 (RTC) 和日历。 数据通过 I2C 总线串行传输,最大数据速率为 1000 kbit/s。 可以使用闹钟和定时器功能,并可以在中断引脚上生成唤醒信号。 偏移寄存器允许对时钟进行微调。 PCF8523具有后备电池切换电路,可检测电源故障并在发生电源故障时自动切换到电池供电。

PCF8523有以下特点:

  • 基于 32.768 kHz 石英晶体提供年、月、日、工作日、小时、分钟和秒分辨率:秒到年时钟工作电压:1.0 V 至 5.5 V
  • 低备用电流:在 VDD = 3.0 V 和 Tamb = 25 C 时典型值为 150 nA
  • 2 线双向 1 MHz 快速模式 Plus (Fm+) I2C 接口,读取 D1h,写入 D0h2
  • 备用电池输入引脚和切换电路
  • 具有中断功能的可自由编程的定时器和闹钟
  • CL = 7 pF 或 CL = 12.5 pF 的可选集成振荡器负载电容器
  • 振荡器停止检测功能
  • 内部上电复位 (POR)
  • 开漏中断或时钟输出引脚
  • 用于频率调整的可编程偏移寄存器

在这里插入图片描述

PCF8523的引脚功能如下:

在这里插入图片描述

2、仿真代码实现

本次实例使用的开源库如下:

演示代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Date and time functions using a PCF8523 RTC connected via I2C and Wire lib
#include "RTClib.h"

RTC_PCF8523 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {
Serial.begin(9600);

if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}

if (! rtc.initialized() || rtc.lostPower()) {
Serial.println("RTC is NOT initialized, let's set the time!");
// When time needs to be set on a new device, or after a power loss, the
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(\_\_DATE\_\_), F(\_\_TIME\_\_)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
//
// Note: allow 2 seconds after inserting battery or applying external power
// without battery before calling adjust(). This gives the PCF8523's
// crystal oscillator time to stabilize. If you call adjust() very quickly
// after the RTC is powered, lostPower() may still return true.
}

// When time needs to be re-set on a previously configured device, the
// following line sets the RTC to the date & time this sketch was compiled
// rtc.adjust(DateTime(F(\_\_DATE\_\_), F(\_\_TIME\_\_)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

// When the RTC was stopped and stays connected to the battery, it has
// to be restarted by clearing the STOP bit. Let's do this to ensure
// the RTC is running.
rtc.start();

// The PCF8523 can be calibrated for:
// - Aging adjustment
// - Temperature compensation
// - Accuracy tuning
// The offset mode to use, once every two hours or once every minute.
// The offset Offset value from -64 to +63. See the Application Note for calculation of offset values.
// https://www.nxp.com/docs/en/application-note/AN11247.pdf
// The deviation in parts per million can be calculated over a period of observation. Both the drift (which can be negative)
// and the observation period must be in seconds. For accuracy the variation should be observed over about 1 week.
// Note: any previous calibration should cancelled prior to any new observation period.
// Example - RTC gaining 43 seconds in 1 week
float drift = 43; // seconds plus or minus over oservation period - set to 0 to cancel previous calibration.
float period_sec = (7 \* 86400); // total obsevation period in seconds (86400 = seconds in 1 day: 7 days = (7 \* 86400) seconds )
float deviation_ppm = (drift / period_sec \* 1000000); // deviation in parts per million (μs)
float drift_unit = 4.34; // use with offset mode PCF8523\_TwoHours
// float drift\_unit = 4.069; //For corrections every min the drift\_unit is 4.069 ppm (use with offset mode PCF8523\_OneMinute)
int offset = round(deviation_ppm / drift_unit);
// rtc.calibrate(PCF8523\_TwoHours, offset); // Un-comment to perform calibration once drift (seconds) and observation period (seconds) are correct
// rtc.calibrate(PCF8523\_TwoHours, 0); // Un-comment to cancel previous calibration

Serial.print("Offset is "); Serial.println(offset); // Print to control offset

}

void loop () {
DateTime now = rtc.now();

Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();

delay(1000);
}

4、仿真结果

在这里插入图片描述

文章来源: https://iotsmart.blog.csdn.net/article/details/121281334