目录

  • 前言
  • 硬件介绍
  • 原理图分析
    • 段选和位选
  • 驱动芯片
    • 74HC138芯片
    • 74HC245芯片
  • 软件实现
    • 点亮一只数码管
    • 倒计时效果
    • 动态显示字符
  • 总结

前言

本节内容我们学习如何控制数码管,先尝试点亮一个数码管,并实现倒计时效果。

硬件介绍

数码管的英文为Nixie Tube,又称辉光管LED数码管。其基本单元由LED组成,单个数码管的概念图如左图所示,一般可以分为七段数码管八段数码管两种。八段比七段多一个小数点,应用更为广泛。

除此之外,单个数码管只能显示一个数字(字母),功能受限。所以常常将多个数码管封装起来,如右图所示,常用的为4位数码管

图1 八段数码管 图2 多位数码管

数码管的发光颜色由管中充的低压气体决定,一般为加上一些汞或氩,一般为橙色或绿色。

原理图分析

数码管的电路原理图如下:

LED的连接方式可以分为共阴极数码管和共阳极数码管。

  • 共阴极:将LED的阴极连在一起称为公共阴极(COM)
  • 共阳极:将LED的阳极连在一起称为公共阳极(COM)

共阴极需要单片机IO给高电平,对应的(LED)才能点亮,而单片机的IO引脚电流输出能力不足,往往需要借助驱动芯片(如74HC245芯片)才可以点亮数码管。而共阳极只需要单片机IO给低电平,故共阳极数码管应用更加广泛。

段选和位选

在数码管中有段选位选两个概念,现阐释如下:

  • 段选:针对单个数码管而言。选择要点亮数码管中 a、b、c、d、e、f、g、dp 哪些段。一般通给IO引脚赋值实现,如0x3f。
  • 位选:针对多位数码管而言。选择点亮哪个数码管。即控制COM端的高低电平。

仔细观察数码管的段选顺序,按 a、b、c、d、e、f、g、h 逆时针排列,依次对应字节的低位至高位。因此,我们可以给出共阴极数码管字形码编码表。(有些字母不易表示,缺省)

字形码 dp g f e d c b a 十六进制
0 0011 1111 0x3f
1 0000 0110 0x06
2 0101 1011 0x5b
3 0100 1111 0x4f
4 0110 0110 0x66
5 0110 1101 0x6d
6 0111 1101 0x7d
7 0000 0111 0x07
8 0111 1111 0x7f
9 0110 1111 0x6f
A 0111 0111 0x77
b 0111 1100 0x7c
c 0101 1000 0x58
d 0101 1110 0x5e
E 0111 1001 0x79
F 0111 0001 0x71
G - -
H 0111 0110 0x76
I 0011 0000 0x30
J 0000 1110 0x0e
K - -
L 0011 1000 0x38
M - -
n 0101 0100 0x54
o 0101 1100 0x5c
p 0111 0011 0x73
q 0110 0111 0x67
r 0101 0000 0x50
s 0110 1101 0x6d
t - -
U 0011 1110 0x3e
v 0001 1100 0x1c
w - -
x - -
y 0110 1110 0x6e
z - -

如果是共阳极,其编码表刚好是共阴极的按位取反(~)。其实可以看出,数码管对显示字母不友好,一般用于显示数字,在电梯楼层显示计算器显示中应用广泛。

从上述一些系列分析中我们可以感觉到,数码管相当于LED的堆叠,它对IO口资源的消耗是巨大的。如果要同时显示多个数字,除了采用芯片(如38译码器)来节约IO口,还可以采用不同的显示方式实现。数码管有两种驱动显示方式静态显示动态显示

  • 静态显示:即每个数码管的每一个段码都由一个单片机的I/O端口进行驱动。优点编程简单显示亮度高缺点占用I/O端口过多,这显然是致命的。
  • 动态显示:利用人眼暂留效应分时轮流控制COM端(位选),每个数码管的点亮时间为1ms~2ms,因为频率很快,仿佛所有数码管都是同时点亮的,这即是动态的含义。优点节省大量IO口功耗低缺点亮度不及静态显示方式,但可以通过降低限流电阻的阻值来提高亮度。

驱动芯片

74HC138芯片

2个4位共阴极数码管74HC138芯片38译码器)原理图如下:

2个4位共阴极数码管 38译码器

将各数码管相同的段选连在一起,由 P0 统一控制,这样每个数码管显示的字符都是一样的。如何使不同数码管显示不同的字符?只需要给出位选信号指定不同的数码管点亮即可。

虽然位选端共有8个引脚,但实际上我们只需要每次点亮一个数码管,即只有8种情况,那么完全可以用3个引脚来控制这8种输出,这就是38译码器实现机理

观察38译码器原理图。其中,G1G1G1、G2‾\overline{G2}G2、G3‾\overline{G3}G3 为使能端,其中G1高电平有效,G2、G3低电平有效(即上横线的含义)。38译码器真值表

A0 A1 A2 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
0 0 0 0 1 1 1 1 1 1 1
0 0 1 1 0 1 1 1 1 1 1
0 1 0 1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1 1 1 1
1 0 0 1 1 1 1 0 1 1 1
1 0 1 1 1 1 1 1 0 1 1
1 1 0 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 0

因为是共阴极数码管,所以Y端口为低电平时该数码管被点亮。

74HC245芯片


主要用于提升单片机IO口的驱动电流。一般IO口的输出电流20mA,这个电流大小仅仅点亮一颗LED是没有问题的,但对于驱动数码管、点阵等多负载模块就力不从心了。

74HC245芯片可以将输出电流提升至70-80mA左右,具有8路输入8路输出,可输出低电平、高电平、高阻态三态。其中DIR引脚用于控制输入输出方向,高电平(A => B)、低电平(B => A)。OE‾\overline{OE}OE为使能引脚低电平输出有效。

软件实现

点亮一只数码管

#include "reg52.h"#define SMG_PORT P0//重定义数据类型
typedef unsigned char u8;
typedef unsigned int u16;//共阴极数码管字形码编码
u8 code smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66, //0 1 2 3 40x6d,0x7d,0x07,0x7f,0x6f, //5 6 7 8 90x77,0x7c,0x58,0x5e,0x79, //A b c d E0x71,0x76,0x30,0x0e,0x38, //F H I J L0x54,0x5c,0x73,0x67,0x50, //n o p q r0x6d,0x3e,0x1c,0x6e};     //s U v y  void main()
{//P0口控制数码管显示字符SMG_PORT = smgduan[14]; //Ewhile(1);
}

定义共阴极数码管字形码编码,注意这里的定义中使用了code关键字,这是C51拓展存储器类型。在标准C中,变量的定义格式

[存储类别] 数据类型 变量名 = 初值;

但在C51中,变量的完整定义格式

[存储类别] 数据类型 [存储器类型] 变量名 = 初值;

存储类别 含义 特点 存储器类型 特点
auto 自动变量 默认,在调用时赋初值,未赋则初值不确定 code 变量放在ROM(程序存储器,64KB),不可更改
static 静态变量 希望局部变量的值在调用结束后保留,下次调用时沿用当前值,而非初值 data 变量放在可直接寻址片内RAM(数据存储器,低128B),访问速度快
extern 外部变量 在一个文件内扩展变量作用域 bdata 变量放在可位寻址片内RAM(数据存储器,20H~2FH,16B)
register 寄存器变量 一般变量存储在内存中,对于频繁调用的变量,为减少内存开销,提高运算速度,可以将变量存储在CPU的寄存器中 idata 变量放在间接寻址片内RAM(数据存储器,全256B)

倒计时效果

代码如下:

#include <REGX52.H>
#define SMG_PORT P0typedef unsigned char u8;
typedef unsigned int u16;void delay(u16 t){while(t--);
}void main(){//定义共阴数码管字形码编码u8 smg_array[] = {0x3f,0x06,0x5b,0x4f,0x66, //0 1 2 3 40x6d,0x7d,0x07,0x7f,0x6f}; //5 6 7 8 9 while(1){int i;for(i=0;i<10;i++){SMG_PORT = smg_array[9-i];delay(50000);}delay(300000);}
}

效果图如下:

动态显示字符

下面,我们通过动态驱动显示的原理来显示字符I LOVE YOU

#include <REGX52.H>
#define SMG_SELECT_PORT P2 //位选端口
#define SMG_PORT P0typedef unsigned char u8;
typedef unsigned int u16;void delay(u16 t){while(t--);
}//共阴数码管码表(I LOVE YOU)
u8 code smg_array[] = {0x30,0x38,0x3f,0x3e,0x79,0x6e,0x3f,0x3e};sbit A0 = SMG_SELECT_PORT^2;
sbit A1 = SMG_SELECT_PORT^3;
sbit A2 = SMG_SELECT_PORT^4;       //位选码,利用十进制取余
void Dec2Bin(u8 i){A0 = i % 2;i /= 2;A1 = i % 2;i /= 2;A2 = i % 2;
}void main(){u8 i;while(1){for(i=0;i<8;i++){Dec2Bin(i);SMG_PORT = smg_array[7-i];delay(100); //1ms,实验测试5ms以上能察觉出闪烁SMG_PORT  = 0x00; //消除重影}}
}

硬件电路中,位选信号P2.2、P2.3、P2.4控制,借助38译码器,控制8位COM端

在程序中,我通过取余运算得到位选信号的取值,并依次赋值给各端口。当然,你也可以通过Switch语句,分别讨论8种取值情况。

比较重要的是,数码管的动态显示存在重影的问题。重影产生的本质是当位选信号发生改变时,上个数码管的段选信号这一瞬间还未发生改变,但因为这个时间极短,因此只会留下淡淡的残影。如何消影呢,只要在下个数码管被点亮前,将段选信号清除即可(熄灭)。

最终效果图如下:

总结

数码管本质就是发光二极管的封装,所以有了LED基础之后,本节内容并不难理解。继续加油吧!

【51单片机实验笔记】2. 数码管的基本控制相关推荐

  1. 【51单片机实验笔记】1. LED的初级控制

    目录 前言 硬件介绍 单色LED 封装形式 正负极判断 双色LED 三色LED 七彩自动闪烁LED(内置IC) 原理图分析 软件实现 点亮一颗LED 方法一 方法二 LED闪烁 流水灯 跑马灯 方法一 ...

  2. 51单片机学习笔记-2数码管显示

    2 数码管显示 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github仓 ...

  3. 51单片机学习笔记之数码管工作原理

    昨天我们学习了按键的基本操作,今天我们来学习一下数码管的工作原理,如果觉得我博客更新的太快,没有关系,大家可以回顾我往期的博客,利用课下时间到社团补习,如果我博客哪里有写的不好的地方,大家也不用想太多 ...

  4. 【51单片机实验笔记】3. LED点阵的基本控制

    目录 前言 硬件介绍 驱动芯片 74HC595芯片 MAX7219芯片 原理分析 软件实现 爱心图片 旋转大风车 滚动日期 螺旋线动画 LED点阵功能函数封装 总结 前言 本章接触的硬件依然与LED息 ...

  5. 51单片机学习笔记之数码管1显示数字0以及使用蜂鸣器

    首先我们还是先定义数码管的引脚,打开原理图,我们将数码管的位选引脚初始化一下. 然后我们打开数码管1的总开关,关掉其余的三个数码管,不懂什么意思看我上一篇博客,下面是链接:https://blog.c ...

  6. 【51单片机实验笔记】4. 蜂鸣器与扬声器的基本控制

    目录 前言 硬件介绍 PWM基础 蜂鸣器简介 扬声器简介 原理图分析 蜂鸣器驱动电路 扬声器驱动电路 软件实现 蜂鸣器短鸣 蜂鸣器功能封装 总结 前言 蜂鸣器和扬声器在生活中的应用实则相当广泛.通过本 ...

  7. 单片机实验四-七段数码管及键盘控制

    动态显示0-15 ORG 0100HLCALL INIT START:MOV P1,#00H ;控制哪个7段数码管显示MOV R0,#16MOV R1,#30H;LOOP0:MOV P2,@R1;IN ...

  8. 单片机实验笔记(汇编、Proteus仿真)(下)

    接上一条单片机实验笔记(汇编.Proteus仿真) 第五节课 第五节课 内容为驱动多位数码管.和驱动一位数码管大同小异. ORG 0000H LJMP MAINORG 0100H MAIN: MOV ...

  9. 单片机实验笔记(汇编、Proteus仿真)

    实验基础 51单片机 本门课程硬件平台为ATMEL公司的AT89C52单片机,在Proteus软件进行仿真实验. 51单片机是8位单片机.8k ROM .256bytes RAM.四个8位并行I/O口 ...

最新文章

  1. 图像配准----SIFT
  2. php time相差12小时_优化你的PHP代码,从现在做起
  3. (转)Spring中Singleton模式的线程安全
  4. apriori算法c++_使用Apriori进行关联分析
  5. VC++ 使用TeeChart图表控件(1)
  6. 数据中心人员短缺,行业仍然充满挑战
  7. 产线数字化软件源码_数字化工厂规划的十大核心要素
  8. Git中Add后对部分文件进行取消
  9. python selenium循环判断元素是否存在_检查Python Selenium是否存在元素
  10. 软件本地化 pdf_软件本地化与标准翻译
  11. 十行代码实现十亿图片检索,我们把它开源了
  12. 红帽RHCE培训-课程3笔记内容2
  13. 广东省计算机应用专业综合理论知识,(计算机应用技术专业综合理论考试说明.doc...
  14. 线程的同步互斥之事件对象(Event)
  15. Linux程序设计 清空标准输入缓冲区
  16. 算法设计与分析第五章习题解答与学习指导(第2版)屈婉婷 刘田 张立昂 王捍贫编著 清华大学出版社
  17. c语言编程题蓄水池,C语言中蓄水池抽样
  18. PPT组合图——如何等比例缩放
  19. Windows+cygwin下构造arm-linux交叉编译环境最简单的方法
  20. python数据函数定义的规则是什么_Python自定义函数基础概念

热门文章

  1. Unity旋转值Quaternion交换旋转轴
  2. vue部分面试题分享
  3. 一文全面了解光纤连接器
  4. 深度学习框架量化感知训练的思考及OneFlow的解决方案
  5. EBS中AP发票分配行的解释
  6. 臻米脱糖电饭煲,古法先煮后蒸,实现低糖生活
  7. 树莓派4B通过网线连接笔记本上网
  8. 《出版专业基础》2015年版(初级)思考与练习 第八章
  9. 产品经理的战争:“产品已死 还是产品为王”?
  10. 如何写网络营销用的成功案例文章