一、数码管介绍
1.1 基本定义与结构
定义:LED数码管是一种由多个发光二极管(LED)封装在一起,形成“8”字型的显示器件。它广泛用于仪表、时钟、车站、家电等场合,用于显示数字、字母或符号。
结构:LED数码管通常由8个LED构成,其中7个LED构成7笔字形,用于显示数字或字母,另1个LED构成小数点(可选)。这些LED按照一定的图形及排列封装在一起,形成完整的显示单元。
1.2 分类与接法
分类:根据电源极性的不同,LED数码管可以分为共阴极和共阳极两种类型。共阴极数码管的7段显示字码共用一个电源的负极,是高电平点亮;而共阳极数码管的7段显示字码共用一个电源的正极,是低电平点亮。
接法:无论是共阴极还是共阳极数码管,都可以通过控制各段LED的亮灭来显示相应的数字、字母或符号。在实际应用中,需要根据单片机的I/O口配置和驱动能力来选择合适的接法。本文所用的单片机是共阴极数码管。
1.3 静态显示原理
静态显示:静态显示是指每个数码管的每一个段码都由一个单片机的I/O口进行驱动,或者使用如BCD码二-十进位转换器进行驱动。这种方式的优点是编程简单,显示亮度高,但缺点是占用I/O口多。
工作原理:在静态显示模式下,单片机通过控制各段LED的亮灭来显示数字或字母。对于共阴极数码管,当某一段的LED需要点亮时,该段对应的I/O口输出高电平;对于共阳极数码管,则输出低电平。同时,为了保证数码管能够正常显示,还需要将公共极(共阴极或共阳极)连接到适当的电源或地线上。
二、原理图
2.1 原理图分析
单片机等微控制器的引脚上拉电流能力一般在20mA左右,想要直接点亮数码管、显示屏等大功率显示器件则明显不够,这时,我们用74HC245芯片来增加单片机引脚的驱动能力。该芯片的引脚上拉电流能够达到73-83mA。它的引脚有三种输出状态:高电平、低电平和高阻态。同时,有八路输入与八路输出,他的工作电压范围是3至5V。19号引脚为使能端,低电平有效所以接地。1号引脚DIR决定了数据是从A缓冲到B还是B缓冲到A,当1接VCC时,左侧A7-A0作为输入端,右侧B7-B0作为输出端。
由第二张单片机核心原理图可知A7-A0左侧接了RP8 RP12的电阻,保证74HC245芯片在没有工作时电位被稳定钳位在低电平。芯片的输出引脚直接连接数码管,这里每条线路串接了一只100Ω的电阻,这个电阻起限流的作用,根据负载的不同,我们选取不同阻值的电阻来进行限流。
动态数码管的输出端接到了74HC138译码器的输出端。 74HC138译码器主要用于选择具体点亮哪个数码管,下面是74HC138译码器的真值表 :
2.2 总结
当我们想要点亮第三个数码管(LED6),让其显示为6,则需要74HC138译码器的输出端LED1-LED8中Y5非为0,其他为1即1111 1011(注意Y0非接的是LED1),此时对应的输入端CBA(P24 P23 P22)为101;还需要让数码管的a c d e f g被点亮,即74HC245的A7-A0(P07-P00)为0111 1101(从高位往低位读),对应十六进制的的0x7D。
三、静态数码管显示实验
3.1 代码示例
3.1.1 直接赋值
#include <REGX52.H>
void main()
{
P2_4=1;
P2_3=0;
P2_2=1;
P0=0x7d;
while(1)
{
}
}
3.1.2 编写子函数——switch和数组实现
#include <REGX52.H>
unsigned char NixieTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//对应的数字0-9
void Nixie(unsigned char Location, unsigned char Number) //第一个参数决定哪个数码管被选择,第二个参数表示需要显示的数字
{
switch(Location)
{
case 1:
P2_4=1;P2_3=1;P2_2=1;break;
case 2:
P2_4=1;P2_3=1;P2_2=0;break;
case 3:
P2_4=1;P2_3=0;P2_2=1;break;
case 4:
P2_4=1;P2_3=0;P2_2=0;break;
case 5:
P2_4=0;P2_3=1;P2_2=1;break;
case 6:
P2_4=0;P2_3=1;P2_2=0;break;
case 7:
P2_4=0;P2_3=0;P2_2=1;break;
case 8:
P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];
}
void main()
{
Nixie(1,0); //第一段数码管显示数字0
while(1)
{
}
}
注: LED灯亮了是由于引脚冲突了,只需要看数码管是否显示正确即可