一、数码管的结构
数码管是一种半导体发光器件,其基本单元是发光二极管。一般的数码管由组成数字的七段二极管以及一个小数点构成,一共是八段,分别用a,b,c,d,e,f,g,dp来表示。通过选择数码管上的二极管,既可以显示需要的字符,这些二极管所对应的数码组合就称为段码。 按二极管单元的连接方式,可分为共阳极和共阴极数码管。
- 共阳极数码管:是指将所有二极管的阳极接到一起形成公共阳极(COM)。在使用时,需要将想要显示的字符对应的二极管的阴极设置成低电平,其余二极管为高电平,从而显示相应的字符;
- 共阴数码管:与共阳极数码管相反,是将所有的阴极接到一起形成公共阴极(COM)。使用时,对应字段应为高电平。
按照可以显示的位数分,又可以分为一位、两位、三位、四位…… 单片机上常用的是由两个四位数码管组合成的八位数码管,每个四位数码管的公共端(COM)都独立分开,称为为选段,可以根据需要,只使用其中的某一位数码管进行显示,也可以一起显示。 同时,为了节省I/O口,常常会令四个数码管共用同一个段码端。因此,当进行数据显示的时候,所有的数码管接受的都是同样的数据。
二、数码管的动态驱动显示方式
由于电路中所有的数码管的8个字段的同名段连在一起,使得它们在同一时间只能显示相同的字符。因此,常采用动态驱动的方式对数码管进行控制,该方法利用了视觉暂留现象和发光管的余辉现象,尽管各位数码管并非同时点亮,只要间隔的时间足够短,就会在人眼中看到稳定的数据。这样一来,既能够节省I/O端口,同时又能保证显示效果。
三、数码管的驱动电路
在单片机电路中,想要驱动数码管需要用到两大模块,分别是:动态数码管模块和74HC138译码器。 在动态数码管模块中,有一块芯片叫做74HC25,这个芯片的作用是进行数据的传送,当它的DIR端接入高电平时,可以将左侧的数据输出到右侧,而当它接入低电平时,则会将右侧的数据读取到左侧。 通过使用这个芯片,可以将左侧的较微弱的控制信号进行放大,从增强对数码管的驱动能力。
74HC138的作用主要是操控数码管的位选端,通过从左侧的输入端A、B、C(权重C>B>A),将其转化为十进制的数据,从右侧对应的输出端输出(对应输出为低电平0,其余为1)。 同时,通过使用138译码器,可以减少I/O口的数量,将原本的8的口缩减为3个口。
四、代码
1. 单个显示数码管
#include <regx52.h>
void main()
{
P2_2=0;P2_3=0;P2_4=0;
P0=0x06;
while(1)
{
}
}
2. 多个数码管动态显示
#include <regx52.h>
unsigned char NixieDic[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void DelayXms(unsigned char xms)
{
unsigned char i,j;
while(xms--)
{
i=2;j=239;
do
{
while(--j);
}while(--i);
}
}
void NixieTube(unsigned char location,number)
{
switch(location)
{
case 1:P2_2=0;P2_3=0;P2_4=0;break;
case 2:P2_2=1;P2_3=0;P2_4=0;break;
case 3:P2_2=0;P2_3=1;P2_4=0;break;
case 4:P2_2=1;P2_3=1;P2_4=0;break;
case 5:P2_2=0;P2_3=0;P2_4=1;break;
case 6:P2_2=1;P2_3=0;P2_4=1;break;
case 7:P2_2=0;P2_3=1;P2_4=1;break;
case 8:P2_2=1;P2_3=1;P2_4=1;break;
}
P0=NixieDic[number];
DelayXms(1);
}
void main()
{
while(1)
{
NixieTube(1,1);
NixieTube(2,2);
NixieTube(3,3);
}
}
|