概述
IAP15F2K61S2单片机控制LED灯,不像STM32一样,直接控制引脚推挽输出高低电平即可,
IAP15F2K61S2单片机的电路与STM32系列单片机的电路有些不一样,所以导致控制LED的亮灭方式也就不一样!不一样的点就在于:
IAP15F2K61S2单片机 | 先通过74HC138译码器,控制Y4口,Y4口再通过或非门电路,控制Y4C口,Y4C口再控制74HC573锁存器输出高低电平,从而控制LED的亮灭 |
STM32单片机 | 控制引脚推挽输出高低电平即可,从而控制LED的亮灭 |
LED控制电路
LED控制电路由73HC138译码器,或非门电路,74HC573锁存器构成。接下来我将分别介绍这三种元器件。
1.73HC138译码器
![](https://img-blog.csdnimg.cn/direct/5e3d2eb8bc904d308751252e2d9d83cc.png)
4,5,6位号引脚是片选,竞赛板电路已经设计好了,开机就处于工作中,所以我们直接不用管!那么就剩1,2,3(P25,P26,P27)位号引脚,那么这3个引脚控制Y0~Y7引脚输出。
![](https://img-blog.csdnimg.cn/direct/8a1c5aef1524493fa4b6b02f4c1abc3f.png)
根据74HC138译码器真值表我们可得知,ABC引脚处于不同的电平状态,则控制不同的Y0~Y7的引脚。 该真值表中,是八路互斥的低有效输出(就是八路Y0~Y7输出为低电平才有效)
A---P25 | B---P26 | C---P27 | 八路输出(均为低电平) |
0 | 0 | 0 | Y0 |
1 | 0 | 0 | Y1 |
0 | 1 | 0 | Y2 |
1 | 1 | 0 | Y3 |
0 | 0 | 1 | Y4 |
1 | 0 | 1 | Y5 |
0 | 1 | 1 | Y6 |
1 | 1 | 1 | Y7 |
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锁存器
![](https://img-blog.csdnimg.cn/direct/7ca83c2ee3714acbbb06e940c36aef7b.png)
根据原理图,我们可得知,OE端接地,这是竞赛板设计好的电路,我们不用管他,所以74HC573锁存器现在只有两种情况:LE端为0/1
LE端电平 | 效果 |
1 | D1~D8的输入与Q1~Q8输出同步(输入输出同步) |
0 | 建立时间和保持时间的数据被锁存 |
![](https://img-blog.csdnimg.cn/direct/0d87f68622644810a43365c2ccecf86f.png)
由上图74HC573锁存器真值表可以看出,OE端为低电平:
①使能LE端电平为低电平,则数据被锁存(意味着,D1~D8的输入无论变成什么,Q1~Q8作为输出端都不会有任何的变化)
②使能LE端电平为高电平,D1~D8的输入与Q1~Q8输出同步(输入输出同步),Q1~Q8输出的是高低电平
总结
![](https://img-blog.csdnimg.cn/direct/c61fbae2b0554f0a82dc7d66f001c891.png)
根据LED电路图可知,L1~L8右侧全部接上电源,故左侧接地,整个电路才算完整,所以由此可以推理出,LED要想亮,则Qx得为低电平,故反推出相应的Dx也得为低电平,则使能LE端为高电平(这样Dx才能实时控制Qx,LED才能被实时控制),LE端要想为高电平,那么则Y4C端为高电平,反推非门电路,Y4 || WR 的结果应该是低电平(因为非门电路是最后结果取反),再因为我们正常开发模式一般选择的是IO扩展开发模式,故WR为低电平,鉴于或门电路(一真则真,全假则假),故Y4应该为低电平
A---P25 | B---P26 | C---P27 | 八路输出(均为低电平) |
0 | 0 | 1 | Y4 |
由上表可知,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)
结束
书山有路勤为径,学海无涯苦作舟,与诸位共勉(^^ゞ