蓝桥杯单片机学习1——LED控制

蓝桥杯单片机学习1——LED控制

事情是这样的,我这几天报名了蓝桥杯的单片机组,于是我就拿到了这个比赛用的板子,那么拿到板子的第一件事,当然就是点个灯来玩了,话不多说,我们开始了……

关于这个板子长啥样

在这里插入图片描述

  大概就长这样。型号的话就是  IAP15F2K61S2/CT107在keil_5里面的话就是STC15F2K60S2。

  好的硬件部分就介绍这么多,其他的部分自己去网上找吧,因为我也不知道,我只是点个灯。

原理图

在这里插入图片描述

我们可以看到,这里的LED等都是负逻辑点亮(即写0点亮),那么我们要做的就是在Q1到Q8上依次写入0就可以实现一个完美的流水灯,那么要输出低电平,我们首先的明白M7HC573MiR/74HC573这颗芯片的原理

在这里插入图片描述

74HC573是一款比较常见的锁存器,在原理图中我们经常而可以看到它的存在,我们直接上它的真值表,可以看到这颗芯片引脚可以分为控制端,输入端和输出端三类,这个Internal
latches我们直接忽略就好,因为没啥好看的。

OE(Output Enable)的意思是输出使能端,低电平有效,可以看到原理图里是直接接地了,那就代表允许输出。其为高电平时,输出端为高阻态。

LE(Latch Enable)意思为锁存使能端口,在下面的注释里可以看到,当LE为高电平时,输出端Dn会等于Dn,此时Qn的值会随着Dn的该改变而改变,当LE为低电平时,锁存器会所存当前Qn的值,并且无论Dn的值如何变化,Qn均不变,也就是我们常所得下降沿锁存。

Dn和Qn则对应为输入输出端口,没啥好讲的。

总结:使用过程中我们通常将OE接地,LE则下降沿锁存,高电平时通过改变修改Dn改变Qn。

那么我们的逻辑就清晰起来了,只需要在Y4C为高电平时对Dn进行写入,就可以对应的LED进行点亮了,那该怎么样来控制Y4C呢?

在这里插入图片描述

到这里我们就可以看到Y4C时连接到了已给或非门上,然后WR又直接通过跳线帽接到了地上,那么我们就只需要在Y4上写入一个低电平,既可以成功的在Y4C上输出一个高电平。

[] 或非门真值表

在这里插入图片描述

然后我们再去看原理图,发现Y4是通过一个74HC138译码器输出的。
在这里插入图片描述

相信大家对这个译码器应该比较熟悉了,所以我们就不讲了……

直接说结论:只需要在P27输入一个高点平我们就可以在Y4上输出一个0,从而实现前面的那些假设。

emmm,算了还是讲一下吧,怕我以后忘了

在这里插入图片描述

简单的讲一下它的真值表,可以看到,首先最明显的就是这个G2* 了,在真值表里有出现它的表达式/G2* =G2A+G2B,当G2A=G2B=0时,/G2* 等于0,此时为低电平有效。
同时要在对应的位上输出低电平还要G1为高电平,原理图上直接接高了,所以不用管。
当满足上述两个条件时,只需要对ABC端口写入不同的数据,则可以在对应的输出口输出高低电平,实现对不同Y0到Y7的选择。

[]:C的权重为4、B的权重为2、A的权重为1

好的到这里我们的逻辑就算完整了,只需要控制74HC138选择Y4输出低电平,然后在通过一个或非门在Y4C输出高电平,在此期间对74HC573的输入端写入数据,再通过LE端口进行锁存,就可以稳定的控制不同的LED亮起,实现电灯的效果,或是实现一个流水灯。

在这里插入图片描述
大概就这个意思

[]:我们要在LE为高电平时才可以对LED进行控制,因此在每次改变LED的状态之前都需要将LE给拉高,在修改晚之后再将LE拉低锁存。

代码实现

#include <STC15F2K60S2.H>
sbit ls138_A=P2^5;
sbit ls138_B=P2^6;
sbit ls138_C=P2^7;

void LED_Init(void)
{		ls138_A=0;
		ls138_B=0;
		ls138_C=0;
		P0 = 0x00;
		ls138_C=1;
}
void Delay(unsigned int num)
{
  unsigned int i;
  while(num--)
    for(i=0; i<628; i++);
}
void main()
{
	unsigned char i =0;
	LED_Init();
	while(1)
	{
		for(i=0;i<8;i++)
		{
			ls138_C=0;
			P0 = ~(0x80>>i);
			Delay(500);
			ls138_C=1;
		}
	}
}

这里代码就不讲了,太简单了……

总结(一堆废话)

终于到总结了,说实话刚开始我是很不想写这个点灯代码的,因为我觉得太没意思,但是我又怕我今天刚刚学到的内容忘记了,怕过几天就不会用上面的那几个芯片了,所以我还是写了,算是证明一下我今天又在学习吧。
说实话点个灯还挺麻烦的,但是也挺有意思的,哎,讲了一堆废话就到这吧,完结撒花。

在这里插入图片描述

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数码管是一种常见的数字显示器件,可以用于显示各种数字、字母等字符。在单片机应用中,数码管通常用于显示计数器、计时器、温度、湿度等实时数据。 数码管的种类有很多,包括共阳数码管、共阴数码管、共阳共阴混合数码管等。其中,共阳数码管是最常见的一种,也是本文所涉及的数码管类型。 单片机控制数码管的原理是通过对数码管的各个管脚进行控制,使其显示相应的数字或字符。数码管的控制方式有两种,即静态显示和动态显示。 静态显示是指将要显示的数字或字符的每一位分别输出到数码管的每个管脚上,然后使其保持不变,从而实现显示效果。静态显示的缺点是需要使用大量的I/O口,且不能灵活地改变显示内容。 动态显示是指将要显示的数字或字符的每一位依次输出到数码管的每个管脚上,并在短时间内快速切换下一个数字或字符,从而形成连续的显示效果。动态显示的优点是可以使用较少的I/O口,且可以灵活地改变显示内容。 以下是一个简单的动态显示数码管的实现示例: 1. 定义数码管的引脚 ```c #define DIG_PORT P2 // 数码管位选端口 #define DIG_COM 0x00 // 数码管位选端口初始值 #define LED_PORT P0 // 数码管段选端口 ``` 2. 定义数码管显示的数字或字符 ```c unsigned char code ledChar[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; ``` 3. 实现数码管动态显示函数 ```c void display(unsigned char i) { unsigned char j, k; for (j = 0; j < 8; j++) { DIG_PORT = DIG_COM | (1 << j); // 选择数码管位(从左到右) for (k = 0; k < 100; k++); // 延时,视情况可调整 LED_PORT = ledChar[i]; // 显示数码管上的数字或字符 } } ``` 4. 调用数码管动态显示函数 ```c int main() { unsigned char i = 0; while (1) { display(i % 10); // 显示数字 i 的个位数 i++; } return 0; } ``` 以上就是一个简单的数码管动态显示的实现示例。需要注意的是,数码管的控制方式和具体实现方法可能因不同的硬件平台和编程语言而有所不同。因此,在具体应用中需要根据实际情况进行适当的调整和修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不想写代码的我

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

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

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

打赏作者

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

抵扣说明:

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

余额充值