蓝桥杯单片机_02(点灯达人)

本文详细解释了IAP15F2K61S2单片机如何通过74HC138译码器、或非门电路和74HC573锁存器控制LED灯,对比了与STM32的差异,并给出了相应的编程示例。
摘要由CSDN通过智能技术生成

概述

 IAP15F2K61S2单片机控制LED灯,不像STM32一样,直接控制引脚推挽输出高低电平即可, 

IAP15F2K61S2单片机的电路与STM32系列单片机的电路有些不一样,所以导致控制LED的亮灭方式也就不一样!不一样的点就在于:

IAP15F2K61S2单片机先通过74HC138译码器,控制Y4口,Y4口再通过或非门电路,控制Y4C口,Y4C口再控制74HC573锁存器输出高低电平,从而控制LED的亮灭
STM32单片机控制引脚推挽输出高低电平即可,从而控制LED的亮灭

LED控制电路

LED控制电路由73HC138译码器,或非门电路,74HC573锁存器构成。接下来我将分别介绍这三种元器件。

 1.73HC138译码器

73HC138译码器

4,5,6位号引脚是片选,竞赛板电路已经设计好了,开机就处于工作中,所以我们直接不用管!那么就剩1,2,3(P25,P26,P27)位号引脚,那么这3个引脚控制Y0~Y7引脚输出

74HC138译码器真值表

根据74HC138译码器真值表我们可得知,ABC引脚处于不同的电平状态,则控制不同的Y0~Y7的引脚。 该真值表中,是八路互斥的低有效输出(就是八路Y0~Y7输出为低电平才有效

ABC引脚控制Y0~Y7引脚
A---P25B---P26C---P27八路输出(均为低电平)
000Y0
100Y1
010Y2
110Y3
001Y4
101Y5
011Y6
111Y7

 2.或非门电路

或非门电路是什么?其实就是C语言中的   或(||)  和  非(!)

或(||) 一真则真,全假则假
非(!) 取反

所以或非门电路就是:先 根据  Y4  和  WR 引脚的高低电平得出它俩的结果(Y4 || WR),然后对这个结果取反即可(0变1 / 1变0),那么取反后的结果值就是Y4C的值

由图可知,或非门电路包括Y4,WR端。Y4由三八译码器控制,那WR端连到哪呢?见下图

这是个3p引脚,在竞赛板子上,有一个跳帽,来决定WR是和P42还是GND连接,那么这就又拓展到51的两种开发模式: IO扩展开发模式   ,   存储器映射扩展模式

IO扩展开发模式WR接GND,也就是跳帽插在WR,GND上面
存储器映射扩展模式WR接P42,也就是跳帽插在P42和WR上面

 如果选择IO扩展开发模式 ,则我们可以非常肯定的是WR为低电平!

如果选择存储器映射扩展模式,则WR的高低电平则由P42电平决定!

3.74HC573锁存器 

74HC573锁存器

 根据原理图,我们可得知,OE端接地,这是竞赛板设计好的电路,我们不用管他,所以74HC573锁存器现在只有两种情况:LE端为0/1

LE端电平效果
1D1~D8的输入与Q1~Q8输出同步(输入输出同步)
0建立时间和保持时间的数据被锁存
74HC573锁存器真值表

由上图74HC573锁存器真值表可以看出,OE端为低电平:

①使能LE端电平为低电平,则数据被锁存(意味着,D1~D8的输入无论变成什么,Q1~Q8作为输出端都不会有任何的变化)

②使能LE端电平为高电平,D1~D8的输入与Q1~Q8输出同步(输入输出同步),Q1~Q8输出的是高低电平

总结

LED电路图

根据LED电路图可知,L1~L8右侧全部接上电源,故左侧接地,整个电路才算完整,所以由此可以推理出,LED要想亮,则Qx得为低电平,故反推出相应的Dx也得为低电平,则使能LE端为高电平(这样Dx才能实时控制Qx,LED才能被实时控制),LE端要想为高电平,那么则Y4C端为高电平,反推非门电路,Y4 || WR  的结果应该是低电平(因为非门电路是最后结果取反),再因为我们正常开发模式一般选择的是IO扩展开发模式,故WR为低电平,鉴于或门电路(一真则真,全假则假),故Y4应该为低电平

A---P25B---P26C---P27八路输出(均为低电平)
001Y4

由上表可知,P25,P26为低电平,P27为高电平!   结束(*^▽^*) 

程序的编写

理清逻辑电路控制LED的原理,那么就开始编写其控制代码吧!

首先,得先让P25,P26为低电平,P27为高电平。经过73HC13译码器,Y4为低电平,之后经过或非门电路,Y4C为高电平,故使能LE端也为高电平,根据74HC573锁存器的原理,P00~P07高低电平来控制LED灯,高电平点亮,低电平熄灭。逻辑理清楚,开写^_^

#include "reg52.h"

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 LED_all_start()
{
	HC138_A=0;
	HC138_B=0;
	HC138_C=1;
	P0 = 0x00; 		
    Delay(60000);
	Delay(60000);
}

void LED_all_close()
{

    HC138_A=0;
	HC138_B=0;
	HC138_C=1;


    P0 = 0xff;  
	Delay(60000);
	Delay(60000);

}


void LED_start()
	
{
	HC138_A=0;
	HC138_B=0;
	HC138_C=1;
	
	
	P0 = 0xFE;   //0x00
	Delay(60000);
	P0 = 0xFD;   //0x01
	Delay(60000); 
	P0 = 0xFB;   //0x02
	Delay(60000);
	P0 = 0xF7;   //0x04
	Delay(60000);
	P0 = 0xEF;   //0x08
	Delay(60000);
	P0 = 0xDF;   //0x10
	Delay(60000);
	P0 = 0xBF;   //0x20
	Delay(60000);
	P0 = 0x7F;   //0x40
	Delay(60000);

	
}
	

void main()
{
  unsigned char i;
	while(1)
	{
		for(i=0;i<=2;i++)
		{
		LED_all_start();
		LED_all_close();
		}
		LED_start();
	}

}

我写了3个功能函数,分别是控制LED全部亮起,LED全部熄灭,LED依次点亮。

LED_all_start()LED全部亮起
LED_all_close()LED全部熄灭
LED_start()LED依次点亮

我是直接通过P0端口控制它下面的8位IO口

P0 = 0x00;

转换为二进制 0000 0000  那么这8个IO口全部输出低电平

P0 = 0xff;转换为二进制 1111  1111   那么这8个IO口全部输出高电平
P0 = 0x01;转换为二进制 0000 0001  只有L1是灭,其余都亮
P0 = 0xFD;转换为二进制 1111  1110  只有L1是亮,其余都灭

这段代码是让它先全部亮三次,然后依次流水灯(从L1~L8)

结束

书山有路勤为径,学海无涯苦作舟,与诸位共勉(^^ゞ

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值