51单片机学习笔记6 数码管显示

51单片机学习笔记5 数码管显示

一、动态数码管

1. 动态数码管工作原理

动态数码管是一种常见的数字显示设备,通常由七段LED组成。每个数码管都有七段LED分别表示数字的不同部分,通过控制这些LED的亮灭,可以显示数字0到9以及一些字母。

在动态数码管中,每个数码管的七段LED是依次被控制的,通过快速地依次使每个数码管的七段LED亮起,可以形成多位数字的连续显示效果。

单片机通过扫描技术和适时的输出控制信号,使得数码管的各个段依次显示所需的数字或字母。

动态数码管特点:

动态数码管具有显示效果清晰、功耗低、寿命长、驱动电路简单等特点,广泛应用于计时器、电子表、计数器等设备中。

由于动态数码管需要单片机不断地扫描和控制,因此需要一定的处理能力和时间,适合用于单片机控制的场合。

我使用的普中开发板,使用 74HC245 作为动态数码管的驱动器,使用 D74HC138 作为译码器。

2. 工作过程

  1. 首先,单片机输出控制信号,选择要显示的数码管。
  2. 然后,单片机根据要显示的数字或字母,通过输出控制信号,通过D74HC138,连接 74HC245,控制对应的七段LED灯亮起或熄灭。
  3. 单片机通过不断地切换显示的数码管,并控制每个数码管的七段LED灯,实现多位数字或字母的连续显示效果。

3. 原理图

(1)数码管及74HC245

(2)74HC138译码器

4. 74HC245介绍

74HC245是一款常用的8位双向电平转换器,也被称为总线驱动器。它常用于数字系统中的数据总线扩展、电平转换以及信号缓冲等应用,其主要特点:

  • 高速:74HC245具有较高的数据传输速率,适用于高速数字系统。
  • 低功耗:它的静态功耗较低,适用于功耗要求较低的应用。
  • 低电平输出:74HC245的输出端口可以提供低电平输出,适用于5V和3.3V系统之间的电平转换。

其管脚定义:

(1)功能

  • 74HC245具有8位双向数据传输功能,可以将数据从一个总线转移到另一个总线,并在两个方向上进行数据传输。
  • 它还具有电平转换功能,可以将高电平信号转换为低电平信号,反之亦然。
  • 74HC245还具有输出使能功能,可以通过控制输入引脚来控制数据的传输使能。

(2)引脚

  • 74HC245具有16个引脚,分为两组,每组包含8个数据引脚和一个使能引脚。

  • 数据引脚用于连接输入或输出数据总线。

  • 使能引脚用于控制数据传输的使能。

  • OE 是输出使能引脚,L 表示输出使能,H 表示输出禁用。

  • DIR 是方向控制引脚,L 表示数据从A端到B端传输,H 表示数据从B端到A端传输。

(3)工作原理

  • 74HC245的工作原理基于双向缓冲器的原理。当使能引脚为高电平时,数据可以从A端传输到B端,并且数据也可以从B端传输到A端。
  • 当使能引脚为低电平时,输入和输出端口之间的连接被切断,此时输入数据不会传输到输出端口,输出端口也不会对输入数据进行响应。

(4)真值表

5. D74HC138 介绍

D74HC138是一种八线三至八译码器,也被称为3-8译码器。它通常用于数字系统中的地址译码、片选信号生成等应用,用于将三位二进制地址转换为八个输出端口中的一个低电平输出。它具有快速响应、低功耗、高阻抗输入端口等特点。

管脚定义:

(1)功能

  • D74HC138具有八个输入端口(A0-A2),可以接受三位二进制地址输入。
  • 它有八个输出端口(Y0-Y7),每个输出端口对应一个使能输入端口(G1、G2A、G2B),输出对应的输出端口为低电平。
  • D74HC138将三位输入地址转换为八个输出端口中的一个为低电平,其余输出端口为高电平。

(2)引脚

  • A0-A2:三位地址输入端口,接受二进制地址输入。
  • Y0-Y7:八个输出端口,其中一个为低电平,其余为高电平。
  • G1、G2A、G2B:使能输入端口,通过这些端口控制输出的使能状态。

(3)工作原理

  • 当输入地址的二进制值与译码器的某个输出对应时,该输出端口将产生低电平输出,其余输出端口为高电平。
  • 通过使能端口G1、G2A、G2B来控制译码器的工作状态,使能信号为高电平时,译码器处于工作状态,可以根据输入地址产生对应的输出信号。

(4)真值表

6. 代码实现

下面代码实现的功能,每1秒在一个数码管上显示当前的数值,即第一个数码管显示0,第二个数码管显示1,以此类推 。

下面定义的gsmg_code中的含义,以0x3f为例,换算成二进制: 00111111,根据电路原理图:

可以看出赋值情况:

  • a 引脚 P00=1
  • b 引脚 P01=1
  • c 引脚 P02=1
  • d 引脚 P03=1
  • e 引脚 P04=1
  • f 引脚 P05=1
  • g 引脚 P06=0
  • dp 引脚 P07=0
    最终在数码管上就会显示数值 0。
c 复制代码
#include "segment_display_utils.h"
#include "types.h"
#include "common_utils.h"

#define SMG_A_DP_PORT P0

// 3-8译码器控制端口
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;

u8 gsmg_code[17] =  {0x3f, 0x06, 0x5b, 0x4f,
                     0x66, 0x6d, 0x7d, 0x07,
                     0x7f, 0x6f, 0x77, 0x7c,
                     0x39, 0x5e, 0x79, 0x71, 0x00};


void segment_display() {
    u8 i=0;
    for(i=0;i<8;i++){
        switch(i){
            case 0:
                // 选择第一位数码管,即数码管1, 通过3-8译码器,转换为二进制码111,即7,即选中LED8
                LSA = 1; LSB = 1; LSC = 1;
                break;
            case 1:
                LSA = 0; LSB = 1; LSC = 1;
                break;
            case 2:
                LSA = 1; LSB = 0; LSC = 1;
                break;
            case 3:
                LSA = 0; LSB = 0; LSC = 1;
                break;
            case 4:
                LSA = 1; LSB = 1; LSC = 0;
                break;
            case 5:
                LSA = 0; LSB = 1; LSC = 0;
                break;
            case 6:
                LSA = 1; LSB = 0; LSC = 0;
                break;
            case 7:
                LSA = 0; LSB = 0; LSC = 0;
                break;
        }
        SMG_A_DP_PORT = gsmg_code[i];
        delay_ms(1000);
    }
}

本文代码开源地址:

https://gitee.com/xundh/learn51

相关推荐
我爱挣钱我也要早睡!2 小时前
Java 复习笔记
java·开发语言·笔记
知识分享小能手5 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
汇能感知7 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun7 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao8 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾8 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT8 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa9 小时前
HTML和CSS学习
前端·css·学习·html
ST.J9 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记
Suckerbin9 小时前
LAMPSecurity: CTF5靶场渗透
笔记·安全·web安全·网络安全