常见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

c语言控制数码管显示时间,单片机 控制 数码管显示相关推荐

  1. 微信小程序showToast在真机中显示时间不可控制,显示时间短

    现象: 使用uniapp开发微信小程序,使用showToast,设置duration来控制提示展现时长,发现在微信开发者工具正常,在真机中显示时间比较短,并且设置duration不生效. 原因: 排查 ...

  2. python如何显示时间_如何让python显示当前时间(东部)

    如果您需要大量时区,则应使用pytz包,并且需要正确处理夏令时的重复小时(即从午夜到凌晨1点发生的情况). 对于简单的事情,创建自己的时区类很容易: import datetime class EST ...

  3. 51c语言数码管编程,51单片机的数码管循环显示编程实例

    要求在数码管上循环显示数字 1-5. 范例分析: 1.1硬件分析 数码管采用共阳极结构. 1.2软件设计 设计中要求循环显示1-5,很显然应采用循环的方法来实现,最简单的方法是将1-5的段码依次由p0 ...

  4. 单片机c语言pwm整流的程序,基于 单片机控制PWM整流电源的设计.doc

    PAGE \* MERGEFORMAT II 摘??? 要 本文介绍了用PWM实现直流电机调整的基本方法.本文在给出直流电机调整和PWM实现方法的基础上,提供一种用单片机软件实现PWM调速的方法,以及 ...

  5. Extjs显示时间兼容性问题——firefox正常显示,IE不正常出现NaN-NaN-NaN的解决方式...

    1.格式化时间导致的问题 firfox.IE都 正常显示: {          header: "入住时间",          dataIndex: "LiveTim ...

  6. php代码时间控制,PHP 网页过期时间的控制代码

    当然,前提要先打开CDN中一个功能reload_into_ims on.这样用户发送过来no-cache也不怕了.因为这样会给给no-cache转成If-Modified-Since .所以我们写程序 ...

  7. 怎样在html中显示时间,如何在网页上显示当前时间

    最近做的页面中有需要在页面直接显示当前时间的功能,一开始不知道怎么实现,后来经过查找资料来实现了该功能.虽然用过该功能的人会觉得很简单,但是在这里还是想总结出来,可以供不熟悉的人参考一下. 具体实现代 ...

  8. sublime运行python只显示时间_sublime3-python 编译运行不显示内容

    sublime链接:https://pan.baidu.com/s/162fVnVIwwl6UkAkzIHUwDQ  提取码:6g57 运行sublime_text.exe,在执行编译python时, ...

  9. 单片机的停车场计数系统c51_基于51单片机控制的自动停车收费管理系统

    4.1硬件设置 本控制中心采用89C51单片机系统.因为系统所需存储容量不大,所以只使用89C51的内部RAM即可,不需要外扩RAM.该单片机采用上电与按钮复位电路,内部时钟频率为12MHz,通过软件 ...

最新文章

  1. BC:带你温习并解读《中国区块链技术和应用发展白皮书》—国内外区块链发展现状
  2. wxWidgets:wxArchiveIterator类用法
  3. Sino Global Capital CEO:Robinhood暂停GME股票交易凸显了DeFi的重要性
  4. The type 'System.Object' is defined in an assembly that is not referenced
  5. 「THUSC 2016」成绩单 方块消除 (区间dp)
  6. 最简单例子图解JVM内存分配和回收(转)
  7. 过拟合和欠拟合_TensorFlow教程-过拟合和欠拟合
  8. Microsoft SQL Server 2005安装
  9. HeadFirst 设计模式
  10. 如何编译python源代码
  11. 明解C语言(入门篇)第十一章
  12. 大数据新闻推送你怎么看_如何看待大数据精准推送,使人的视界越来越窄?
  13. 变点理论CUSUM在择时交易中的应用
  14. Linux系统配置及服务管理_02章_文件和用户管理
  15. 远场(far-field)语音识别的主流技术有哪些
  16. 离散数学-3 命题逻辑的推理理论
  17. 多任务多目标 CTR 预估技术
  18. 文章《Deep Image Homography Estimation》
  19. 今日踩坑Maven:omitted for duplicate
  20. vue面试题(自用)

热门文章

  1. 知识图谱从入门到应用——知识图谱的技术结构
  2. Git命令: rebase 和 squash命令
  3. 最近调试HEVC中码率控制, 发现HM里面一个重大bug
  4. 几何原本译林pdf下载_《几何原本》欧几里得_文字版_pdf电子书下载
  5. 关于 JS 中,实现在异步代码执行完毕再执行后续代码
  6. 解决佳能MG3080、MG2980打印机报错5B00无法打印的问题
  7. 掌门1对1《啊呜!卡通人》引强烈共鸣 智能科技赋能高效教学收获点赞
  8. 2018.07.12【2018提高组】模拟B组 【NOIP2015模拟10.27】魔法阵
  9. android入门实例!一线互联网移动架构师NDK模块开发!看这一篇就够了!
  10. IP地址(简单模拟)