51单片机学习——数码管显示

今天是第三天,进行数码管显示 

1.原理图

单片机核心图 

51单片机学习——数码管显示_第1张图片

74HC138译码器 

 51单片机学习——数码管显示_第2张图片

动态数码管模块 

51单片机学习——数码管显示_第3张图片

2.原理讲解 

 138译码器:74LS138译码器可以用于数码管显示驱动电路。通过将二进制代码输入到译码器的输入端,根据译码器的输出状态来控制显示的数字或字符。这样可以简化驱动电路的设计,并提高显示的灵活性和可靠性。

数码管灯链接是共阴极的,,因此需要给其高电平。

通过控制138译码器来选中LED灯,再控制P0口的电平来实现数字。了解了原理,实现这就很简单了

 3.实现某个位置显示某个数

 实现这个功能我们可以通过写一个函数来完成,让其变得更方便 我就不啰嗦了,直接上代码,看懂代码基本就弄会原理了

#include
#include
unsigned char Number[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void display(unsigned char lamb,unsigned char number)
{
		switch(lamb)//这里就是列举,挺无脑的
		{	
			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=Number[number];//用一个数组表示更方便一点
}



void main()
{
	display(6,6);//直接引用函数了,特别爽
		while(1)
		{
		
		}
}

4.数码管显示一堆数

   消影

  根据数码管显示的原理,多位数码管显示不同数据其实不是同时显示的,是以扫描的方式显示的,例如上面的原理图我想显示12这个数字,理论上我需要先让第一个显示数字1,第二个显示数字2,这样来回不停的显示并且刷新频率上去的话,利用人眼的视觉暂留效应就可以得到一个显示着12的数码管了。

  根据单片机工作原理位选 -->段选-->位选-->段选-->位选 ,位选要比段选快的,所以位选结束了,段选还在上次,

  举个例子:我先开控制第一个数码管亮位选信号1,然后送数字1的段选信号,这个时候第一个数码管就成功的显示了数字1了,这个时候我关掉第一个数码管的位选信号,打开第二位的位选信号2,在这一瞬间,2号数码管等于收到了位选信号2和段选信号1,由于段选信号没有更新,所以短暂的亮了一下数字1,接下来段选信号刷新,更新为段选信号2,数码管改显示2。

这里提供两个消影方法,

【1】延时函数

void main()
{
	
		while(1)
		{
		display(6,6);
			Delay(1);
		display(5,7);
			Delay(1);
		display(4,5);
			Delay(1);
		}
}

 通过加入延时代码,来实现消影,就是利用人眼的缺陷。

51单片机学习——数码管显示_第4张图片

这是单独用延时函数 

【2】重置代码

就是用完之后直接消除这段函数 

​
#include
#include "Delay.H"
unsigned char Number[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void display(unsigned char lamb,unsigned char number)
{
		switch(lamb)
		{	
			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=Number[number];//取位
		Delay(1);
		P0=0x00;//清除
}

​

这也是一种方法; 

 51单片机学习——数码管显示_第5张图片

这是用重置代码

哪个好用不用说了吧   !!!!! 

代码 

下面就是代码了

#include
#include
void Delay( int x)//延时函数
{
	unsigned char data i, j;


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

unsigned char Number[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数组表示数字

void display(unsigned char lamb,unsigned char number)//函数确定管位置(从左到右)和数字
{
		switch(lamb)
		{	
			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=Number[number];
		Delay(1);
		P0=0x00;//消影
}



void main()
{
	
		while(1)
		{
		display(6,6);
			Delay(1);
		display(5,7);
			Delay(1);
		display(4,5);
			Delay(1);
		}
}

烧录后得到结果如下图 

51单片机学习——数码管显示_第6张图片

看着很舒服,然后今天就大功告成了!!!!

5.结语 

就用一段歌词共勉吧!!!

51单片机学习——数码管显示_第7张图片

你可能感兴趣的:(51单片机学习,51单片机,学习,嵌入式硬件)