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

这篇具有很好参考价值的文章主要介绍了【51单片机实验笔记】2. 数码管的基本控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

本节涉及到的封装源文件可在《模块功能封装汇总》中找到。

本节完整工程文件已上传GitHub,仓库地址,欢迎下载交流!


硬件介绍

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

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

【51单片机实验笔记】2. 数码管的基本控制图1 八段数码管
【51单片机实验笔记】2. 数码管的基本控制图2 多位数码管

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


原理图分析

数码管的电路原理图如下:
【51单片机实验笔记】2. 数码管的基本控制
LED的连接方式可以分为共阴极数码管和共阳极数码管。

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

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

:由于每段都是由LED组成,故实际电路中应该串联限流电阻,一般接一个8P排阻


段选和位选

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

  • 段选:针对单个数码管而言。选择要点亮数码管a、b、c、d、e、f、g、dp 哪些段。一般通过给 IO 引脚赋值实现。
  • 位选:针对多位数码管而言。选择点亮哪个数码管。即控制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口功耗低缺点亮度不及静态显示方式,但可以通过降低限流电阻的阻值来提高亮度。

驱动芯片

我们需要清楚一点,单片机适合用于控制,它可以输入输出电平,但电流是很小的。或许单片机驱动单独一个LED是足够的,但当LED数量多起来时,它便无能为力了,更别提驱动大功率灯泡或是电机了。

这些功率比较大的外设往往需要外接电源,通过驱动芯片来提供电流能量,单片机提供信号指令


74HC138芯片

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

【51单片机实验笔记】2. 数码管的基本控制2个4位共阴极数码管
【51单片机实验笔记】2. 数码管的基本控制38译码器

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

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

观察38译码器原理图。其中, G 1 G1 G1 G 2 ‾ \overline{G2} G2 G 3 ‾ \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芯片

【51单片机实验笔记】2. 数码管的基本控制
主要用于提升单片机 IO 口驱动电流。一般 IO 口输出电流20mA,这个电流大小仅仅点亮一颗LED是没有问题的,但对于驱动数码管点阵多负载模块就力不从心了。

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


软件实现

点亮一只数码管

#include "REGX52.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 4
					 0x6d,0x7d,0x07,0x7f,0x6f, //5 6 7 8 9
					 0x77,0x7c,0x58,0x5e,0x79, //A b c d E
					 0x71,0x76,0x30,0x0e,0x38, //F H I J L
					 0x54,0x5c,0x73,0x67,0x50, //n o p q r
					 0x6d,0x3e,0x1c,0x6e};     //s U v y  

void main()
{
	//P0口控制数码管显示字符
	SMG_PORT = smgduan[14]; //E
	while(1);
}

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

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

存储类别 含义 特点
auto 自动变量 默认类型。(生存期)属于动态局部变量,调用时临时分配内存,函数调用结束即释放。(初值分配)在调用时赋初值,未赋初值则初值不确定。(作用域)仅在函数体内可调用。
static 静态变量 生存期) 属于静态局部(全局)变量,调用结束后保留当前值。(初值分配)只在编译时赋初值,默认赋0'\0'。 (作用域静态局部变量仅在函数体内可调用,静态全局变量本文件中可调用。
extern 外部变量 外部声明数据类型可省略扩展变量作用域,实现跨文件调用。
register 寄存器变量 将变量存储在CPU的寄存器中,减小内存开销

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

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

存储器类型 特点
code 变量放在ROM(程序存储器,64KB),不可更改
data 变量放在可直接寻址片内RAM(数据存储器,低128B),访问速度快
xdata 变量放在间接寻址片外RAM(数据存储器,全64KB)
bdata 变量放在可位寻址片内RAM(数据存储器,20H~2FH,16B)
idata 变量放在间接寻址片内RAM(数据存储器,全256B)
pdata 变量放在间接寻址片外RAM(数据存储器,低128B)

单片机的ROM一般比RAM大很多(STC89C52单片机ROM8KBRAM256个字节),所以一些硬编码数据(比如字形库数据)可以放在ROM区,以节省片内RAM资源


倒计时效果

代码如下:

#include <REGX52.H>
#define SMG_PORT P0

typedef 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 4
					 0x6d,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(60000);
	}
}

效果图如下:
【51单片机实验笔记】2. 数码管的基本控制


动态显示字符

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

#include <REGX52.H>
#define SMG_SELECT_PORT P2 //位选端口
#define SMG_PORT P0

typedef unsigned char u8;
typedef unsigned int u16;

//共阴数码管码表(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 delay(u16 t){
	while(t--);
}			
		 
//位选码,利用十进制取余
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); //给38译码器赋值
			SMG_PORT = smg_array[7-i];
			delay(100); //1ms,实验测试5ms以上能察觉出闪烁
			SMG_PORT  = 0x00; //消除重影
		}
	}
}

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

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

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

最终效果图如下:
【51单片机实验笔记】2. 数码管的基本控制


总结

基于延时实现的数码管动态刷新两个重要的时间

  1. 每个位选停留的时间t1
  2. 两次整体动态刷新之间的间隔t2

我们现在总结一下两个时间长短数码管显示的影响。

  • t1比较时,数码管逐位点亮的频率变慢人眼会明显察觉出闪烁。由于每个位停留时间比较,所以数码管比较
  • t1比较时,数码管逐位点亮的频率变快人眼无法察觉出闪烁。由于每个位停留时间比较,所以数码管比较
  • t2比较时,数码管整体刷新点亮的频率变慢人眼会明显察觉出整体闪烁
  • t2比较时,数码管整体刷新点亮的频率变快人眼无法察觉出整体闪烁

t1可以在程序中手动调节合适的值。而t2则由程序其他代码量决定,如果其他程序耗时太长,导致t2变大数码管将发生严重闪烁

当然,t2弱点将在中断篇彻底消除,那时我们将用最佳方式刷新数码管

数码管本质就是发光二极管的封装,所以有了LED基础之后,本节内容并不难理解。继续加油吧!文章来源地址https://www.toymoban.com/news/detail-422793.html

到了这里,关于【51单片机实验笔记】2. 数码管的基本控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习C51单片机——矩阵按键控制数码管显示数字(学习笔记Keil5)

    单片机检测矩阵按键是否被按下的依据是检测与该按键对应的 I/O 口是否为低电平

    2024年04月17日
    浏览(46)
  • 51单片机数码管

    51单片机的数码管是一种常用的数字显示设备,用于在嵌入式系统中显示数字和一些特定的符号。数码管通常由七段LED组成,每个LED段可以显示数字0到9以及一些字母和符号。通过控制每个LED段的亮灭,可以显示不同的数字和字符。 在51单片机中,数码管通常连接到GPIO(通用

    2024年01月21日
    浏览(48)
  • 51单片机(四)静态数码管和动态数码管显示

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(44)
  • 【51单片机】动态数码管

    0、前言 参考: 普中51单片机开发攻略–A2.pdf 上一章我们主要是介绍一位数码管的内部结构及控制原理。下面我们再来介 绍下多位数码管及动态显示原理的相关知识。 本章所要实现的功能是:控制动态数码管从左至右显示数字 0-7。 为了正规点,工程弄个正规文件夹: http

    2024年01月21日
    浏览(67)
  • 51单片机(数码管可调时钟)

    1.数码管(共阴极)如何显示数字:位选+段选(单个) 位选:138译码器通过P22、P23、P24三个端口输入二进制数(011、000等)来选择连同译码器右边的哪一条线,而这些线又分别连着数码管的LED12345678、决定选择哪一个来显示数字 段选:决定输出什么数字,数码管下方又连着一

    2024年02月05日
    浏览(46)
  • 51单片机静态数码管显示

    51单片机静态数码管显示 数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件。   数码管从上右下左中有ABCDEFGDP,共10个引脚,其中3、8号引脚是连接到所有二极管的阴极,A二级管对应7号和38号引脚,B二极管对应6号和38号引脚。所有阴极

    2024年02月08日
    浏览(67)
  • 51单片机数码管显示(三)

    目录 一、静态数码管显示 1、一位数码管 (1)LED数码管各段名称 (2)数码管引脚定义 (3) 共阴极(89C52RC单片机LED数码管采用共阴极方式) (4)共阳极 2、四位一体数码管 (1)四位一体数码管引脚定义 (2)上面共阴极和下面共阳极  3、数码管模块原理图详解 4、编写

    2024年02月08日
    浏览(40)
  • 二、51单片机控制数码管

    (1)数码管的外观: 数码管可分为单个的,联排的(2位、4位、8位) (2)数码管的作用: 数码管是显示器件,是用来显示数字的。 (1)数码管的亮灭是由内部的照明LED的亮灭实现的。 (2)一位数码管内部有八颗LED灯,利用内部的LED灯的亮和灭让数码管显示不同的数字。 (1)驱动方法的

    2023年04月09日
    浏览(45)
  • 51单片机入门————数码管显示

    我们在马路上看到的红绿灯,就是由数码管来实现的,就是其中可能加入了一些延时和转换 数码管是通过控制138译码器与74HC245来控制数码管的亮灭与数字的显示 我们先讨论一个数码管 数码管有共阳极和共阴极,我们现在使用的STC89C52是共阴极的,说明数码管共用阴极 上面是

    2024年02月13日
    浏览(42)
  • 51单片机数码管显示0-9

    初级代码:使用延时函数,延时; 进阶代码:使用定时器,延时:51单片机定时器控制数码管显示_学习笔记吧的博客-CSDN博客 初级代码: 电路接线图:  

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包