单片机-控制-数码管显示


常见LED数码管

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
显示数字8
显示数字6


AVR单片机控制数码管显示示例

为方便起见,下面的实验依旧是基于Arduino开发板

与上文直接通过Arduino IDE编程控制开发板稍有不同的是,在下面实验开始前,需要先看几张图:
ATmega328引脚定义及其对应关系
ATmega328p内部结构
ATmega328p内部结构

ATmega328p引脚
ATmega328p引脚

下面直接贴电路与源码,有注释:

电路连接示意
实验电路原理图

AVR C语言源码:







源码下载地址:

算了,还是不发了吧!自己懂原理了,自己写去!
看都看了,关注一下吧!
关注都关注了,分享一下吧!


    感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。

    感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。

    感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。

                禾灮,感谢有你。

    未来,我们将一如既往,砥砺前行。

                                        禾灮·小楊
                                       2018.07.07

猜你喜欢

转载自blog.csdn.net/HeGuang68207/article/details/81814542