🎈教程介绍:博客依据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){}
}