蓝桥杯——单片机学习(3——点亮LED灯)

2023-05-16

注:此单片机型号为 STC15F2K60S2.

原理图片来源:我自己:)

如图,发光二极管L1—L8 共阳接法,VCC为电源正极,高电平。
已知发光二极管正向导通反向截至,要使得二极管发光,就要让Q1—Q8为低电平。可控管脚为P00—P07,所以要输入P00—P07为低电平。为了让P0能够影响到Q1—Q8,就要使得锁存器 M74HC573M1R 导通,即要让管脚LE为高电平。又管脚LE与Y4C连接,所以Y4C也为高电平。
图片来源:我自己:)
图片来源:我自己:)
又Y4C连接了一个或非门,或非门的输入端为Y4和WR。因为WR已用跳线帽与GND连接在了一起,GND为接地,所以WR为0(低电平)。
根据或非门逻辑表格:

Y4	      WR	   Y4C
0	       0	     1
0          1   	     0
1	       0	     0
1	       1	     0

所以,当Y4C为0时,Y4为1;当Y4C为1时,Y4为0.
所以,要使得Y4C为高电平,Y4就要为低电平,即Y4为0.
图片来源:我自己:)
又Y4是由 74HC138 位译码器的输入端A、B、C来控制,以 C、B、A 为逻辑顺序,CBA组成二进制数,来选中Y0—Y7,被选中者即为低电平。

所以,要使得 Y4 为低电平,CBA 要为 100.

另外,由于 P0 口是复用的,意味着也要控制别的器件,所以如果一直让 LE 为高,那么就在控制别的器件的时候就会影响到 LED,所以在锁存器导通后,应该截止保存住它的状态。

整理逻辑

点亮LED:
Q1—Q8为低电平 —> P00-P07为低电平 -> 导通锁存器,LE为高电平 ->
Y4C为高电平 -> 或非门,Y4为低电平 -> 译码器,CBA组合为100 ->
锁存状态,断开锁存器,LE为低电平,Y4C为低电平 -> 
或非门,Y4为高电平 -> 译码器,CBA组合为000.(不为100即可)

同理,熄灭LED:
Q1—Q8为高电平 —> P00-P07为高电平 -> 导通锁存器,LE为高电平 ->
Y4C为高电平 -> 或非门,Y4为低电平 -> 译码器,CBA组合为100 ->
锁存状态,断开锁存器,LE为低电平,Y4C为低电平 -> 
或非门,Y4为高电平 -> 译码器,CBA组合为000.(不为100即可)

代码

官方代码

来源:蓝桥杯官方资料。

#include "reg52.h"
// #include "absacc.h"
// 关闭外设
void Cls_Peripheral(void)
{ // IO模式(J13-2和J13-3相连)
  P0 = 0xFF;
  P2 = P2 & 0x1F | 0x80;			// P27~P25清零,再定位Y4C
  P2 &= 0x1F;						// P27~P25清零
  P0 = 0;
  P2 = P2 & 0x1F | 0xA0;			// P27~P25清零,再定位Y5C
  P2 &= 0x1F;						// P27~P25清零
//XBYTE[0x8000] = 0xFF;				// MM模式(J13-2和J13-1相连)
//XBYTE[0xA000] = 0;
}
// LED显示
void Led_Disp(unsigned char ucLed)
{ // IO模式(J13-2和J13-3相连)
  P0 = ~ucLed;                      //unsigned char
  P2 = P2 & 0x1F | 0x80;			// P27~P25清零,再定位Y4C
  P2 &= 0x1F;						// P27~P25清零
//XBYTE[0x8000] = ~ucLed;			// MM模式(J13-2和J13-1相连)
}
// 延时函数(最小约1ms@12MHz)
void Delay(unsigned int num)
{
  unsigned int i;
  while(num--)
    for(i=0; i<628; i++);
}
// 主函数
void main(void)
{
  unsigned char i, j;

  Cls_Peripheral();

  while(1)
  { // 4个亮度等级
    for(i=0; i<4; i++)
      for(j=0; j<100; j++)
      {
        Led_Disp(0xff);
        Delay(i+1);
        Led_Disp(0);
        Delay(4-i);
      }
  }
}

第一段:关闭外设
因为C51单片机默认P口为高电平,所以LED和蜂鸣器等等在程序运行前就会工作。具体原理看这个@我的头绝不是面团捏的 —— 蓝桥杯单片机比赛系列 1 初探关闭外设。
代码就直接放这了:

// 关闭外设
void Cls_Peripheral(void)
{ // IO模式(J13-2和J13-3相连)
  P0 = 0xFF;
  P2 = P2 & 0x1F | 0x80;			// P27~P25清零,再定位Y4C
  P2 &= 0x1F;						// P27~P25清零
  P0 = 0;
  P2 = P2 & 0x1F | 0xA0;			// P27~P25清零,再定位Y5C
  P2 &= 0x1F;						// P27~P25清零
//XBYTE[0x8000] = 0xFF;				// MM模式(J13-2和J13-1相连)
//XBYTE[0xA000] = 0;
}

(注:这个IO模式还是不懂诶,懂了我再填上,先放个参考博客——liu_endong——51 单片机 ——IO 口工作模式及配置)

第二段:LED 显示

// LED显示
void Led_Disp(unsigned char ucLed)
{ // IO模式(J13-2和J13-3相连)
  P0 = ~ucLed;                      //unsigned char
  P2 = P2 & 0x1F | 0x80;			// P27~P25清零,再定位Y4C
  P2 &= 0x1F;						// P27~P25清零
//XBYTE[0x8000] = ~ucLed;			// MM模式(J13-2和J13-1相连)
}

先设置 P0 口,选择要点亮的灯的编码 ucled ,再选中 Y4 导通锁存器,在 LED 点亮后再锁存。

第三段:延时函数

// 延时函数(最小约1ms@12MHz)
void Delay(unsigned int num)
{
  unsigned int i;
  while(num--)
    for(i=0; i<628; i++);
}

这个就不用说了吧,应该都懂。

第四段:主函数

void main(void)
{
  unsigned char i, j; //设置无符号char型参数  i,j.

  Cls_Peripheral();   //关闭外设

  while(1)            //循环
  { // 4个亮度等级
    for(i=0; i<4; i++)
      for(j=0; j<100; j++)
      {
        Led_Disp(0xff);//1111 1111,全灭
        Delay(i+1);    //设置延迟时间
        Led_Disp(0);   //0000 0000  全亮
        Delay(4-i);    //
      }
  }
}

呼吸灯其实就是以不同的亮度点亮led灯,关键就在于如何以不同的亮度来点亮led灯,也就是改变led灯的亮度。简单的方法就是在肉眼观察不到的时间范围内,改变 led 点亮时间的占比,从而形成不同亮度的视觉效果。

// 4个亮度等级
for(i=0; i<4; i++)
      for(j=0; j<100; j++)
      {
        Led_Disp(0xff);//1111 1111,全灭
        Delay(i+1);    //设置延迟时间
        Led_Disp(0);   //0000 0000  全亮
        Delay(4-i);    //
      }

两个循环,第一个循环和Delay函数一起用来设置亮与灭的时间,从而设置灯的亮度等级。第二个循环则设置每一个亮度等级的运行时间。
第二个循环内的内容,是将亮与灭的时间分为四份,按照不同搭配组合调节灯的亮度。

我的代码

led.c

/**************************************************************************** 
* Copyright (C), 2022,Moqim
* 文件名: led.c 
* 内容简述:LED初始化、LED控制函数 
* 
* 文件历史: 
* 版本号      日期       作者     说明 
*   01a    2022-04-24   Moqim   创建该文件
* 
* All rights reserved
*/

#include "led.h"

/**************************************************************************** 
* 函数名: LED_Init() 
* 功 能: 关闭全部的LED灯
* 输 入: 无        
* 输 出: 无 
*/
void LED_Init(void)
{	
	P0 = 0Xff;            //拉高所有PO端口
	P2 = P2 & 0x1f | 0x80;// P27~P25清零,再定位Y4C  关闭led
	P2 &= 0x1f;           // P27~P25清零,锁存
}

/**************************************************************************** 
* 函数名: LED_Ctrl() 
* 功 能: 关闭全部的LED灯
* 输 入: 无        
* 输 出: 无 
*/
void LED_Ctrl(unsigned char ucLed)//uc 表示 "unsigned char" 类型
{
	P0 = ~ucLed;          //ucled取反 0000 0001 -> 1111 1110
	P2 = P2 & 0x1f | 0x80;// P27~P25清零,再定位Y4C
	P2 &= 0x1f;           // P27~P25清零,锁存
}

led.h

//为了防止头文件被重复引用,应当用 ifndef/define/endif结构产生预处理块

#ifndef __LED_H
#define __LED_H

#include "stc15f2k60s2.h"

void LED_Init(void);
void LED_Ctrl(unsigned char ucLed);

#endif /*__LED_H*/

main.c

/**************************************************************************** 
* Copyright (C), 2022,Moqim
* 文件名: main.c 
* 内容简述:实现十个等级的呼吸灯与向右移动的LED流水灯 
* 
* 文件历史: 
* 版本号      日期       作者     说明 
*   01a    2022-04-24   Moqim   创建该文件 
*
* All rights reserved
*/

//头文件调用区
#include "stc15f2k60s2.h"
#include "led.h"

//变量定义区


//函数声明区
void LED_NotifyLight(void);
void LED_Runningwater(void);
void Delay_ms(unsigned int num);

//Main Body
int main(void)
{
	LED_Init();
	while (1)
	{
		LED_NotifyLight();
		LED_Runningwater();
	}
	
}

/**************************************************************************** 
* 函数名: LED_NotifyLight() 
* 功 能: 实现10个等级的呼吸灯
* 输 入: 无        
* 输 出: 无 
* 说 明:像油画调色一样,不同比例的亮与暗的搭配,可以实现LED的不同亮度
*/
void LED_NotifyLight(void)
{
	int i, j;
	for(i=0; i<10; i++)//划分等级,将LED的亮度划分为十份
		for(j=0; j<100; j++)//为保证肉眼能够观察,将每个时段的时间扩大一百倍
		{
			//熄灭时间 + 点亮时间 = 10(按比例理解也是一样的)
			LED_Ctrl(0xff);
			Delay_ms(i+1);//设定LED熄灭的时间
			LED_Ctrl(0);
			Delay_ms(10-i);//设定LED点亮的时间
		}
}

/**************************************************************************** 
* 函数名: LED_Runningwater() 
* 功 能: 实现向右移动的LED流水灯
* 输 入: 无        
* 输 出: 无 
* 说 明:注意蓝桥杯板子上LED灯的排序,是低位在前,~0x01在第一个,~0x02在第二个,~0x04在......
*/
void LED_Runningwater(void)
{
	int i = 0;//变量定义放在外面,或者紧挨着函数开头的括号
	
	for (i = 0;i<8;i++)//右移8次 (包括移动0位)
	{
		LED_Ctrl(0x01 << i);//取反后为:1111 1110 -> 1111 1101 ->1111 1011 ->......
		Delay_ms(500);
	}
}

/**************************************************************************** 
* 函数名: Delay_ms() 
* 功 能: 延时
* 输 入: unsigned int num:延时num毫秒        
* 输 出: 无 
*/
void Delay_ms(unsigned int num)//软件延时不精确,凑合用吧
{
	int i,j;
	for(i = 0;i<num;i++)
	{
		for(j = 0;j<625;j++);
	}
}

老师的代码(流水灯)

int i;
while(1){
	
  for(i=0;i<8;i++){
    P0 = ~(1<<i);//从右往左
		//从左往右   P0 = ~(0x80>>i);
		P2 = P2 & 0x1F | 0x80;
		P2& = 0x1F;
	}

}

注:

流水灯连续左移右移可能会导致有一个灯闪烁两次,为了解决这个问题,可以使得左移 1-7,右移也 1-7,直接交叉点亮。

请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯——单片机学习(3——点亮LED灯) 的相关文章

  • 虚拟机连不上网解决办法,以及出现Ubuntu connect: Network is unreachable

    虚拟机连不上网解决办法 xff0c 以及出现Ubuntu connect Network is unreachable 问题来源具体过程 问题来源 出现了Ubuntu connect Network is unreachable这个问题 x
  • linux持久化

    linux持久化后门 添加超级用户SUID shellalias 后门inetdcrontab后门ssh公钥免密ssh软连接SSH wrapper后门PAM隐身登录隐藏文件Git hooksPROMPT COMMAND后门PROMPT CO
  • linux恶意进程隐藏

    https mp weixin qq com s 6Z4tErcnusYHTqiSUSVz3A https blog csdn net nzjdsds article details 82919100
  • 图图图图图

  • windows提权总结

    windows提权总结 内核溢出提权Windows系统配置错误提权系统服务权限配置错误注册表键AlwaysInstallElevated可信任服务路径漏洞自动安装配置文件计划任务 Windows组策略首选项提权 SYSVOL GPP SYS
  • 运行Intel realsense L515相机

    运行Intel realsense L515相机 首先去官 https www intelrealsense com sdk 2 xff0c 按照上面的提示安装各种文件 xff0c 然后输入realsense viewer出现可视化窗口 下
  • python的shellcode_loader解释

    python的shellcode loader解释 代码 loader传到主机执行 xff0c shellcode传到自己的服务器上 简单的python shellcode加载器 xff0c 直接上代码 xff0c 注释都在代码里 代码 s
  • 「网络工程师必会技能」-路由器介绍和路由器基本配置

    网络工程师必会技能 路由器介绍和路由器基本配置 xff0c 这是每个网络必须会的技能 xff0c 不是你有证书就一个网络工程师了哦 xff01 以Cisco路由器为例说明 xff1a xff08 1 xff09 访问路由器 访问路由器与访问
  • 英飞凌微控制器,驱动物联网的关键“大脑”

    英飞凌微控制器 xff0c 驱动物联网的关键 大脑 英飞凌各种各样的传感器以及基于它们的创新应用 xff0c 可谓是打开了传感器的 兵器库 xff0c 令人大开眼界 今天 xff0c 我们将进入 计算 这一环节 xff0c 看看唯样商城代理
  • EMC对策产品:TDK扩大了内置ESD保护功能的陷波滤波器阵容

    EMC对策产品 xff1a TDK扩大了内置ESD保护功能的陷波滤波器阵容 新的陷波滤波器同时实现了ESD保护和最大频率为5 3 GHz频段噪声抑制抑制无线通信中产生的TDMA噪声 xff0c 提高无线信号接收灵敏度强大的静电保护能力 xf
  • 这27个电源符号,别再分不清 快收藏起来学习

    这27个电源符号 xff0c 别再分不清 xff01 快收藏起来学习 以下的V代表Volatge的意思 电源符号 解析 VCC C可以理解为三极管的集电极Collector或者电路Circuit xff0c 指电源正极 VDD D可以理解为
  • 74ls160引脚图引脚图和功能真值表

    74ls160引脚图管脚图及功能真值表 xff0c 74ls160引脚图管脚图74LS160的功能真值表 综合电路图 74ls160引脚图管脚图 74LS160的功能真值表 唯样商城是本土元器件目录分销商 xff0c 采用 小批量 现货 样
  • 最全74HC04六反相器中文资料|引脚图及功能表|应用电路图

    最全74HC04六反相器中文资料 引脚图及功能表 应用电路图 最全74HC04六反相器中文资料 引脚图及功能表 应用电路图 xff0c 该74HC04 74HCT04是高速CMOS器件 xff0c 低功耗肖特基的TTL LSTTL 电路 功
  • 房卡一插就有电 酒店插卡取电原理解析

    房卡一插就有电 酒店插卡取电原理解析 酒店插卡取电的原理是什么 xff0c 入住酒店只需用房卡一插就有电 xff0c 原理是什么呢 xff1f 只是一张塑料片不能导电的啊 导读 xff1a 酒店插卡取电的原理是什么 xff0c 入住酒店只需
  • SiC MOSFET驱动电压的分析及探讨

    SiC设计干货分享 xff08 一 xff09 xff1a SiC MOSFET驱动电压的分析及探讨 随着制备技术的进步 xff0c 在需求的不断拉动下 xff0c 碳化硅 xff08 SiC xff09 器件与模块的成本逐年降低 相关产品
  • EM-500储能网关的AI采集性能实测

    EM 500储能网关的AI采集性能实测 EM 500是致远电子面向工商储能应用推出的高性价比储能网关产品 为满足采集外部传感器数据需要 xff0c EM 500设计内置了多通道高性能AI采集接口 xff0c 本文将对其进行一次实测 EM 5
  • 【IoT开发】UART通信高频测试

    测试所使用芯片 STM32F103RCT6 UART收发的极限频率 xff1a bytes s 1 发送频率 主程序循环发送一字节u8整型 xff0c 记录次数 while 1 t 43 43 if t 61 61 255 t 61 0 p
  • 560V输入、无光隔离反激式转换器

    560V输入 无光隔离反激式转换器 在传统的隔离式高压反激式转换器中 xff0c 使用光耦合器将稳压信息从副边基准电压源电路传输到初级侧 xff0c 从而实现严格的稳压 问题在于 xff0c 光耦合器大大增加了隔离设计的复杂性 xff1a
  • 用于DC-DC转换器的MIL-SPEC COTS EMC输入滤波器

    用于DC DC转换器的MIL SPEC COTS EMC输入滤波器 DC DC转换器的开关动作可能会引起不良的共模和差模噪声 xff0c 在频谱的许多点上创建不可接受的干扰 前端 xff08 或电力线 xff09 滤波器旨在在DC DC转换
  • C语言中调用nop();解决办法

    C语言中调用 nop 解决办法 可在头文件中添加 include lt intrins h gt 或是直接删去 nop intrins h一般用在keilC51单片机编程中 xff0c 一般程序中需要使用到空指令 nop 字符循环移位指令

随机推荐

  • rosrun teleop_twist_keyboard teleop_twist_keyboard.py

    rospack Error package teleop twist keyboard not found 解决方案 xff1a 1 cd catkin ws src xff08 如果没有这个目录先在工作目录下创建工作空间 xff1a mk
  • ubuntu20.04安装ros配置秘钥时出现gpg: keyserver receive failed: Connection timed out

    gpg keyserver receive failed Connection timed out也是从公钥服务器接收失败 xff1a 连接超时 解决方案1 换自己的手机热点 解决方案2 切换网络配置 xff1a 这大多数是网络的问题 xf
  • rosbag的命令使用以及代码编写

    概念 xff1a rosbag是用于录制和回放 ROS 主题的一个工具集 作用 实现了数据的复用 xff0c 方便调试 测试 本质 xff1a rosbag本质也是ros的节点 xff0c 当录制时 xff0c rosbag是一个订阅节点
  • 格式化串漏洞

    格式化字符串漏洞本身并不算缓冲区溢出漏洞 xff0c 这里作为比较典型的一类漏洞进行简单介绍 为了能够将字符串 变量 地址等数据按照指定格式输出 xff0c 通常使用包含格式化控制符的常量字符串作为格式化串 xff0c 然后指定用相应变量来
  • 单链表的遍历

    1 什么是遍历 遍历就是把单链表的各个节点挨个拿出来 xff0c 一个不能少 xff0c 也不能重复 xff0c 追求效率 2 如何遍历单链表 xff08 1 xff09 分析数据结构的本身特点 xff0c 然后根据根据它本身的特点制定相应
  • 单链表之删除节点

    1 删除节点的步骤 xff08 1 xff09 找到要删除的这个节点 xff1a 通过遍历来查找节点 xff0c 从头指针 43 头节点开始 xff0c 顺着链表依次将各个节点拿出来 xff0c 按照一定的方法比对 xff0c 找到我们要删
  • lssek函数的用法及作用

    1 lseek函数的介绍 xff08 1 xff09 文件指针 xff1a 当我们对一个文件读写时 xff0c 一定需要打开这个文件 xff0c 所以我们操作的都是动态文件 xff0c 动态文件在内存中的形态就是流的形式 xff08 2 x
  • ubuntu20.04安装arduino IDE(亲测可用)

    步骤一 xff1a 在官网下载arduino安装包选择相应的版本 下载链接 步骤二 xff1a 解压下载的安装包在相应的目录下执行下面语句 tar xvf 安装包名 步骤三 xff1a 将解压后的安装包移动到 opt目录下 sudo mv
  • px4无人机常识介绍(固件,px4等)

    专业名词解释 aircraft 任何可以飞或者可以携带物品还是搭载旅客的飞行器统称为飞机 航空器 uav 无人驾驶飞机 vehicle 飞行器 airplane plane aero plane 有机翼和一个或多个引擎的飞行器统称为飞机 D
  • 在运行ros的Python文件时报找不到路径

    1 第一行解释器声明 xff0c 可以使用绝对路径定位到 python3 的安装路径 usr bin python3 xff0c 但是不建议 2 建议使用 usr bin env python 但是会抛出异常 usr bin env pyt
  • ros文件架构

    WorkSpace span class token operator span span class token operator span 自定义的工作空间 span class token operator span span cla
  • 用C语言和汇编给寄存器赋值

    1 用汇编 要根据目标CPU的体系 xff0c 用对应的汇编类型编写 ldr r0 61 0X020C4068 CCGR0 ldr r1 61 0XFFFFFFFF str r1 r0 2 用C语言 要知道相关寄存器地址 官方会提供参考手册
  • 商人过河--广度优先搜索--matlab实现

    进行了代码优化 目录 应用背景 xff1a 模型求解 xff1a 模型建立 xff1a 模型实现 xff1a 源代码 xff1a 运行结果 xff1a 附 xff1a 应用背景 xff1a M个商人与N个仆从过河 xff0c 小船一次可载k
  • C++---全局对象、局部对象、静态对象

    1 全局对象 xff0c 程序一开始 xff0c 其构造函数就先被执行 xff08 比程序进入点更早 xff09 xff1b 程序即将结束前其析构函数将被执行 2 局部对象 xff0c 当对象生成时 xff0c 其构造函数被执行 xff1b
  • 2011年B题交通巡警第一问的练习与实现

    题目要求 xff1a 试就某市设置交巡警服务平台的相关情况 xff0c 建立数学模型分析研究下面的问题 xff1a xff08 1 xff09 附件1中的附图1给出了该市中心城区A的交通网络和现有的20个交巡警服务平台的设置情况示意图 xf
  • 利用最大流最小割算法matlab割图

    目录 练习思路 matlab绘图 噪音 坐标编码 邻接矩阵 最大流最小割算法 对最大流最小割算法求解结果转换为图像 源代码 运行实例 TIPS 最近学习了最大流和最小割算法 xff0c 可以把图看成是一些点的集合 xff0c 色彩差值的倒数
  • 关于将一个数分解成四个数平方和的算法matlab

    目录 理论基础 拉格朗日四平方数和定理 高斯恒等式 操作步骤 分解质因数 求解四平方数 应用高斯恒等式 小结 高斯恒等式输出代码 输出结果 运行结果 怎么把一个大数分解成四个小数的平方和呢 xff1f 理论基础 拉格朗日四平方数和定理 每个
  • 寻找较大素数,简易实现RSA密码系统matlab

    目录 RSA密码系统 随机寻找两个较大的素数 欧拉筛的算法函数 寻找随机素数的代码 生成公钥和私钥 加密解密方式 实现代码 运行结果 小结 首先来了解一下什么是RSA算法 RSA密码系统 RSA是被研究得最广泛的公钥算法 xff0c 从提出
  • 关于返回一个矩阵中为0元素个数及位置的matlab自定义函数实现以及用到的matlab基本操作

    目录 练习例题 题目要求 代码呈现 运行结果 基础操作 返回矩阵的行数列数 生成矩阵函数 取整取余函数 自定义函数参数缺省下的默认值以及输入参数为空集下替换为默认值的情况 find函数大观 对于find函数的改善调用 练习例题 题目要求 编
  • 蓝桥杯——单片机学习(3——点亮LED灯)

    注 xff1a 此单片机型号为 STC15F2K60S2 原理 如图 xff0c 发光二极管L1 L8 共阳接法 xff0c VCC为电源正极 xff0c 高电平 已知发光二极管正向导通反向截至 xff0c 要使得二极管发光 xff0c 就