一 数码管的概述

(1) 数码管的工作原理

内部的么一个LED对应的就是数码管里面的数字一个笔画
我们可以进行观察


一个数字加上一个小数点对应的就是8个笔画也就是对应着8个LED灯,还有一个小数点,这个也是对应着一个LED灯,我们来看看我们的51单片机的原理图,观察要怎么设置才可以使得数码管亮。

(2)  数码管的分析

上图是一个共阴极数码管,一共有8个阴极,一个阴极对应着一个数码管,下面有8个阳极,abcdeg对应着每一个数码管的笔画,dp对应的是每一个数码管后面的小数点,所以一个数码管是由4个阴极和8个阳极进行控制的,也就是12个引脚进行控制,如需控制这个数码管的显示的数字,只需要控制对应的阳极和阴极。

阴极是控制哪一个数码管单位是亮的,阳极是控制这个所需要亮的数码管的哪一个笔画

二 数码管的静态显示(硬件篇)

1 显示的具体需求描述

开发板上有2个并排的4位数码管,我们将其视为一个整体,也就是1个8位的数码管,先阶段只需求点亮实现其中一位(同一时刻显示一位数字),具体需求是能在8个任意位置显示任一数字

2 数码管的硬件设计

2个4位的数码管是有24个引脚(8+4)*2,我们的引脚取出晶振那些引脚的话剩下34个引脚,那么我们用24个引脚来接入这个这个数码管的话。

如果用上述的方法,运用24个引脚进行控制数码管的话,就很浪费,为什么?因为其他还都需要引脚。

那么我们该怎么怎么设计才可以节省我们引脚的使用呢?

我们不难看到这个两个数码管的正极和阴极是连接两个共同的位置的数字
我们是可以这样去连接,我们把这个看成一个整体,如果左边亮的话,那么在右边就会亮,因为两个连接着共同的阴极和阳极,但是这样的设计是有弊端的,不可以实现两个数码管实现不同的数字,8位里面点亮一位

那么我们该怎么办?
所以我们就有了另外一个方法,运用38译码器。

3 38译码器的应用

  38译码器是一种三线到八码的编译器(74HC138),它可以将3位二进制输出成8个独立的输出信号

38译码器的译码原理

  需要理解38译码器的原理,首先要理解二进制编码原理,000在二进制对应的数字为0,那么这里就是转换到对应的Y0端口,如果为001在二进制对应的数字为1,那么就是对应着Y1端口,一次类推,最终的端口数字为Y7。


这个时候我们就可以画出这个运用到这个数码管硬件

我们就可以有效的控制这个0-1信号了,为什么要这样呢?
就是我们在设计这个数码管的时候,本来就是一个一个控制,不可以多个同时控制,不同时点亮多个数码管的数字,这里为了不同时亮,采用了38译码原理。

4 51单片机高点平的驱动能力很微弱原理

由于51单片机高电平的驱动能力很微弱,不足以点亮数码管,因此可以使用74HC245N作为驱动芯片
要想知道为什么51单片机高电平微弱,这就要从之前讲过的51单片机的引脚内部结构说起

由前面学习可知,引脚是既可以收到信号也可以输出信号


(1)  51单片机的输出信号的过程
输出高电频:就是当这个寄存器的数字为1,然后经过反门就是为0了。
输出低电频:就是当这个寄存器的数字为0,然后经过反门就是为1了。
然后经过mos管,只有高电平的时候,这个mos管才会被点通。

(2)  高电平微弱的原因
看到那个黑色的电阻上面写着弱上拉,就是上拉电阻很大,导致这个电压会变得很小,也就导致电流变得很小。

(3)  使用上拉电阻形成弱上拉的原因
其实这里是需要考虑输入的问题,因为引脚是外部电路和内部电路都可以改变引脚的电频

因为都可以改变该引脚的电平,如果内部是一个弱上拉的话,那么外部就可以很方便改变这个引脚的状态,如果为强上拉的话,那么就很难改变这个引脚的状态,所以这里采用弱上拉,维持外部电路和内部电路都可以改变引脚的电频。

5 74HC245N驱动器

这个是驱动器的示意图

(1)  74HC245的基本理解
由于两个都是可以进行输入和输出的,那么就是一个双向8路总线收发器
DIR引脚表示为数据的传输的方向,是A->B,还是B->A
VCC和GND引脚:电源和接地
OF#引脚:这里的#表示低电平有效,就是低电平才可以进行工作,还可以上面加个横线,表示输出功能

(2)  74HC245的真值表

OE#:这里为1,则表示不工作,这里的高阻态理解为断开。
OIR:这里为1,则表示从A输出到B,如果为0则表示从B输出到A。

然后我们就可以构建出一个完整的电路了。

(3)  放入74HC245的真值表的原理图

但是我们使用的中科大的那一个阴极是不做这种处理的,所以还是有点区别的

(4)  74HC245的用处

它内部有“功率放大”电路,接过单片机微弱的“命令”信号,然后用自己的电源去驱动这些LED。这样,它就能同时点亮几十个LED而毫无压力

三  数码管的静态显示(软件篇)

1 位选

确定显示的位置称为位选,在确定显示的数字称为段选
下面这个为阴极所对应的这个输入和输出:

对照这个38译码原理就可以弄出左边怎么编码可以控制控制右边的数字被点亮。

规律总结

由于我们使用的江科大的51单片机板子,所以需要注意改变对应的引脚,这个第三行的十进制的数字是为2,不为1,我们要懂得进行修改。

2 段选

段选的意思是,显示哪一个数字的哪一个笔画,这个是段选。
下面这个位阳极的接入情况

如果我想点亮一个0(下面为abcdefg和dp 与 74HC245输出口 所对应的关系)

所对应的关系:  11-18,7-17,4-16,2-15,1-14,10-13需要接入才可以被点亮。

所对应的输入口就是:  2,3,4,5,6,7。
所对应的引脚:  P00,P01,P02,P03,P04,P05
所对应的二进制编码:  1,1,1,1,1,1,0,0
最后我们就可以得到这么一个映射关系表

3 代码的实现

以下为具体的代码实现

#include <STC89C5xRC.H>
#include <stdio.h>

typedef unsigned char u8;
//0~9数字的编码
static u8 codes[10]={
    0x3F,
    0x06,
    0x5B,
    0x4F,
    0x66,
    0x6D,
    0x7D,
    0x07,
    0x7F,
    0x6F
// 0x3F → 00111111
// 0x06 → 00000110
// 0x5B → 01011011
// 0x4F → 01001111
// 0x66 → 01100110
// 0x6D → 01101101
// 0x7D → 01111101
// 0x07 → 00000111
// 0x7F → 01111111
// 0x6F → 01101111
};

//pos表示的位位置      numcode表示的位数字
void digital(u8 pos, u8 numcode){
    //位选

    //p22 p23 p24是改变这个位置的
    //p2 = 110 111 11
    //pos = 0000 0011(后面三位是0~7),把后面三位赋予到中间的101
    // 110 111 11
    // 000 011 00(position左移两位)

    pos<<=2;
    //p1 &= 111 000 11
    P2 &= 0xe3;
    P2 |= pos;

    // P22 = 0;
    // P23 = 0;
    // P24 = 0;

    //段选
    P0 = numcode;
}

void main(){
    digital(0,codes[4]);
    while(1){

    }
}

这个数组是我们之前已经计算好的对应的二进制所对应的十六进制。

1 digital段选函数的实现

这个我们是需要看原理图进行分析的


首先我们可以看到是控制P22 P23 P24这三个接口来进行控制这个后面的阴极的接口,然后我们也不可以干扰到P2其余的接口,所以我们就要想一个办法

1 按位或的运算规则

对于两个二进制数的每一位进行比较:

如果至少有一个对应位是 1,则结果的该位为 1。

只有当两个对应位都是 0 时,结果的该位才是 0。

总结:都为0才为0,否则为1。

2 按位与运算

按位与运算用符号 & 表示,它对两个二进制数的每一位进行比较.

只有当两个对应位都是 1 时,结果的该位才是 1,否则为 0

3 位选

//pos = 0000 0011(后面三位是0~7),把后面三位赋予到中间的101
pos是代表为0~7,然后我们只需要管理后面这个三位的数字,然后我们的目标位置为第2,3,4这个三个位置的数字,那么就是左移4位就可以对准这三个了。

pos<<=2;
//p1 &= 111 000 11
P2 &= 0xe3;
P2 |= pos;

然后就是按位与,就是把这个对应的数字变成0,然后再按位或,就是把这三个数字赋予上去

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐