蓝桥杯51单片机-LED指示灯的基本控制

基本功能:三次亮灭,依次从左往右增加一个点亮小灯,再依次从左往右逐渐一个熄灭小灯

首先根据CT107D单片机开发板原理图,操作LED需要使用P0端口,P2端口,74HC138译码器,74HC573锁存器。我们从LED开始分析,根据原理图可知,点亮LED需要低电平,则我们需要Q1-Q8输出低电平。

那我们先来了解74HC573

真值表

其中X为叉号,表示无关,
Z表示高阻,即输出开路

只有当OE端为低电平、LE端为高电平时,Q端的输出才会和D端的输入保持一致,
当OE端为高电平时,无论LE为何种电平,Q端都为高阻态,即无论此时D端如何变化,Q端总是保持当前状态,而不会随D端的数据变化而变化。

所以需要Q1-Q8输出低电平,我们要保证OE端为低电平、LE端为高电平,D1-D8为低电平,即P0端口全部为0,接下来我们一步步分析。OE已经接地,默认为低电平,这个条件已经满足。然后是LE端,我们看到它的网络标号是Y4C,我们需要它为高电平,而它的电平取决于74HC02四输入或非门,以下为或非门真值表

结合原理图分析,我们需要Y4C输出为高电平,那么得保证它的输入端都为0,WR我们可以理解低电平,那么我们需要保证Y4为低电平,而Y4的电平取决于74HC138译码器。

那我们来了解74HC138

真值表

H代表高电平,L代表低电平,X代表随机电平(可高可低)(A0--A,A1--B,A2--C)

根据原理图和真值表可知,在74HC138的A,B,C端口状态未知时,Y0-Y7默认为高电平

我们要让Y4为低电平,则需要保证A=0,B=0,C=1,即需要P25=0,P26=0,P27=1

至此我们操控LED的模块全部弄好了,可以开始使用代码来点灯

#include<reg52.h>

sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;

void main()
{
	HC138_C=1;
	HC138_B=0;
    HC138_A=0;
	P0=0x00;
}

我们可以看到灯全部点亮了,接下来实现基本功能:三次亮灭,依次从左往右增加一个点亮小灯,再依次从左往右逐渐一个熄灭小灯

#include<reg52.h>
#define uchar unsigned char
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;

void Delay(unsigned int t)
{
	while(t--);
	while(t--);
}

void LEDRunning()
{
	uchar i;
	HC138_C=1;
	HC138_B=0;
  HC138_A=0;
	
for(i = 0; i < 3; i++)
	{
		P0 = 0x00;
		Delay(60000);
		Delay(60000);
		P0 = 0xff;
		Delay(60000);
		Delay(60000);
	}
	
	for(i = 1; i <= 8; i++)
	{
		P0 = 0xff << i;
		Delay(60000);
		Delay(60000);
	}
	
	for(i = 1; i <= 8; i++)
	{
		P0 = ~(0xff << i);
		Delay(60000);
		Delay(60000);
	}
}

void main()
{
	while(1)
	{
		LEDRunning();
	}
}

是不是很简单,我们再来试试从右往左点灯,其他条件不变

#include<reg52.h>
#define uchar unsigned char
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;

void Delay(unsigned int t)
{
	while(t--);
	while(t--);
}

void LEDRunning()
{
	uchar i;
	HC138_C=1;
	HC138_B=0;
  HC138_A=0;
	
for(i = 0; i < 3; i++)
	{
		P0 = 0x00;
		Delay(60000);
		Delay(60000);
		P0 = 0xff;
		Delay(60000);
		Delay(60000);
	}
	
	for(i = 1; i <= 8; i++)
	{
		P0=0Xff>>i;
		Delay(60000);
		Delay(60000);
	}
	
	for(i = 1; i <= 8; i++)
	{
		P0 = ~(0xff >> i);
		Delay(60000);
		Delay(60000);
	}
}

void main()
{
	while(1)
	{
		LEDRunning();
	}
}

左移从低位开始补0,右移从高位开始补0,使LED点亮顺序发生改变

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值