2.蓝桥杯大赛单片机系列—LED灯操作

发布时间:2024年01月24日

一,设计目标:

????????对于第一次接触蓝桥杯大赛单片机而言的同学们来说,千里之行始于足下,咱们先学会怎么点亮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为全亮。


三,代码实现:

(1)点亮指定LED灯

? ? ? ? 如(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) 均需要

(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);
		}
		
	}
}

这里就不展示视频了。

文章来源:https://blog.csdn.net/weixin_62934685/article/details/135678400
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。