如今,数字挂钟正变得越来越流行,并且它比模拟时钟更好,因为它提供了以小时,分钟和秒为单位的准确时间,并且易于读取数值。一些数字时钟还具有许多功能,例如显示温度,湿度,设置多个警报等。大多数数字时钟使用七段显示。
我们以前使用7段显示器或16x2 LCD构建了许多数字时钟电路。在这里,您可以完成基于AVR的数字时钟的完整PCB设计。本教程将通过使用Arduino UNO多路复用4-7段显示并以HH:MM格式显示时间来制作数字时钟。
所需组件
- 4位7段显示
- 74HC595 IC
- DS3231 RTC模块
- Arduino UNO
- 面包板
- 连接线
4位7段显示
4位7段显示器将四个七个段显示器连接在一起,或者可以说是多路复用。它们用于显示数值以及带有小数点和冒号的一些字母。该显示可以双向使用。四位数字对于制作数字时钟或对0到9999之间的数字进行计数非常有用。下面是4位7段显示的内部示意图。
每个段都有一个带独立LED控制的LED。七段式显示器有两种类型,例如“共阳极”和“共阴极”。上图显示了共阳极7段显示。
共同阳极
在“公共阳极”中,所有8个LED的所有正极(阳极)都连接在一起,称为COM。并且所有负极端子都保持不变或连接到微控制器引脚。通过使用微控制器,如果将逻辑低电平设置为点亮特定的LED段,而将逻辑高电平设置为关闭LED。
普通阴极
在共阴极中,所有8个LED的所有负极端子(阴极)都连接在一起,称为COM。并且所有正极端子都保持不变或连接到微控制器引脚。通过使用微控制器,如果将逻辑设置为高电平来点亮LED,而设置为低电平来关闭LED。
在此处了解有关7段显示器的更多信息,并检查如何将其与其他微控制器接口:
- 与Arduino的7段显示器接口
- 与Raspberry Pi的7段显示器接口
- 七段显示器与ARM7-LPC2148的接口
- 与PIC单片机的7段显示器接口
- 与8051单片机的7段显示器接口
74HC595移位寄存器IC
所述IC 74HC595也称为8位串行IN -并行输出移位寄存器。该IC可以接收串行输入的数据,并可以并行控制8个输出引脚。这对于减少微控制器使用的引脚很有用。您可以在这里找到所有与74HC595移位寄存器相关的项目。
74HC595 IC的工作:
该IC使用微控制器的时钟,数据和锁存器等三个引脚来控制IC的8个输出引脚。时钟用于提供来自微控制器的连续脉冲,数据引脚用于发送数据,例如需要在相应的时钟时间打开或关闭输出。
引脚排列:
针号 |
引脚名称 |
描述 |
1,2,3,4,5,6,7 |
输出引脚(Q1至Q7) |
74HC595具有8个输出引脚,其中7个是这些引脚。它们可以串行控制 |
8 |
地面 |
连接到微控制器的接地 |
9 |
(Q7)串行输出 |
该引脚用于级联多个74HC595 |
10 |
(MR)主重置 |
将所有输出复位为低电平。必须保持高位才能正常运行 |
11 |
(SH_CP)时钟 |
这是时钟引脚,必须从MCU / MPU提供时钟信号 |
12 |
(ST_CP)闩锁 |
锁存引脚用于将数据更新到输出引脚。高活跃 |
13 |
(OE)输出使能 |
输出使能用于关闭输出。必须保持低电平才能正常运行 |
14 |
(DS)串行数据 |
这是向其发送数据的引脚,基于该引脚可控制8个输出 |
15 |
(Q0)输出 |
第一个输出引脚。 |
16 |
Vcc |
该引脚为IC供电,通常使用+ 5V。 |
DS3231 RTC模块
DS3231是一个RTC模块。RTC代表实时时钟。该模块用于记住时间和日期,即使电路未通电也是如此。它具有备用电池CR2032,可在没有外部电源的情况下运行模块。该模块还包括一个温度传感器。该模块可用于嵌入式项目,例如制作带有温度指示器的数字时钟等。以下是一些有用的项目:
- 使用Arduino的自动宠物喂食器
- 将RTC模块(DS3231)与PIC微控制器连接:数字时钟
- 将RTC模块(DS3231)与MSP430连接:数字时钟
- 使用DS3231模块的ESP32实时时钟
- 使用AVR微控制器Atmega16和DS3231 RTC的PCB上的数字壁钟
DS3231的引脚排列:
引脚名称 |
采用 |
VCC |
连接电源正极 |
地线 |
接地 |
SDA |
串行数据引脚(I2C) |
SCL |
串行时钟引脚(I2C) |
品质保证 |
方波输出引脚 |
32K |
32K振荡器输出 |
特性和规格:
- RTC计算秒,分钟,小时和年
- 数字温度传感器,精度为±3ºC
- 注册老化装饰
- 400Khz I2C接口
- 低功耗
- CR2032备用电池,使用寿命为两到三年
- 工作电压:2.3至5.5V
电路原理图
DS3231 RTC与Arduino UNO之间的电路连接:
DS3231 |
Arduino UNO |
VCC |
5伏 |
地线 |
地线 |
SDA |
A4 |
SCL |
A4 |
74HC595 IC与Arduino Uno之间的电路连接:
74HC595 IC |
Arduino UNO |
11-SH_CP(SRCLK) |
6 |
12-ST_CP(RCLK) |
5 |
14-DS(数据) |
4 |
13-OE(闩锁) |
地线 |
8-GND |
地线 |
10-MR(SRCLR) |
+5伏 |
16 VCC |
+5伏 |
IC 74HC595和4位七段与Arduino UNO之间的电路连接:
4-DigitSevenSegment |
集成电路74HC595 |
Arduino UNO |
一种 |
Q0 |
-- |
乙 |
Q1 |
-- |
C |
Q2 |
-- |
d |
Q3 |
-- |
Ë |
Q4 |
-- |
F |
Q5 |
-- |
G |
Q6 |
-- |
D1 |
-- |
10 |
D2 |
-- |
11 |
D3 |
-- |
12 |
D4 |
-- |
9 |
编程Arduino UNO以复用七段显示
本教程末尾附有完整的代码和工作视频。在编程部分,将说明如何以24小时格式从RTC模块中提取时间(小时和分钟),然后将其转换为相应的格式,以便在4位7段显示中显示它们。
要将DS3231 RTC模块与Arduino UNO连接,使用了Arduino UNO的I2C总线。一个名为
在此概念中,小时和分钟首先从RTC中获取,然后像0930(09:30 pm)一样组合在一起,然后将各个数字分开,如千,百,十,单位,然后将各个数字转换为二进制格式,如0放入63(0111111)。将该二进制代码发送到移位寄存器,然后从移位寄存器发送到七段,从而在七段显示中成功显示数字0。这样,四个数字被多路复用并显示小时和分钟。
最初,包含必需的库,例如DS3231库和Wire库(I2C库)。
#包括
引脚定义为七段式控制。这些控件将在多路显示中扮演重要角色。
#定义闩锁引脚5 #定义时钟引脚6 #定义数据引脚4#定义 点2
声明变量以存储从RTC提取的转换结果或原始结果。
诠释 //将变量声明为小时 int m; //将变量声明为分钟 int千; 整数百 整数 整数单位 布尔h24; 布尔PM;
接下来,将类DS3231的对象声明为RTC,以简化后续代码的使用。
DS3231 RTC;
由于RTC模块通过I2C通信与Arduino接口。因此,wire.begin()用于在RTC的默认地址中启动I2C通信,因为没有其他I2C模块。
Wire.begin();
所述销模式被定义,所述GPIO是否将表现为输出或输入。
pinMode(9,输出); pinMode(10,输出); pinMode(11,输出); pinMode(12,输出); pinMode(latchPin,输出); pinMode(clockPin,OUTPUT); pinMode(数据输入,输出); pinMode(点,输出);
循环无限运行,并且需要RTC DS3231模块以小时和分钟为单位的时间。“ h24”表示24小时格式变量。
int h = RTC.getHour(h24,PM); int m = RTC.getMinute();
然后将小时和分钟组合为一个数字(例如,如果小时为10,最小为60,则数字为10 * 100 = 1000 + 60 = 1060)。
整数= h * 100 + m;
在从多个单独的数字被获得(例如1060- 1是千,0 hundered,1是第十和0是最后一位)。为了分隔数字,使用了模运算符。例如,在1060中获得1,则1060/1000 = 1.06%10 = 1)。因此,单独的数字存储在单独的变量中。
千位整数=数字/ 1000%10; 整数百=数字/ 100%10; 整数tens =数字/ 10%10; int单位=数字%10;
之后,为每个单独的数字定义一个切换案例语句,用于将它们转换为相应的格式(二进制格式),并通过移位寄存器发送出去,以7段显示。例如(对于1位数字,它将更改为06(0000 0110))。因此它通过移位发送出去,并在7段中显示1位数字(0表示低,1表示高)。
开关(t) { 情况0: 单位= 63; 打破; 情况1: 单位= 06; 打破; 情况2: 单位= 91; 打破; 情况3: 单位= 79; 打破; 情况4: unit = 102; 打破; 情况5: 单位= 109; 打破; 情况6: 单位= 125; 情况7: 单位= 07; 打破; 情况8: 单位= 127; 打破; 情况9: 单位= 103; 打破; }
然后,首先通过MSB的“移出”功能将二进制格式的单个数字发送出去,并将各个数字引脚设为高电平并将锁存引脚设为高电平。
digitalWrite(9,LOW); digitalWrite(latchPin,LOW); shiftOut(dataPin,clockPin,MSBFIRST,数千); digitalWrite(latchPin,HIGH); digitalWrite(9,HIGH); delay(5);
这样就完成了完整的代码。大多数功能说明在代码行旁边的代码注释部分中给出。时钟的频率将决定时间的视图和多路复用的质量,即如果使用低时钟,则可以看到闪烁,而如果时钟速度很高,则不会出现这种闪烁,并且可以看到稳定的时间。
请注意,要访问RTC模块,必须保持I2C总线电压。为了提供任何建议或您有任何疑问,请在下面评论。