前言
蓝桥杯单片机点灯操作分为硬件原理和程序编写,我们只有知道了硬件如何工作的我们才能知道程序该如何编写
一、硬件原理
硬件流程大致如下:
首先赛前养成良好习惯第一步关闭外设,如果不事先关闭外设的话上电蜂鸣器和继电器就会自动响应,造成不必要的影响(被旁边同学爆锤)。
1.关闭外设
各个外设接口的原理图:
74HC573内部原理图:
由图上可知,当使能(LE)为高时,Q输出将随数据(D)输入而变。当使能(LE)为低时,输出将锁存在已建立的数据电平上。所以要想关闭外设必须使得Y5C=1,然后让P0=0X00,再经过ULN2003内部自带反相器才能输出为高电平使外设关闭。
ULN2003内部图:
那么同理也要先将LED全部关闭,因为是共阳极数码管,所以是低电平点亮。要想关闭LED必须使得Y4C=1,然后让P0=0XFF。
LED原理图:
2.点亮LED
那么只需要一个8位的数据类型unsigned char便能够存储对应LED各个位。道理都是一样的,可以先给变量赋值如0xFE,然后再使能Y4C锁存器透传,随即再关闭所有锁存器即可点亮LED。
3.74HC138译码器和74HC02
那么往上追溯,那如何决定Y4C和Y5C呢?答案就是74HC02,该芯片由4片或非门组成:
IO模式接口原理图:
因为IO模式默认跳线帽是23脚接在一起的,所以WE=0。
所以决定Y4C和Y5C转变成了决定于Y4和Y5,那么Y4和Y5由谁决定呢?答案就是74HC138译码器。
真值表:
二、程序编写
main.c
#include "Delay.h"
#include "bsp_init.h"
#include "bsp_led.h"
void main()
{
unsigned char i,j;
Cls_Peripheral();//关闭外设
while(1)
{
for(i=0;i<10;i++)
{
for(j=0;j<8;j++)
{
Led_Disp(0X10);
Delay(i); //亮的时间
Led_Disp(0x00);
Delay(10-i); //灭的时间
}
}
for(i=10;i>0;i--)
{
for(j=0;j<8;j++)
{
Led_Disp(0X10);
Delay(i); //亮的时间
Led_Disp(0x00);
Delay(10-i); //灭的时间
}
}
}
}
bsp_led.c
#include "bsp_led.h"
//函数名:LED显示函数
//入口参数:一个字节的数据,每位对应要显示的十六进制数据,如0x01 = 0000 0001,L8~L1
//返回值:无
//函数功能:按照入口参数顺序将LED点亮,1为亮,0为灭
void Led_Disp(unsigned char ucled)
{
P0 = ~ucled; //将输入数据取反,更改为正常的逻辑1为亮,0为灭
P2 = P2 & 0x1F | 0x80; //先高三位清零,0x80选通 Y4C,也就是LED的锁存器,将数据透传过去
P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器关闭
}
bsp_led.h
#include "STC15F2K60S2.H"
//函数名:LED显示函数
//入口参数:一个字节的数据,每位对应要显示的十六进制数据,如0x01 = 0000 0001,L8~L1
//返回值:无
//函数功能:按照入口参数顺序将LED点亮,1为亮,0为灭
void Led_Disp(unsigned char ucled);
bsp_init.c
#include "bsp_init.h"
//函数名:关闭外设的初始化函数
//入口参数:无
//返回值:无
//函数功能:将蜂鸣器、LED和继电器关闭
void Cls_Peripheral(void)
{
P0 = 0xFF; //P0端口各位置1,共阳二极管,将LED全灭
P2 = P2 & 0x1F | 0x80; //先高三位清零,0x80选通 Y4C,也就是LED的锁存器,将数据透传过去,将LED关闭
P2 &= 0x1F; //将打开的锁存器关闭,所有锁存器关闭
P0 = 0x00; //准备关闭外设,数据还未透传
P2 = P2 & 0x1F | 0xA0; //先高三位清零,选通 Y5C,也就是外设的锁存器,将数据透传过去,将外设关闭
P2 &= 0x1F; //将打开的锁存器关闭,所有锁存器关闭
}
bsp_init.h
#include "STC15F2K60S2.H"
//函数名:关闭外设的初始化函数
//入口参数:无
//返回值:无
//函数功能:将蜂鸣器、LED和继电器关闭
void Cls_Peripheral(void);
Delay.c
#include "Delay.h"
//函数名:延时毫秒函数
//入口参数:延时的数值,2个字节,16位,0--65535
//返回值:无
//函数功能:延时一定的毫秒数据
void Delay(unsigned int num)
{
unsigned int i;
while(num--)
for(i=0; i<628; i++);
}
Delay.h
#include "STC15F2K60S2.H"
//函数名:延时毫秒函数
//入口参数:延时的数值,2个字节,16位,0--65535
//返回值:无
//函数功能:延时一定的毫秒数据
void Delay(unsigned int num);
三、呼吸灯效果演示
呼吸灯演示