蓝桥杯单片机之点灯学习记录

前言

蓝桥杯单片机点灯操作分为硬件原理和程序编写,我们只有知道了硬件如何工作的我们才能知道程序该如何编写

一、硬件原理

硬件流程大致如下:
首先赛前养成良好习惯第一步关闭外设,如果不事先关闭外设的话上电蜂鸣器和继电器就会自动响应,造成不必要的影响(被旁边同学爆锤)。
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); 

三、呼吸灯效果演示

呼吸灯演示

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小的Wu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值