动态数码管


动态数码管实验

一、数码管介绍

数码管是一种半导体发光器件,其基本单元是发光二极管。

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

一位数码管图片

二、数码管显示原理

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

多位数码管的静态显示:

想要点亮一个数码管并让其显示数字,我们需要操作两个端口,给两个端口不同的电平。51单片机数码管上端是2个四位一体的共阴极数码管,即 8 位数码管的段选数据 a-dp 全部并联一起引出,每位数码管的位选即公共端引出,所以发光的条件是上端赋予低电平,下端赋予高电平。

特征:

1.只显示一位数码管

2.多位同时显示相同内容

多位数码管的动态显示:

利用减少段选线,分开位选线,利用位选线不同时选择通断,改变段选数据来实现的。

简单来说,段选用来控制数码管的笔画,也就是数码管显示的内容(数字或者字符);位选用于控制多个数码管中的一个或几个数码管是否显示数字或字符。

三、数码管的动态显示

1.数码管依次轮流显示不同的数字

这个比较简单,只需要分别通过位选线和段选线显示不同的数码管以及数码管所对应的内容。

2.数码管同时显示不同的数字

只需要先将数码管依次轮流显示不同的数字,然后修改延时时长,相当于让每位数码管依次显示且循环显示,假如这个过程很短,位选线信号和段选线信号变化很快,人眼难以捕捉数码管显示的快速变化(人眼的视觉滞留效应,人的肉眼正常情况下只能分辨变化超过 24ms 间隔的运动。)

四、实验过程

实现功能:控制动态数码管从左至右显示20031129(我的生日)。

我使用的单片机是2个四位一体的共阴数码管组成,即8位数码管的段选数据 a-dp 全部并联一起引出,每位数码管的位选即公共端引出。数码管的段选 a-dp 连接在 74HC245 驱动芯片输出口,由 P0 端口控制。由 P2.2、P2.3、P2.4 管脚控制 74HC138 译码器输入从而控制数码管位选。

实验代码

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"
typedef unsigned int u16;
typedef unsigned char u8;

#define SMG_PORT P0//宏定义数码管段码口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//定义数码管位选信号控制脚

u8 gsmg_code[8]={0x5b,0x3f,0x3f,0x4f,0x06,0x06,0x5b,0x6f};//共阴极数码管显示 20031129 的段码数据

void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//延时函数

void smg_display(void)
{
u8 i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case 0: LSC=1;LSB=1;LSA=1;break;
case 1: LSC=1;LSB=1;LSA=0;break;
case 2: LSC=1;LSB=0;LSA=1;break;
case 3: LSC=1;LSB=0;LSA=0;break;
case 4: LSC=0;LSB=1;LSA=1;break;
case 5: LSC=0;LSB=1;LSA=0;break;
case 6: LSC=0;LSB=0;LSA=1;break;
case 7: LSC=0;LSB=0;LSA=0;break;
}//即选中所要显示的那位数码管,共8个数码管
SMG_PORT=gsmg_code[i];//传送段选数据,同时依次输出20031129
delay_10us(100);//延时一段时间,等待显示稳定
SMG_PORT=0x00;//消音
}
}

void main()
{
while(1)
{
smg_display();
}
}//written by andy

五、实验现象

通过改变延时函数的数据,我们可以在数码管上实现依次轮流显示20031129,也可以实现8个数码管同时显示20031129。


文章作者: Andy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Andy !
  目录