51单片机从零开始入门教程(数码管篇)

参考教程:[4-1] 静态数码管显示_哔哩哔哩_bilibili

1、LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件(也就是说数码管显示数字的原理只是点亮LED灯原理的plus版而已)。

2、数码管分为共阳极数码管和共阴极数码管,原理图如下所示。对于共阴极数码管,如果想让其显示数字,首先要将其公共阴极置为低电平(否则永远不可能产生正向电流),对于各个LED的阳极,需要点亮哪个LED灯,就将哪个LED灯的阳极置为高电平;对于共阳极数码管,如果想让其显示数字,首先要将其公共阳极置为高电平(否则永远不可能产生正向电流),对于各个LED的阴极,需要点亮哪个LED灯,就将哪个LED灯的阴极置为低电平。

3、开发板原理图中的数码管模块:

(1)开发板采用的是共阴极数码管,且封装起来的四个数码管其同样位置的LED阳极接的是同一条线,也就是说,理论上讲要是同时将4个数码管的公共阴极全部置为低电平,那么4个数码管将会显示同一个数字

(2)74HC245起到一个数据缓冲的作用,它有助于高电平驱动,A端口的信息会原封不动地传到B端口。

(3)开发板上的138译码器:可以看到左边有ABC三个输入,它们分别代表一位二进制数,译码器获取到三位二进制数后会得到该二进制数转化为0~7的十进制数,以此选择LED1~8,而LED1~8就是数码管模块中8个数码管的公共阴极,被选中的引脚被置为低电平(同一时刻只能有一个引脚被选中),其对应的数码管可以显示数字。

4、静态数码管显示一个数字:

(1)在main.c文件中输入以下代码,然后点击“编译”。

#include <REGX52.H>

unsigned char NixieTube[] = {0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
//在全局直接定义数码管段码表(数组),从左往右依次是0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,无显示

void Nixie(unsigned char Location, Number)  //Location是显示数字的数码管,Number是需要显示的数字(需要显示a则Number传入10,以此类推)
{
	switch(Location)
	{
		case 1:
			P2_4 = 1; P2_3 = 1; P2_2 = 1; break;  
		//选中LED8,左边第一个数码管显示数字
		case 2:
			P2_4 = 1; P2_3 = 1; P2_2 = 0; break;  
		//选中LED7,左边第二个数码管显示数字
		case 3:
			P2_4 = 1; P2_3 = 0; P2_2 = 1; break;  
		//选中LED6,左边第三个数码管显示数字
		case 4:
			P2_4 = 1; P2_3 = 0; P2_2 = 0; break;  
		//选中LED5,左边第四个数码管显示数字
		case 5:
			P2_4 = 0; P2_3 = 1; P2_2 = 1; break;  
		//选中LED4,左边第五个数码管显示数字
		case 6:
			P2_4 = 0; P2_3 = 1; P2_2 = 0; break;  
		//选中LED3,左边第六个数码管显示数字
		case 7:
			P2_4 = 0; P2_3 = 0; P2_2 = 1; break;  
		//选中LED2,左边第七个数码管显示数字
		case 8:
			P2_4 = 0; P2_3 = 0; P2_2 = 0; break;  
		//选中LED1,左边第八个数码管显示数字
	}
	P0 = NixieTube[Number];  //Number作为数组下标,自动匹配对应的段码
}

void main()
{
	/*
	P2_4 = 1;
	P2_3 = 0;
	P2_2 = 0;  //这三个变量控制138译码器ABC三个引脚,100译码得4,会选中LED5
	P0 = 0x7D;  //P0寄存器的8位分别控制数码管的8个LED灯,0111 1101对应数字6
	*/
	Nixie(7,2);  //从左往右的第七个数码管显示数字2
	while(1)
	{
		
	}
}

(2)将生成的.hex文件下载到开发板中,可以看到从左往右的第七个数码管显示数字2。

5、动态数码管显示123:

(1)根据前面的讲述,貌似不能同时点亮好几个数码管,更不能让它们同时显示不同的数字,但实际上并不是这样,共阴极数码管(共阳极数码管同理)被点亮后,即使阳极变为低电平或者公共阴极变为高电平,数码管也不会立刻熄灭(或者说人眼不能马上发现数码管熄灭),会有一个“视觉暂留”的现象,在人眼发现数码管熄灭之前可以先点亮其它数码管,接着再重新点亮熄灭的数码管,从而可以达到多个数码管同时显示不同数字的效果

(2)在main.c文件中输入以下代码,然后点击“编译”。

#include <REGX52.H>
#include <INTRINS.H>  //_nop_()需要这个头文件

void Delay(unsigned int xms)
{
	while(xms--)
	{
		unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}

unsigned char NixieTube[] = {0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
//在全局直接定义数码管段码表(数组),从左往右依次是0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,无显示

void Nixie(unsigned char Location, Number)  //Location是显示数字的数码管,Number是需要显示的数字(需要显示a则Number传入10,以此类推)
{
	switch(Location)  //(位选)
	{
		case 1:
			P2_4 = 1; P2_3 = 1; P2_2 = 1; break;  
		//选中LED8,左边第一个数码管显示数字
		case 2:
			P2_4 = 1; P2_3 = 1; P2_2 = 0; break;  
		//选中LED7,左边第二个数码管显示数字
		case 3:
			P2_4 = 1; P2_3 = 0; P2_2 = 1; break;  
		//选中LED6,左边第三个数码管显示数字
		case 4:
			P2_4 = 1; P2_3 = 0; P2_2 = 0; break;  
		//选中LED5,左边第四个数码管显示数字
		case 5:
			P2_4 = 0; P2_3 = 1; P2_2 = 1; break;  
		//选中LED4,左边第五个数码管显示数字
		case 6:
			P2_4 = 0; P2_3 = 1; P2_2 = 0; break;  
		//选中LED3,左边第六个数码管显示数字
		case 7:
			P2_4 = 0; P2_3 = 0; P2_2 = 1; break;  
		//选中LED2,左边第七个数码管显示数字
		case 8:
			P2_4 = 0; P2_3 = 0; P2_2 = 0; break;  
		//选中LED1,左边第八个数码管显示数字
	}
	P0 = NixieTube[Number];  //Number作为数组下标,自动匹配对应的段码(段选)
	
	Delay(1);
	P0 = 0x00;  //动态数码管需要消影,静态不需要
	/*
	①段选完成后要将段选全部置为0,防止上一个数码管的段选“赶上”下一个数码管的位选(位选负责选择要被点亮的数码管,段选负责决定显示的内容,一个数码管的位选要在段选之前;因为数码管被点亮后不会立刻熄灭,要是下一个数码管的位选完成后,上一个数码管的段选没有清零,那么上一个数码管的段选会影响下一个数码管的段选,即使下一个数码管有自己的段选,但是数码管被上一个段选点亮后不会立刻熄灭,这样一来就会显示错误)
	②数码管被点亮后,即使阳极变为低电平,数码管也不会立刻熄灭,所以P0全部清零不会让数码管“关灯”
	*/
	}

void main()
{
	while(1)
	{
		Nixie(1,1);
		Delay(1);
		Nixie(2,2);
		Delay(1);
		Nixie(3,3);
		Delay(1);
		//正是因为数码管不会立刻熄灭(视觉暂留)这一特性,让不同数码管分时段显示就能达到看起来数码管同时显示不同数字的效果
	}
}

(3)将生成的.hex文件下载到开发板中,可以看到左边开始数的三个数码管显示“123”。

6、数码管的驱动方式:

(1)单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间

(2)专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
学习51单片机C语言需要有一定的基础知识,首先要了解C语言的基本语法和编程规范。可以通过阅读相关的书籍和资料,网上视频教程来系统地学习C语言的基础知识。掌握了C语言的基础知识之后,就可以开始学习51单片机的相关知识。 其次,需要了解51单片机的硬件结构、指令集和编程环境。可以通过查阅51单片机的相关资料和学习笔记来了解51单片机的基本知识和编程环境的搭建。学习过程中可以通过实验和练习加深理解,掌握51单片机的基本原理和编程方法。 学习过程中还需要具备一定的动手能力和实践经验,可以通过购买一些实验套件进行实际的操作和编程练习。通过实际操作可以更加深入地理解单片机的工作原理和编程方法,同时也可以提高自己的动手能力和解决问题的能力。 另外,学习51单片机C语言还需要有一定的毅力和耐心,因为学习过程中可能会遇到各种各样的困难和问题,需要持之以恒地克服这些困难。可以多参与一些相关的社区和论坛,向其他有经验的人请教和交流,可以更快地解决问题和提高自己的学习效率。 总之,学习51单片机C语言需要持续地学习和实践,掌握C语言的基础知识、了解51单片机的硬件结构和编程环境,提高动手能力和解决问题的能力,同时要有毅力和耐心,相信通过不懈的努力一定能够掌握这门技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zevalin爱灰灰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值