一、基础原理
蓝桥杯的板子与我之前所用有些不同,用了大量锁存器与译码器,可能会有点难度,不过核心都差不多,只要搞懂原理还是很好掌握相关知识点的!
1、74HC573锁存器
对于该51板子,LED模块用到了下面的74HC573锁存器,该锁存器为一个八路三态输出的非反转透明锁存器,即左边输入什么,右边就输出什么;
该锁存器使能端LE为高时,数据是透明的,当LE为低,即Y4C为低电平时,该锁存器处于锁存状态(无论左边输入什么,右边输出均不会随其改变)。于是我们应该将其设置为使能端LE为低(即Y4C为低),即非锁存状态;
2、74HC02
由于Y4与WR会经过或非门之后为Y4C的值,根据上面一点所述,我们要将Y4C的值设置为高电平,即Y4要被设置为低电平
3、74HC138译码器
该译码器为三八译码器,三个输入控制八路互斥的低有效输出,即Y4为低电平则为100,即P27=1 P26=0 P25=0
二、相关代码
1、相关代码思路
先是通过延时函数,控制LED亮灭,再调用闪烁函数三次,实现LED亮灭3遍;
实现LED依次点亮:第一个LED点亮即1111 1110即0xfe 然后不断向左移位->1111 1100(第一第二灯亮)->1111 1000(第一、二、三灯亮)...... 如此进行八次,使八个灯均被点亮
实现LED依次熄灭:上一步灯均被点亮,为0000 0000,进行左移一位为0000 0000,再或1为0000 0001(第一个被熄灭)->进行左移一位为0000 0010,再或1为0000 0011(第一、二均被熄灭)...... 如此进行八次,使八个灯依次被熄灭
2、具体代码
/*******************************************************************************
* 文件名称:LED实验
* 实验配置:J3跳线配置为IO方式,J5配置为KBD、J2配置为1-3和2-4
* 实验现象:LED灯闪烁三次之后,从左至右依次点亮,之后再从左至右依次熄灭
* 日期版本:2023/3/5
*******************************************************************************/
#include <reg52.h>
#include <intrins.h>
//定义端口
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
//延时函数
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
//LED闪烁函数
void Runing(){
HC138_A=0;
HC138_B=0;
HC138_C=1;
P0=0x00;
delay(10000);
P0=0xff;
delay(10000);
}
void main(void){
unsigned char i;
while(1){
delay(10000);
Runing();
Runing();
Runing(); //闪烁三次
P0=0xfe; //第一个灯亮
delay(10000);
for(i=0;i<8;i++){
P0=P0<<1; //依次点亮
delay(10000);
}
delay(10000);
for(i=0;i<8;i++){
P0=P0<<1;
P0|=1; //依次熄灭
delay(10000);
}
}
}