数码管介绍

多位数码管简介

  多位数码管,即两个或两个以上单个数码管并列集中在一起形成一体的数码管。当多位一体时,它们内部的公共端是独立的,而负责显示什么数字的段线(a-dp)全部是连接在一起的,独立的公共端可以控制多位一体中的哪一位数码管点亮,而连接在一起的段线可以控制这个能点亮数码管亮什么数字,通常我们把公共端叫做“位选线”,连接在一起的段线叫做“段选线”,有了这两个线后,通过单片机及外部驱动电路就可以控制任意的数码管显示任意的数字了。

数码管动态显示原理

  多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,要么多位同时显示相同内容。当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,送入所有数码管的段选信号都是相同的,所以它们显示的数字必定一样,数码管的这种显示方法叫做静态显示。

  而动态显示,就是利用减少段选线,分开位选线,利用位选线不同时选择通断,改变段选数据来实现的。比如在第一次选中第一位数码管时,给段选数据0,下一次位选中第二位数码管时显示1。为了在显示1的时候,0不会消失(当然实际上是消失了),必须在人肉眼观察不到的时间里再次点亮第一次点亮的0。而这时就需要记住,人的肉眼正常情况下只能分辨变化超过24ms间隔的运动。也就是说,在下一次点亮0这个数字的时间差不得大于24ms。这时就会发现,数码管点亮是在向右或者向左一位一位点亮,形成了动态效果。如果把间隔时间改长就能直接展现这一现象。

芯片介绍

  ,要使单片机能控制开发板上2位一体的共阴数码管显示,仅靠单片机IO口来驱动是不行的,这里就需要增加外部驱动芯片,开发板上使用的是74HC245芯片。2个4位一体的共阴数码管的位选线有8根,直接让单片机IO口控制是没有任何问题的,但考虑到51单片机IO口资源的限制,通常我们会使用一种IO扩展芯片,比如74HC138、74HC164、74HC595芯片等,只需要很少的单片机IO口就可以扩展出8个控制口,通过级联方式甚至可扩展出更多的控制口。我们开发板上使用的是74HC138译码器芯片,只需单片机3个IO口就可以实现8个位选管脚的控制,节省了芯片的IO资源。

74HC245

  74HC245 是一种三态输出、八路信号收发器,主要应用于大屏显示,以及其它的消费类电子产品中增加驱动。

  • 主要特性
    1. 采用CMOS工艺
    2. 宽电压工作范围:3.0V-5.0V
    3. 双向三态输出
    4. 八线双向收发器
    5. 封装形式:S0P20、S0P20-2、TSS0P20、DIP20
  • 管脚说明
    |符号|管脚名称|管脚号|说明|
    |—|---|—|---|
    |A0-A7|数据输入/输出|2-9||
    |B0-B7|数据输入/输出|18-11|
    |OE|输出使能|19||
    |DIR|方向控制|1|DIR=1,A→B;DIR=0,B→A|
    |GND|逻辑地|20|逻辑地|
    |VDD|逻辑电源|10|电源端|
管脚定义
功能真值表

  从上面的管脚功能定义说明及真值表可以知道该芯片使用方法很简单,给OE使能管脚低电平,DIR管脚为高电平传输方向是A->B输出,DIR为低电平传输方向是B->A,至于输出高电平还是输出低电平取决于输入端的状态,如果输入为低电平,输出即为低;输入为高电平,输出即为高。如果OE使能管脚为高电平,不论DIR管脚是高还是低,输出是高组态。

通常我们使用74HC245芯片用作驱动只会让其在一个方向输出,即DIR管脚为高电平,传输方向是A->B。

74HC138

  74HC138D 是一种三通道输入、八通道输出译码器,主要应用于消费类电子产品。

  • 主要特性
    1. 采用CMOS工艺
    2. 低功耗
    3. 工作电压:3.0V-5.0V
    4. 封装形式:S0P16
  • 管脚说明
    |名称|功能说明|管脚号|
    |—|---|—|
    |Y0-Y6,Y7|数据输出|15-9,7|
    |A0-A2|数据输入|1-3|
    |E1、E2、E3|使能控制|4-6|
    |VDD|逻辑电源|16|
    |GND|逻辑地|8|
管脚功能定义
真值表

  从上面的管脚功能定义说明及真值表可以知道该芯片使用方法很简单,给E1、E2 使能管脚低电平,E3管脚为高电平,至于哪个管脚输出有效电平(低电平),要看A0,A1,A2输入管脚的电平状态。如果A0,A1,A2都为低电平,则 Y0 输出有效电平(低电平),其他管脚均输出高电平。如果A0为高电平,A1,A2 都为低电平,则Y1输出有效电平(低电平),其他管脚均输出高电平。其他几种输出大家可以对照真值表查看。如果E1、E2使能管脚任意一个为高电平或者E3为低电平,不论输入是什么,输出都为高电平

A0、A1、A2输入就相当于3位2进制数,A0是低位,A1是次高位,A2是高位。而Y0-Y7具体哪一个输出有效电平,就看输入二进制对应的十进制数值。比如输入是101(A2,A1,A0),其对应的十进制数是5,所以Y5输出有效电平(低电平)。

硬件设计

  本实验使用到的硬件资源如下:

  1. 动态数码管模块
  2. 74HC138

软件设计

  本章所要实现的功能是:控制动态数码管从左至右显示数字0-7。

实物接线图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "reg52.h"

// 使用宏定义数码管段码口
#define SMG_A_DP_PORT P0

// 对系统默认数据类型进行重命名
typedef unsigned int u16;
typedef unsigned char u8;

// 定义数码管位选信号控制脚
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};

void delay_10us(u16 ten_us)
{
while(ten_us--);
}

void main()
{
u8 i = 0;
while(1)
{
for(i = 0;i < 8;i++)
{
switch(7 - i)
{
case 0: LSC = 1;LSB = 1;LSA = 1;break; // 111 = Y7
case 1: LSC = 1;LSB = 1;LSA = 0;break; // 110 = Y6
case 2: LSC = 1;LSB = 0;LSA = 1;break; // 101 = Y5
case 3: LSC = 1;LSB = 0;LSA = 0;break; // 100 = Y4
case 4: LSC = 0;LSB = 1;LSA = 1;break; // 011 = Y3
case 5: LSC = 0;LSB = 1;LSA = 0;break; // 011 = Y2
case 6: LSC = 0;LSB = 0;LSA = 1;break; // 001 = Y1
case 7: LSC = 0;LSB = 0;LSA = 0;break; // 000 = Y0
}

SMG_A_DP_PORT = gsmg_code[i]; // 传送段选数据
delay_10us(100); // 延时一小段时间,等待显示稳定
SMG_A_DP_PORT=0x00; // 消影(清除之前的显示)
}
}
}