????????对于第一次接触蓝桥杯大赛单片机而言的同学们来说,千里之行始于足下,咱们先学会怎么点亮LED小灯吧!学会之后加点自己的想法,想怎么亮就怎么亮,通过此次学习也进一步了解到51单片机74HC138译码器(可参考1.蓝桥杯大赛单片机系列——74HC38译码器)。而且在我写了多届比赛真题之后发现点亮LED小灯是几乎是蓝桥杯每届比赛必考点,熟练掌握和融汇贯通至关重要。
? ? ? ? 切入正题,介绍我们怎么换频道来让LED灯亮起来吧!这里说明一下74HC38译码器吧,学过数字逻辑的同学应该知道74HC38译码器属于一种典型的38译码器,通俗来说就是通过三位二进制数来选择8个频道(000,001,010,011,100,101,110,111),由下图可知这三位数是P2的高三位,而我们蓝桥杯大赛单片机实现LED灯则为频道4需设置P2? = 100*? ****;而且根据要亮的8个LED的要求不同对各自M74HC573M1R锁存器的P0口进行设置。而且8个LED灯对应的位置有讲究,P0 八位从右往左对应蓝桥杯大赛单片机8个LED灯(L1~L8), 注意8个LED灯是共阳极,所以P0=0xff为全灭,P0=0x00为全亮。
? ? ? ? 如(L1,L3,L5,L7);
#include "reg52.h"
void initHC138(unsigned char n)
{
switch(n)
{
case 0:
P2=(P2 & 0x1f)|0x00;break;//0000 0000
case 4:
P2=(P2 & 0x1f)|0x80;break;//1000 0000 LED
case 5:
P2=(P2 & 0x1f)|0xa0;break;//1010 0000 蜂鸣器
case 6:
P2=(P2 & 0x1f)|0xc0;break;//1100 0000
case 7:
P2=(P2 & 0x1f)|0xe0;break;//1110 0000
}
}
void main(){
initHC138(5); //选择蜂鸣器频道
P0 = 0x00; //关闭蜂鸣器,防止启动乱叫
initHC138(4); //选择LED频道
P0 = 0xff; //预先LED灯全灭
while(1){
initHC138(4);
P0 = 0xaa; // 1010 1010 1亮 0灭 注意LED顺序
}
}
?这里注意接线(J13 IO口短接);(1) (2) 均需要
#include "reg52.h"
void initHC138(unsigned char n)
{
switch(n)
{
case 0:
P2=(P2 & 0x1f)|0x00;break;//0000 0000
case 4:
P2=(P2 & 0x1f)|0x80;break;//1000 0000 LED
case 5:
P2=(P2 & 0x1f)|0xa0;break;//1010 0000
case 6:
P2=(P2 & 0x1f)|0xc0;break;//1100 0000
case 7:
P2=(P2 & 0x1f)|0xe0;break;//1110 0000
}
}
void delay(int n){ //延时函数
while(n--);
while(n--);
while(n--);
}
void main(){
unsigned int i=0;
initHC138(5);
P0 = 0x00;
initHC138(4);
P0 = 0xff;
while(1){
initHC138(4);
for(i=0;i<=8;i++)
{
P0 = ~(0x01<<i); // << 末尾补0
delay(10000);
delay(10000);
}
}
}
这里就不展示视频了。