幸运微笑

微笑一下,世界就会变得不一样

2018年9月28日

LUCKY>

【金沙滩51单片机开发板】简单数码管显示

描述:6个数码管同时循环显示0~F。

这个实验是基于金沙滩的51单片机开发板上实现的

实验效果

1538140695159.gif

需要用到的原理图:

1.数码管原理图

QQ截图20180928212159.jpg

2.74H138译码机模块原理图

QQ截图20180928212221.jpg

74H138真值表

QQ截图20180928214223.jpg

3.跳线部分原理图

QQ截图20180928212233.jpg

4.单片机部分原理图

QQ截图20180928212259.jpg


源代码和解释

/*6个数码管同时循环显示0~F
20180928
minuy*/
#include<reg52.h>

unsigned char code smg[] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};	//数码管真值表

void delay(void)	  //延时函数
{
    unsigned int b,c;
    for(c=400;c>0;c--) for(b=80;b>0;b--);
}

void main()
{
	unsigned char n = 0x00,i = 0; //声明位选变量和数字变量
								  //位选用来记录哪位显示,数字记录要显示什么数字
	while(1)
	{
		P1 = n|0x08;//通过原理图和74H138真值表知,只要改变P1口的
		//低位的低3位就可以改变哪个数码管点亮
		P0 = smg[i];//给选位数码管传送段选数据
		delay();//延时,让别人看清楚显示了什么(去掉或改小延时有好玩的结果)
		n++; //位选向左移动一位
		i++; //段选数据加一,也就是显示下一个数字
		if(n>5)n = 0;//判断是否数码管选到了最左边一个,是的话设置下一个为第0个亮
		if(i>16)i = 0;//判断是否把数字显示完一遍了,是的话又从0开始	
	}
}

对于P1 = n|0x08;那句,有很多小伙伴不知道是怎么来的吧?

正常情况下,我们要让最右边的数码管显示我们从P0口送出的真值表数字段选数据就要打开74H138的第15脚(也就是Y0)吧,

从74H138译码机真值表可以知道,那就是让ADDR0 – ADDR2都为0,LEDEN为0,ADDR3为1才能使最右边的数码管显示我们从P0口送出的数字。

依此推出,

ADDR2 ADDR1 ADDR0为001,LEDEN为0,ADDR3为1使右边第2个显示P0送出的数据

ADDR2 ADDR1 ADDR0为010,LEDEN为0,ADDR3为1使右边第3个显示P0送出的数据

ADDR2 ADDR1 ADDR0为011(3),LEDEN为0,ADDR3为1使右边第4个显示P0送出的数据

ADDR2 ADDR1 ADDR0为100(4),LEDEN为0,ADDR3为1使右边第5个显示P0送出的数据

ADDR2 ADDR1 ADDR0为101(5),LEDEN为0,ADDR3为1使右边第6个显示P0送出的数据

然后又ADDR0-ADDR3分别是P1^1-P1^4,LEDEN是P1^5,其他的P1口引脚不管。

使右边第1个显示P0送出的数据,P1口=0x08=00001000

使右边第2个显示P0送出的数据,P1口=0x08=00001001

使右边第3个显示P0送出的数据,P1口=0x08=00001010

使右边第4个显示P0送出的数据,P1口=0x08=00001011

使右边第5个显示P0送出的数据,P1口=0x08=00001100

使右边第6个显示P0送出的数据,P1口=0x08=00001101

改变的只是低4位的低3位,因此只要n初始为0,每次加一,并且按位或0x08就可以根据n0-5的值来选择数码管的第0-5位来显示数据啦!

小伙伴有没有get到?

其他好理解就不说啦

emmm…..

既然数码管这么好玩?

那你能让数码管从左到右同时显示012345吗?

聪明的小伙伴快把你的源代码发到下面评论区吧!

9bd171940a7b020871d3a6ae6ed9f2d3562cc844 (1).jpg

先为你点赞

自古表白多白表

小鱼啊小鱼

来一发吐槽