LED数码管(LED Segment Displays)简介
数码管也称LED数码管,是由多个发光二极管封装在一起的“8”字型的器件。
按发光二极管单元连接方式可分为`共阳极数码管`和`共阴极数码管`。
共阳数码管
是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到高电平,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管
是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
led数码管广泛应用于仪表、时钟、车站、家电等场合。常用段数一般为7段,有的另加一个小数点,当然也可以完全定制。选用时应注意产品尺寸颜色、功耗、亮度、波长等。
驱动电路
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
静态显示驱动
静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
动态显示驱动
数码管动态显示是单片机中应用最为广泛的显示方式之一.
动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
Arduino控制数码管显示示例
今天实验中要用的数码管型号为:5161AS,是一款0.56英寸的红色共数码管 。
首先需要说明的是:数码管和发光二极管一样,需要添加限流电阻。
限流电阻的具体阻值与数码管击穿电压有关。
加限流电阻的两种方法:
当然,各有利弊:
- 串联在公共端可以节省元件。但数码管显示不同数字时发光亮度不一致(此时电阻分压),显示小数点Dp时最亮,显示8.时最暗。
- 在笔划"a,b,c,d,e,f,g,dp"对应引脚上分别串联限流电阻,虽元件消耗较多,但可以保证显示亮度相同。
本次实验选择330Ω限流电阻,和5.0V供电。电路如下:
依据发烟测试原则,咱们通过Arduino从最简单的程序入手,实现显示功能:
/* Main.ino file generated by New Project wizard
* Designer: 禾灮
* Created: 周六 7月 7 2018
* Processor: Arduino Uno
* Compiler: Arduino AVR (Proteus)
*/
// Define Function Prototypes that use User Types below here or use a .h file
//
//设置数码管A接口
int a = 2;
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 7;
int g = 8;
//设置调整变量
unsigned long ChangeTime;
int n;
// Define Functions below here
//
void ClearLEDs(){ //定义ClearLEDs(),其作用是清屏
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void PickNumber(int x){ //定义PickNumber(x),其作用是显示数字x
switch(x){
default:
zero();
break;
case 1:
one();
break;
case 2:
two();
break;
case 3:
three();
break;
case 4:
four();
break;
case 5:
five();
break;
case 6:
six();
break;
case 7:
seven();
break;
case 8:
eight();
break;
case 9:
nine();
break;
}
}
void zero(){ //定义数字0
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
}
void one(){ //定义数字1
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void two(){ //定义数字2
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
void three(){ //定义数字3
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
void four(){ //定义数字4
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void five(){ //定义数字5
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void six(){ //定义数字6
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void seven(){ //定义数字7
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void eight(){ //定义数字8
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void nine(){ //定义数字9
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void ShowLED(int x){ //定义ShowLED(x),其作用是显示数字0~x,每个数字显示时间300ms
n = x;
while(n >= 0){
ClearLEDs();
ChangeTime = millis();
while((millis() - ChangeTime) < 300){
PickNumber(n);
}
n--;
}
delay(1000);
}
void setup(){ // put your setup code here, to run once:
//数码管
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
ClearLEDs();
}
void loop(){ // put your main code here, to run repeatedly:
ShowLED(9); //所有数码管同时显示数字0~9,每个数字显示时间300ms
}
//——————————————————————————————————————————————————————————————————————————
上面的代码可以让数码管依次显示数字0-9
AVR单片机控制数码管显示示例
为方便起见,下面的实验依旧是基于Arduino开发板
与上文直接通过Arduino IDE编程控制开发板稍有不同的是,在下面实验开始前,需要先看几张图:
下面直接贴电路与源码,有注释:
电路连接示意
AVR C语言源码:
源码下载地址:
算了,还是不发了吧!自己懂原理了,自己写去!
看都看了,关注一下吧!
关注都关注了,分享一下吧!
感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。
感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。
感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。
禾灮,感谢有你。
未来,我们将一如既往,砥砺前行。
禾灮·小楊
2018.07.07