风筝
发表于: 2019-4-21 22:01:44 | 显示全部楼层

数字挂钟现在越来越受欢迎,它们比模拟时钟更好,因为它提供了小时、分钟和秒的准确时间,并且易于读取数值。一些数字时钟也有许多设施,如显示温度、湿度、设置多个闹铃等。大多数数字时钟使用七段数码管。


我们之前使用七段数码管或使用1602 LCD制作了许多数字时钟电路。在本文中,主要介绍通过使用Arduino UNO和四位数码制作数字时钟,并以HH:MM格式显示时间。

Multiplexing-Four-7-Segment-Displays-using-Arduino-to-Display-Time.jpg


需要的组件

●    4位7段数码管

●    74HC595

●    DS3231 RTC模块

●    Arduino UNO

●    面包板

●    连接跳线


四位七段数码管

4-Digit-7-Segment-Display.png

四位七段数码管有四个七段数码管连接在一起。它们用于显示数值以及一些带小数和冒号的字母。显示屏可以双向使用。四位数码管可用于制作数字时钟或类似于0到9999之间的计数器。下面是四位七段数码管的内部图。

4-Digit-7-Segment-Display-Internal-Connection.png

每个部分都有一个带独立控制的LED。七段数码管显示有两种类型,共阳极和共阴极。上图显示了共阳极七段数码管。


共阳极

在共阳极中,所有8个LED的所有正极(阳极)连接在一起,命名为COM。并且所有负极端子都保持断开或连接到微控制器引脚。通过使用微控制器,逻辑低电平用于点亮特定LED段,逻辑高电平熄灭LED。

7-Segment-Common-Anode-Display-Internal-Connection.jpg


共阴极

在共阴极中,所有8个LED的所有负极端子(阴极)连接在一起,命名为COM。并且所有正极端子都保持断开或连接到微控制器引脚。通过使用微控制器,逻辑高电平用于点亮特定LED段,逻辑低电平熄灭LED。。

7-Segment-Common-Cathode-Display-Internal-Connection.jpg


74HC595移位寄存器IC

74HC595-Shift-Register-IC.png

74HC595也称为8位串行输入 - 并行输出移位寄存器。该IC可以串行接收数据输入,并行控制8个输出引脚。这对于减少微控制器使用的引脚非常有用。


74HC595 IC的工作原理:

该IC使用三个引脚(如时钟、数据和锁存器)与微控制器来控制IC的8个输出引脚。时钟用于连续提供来自微控制器的脉冲,数据引脚用于发送数据,例如在相应的时钟时间需要将输出打开或关闭的数据。


DS3231 RTC模块

DS3231-RTC-Module.jpg

DS3231是一款RTC模块。 RTC代表实时时钟。即使电路未通电,该模块也用于记住时间和日期。它有一个备用电池CR2032,可在没有外部电源的情况下运行模块。该模块还包括温度传感器。该模块可用于嵌入式项目,如制作带温度指示器的数字时钟等.


该模块的一些功能和参数:

●    RTC,计算秒、分、小时和年

●    数字温度传感器,精度为±3ºC

●    400Khz I2C接口

●    功耗低

●    CR2032备用电池,具有两到三年的使用寿命

●    工作电压:2.3至5.5V


电路原理图

Circuit-Diagram-for-Multiplexing-Four-7-Segment-Displays-using-Arduino-to-Display-Time.png

DS3231 RTC和Arduino UNO之间的电路连接:

DS3231
Arduino UNO开发板
VCC
5V
GND
GND
SDA
A4
SCL
A5

Circuit-Hardware-for-Multiplexing-Four-7-Segment-Displays-using-Arduino-to-Displ.jpg


编程Arduino UNO

在本文的末尾处给出了完整的代码。在编程部分中,将说明如何以24小时格式从RTC模块获取时间(小时和分钟),然后将其转换成用于在4位7段显示中显示它们的相应格式。


要将DS3231 RTC模块与Arduino UNO连接,使用Arduino UNO的I2C总线。程序中包含一个名为<DS3231.h>的库,用于访问设置和读取时间、日期、温度数据等功能。下载DS3231 RTC模块Arduino库。由于RTC模块使用I2C接口,因此程序中也使用<wire.h>库。


在本文中,小时和分钟首先从RTC获取,它们像0930(09:30 pm)一样被组合在一起然后各个数字被分开,如千、百、十、单位,并且各个数字被转换成二进制格式,如0到63(0111111)。该二进制代码被发送到移位寄存器,然后从移位寄存器发送到七段,成功地在七段显示中显示数字0。这样,四位数码管姐可以显示小时和分钟。


首先,包括必要的库,例如DS3231库和Wire库(I2C库)。

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

定义控制七段数码管的引脚。这些控制将在复用数码管中发挥重要作用。

  1. #define latchPin 5                     
  2. #define clockPin 6
  3. #define dataPin 4
  4. #define dot 2
复制代码

声明变量存储从RTC获取的转换结果或原始结果。

  1. int h;               //Variable declared for hour
  2. int m;              //Variable declared for minute
  3. int thousands;   
  4. int hundreds;
  5. int tens;
  6. int unit;


  7. bool h24;
  8. bool PM;
复制代码

接下来,声明类DS3231的对象为RTC,以简化在以后代码中的使用。

  1. DS3231 RTC;
复制代码

由于RTC模块通过I2C通信与Arduino连接。因此,wire.begin()用于在RTC的默认地址中启动I2C通信,因为没有其他I2C模块。

  1. Wire.begin();
复制代码

定义引脚模式,确定GPIO是作为输出还是输入。

  1. pinMode(9,OUTPUT);
  2.     pinMode(10,OUTPUT);
  3.     pinMode(11,OUTPUT);
  4.     pinMode(12,OUTPUT);
  5.     pinMode(latchPin, OUTPUT);
  6.     pinMode(clockPin, OUTPUT);
  7.     pinMode(dataPin, OUTPUT);
  8.     pinMode(dot,OUTPUT);
复制代码

loop函数将无限运行,首先需要从RTC DS3231模块读取以小时和分钟为单位的时间。 'h24'表示24小时格式变量。

  1. int h= RTC.getHour(h24, PM);
  2.     int m = RTC.getMinute();   
复制代码

然后将小时和分钟组合为一个数字(例如,如果小时为10,则min为60,则数字为10 * 100 = 1000 + 60 = 1060)。

  1. int number = h*100+m;
复制代码

获得数字的各个位的数字(示例1060-1是千位,0是百位,1是十位,0是最后一个数字)。为了分开数字,使用模数运算符。例如,在1060得到1然后1060/1000 = 1.06%10 = 1)。因此,单独的数字存储在单独的变量中。

  1.     int thousands = number/1000%10;
  2.     int hundreds = number/100%10;
  3.     int tens = number/10%10;      
  4.     int unit = number%10;      
复制代码

之后,定义每个数字的switch-case语句,用于将它们转换为相应的格式(二进制格式),并通过移位寄存器发送到7段显示。例如(对于1位数,它将转换为06(0000 0110))。因此它通过移位发出,1位数显示在7段(0表示LOW,1表示HIGH)。

  1. switch (t)
  2. {
  3.   case 0:
  4.   unit = 63;
  5.   break;
  6.   case 1:
  7.   unit = 06;
  8.   break;
  9.   case 2:
  10.   unit =91;
  11.   break;
  12.   case 3:
  13.   unit=79;
  14.   break;
  15.   case 4:
  16.   unit=102;
  17.   break;
  18.   case 5:
  19.   unit = 109;
  20.   break;
  21.   case 6:
  22.   unit =125;
  23.   case 7:
  24.   unit = 07;
  25.   break;
  26.   case 8:
  27.   unit = 127;
  28.   break;
  29.   case 9:
  30.   unit =103;
  31.   break;
  32.   }
复制代码

然后,通过'shiftout'函数以先MSB的方式发送二进制格式的数字,相应的数字引脚变为高电平,锁存引脚变为高电平。

  1.     digitalWrite(9, LOW);
  2.     digitalWrite(latchPin, LOW);
  3.     shiftOut(dataPin, clockPin, MSBFIRST,thousands);
  4.     digitalWrite(latchPin, HIGH);
  5.     digitalWrite(9, HIGH);        
  6.     delay(5);         
复制代码

这样就完成了完整的代码。大多数函数说明都在代码注释部分的代码行旁边给出。时钟的频率将决定多路复用的时间和质量的、。如果使用的时钟低,那么可以看到闪烁,如果时钟速度高,那么就不会有这样的闪烁,可以看到稳定的时间。

Testing-of-Four-7-Segment-Displays-Multiplexing-using-Arduino-to-Display-Time.jpg


请注意,要访问RTC模块,I2C总线需要有上拉电阻。如果您有任何建议或有任何疑问,请在本帖下面进行回复。


代码

本文使用的完整代码如下: main.zip (1.2 KB, 下载次数: 254)

跳转到指定楼层
白衣好少年
发表于: 2019-5-25 22:23:14 | 显示全部楼层

提示这个该咋解决啊,大师C:\Users\Dell\Desktop\sketch_may25a\sketch_may25a\sketch_may25a.ino:5:48: fatal error: DS3231.h: No such file or directory

#include <DS3231.h>   //Library for RTC module

                                                ^

compilation terminated.

exit status 1
为开发板 Arduino Nano 编译时出错。
回复

使用道具 举报

白衣好少年
发表于: 2019-5-25 22:55:27 | 显示全部楼层

白衣好少年 发表于 2019-5-25 22:23
提示这个该咋解决啊,大师C:%users\Dell\Desktop\sketch_may25a\sketch_may25a\sketch_may25a.ino:5:48: fa ...

上个问题解决了,又出新问题了
avrdude: ser_open(): can't open device "\\.\COM1": 系统找不到指定的文件。


上传出错
求大神指点
回复

使用道具 举报

小白藤
发表于: 2019-12-22 16:06:01 | 显示全部楼层

电路图看着跟做出来的不一样啊
回复

使用道具 举报

1929594720
发表于: 2020-1-7 11:11:11 | 显示全部楼层

请问这个可以做6位数的吗,小时:分钟:秒。
回复

使用道具 举报

1929594720
发表于: 2020-1-7 16:34:36 | 显示全部楼层

DS3231 RTC模块买来用不用自己先定义,还是直接以上代码即可?
回复

使用道具 举报

1929594720
发表于: 2020-1-7 16:44:31 | 显示全部楼层

小白藤 发表于 2019-12-22 16:06
电路图看着跟做出来的不一样啊

你有这个电路图吗
回复

使用道具 举报

350424@林
发表于: 2020-11-30 09:50:29 | 显示全部楼层

代码里面是共阴还是共阳的数码管
回复

使用道具 举报

风筝
发表于: 2020-11-30 10:15:24 | 显示全部楼层

350424@林 发表于 2020-11-30 09:50
代码里面是共阴还是共阳的数码管

用的是共阴极模块
回复

使用道具 举报

350424@林
发表于: 2020-11-30 12:40:24 | 显示全部楼层

风筝 发表于 2020-11-30 10:15
用的是共阴极模块

提示这个该咋解决啊,大师C:\Users\Dell\Desktop\sketch_may25a\sketch_may25a\sketch_may25a.ino:5:48: fatal error: DS3231.h: No such file or directory

#include <DS3231.h>   //Library for RTC module
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-20 21:32 , Processed in 0.136535 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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