蓝桥杯单片机学习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;
}
}
}
这里代码就不讲了,太简单了……
总结(一堆废话)
终于到总结了,说实话刚开始我是很不想写这个点灯代码的,因为我觉得太没意思,但是我又怕我今天刚刚学到的内容忘记了,怕过几天就不会用上面的那几个芯片了,所以我还是写了,算是证明一下我今天又在学习吧。
说实话点个灯还挺麻烦的,但是也挺有意思的,哎,讲了一堆废话就到这吧,完结撒花。