单片机零基础入门(8-1)学会单片机数码管,这篇文章就够了,一文吃透数码管---数码管如何定义引脚?数码管如何驱动?驱动方式有哪些?单片机中的译码器和缓冲器又是什么?数码管段码表

一、回顾

上篇文章,我写了:单片机零基础入门(7):解决独立按键抖动的问题,单片机零基础入门(8-1)学会单片机数码管,这篇文章就够了,一文吃透数码管—数码管如何定义引脚?数码管如何驱动?驱动方式有哪些?单片机中的译码器和缓冲器又是什么?。
为什么要写(8-1),因为还有(8-2),(8-3)等,后面的文章写用数码管实现的小项目。


声明:本文为原创内容,转载需声明来源,地址。
声明:本文为原创内容,转载需声明来源,地址。


二、本章知识点

1、什么是数码管?

百度百科如下:(截取部分)

数码管,也称作辉光管,是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极。大部分数码管阴极的形状为数字。数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字。

可以这样理解:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件。
生活中常见的数码管,例如:红绿灯。
在这里插入图片描述


2、数码管引脚的定义?

(1)数码管的形状:

在这里插入图片描述


(2)数码管的引脚定义:

图1:数码管的笔端
在这里插入图片描述
图1为一个数码管的笔端图,笔端分为A、B、C、D、E、F、G、DP 8段,也就是由8个LED组成的,点亮前7段既可点亮一个数字,DP一般用于表示小数点。


图2:单个数码管的连接方式
在这里插入图片描述
图2为一个数码管的连接方式,图2中,上面一个为共阴极连接,下面一个为共阳极连接。
(PS:上图为个人手工绘制,略丑,勿嫌弃!)


三、数码管的连接方式:

1、什么是共阴极,什么是共阳极?

百度百科:

按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。
1、 共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。


2、共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

PS:百度百科解释的很详细了,我上面分段,很清晰,这里我就不再赘述!


2、四位一体的数码管:

(1)四位一体数码管的形状:

个人开始刚开始写单片机文章时,说的开发板上的数码管就是下图这种,两个四位一体的数码管。
在这里插入图片描述
(PS:上图为个人手工绘制,略丑,勿嫌弃!)


(2)四位一体数码管的连接方式:
下图为数码管在我单片机开发板中的连接方式,为共阳极连接方式。

在这里插入图片描述
注:四位一体的数码管在我的单片机开发板中的连接方式是共阳极。
图中:上面的COM为公共端,数字 11、7、4、2、1、10、5、3为位选端。

重点: 共阳极就是把二极管的正极连接在一起,那么共阴极就是把二极管负极连接在一起;共阳极数码管,要点亮LED就需要输入端信号为低电平,反之共阴极就需要输入高电平信号;


四、如何驱动数码管?

1、数码管的驱动方式有哪些?

数码管的驱动方式有静态驱动和动态驱动两种,具体的,(PS:这里偷个懒,百度百科扒过来,如下)
百度百科:

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
1、静态显示驱动
静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性

2、动态显示驱动 数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一。
动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。


2、数码管如何驱动?

数码管的驱动还需要两个芯片,一个是 138译码器,另一个是 双向数据缓冲器。


四、数码管的驱动核心:

1、什么是138译码器?

74LS138又称138译码器。

百度百科:

74LS138 为3 线-8线译码器,共有 54LS138和 74LS138 两种线路结构型式。54LS138为军用,74LS138为民用。

2、74LS138译码器的原理图:

在这里插入图片描述
注:138译码器,也就是通过3个IO控制8个输出端。
(1)图中(P22、P23、P24)A、B、C是输入端,Y0、Y1、Y2…Y7为输出端。A为低位,C为高位。
(2)VCC和GND是电源,VCC为高电平,GND为低电平。
(3)左下角G1、G2A、G2B为使能端。使能有效工作,无效就不工作。
G1接上高电平,G2接低电平,译码器才可以工作。个人使用的这个单片机,从原理图中已经看出,G1已经接上VCC,G2接上GND,所以无需管这里。


138译码器中,ABC按照高低顺序排序,分别为CBA(P24,P23,P22),如果我们三位都分别给一个数字(此时为二进制),转化为十进制后,对应的就是输出端的编号。例如:CBA分别赋值为0,此时:P2_4 = 0,P2_3= 0,P2_2 = 0。得出:Y0。此时Y0低电平有效(为0)。其他输出端无效(为1)。那么:0111 1111


3、双向数据缓冲器?

作用:双向数据缓冲器用来提高单片机的驱动能力的。
在这里插入图片描述
解读:
(1)数据缓冲器中,A0与B0,A1与B1,A2与B2…A7与B7是一一对应的关系。
(2)OE:芯片的使能,如果图中OE接低电平,芯片就工作,接高电平,芯片就不工作。
(3)DIR(英文名direction),方向。数据发出去还是读回来,就是DIR决定。 如果DIR接高电平,就把左边数据发送到右边去(A0–>B0…);如果接低电平,则接收右边发回来的数据(B0–>A0…)。


五、数码管段码:

1、笔段:

1、一个数码管的驱动,主要就是通过数码管点亮笔段实现,例如:在第3个数码管上显示6。分别点亮笔段:A、C、D、E、F、G既可。
在这里插入图片描述
(PS:上图为个人绘制,非专业,略丑!)

如上图: 笔段A、C、D、E、F、G为1,其他的为0既可。二进制表示:1011 1110。转化为十六进制赋值:0x7D
解:动态数码管模块中显示,第3个数码管为LED6,LED6在138译码器中为Y5。Y5为138译码器中A、B、C的对应二进制值转化后的十进制(此处在第四节中第2小段:74LS138译码器的原理图下的注释中写得很详细)。

注意: 数据的高位对端口的高位。


2、笔段赋值原理:

在这里插入图片描述
注: 根据数码管笔段赋值,得到P0 = 0x7D。
解释: 根据右边笔段赋值,得到双向数据缓冲器右边的数据为段码赋值的值:1011 1110。再根据双向数据缓冲器的原理,得出右边数据也为1011 1110。最后根据从高位到低位转化,再转化为16进制赋值既可。


代码如下:

//------源代码-------
#include <REGX52.H>

/*
----需求:
在第3个数目管显示6
*/

int main()
{
	/************************************
	* 第3个数码管为138译码器中的LED6,
	* LED6为138译码器中的Y5,
	* 下面给二进制ABC赋值转为Y5既可。0101 = 5
	*************************************/
	
	/*Y5赋值*/
	P2_2=1;
	P2_3=0;
	P2_4=1;
	
	/*******************************
	* LED6赋值
	* a,b,c,d,e,f,g,dp显示数字6,笔段A、C、
	* D、E、F、G为1,其他的为0既可。
	* 0100 0001,由高位到低位为:1000 0010=0x82
	* 1011 1110                 0111 1101=0x7D
	********************************/
	
	P0 = 0x7D;		//LED6赋值

	return 0;
}

3、数码管段码表

(1)当我们需要表达数码管中的某某数字时,需要对其数码管进行赋值某某。因此,整理出数码管段码表,对其快速赋值,提高工作效率。
从1到F到空的数码管段码表如下图:
在这里插入图片描述
(2)共阳极数码管段码表:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e。

(3)共阴极数码管段码表:0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71。


六、数码管小项目的实现:

1、小项目1:在数码管中实现显示一个数字。
2、小项目2:在数码管中任意位置显示一个数字----(1)的进阶。
3、小项目3:动态数码管的小项目实现。


以上内容,就是咱们本篇文章关于数码管的讲解,下篇文章,将写第五点小项目。


声明:本文为原创内容,转载需声明来源,地址。
声明:本文为原创内容,转载需声明来源,地址。


-----------------人生在勤,不索何获!-------------

  • 22
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
本文将介绍如何使用MSP430G2553单片机实现四位扫描数码管动态显示。 1. 硬件连接 将四位共阳数码管连接至单片机的P1口,具体接法如下: 数码管A口接P1.0口,数码管B口接P1.1口,数码管C口接P1.2口,数码管D口接P1.3口;数码管E口接P1.4口,数码管F口接P1.5口,数码管G口接P1.6口,数码管DP口接P1.7口。 2. 程序设计 首先定义数码管显示的数字和对应的P1口输出值,如下所示: unsigned char num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示的数字 unsigned char pos[]={0xfe,0xfd,0xfb,0xf7}; //四个数码管的位置 num数组存储了0~9的数码管显示值,pos数组存储了四个数码管的位置,在程序会循环使用这两个数组来实现动态显示。 然后定义一个函数实现数码管显示,函数使用循环语句逐位输出数码管的值,如下所示: void show(unsigned int x) //数码管显示函数 { unsigned char i; for(i=0;i<4;i++) { P1OUT=num[x%10]; //输出数码管显示值 P1OUT|=pos[i]; //输出数码管位置 __delay_cycles(500); //延时 P1OUT&=0x0f; //清除数码管位置 x/=10; //下一位 } } 在主函数,使用一个循环不断调用show函数实现数码管动态显示,如下所示: void main(void) { WDTCTL=WDTPW+WDTHOLD; //停用看门狗定时器 P1DIR=0xff; //P1口全部设置为输出 while(1) { unsigned int i; for(i=0;i<10000;i++) //循环10000次 { show(i); //调用数码管显示函数 } } } 程序使用了循环语句实现了数码管的动态显示,每次循环调用show函数输出一个数字,并在下次循环前延时一时间。 3. 程序下载 将程序下载至MSP430G2553单片机,可以看到数码管动态显示了0~9999的数字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡先森ia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值