0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Arduino UNO和四位数码制作数字时钟

454398 来源:一板网 作者:风筝 2020-11-09 16:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

需要的组件

● 4位7段数码管

● 74HC595

● DS3231 RTC模块

● Arduino UNO

● 面包板

● 连接跳线

四位七段数码管

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

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

共阳极

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

共阴极

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

74HC595移位寄存器IC

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

74HC595 IC的工作原理

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

DS3231 RTC模块

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

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

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

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

● 400Khz I2C接口

● 功耗低

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

● 工作电压:2.3至5.5V

电路原理

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

编程Arduino UNO

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

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

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

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

#include

#include

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

#define latchPin 5

#define clockPin 6

#define dataPin 4

#define dot 2

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

int h; //Variable declared for hour

int m; //Variable declared for minute

int thousands;

int hundreds;

int tens;

int unit;

bool h24;

bool PM;

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

DS3231 RTC;

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

Wire.begin();

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

pinMode(9,OUTPUT);

pinMode(10,OUTPUT);

pinMode(11,OUTPUT);

pinMode(12,OUTPUT);

pinMode(latchPin, OUTPUT);

pinMode(clockPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(dot,OUTPUT);

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

int h= RTC.getHour(h24, PM);

int m = RTC.getMinute();

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

int number = h*100+m;

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

int thousands = number/1000%10;

int hundreds = number/100%10;

int tens = number/10%10;

int unit = number%10;

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

switch (t)

{

case 0:

unit = 63;

break;

case 1:

unit = 06;

break;

case 2:

unit =91;

break;

case 3:

unit=79;

break;

case 4:

unit=102;

break;

case 5:

unit = 109;

break;

case 6:

unit =125;

case 7:

unit = 07;

break;

case 8:

unit = 127;

break;

case 9:

unit =103;

break;

}

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

digitalWrite(9, LOW);

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, MSBFIRST,thousands);

digitalWrite(latchPin, HIGH);

digitalWrite(9, HIGH);

delay(5);

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

请注意,要访问RTC模块,I2C总线需要有上拉电阻
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数码管
    +关注

    关注

    32

    文章

    1891

    浏览量

    93708
  • 数字时钟
    +关注

    关注

    2

    文章

    153

    浏览量

    21327
  • Arduino
    +关注

    关注

    190

    文章

    6515

    浏览量

    195964
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    贸泽电子开售全新Arduino UNO Q单板计算机

    贸泽电子开售全新Arduino UNO Q单板计算机。Arduino UNO Q单板计算机(SBC)将高性能计算与实时控制结合,提供理想的创新平台。
    的头像 发表于 11-08 09:50 960次阅读

    Arduino Uno l两轮自平衡机器人 电机驱动无输出求解

    Arduino Uno l两轮自平衡机器人 电机驱动无输出求解
    发表于 10-15 06:36

    Arduino UNO Q 登陆 DigiKey,现已开放预订

    融合高性能微处理器与专用微控制器,Arduino UNO Q加强创新开发能力 美国, 明尼苏达, 锡夫里弗福尔斯市 - 2025 年 10 月 07 日 全球领先的电子元器件与自动化产品分销商
    的头像 发表于 10-13 14:55 273次阅读
    <b class='flag-5'>Arduino</b> <b class='flag-5'>UNO</b> Q 登陆 DigiKey,现已开放预订

    如何判断贴片电容和电阻的阻值?

    有效数字,第三为倍率(10ⁿ)。 示例: 103 = 10 × 10³ = 10kΩ 472 = 47 × 10² = 4.7kΩ 105 = 10 × 10⁵ = 1MΩ 四位数标识(精度±1
    的头像 发表于 08-12 14:22 1212次阅读
    如何判断贴片电容和电阻的阻值?

    如何用Arduino Nano/UNO R3开发板给另一个Arduino IDE不能下载的Arduino Nano/UNO R3开发板重新烧录引导程序bootlaoder

    本文介绍了如何用能够Arduino IDE下载的Arduino Nano/UNO R3开发板给另一个Arduino IDE不能下载的Arduino
    的头像 发表于 08-08 20:16 3061次阅读
    如何用<b class='flag-5'>Arduino</b> Nano/<b class='flag-5'>UNO</b> R3开发板给另一个<b class='flag-5'>Arduino</b> IDE不能下载的<b class='flag-5'>Arduino</b> Nano/<b class='flag-5'>UNO</b> R3开发板重新烧录引导程序bootlaoder

    Texas Instruments INA4230 16位数字电流监控器数据手册

    Texas Instruments INA4230通道16位数字电流监控器具有一个兼容I ^2 C^ /SMBus的接口,兼容1.2V至5V的数字总线电压。该器件可监测外部感应电阻器上的电压,并报告每个通道的分流电压、总线电压
    的头像 发表于 07-25 14:43 437次阅读
    Texas Instruments INA4230 16<b class='flag-5'>位数字</b>电流监控器数据手册

    0.1-3.0 GHz 四位数字衰减器 (1 dB LSB) skyworksinc

    电子发烧友网为你提供()0.1-3.0 GHz 四位数字衰减器 (1 dB LSB)相关产品参数、数据手册,更有0.1-3.0 GHz 四位数字衰减器 (1 dB LSB)的引脚图、接线图、封装手册
    发表于 05-26 18:29
    0.1-3.0 GHz <b class='flag-5'>四位数字</b>衰减器 (1 dB LSB) skyworksinc

    贴片电阻的阻值如何判断?

    以下几种方法: 一、观察表面标识 1、数字编码 三位数字编码:前两位数字代表电阻值的有效数字,第三位数字代表乘数(即10的幂次方)。例如,标
    的头像 发表于 05-14 15:32 3113次阅读
    贴片电阻的阻值如何判断?

    AD9912 1 GSPS直接数字频率合成器,内置14位数模转换器技术手册

    AD9912是一款集成14位数模转换器(DAC)的直接数字频率合成器(DDS)。AD9912具有一个48频率调谐字(FTW),可以合成步长不超过4μHz的频率。通过调整DAC系统时钟
    的头像 发表于 05-06 09:58 1085次阅读
    AD9912 1 GSPS直接<b class='flag-5'>数字</b>频率合成器,内置14<b class='flag-5'>位数</b>模转换器技术手册

    # quartus ii 9.1对registered adder仿真出错,但硬件上能够实现,怎么解决?

    D=B; input reset,Clock;//复位信号和时钟信号 output[3:0] S;//最终输出的四位数结果 output Cout;//进位输出 reg[3:0] QA,QB
    发表于 04-14 21:35

    ADS1247采集数据不稳定是怎么回事?

    ADS1247硬件电路参考的是sbaa180热电阻三线制接法,目前产品要求精度<0.5摄氏度,但是ADS1247采集数据总共6,后面四位数据都不稳定,想请教下是怎么回事啊?程序
    发表于 02-10 07:25

    开源项目!手把手教你制作一个互动式LED墙壁时钟

    一定经验,本指南都将带你走完所有必要的步骤。 教程内容概览 制作视频 编码视频 CAD文件 材料清单 电子组件: Arduino Uno x 1 DS1302 实时时钟模块 x 1
    发表于 02-08 17:47

    用示波器测量ADS801的12位数字量,有些的输出高低电平一直在跳,是什么原因?

    我用示波器测量ADS801的12位数字量,有些的输出高低电平一直在跳,不知道什么原因,我测了一下参考电压,基本上跟数据手册上差不多,数据手册上要求时钟信号的上升和下降时间是2ns,我给的
    发表于 02-08 08:47

    四位数码管12个引脚怎么分配

    在电子显示技术中,四位数码管作为一种常见的显示器件,广泛应用于各种数字显示系统。其通过控制不同段(A-G)的发光二极管(LED)来显示数字或字符。对于具有12个引脚的四位数码管,合理的
    的头像 发表于 01-30 15:00 5w次阅读

    自己设计的Arduino UNO R3主控板原理图+PCB源文件(可直接打样)

    一年前做的Arduino UNO r3,开源精神,把自己这块板子奉献给大家,板子没有什么问题,可以直接打样制作,原理图文件都表明了型号。不用谢~ Arduino
    发表于 12-10 10:14