🎈教程介绍:博客依据b站小蜜蜂老师的教程进行编写,文中会对老师传授的知识进行总结并加入自己的一些理解。教程链接
文章目录
- 一、点灯介绍
- 二、相关数字芯片介绍
- 2.1 74HC138介绍
- 2.2 74HC573介绍
- 2.3 74HC02介绍
- 三、代码设计思路
- 四、代码编写
- 五、小蜜蜂老师的课后作业题目以及答案
- 5.1题目
- 5.2 答案
一、点灯介绍
打开开发板原理图我们可以知道LED灯并不是直接接到IO口上的,而是经过了74HC573来实现间接控制。此外74HC573不能直接使用必须使能LE引脚才能使用,使能的工作又需要通过74HC138和74HC02来配合完成。所以,在点亮一个LED前,我们需要学习74HC573、74HC138、74HC02。
二、相关数字芯片介绍
2.1 74HC138介绍
74HC138是一个三八译码器,也就是三个输入控制八路互斥的低有效输出。互斥的意思是只能有一个是低电平,不可能存在两个及以上同时输出低电平。
在开发板上G_1和G_2已经帮我们设计好了,不需要我们去操作什么。我们的任务就是知道A B C和8个Yx之间的联系就好
在数字电路中,我们以低电平(L)表示0,高电平(H)表示1,所以当C B A=0 0 0,也就是0(二进制转十进制)的时候,第0号口(Y0=0)就输出低电平;当C B A=0 0 1时,第1号口(Y1=0)就输出低电平。反过来我们想要Y4输出低电平就让C B A=1 0 0,也就是P27=1,P26=0,P25=0。
这里需要一些数电知识,不懂得b站搜索二进制转进制
2.2 74HC573介绍
当给LE引脚高电平时,输入什么就输出什么,当给LE引脚低电平时,输出不随输入变化,保持不变。
2.3 74HC02介绍
74HC02是或非门,也就是当两个输入都为低电平(0)的时候,输出才为高电平,否则一直是低电平。
三、代码设计思路
假设让L1亮起来其他全灭,那么就需要令Q1=0,Q2~Q7=1
也就是D1=0,D2~D7=1,也就是P00=0,P02~P07=1。
上面介绍573的时候也说到了输出要和输入一样需要让LE引脚为高电平,也就是Y4C要为低电平。
因为WR引脚接的是GND,所以要让Y4C为低电平,就要138的Y4=0,也就是C B A=1 0 0,也就是P27=1,P26=0,P25=0。
总结:要控制LED灯,我们就要控制P00~P07和P27、P26、P25这几个引脚
四、代码编写
#include <stc15.h>
#include <intrins.h>
/*
num从4到7,分别对应
4:LED灯
5:蜂鸣器、继电器、电机
6:数码管段选
7:数码管位选
*/
void selectHC573(unsigned char num)
{
switch(num)
{
case 4:
P2=(P2 & 0x1f) | 0x80;
break;
case 5:
P2=(P2 & 0x1f) | 0xa0;
break;
case 6:
P2=(P2 & 0x1f) | 0xc0;
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;
break;
case 0:
P2=(P2 & 0x1f) | 0x00;
break;
}
}
void system_Init() // 因为单片机上电时IO口状态不稳定,可能会导致蜂鸣器鸣叫(很吵)
{
selectHC573(5);
P0=0x00;
}
void L1()
{
selectHC573(4);
P0=0xfe;
}
void main(){
system_Init();
L1();
while(1)
{
}
}
五、小蜜蜂老师的课后作业题目以及答案
5.1题目
5.2 答案
#include <stc15.h>
#include <intrins.h> // 利用stc软件生成的软件延时代码中_nop_();需要用到这个头文件。
/*
num从4到7,分别对应
4:LED灯
5:蜂鸣器、继电器、电机
6:数码管段选
7:数码管位选
*/
void Delay1000ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 14;
j = 174;
k = 224;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void selectHC573(unsigned char num)
{
switch(num)
{
case 4:
P2=(P2 & 0x1f) | 0x80;
break;
case 5:
P2=(P2 & 0x1f) | 0xa0;
break;
case 6:
P2=(P2 & 0x1f) | 0xc0;
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;
break;
case 0:
P2=(P2 & 0x1f) | 0x00;
break;
}
}
void all_Led_Blink()
{
int i;
selectHC573(4);
for(i=0;i<3;i++)
{
P0=0x00;
Delay1000ms();
P0=0xff;
Delay1000ms();
}
}
void system_Init() // 因为单片机上电时IO口状态不稳定,可能会导致蜂鸣器鸣叫(很吵)
{
selectHC573(5);
P0=0x00;
}
void main(){
system_Init();
all_Led_Blink();
while(1)
{
}
}