当前位置:   article > 正文

Arduino 驱动4位时钟类型的3线数码管(74hc595)_arduino 74hc595 4位数码管

arduino 74hc595 4位数码管

目录

概述

1 7段数码管显示原理

1.1 原理概述

1.2 显示数据数据方法

1.2.1 共阳极数码管

1.2.2 共阴极数码管

2 硬件结构

2.1 4位共阳极数码管

2.2 认识74HC595

2.2.1 概述

2.2.2 74HC595的工作原理

2.2.3 操作方法

3 使用Arduion驱动4段数码管

3.1 系统硬件结构

3.2 代码实现

3.2.1 功能描述

3.2.2 显示:的技巧

3.2.3 编写和编译代码

4 测试


概述

       本文详细介绍了7段数码管的显示原理,并介绍了共阳极和共阴极类型的控制方法。还对74HC595串转并行芯片做了介绍,包括工作原理、时序分析等类型。还是用Arduino板卡驱动了4位时钟类型的数码管,实现其驱动程序,并完成测试验证。

源代码下载地址:arduino-HC595-SMG4:驱动4个数码管,使用74HC595驱动资源-CSDN文库

1 7段数码管显示原理

1.1 原理概述

       7段数码管是一种电子显示器件,用于显示数字和字母字符。它由7个LED(发光二极管)组成,可以显示0到9的数字以及A到F的字母。

       每个LED都有一个阴极和一个阳极。阴极被连接到一个共阳极电源,而阳极则是通过控制电路来控制的。7段数码管的显示原理是通过控制不同的LED亮灭来显示不同的数字或字母。通过控制各个LED的阴极和阳极,可以实现各种数字和字母的组合显示。为了方便控制,通常使用了多路复用技术。在多路复用模式下,通过不同的电信号控制各个LED的阴极,从而实现显示不同的字符。除了数字和字母,7段数码管还可以显示一些特殊的符号,如小数点、减号等。这些符号通常使用额外的LED来实现。

      总之,7段数码管是一种常用的电子显示器件,通过控制LED的亮灭来显示数字、字母和一些特殊符号。它在计算器、电子钟表、仪器仪表等领域得到广泛应用。

1.2 显示数据数据方法

1.2.1 共阳极数码管

共阳极数码管(Common Anode LED Display)是一种LED数字显示器件,它的每个数字由多个LED组成。它们通常具有共阳极(common anode)的极性,即所有的阳极都通过一个共阳极连接在一起,而每个LED的阴极则单独连接。

在共阳极数码管中,当需要显示某个特定数字时,只有该数字对应的LED会被激活,其他LED则保持关闭。通过控制各个LED的开关状态,可以实现显示不同的数字。

下图为共阳极LED结构如:

      DIG-1, DIG-2,DGI-3,DIG-4为阳极,和驱动电路的VCC相连,A,B,C,D,E,F,G为控制引脚,改变该电平的状态。控制LED的亮灭,已实现实现相应的数据。

1.2.2 共阴极数码管

共阴极数码管(Common Cathode Digital Tube)是一种常见的显示器件,用于显示数字、字母和符号等信息。共阴极数码管由多个LED(发光二极管)组成,每个LED代表一个数字或字符的一部分。每个LED的阳极连接在一起,而阴极则分别与控制电路相连。

在共阴极数码管中,当某个LED的阴极接地时,该LED会亮起。通过控制电路,可以选择性地点亮某个或某些LED,从而显示出特定的数字或字符。共阴极数码管通常使用多位共阴极数码管,每个位置上有一个数码管。在显示一个数字时,需要依次点亮各个位置上的数码管。通过不断地改变电压和电流的控制,可以实现数码管上数字的刷新,从而呈现出连续的数字显示效果。

下图为共阴极LED结构如:

DIG-1, DIG-2,DGI-3,DIG-4为阴极,和驱动电路的GNG相连,A,B,C,D,E,F,G为控制引脚,改变该电平的状态。控制LED的亮灭,已实现实现相应的数据。

2 硬件结构

2.1 4位共阳极数码管

4为可显示时间段位共阳极LED模块使用74HC579驱动,对外有5个引脚,其定义参看下图

VCC: 电源引脚(3 ~ 5.2 V)

GND: 公共地

SDIO: 数据输入

LOAD: 锁存器时钟

SCLK:移位寄存器时钟

该模块有两个74HC595芯片,一个芯片的并行输出数据和LED的段位(a,b,c,d,e,f,g,dp)连接起来,另外一个引脚和4个数码管的共阳极连接起来。

2.2 认识74HC595

2.2.1 概述

74HC595是一种8位串行至并行移位寄存器,用于控制数字输出信号。它可以通过串行数据输入来控制8个数字输出引脚,并且可以级联多个74HC595寄存器以扩展输出数量。

74HC595寄存器具有以下主要特点:

  1. 高速操作:它可以在时钟信号的控制下将串行输入数据转换为并行输出数据,具有快速的数据传输速度。

  2. 扩展能力:通过级联多个74HC595寄存器,可以实现更多的输出引脚,从而扩展数字输出的能力。

  3. 串行输入:它具有一个串行输入引脚(SER),可以通过串行输入将数据传递给寄存器。

  4. 并行输出:它具有8个并行输出引脚(Q0-Q7),可以控制8个数字输出信号。

  5. 控制引脚:它具有时钟引脚(SRCLK)用于控制数据传输的时钟信号,锁存时钟引脚(RCLK)用于锁存并行输出数据,以及输出使能引脚(OE)用于控制输出的使能。

  6. 低功耗:74HC595寄存器具有低功耗特性,适用于电池供电设备或需要节能的应用。

  7. 应用广泛:由于其灵活性和易用性,74HC595寄存器广泛应用于各种数字输出控制应用,如LED显示屏控制、数码管控制、电机控制等。

        总的来说,74HC595是一种常用的数字输出控制芯片,具有高速操作、扩展能力强和低功耗等特点,在各种数字控制应用中具有广泛的应用价值。

2.2.2 74HC595的工作原理

关于74HC595的详细资料,参考下列文档:

SNx4HC595 8-Bit Shift Registers With 3-State Output Registers datasheet (Rev. J) (ti.com)

下图为74HC595的硬件原理图:

由上图可知:

OE: 并行输出数据使能,低电平时有效

RCLK: 锁存寄存器时钟引脚,上升沿有效

SRCLK:移位寄存器时钟引脚,上升沿有效

SER: 数据输入引脚

SRCKR: 数据清除引脚,低电平有效

其具体功能定义如下:

2.2.3 操作方法

下面使用一段代码来介绍74HC595的控制方法

  1. void hc595_send(unsigned char dat) {
  2.    unsigned char i;
  3.    for (i = 0; i < 8; i++) {
  4.        SCK = 0;
  5.        SER = dat & 0x80;  // 从高位开始发送数据
  6.        dat <<= 1;
  7.        SCK = 1;
  8.   }
  9.    RCK = 1;       // 移位完成,数据存储
  10.    delay(1);
  11.    RCK = 0;
  12. }
原理框图:

3 使用Arduion驱动4段数码管

3.1 系统硬件结构

模块驱动引脚与Arduino UNO主板之间关系:

模块引脚Arduino UNO 引脚注释
RCLKPIN-12数据锁存器时钟
SCLKPIN-13移位寄存器时钟
DIOPIN-11数据输入

3.2 代码实现

3.2.1 功能描述

1) 定时器产生1000ms中断,用于产生

2)4为数码管上显示0~9999数据

3)使能" : "

3.2.2 显示:的技巧

由数据码的实现原理可知,只需将dp引脚置高(共阴极)或者置地(共阳极),即可以控制这个显示位。

由上图可得,dp 处于一个byte的最高位 bit-7, a~g对应是bit0~bit6。对于4个数据的数码管,时钟“:”处在第三个数据码的dp bit-7上,所以,控制它的方法如下:

3.2.3 编写和编译代码

使用Arduino IDE编写和编译代码

详细代码如下:

  1. /***************************************************************
  2. Copyright 2024-2029. All rights reserved.
  3. 文件名 : arduino_HC595_SMG4.ino
  4. 作者 : tangmingfei2013@126.com
  5. 版本 : V1.0
  6. 描述 : 显示0~9999数据
  7. 其他 : 无
  8. 日志 : 初版V1.0 2024/02/23
  9. ***************************************************************/
  10. #include <MsTimer2.h>
  11. int latchPin=12; // 74HC595 - rclk
  12. int clockPin=13; // 74HC595 - sclk
  13. int dataPin=11; // 74HC595 - sdi
  14. unsigned char smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
  15. unsigned char bitMa[] = {0x01, 0x02, 0x04, 0x08};
  16. unsigned int cnt = 0;
  17. void timer_irq()
  18. {
  19. cnt++;
  20. }
  21. void setup() {
  22. pinMode(latchPin, OUTPUT);
  23. pinMode(clockPin, OUTPUT);
  24. pinMode(dataPin, OUTPUT);
  25. // 中断设置函数,每 500ms 进入一次中断
  26. MsTimer2::set(1000, timer_irq);
  27. //开始计时
  28. MsTimer2::start();
  29. }
  30. void display( unsigned char duan, unsigned char ch)
  31. {
  32. unsigned char temp;
  33. digitalWrite(latchPin,LOW); //低电位表示启动
  34. temp = ~smgduan[duan];
  35. if( ch == 2 )
  36. {
  37. temp = temp & (~0x80);
  38. }
  39. shiftOut(dataPin,clockPin,MSBFIRST,temp);
  40. shiftOut(dataPin,clockPin,MSBFIRST,bitMa[ch]);
  41. digitalWrite(latchPin,HIGH); //高电位表示停止
  42. }
  43. void loop()
  44. {
  45. unsigned char weibuff[4], i;
  46. weibuff[0] = (cnt%100)%10;
  47. weibuff[1] = (cnt%100)/10;
  48. weibuff[2] = (cnt%1000)/100;
  49. weibuff[3] = cnt/1000;
  50. for( i =0; i < 4; i++ )
  51. {
  52. display( weibuff[i] , i );
  53. }
  54. if( cnt > 9999 )
  55. cnt = 0;
  56. }

4 测试

       编译代码,然后将其下载到板卡中,可以看见,数码管上数据1s的时间间隔累加,且“:”也能正常的显示出来。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/946666
推荐阅读
  

闽ICP备14008679号