51单片机--数码管显示

准备工作
        本教程51单片机开发应用程序使用Keil5和stc-isp编译烧录,开发板型号使用STC89C52RC(购物APP搜索单片机开发板可找到),没有下载应用程序的我已经打包好可以通过下方链接进行下载,安装教程可以参考
[1-2] 开发工具介绍及软件安装_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1Mb411e7re/?spm_id_from=333.788.videopod.episodes&vd_source=5669e58ac53af251d4229e3a559e3a35&p=2

链接: https://pan.baidu.com/s/1XrVrhCB0-IVhywTkV_UN3w?pwd=1234 提取码: 1234

一.引言

        上一章我使用了独立按键控制LED灯的亮灭,从独立按键模块了解了按键的检测机制并学会去抖处理。这一章我将对51单片机的数码管显示进行操作,进而加深了解数码管显示的原理与应用。

二.数码管原理

        数码管是一种常见的数字显示器,由多个发光二极管(LED)组成,能够以直观的方式呈现数字信息。根据显示方式的不同,数码管可分为静态显示和动态显示两种类型。静态显示是指每个数码管的段选线和位选线都直接与单片机的I/O口相连,而动态显示则是通过时分复用的方法,利用人眼的视觉暂留效应来实现多位数码管的轮流点亮,具体方法如下:

1.将待显示的数据转换为相应的段码表格式;
2.设置定时器中断服务程序,按照预定的时间间隔轮询每位数码管;
3.在中断服务程序中,根据当前轮询到的数码管位置,从段码表中取出对应的数据并通过单片机的I/O口发送出去;
4.点亮该位数码管的位选线,使其短暂发光;
5.关闭该位数码管的位选线,准备下一轮扫描。
        通过上述过程,虽然每时刻只有一位数码管处于点亮状态,但由于人眼无法察觉这种快速的闪烁变化,因此看起来就像所有的数码管都在同时显示一样。       

三.数码管的三种驱动方式 

1.直接驱动:当数码管的工作电流较小且数量不多时,可以直接将数码管的段选线和位选线连接到单片机的I/O口上。这种方式电路简单,但受限于单片机的驱动能力,难以满足大规模显示的需求。
2.三极管驱动:对于需要较大工作电流的数码管,可以通过三极管放大单片机输出的信号来提高驱动能力。这种方法适用于中等规模的数码管显示系统。
3.专用芯片驱动:在大规模或多路数码管显示场合,可以使用专门的数码管驱动芯片如74HC595等,这些芯片具有串行输入并行输出特性,可以大大简化电路设计和编程复杂度。

四.电路设计

         如图所示,这是我使用的STC89C52RC单片机数码管模块电路图(我们在使用的时候一定要参考自己的原理图来进行操控)。其中74HC138译码器是用来选择点亮哪个LED的,这里它只用了P2_4(高位)、P2_3、P2_2三个端口就可以表示完8个LED(2*3=8),比如:

#include <REGX52.H>
void main(){
    P2_4=1;
    P2_3=1;
    P2_2=0;
    P0=0x7D;
	while(1){
		
	}
}

        代码里的110=6,根据74HC138译码器即指向Y6,而Y6连接的是LED7,所以上面代码表示显示LED7(这里Y与LED数字规律是有一个错位),即数码管从左开始数的第二个。同时,这里由于使用了P2是与前面学的LED灯是共享端口的,所以可以发现LED03也会被点亮,这里我们可以不用管。P0=0x7D表示显示的数字为6,下面有一张数码管段码表:

        这里我通俗说一下它的原理,根据动态数码管模块的图,那里有由a,b,c,d,e,f,g,dp的小管形成的一个LED,这里8个LED显示原理都一样,都是通过控制点亮小管来形成一个图形,需要点亮就标记为1,反之则为0,遵循数据的高位对端口高位原则,所以是从下往上读。这里我还是举显示的数字为6为例,需要小管形成6的形状,就要点亮除了b和dp的小管,从a~dp标记分别为1011 1110,读的时候则为0111 1101,即为7D,所以上面代码为P0=0x7D,想了解的更多的可以去查询具体实现。

五.程序实现

        静态数码管显示:

#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
void Nixie(unsigned char Location,Number){
	switch(Location){
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];
}
void main(){
	Nixie(2,3);
	while(1){
		
	}
}

        这里介绍一种子函数:将完成某一种功能的程序代码单独抽取出来形成一个模块,在其他函数中可随时调用此模块,以达到代码的复用和优化程序结构的目的。这里的void Nixie(unsigned char Location,Number)就是一种子函数,同时之前学习的延迟函数Delay(unsigned int xms)也是一种子函数。

        同时,这里对要数码管要显示的的数字,我用来数组把它们编制到了一起,这里也做一下说明,数组的作用:把相同类型的一系列数据统一编制到某一个组别中,可以通过数组名+索引号简单快捷的操作大量的数据。

六.与数码管显示有关的其他代码

        动态数码管显示:

#include <REGX52.H>
void Delay(unsigned int xms)		
{
	unsigned char i, j;
	while(xms--){
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7F,0x6F};
void Nixie(unsigned char Location,Number){
	switch(Location){
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];
	Delay(5);
	P0=0x00;
}
void main(){
	
	while(1){
		Nixie(1,2);
		Nixie(2,5);
		Nixie(3,0);
	}
}

        这里需要做一些延迟和清零处理,不然运行太快数据缓存区会来不及清理会出现不理想的结果出现,比如:

        后面就是在一个while循环里面使用多个静态数码管显示,利用人眼的视觉暂留效应来实现动态数码管显示功能。

七.应用实例

        在实际项目中,我们经常需要对多个数码管进行协调控制以满足不同的显示需求。例如在一个温度监测系统中,可能需要在同一块面板上分别显示当前的温度值和历史最高/最低温度记录等信息。此时就可以充分利用动态扫描的优势,合理安排各数码管的刷新频率和数据更新策略以确保信息的准确性和实时性。此外,还可以结合其他外围设备如键盘矩阵、液晶屏等进行更复杂的交互操作,进一步拓展系统的功能和实用性。

八.总结

        掌握好数码管显示、子函数和数组的运用相关知识不仅有助于提升个人的实践能力和创新能力,也为今后做更高端的显示开发奠定了坚实的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值