蓝桥杯模块学习2——LED灯

news2024/11/30 10:31:05

第一章 硬件部分

1.1 为什么要了解硬件部分?

  比赛的时候会给出原理图,如果我们能够深入的理解硬件,就可以从中推导出代码应该怎样写,而不用死记硬背

1.2 电路的组成部分

1.2.1 74HC573锁存器

  1. 原理图:
    ​​​​​​​​​​在这里插入图片描述
  2. 功能:
    (1)LE控制锁存,由Y4C控制(可以简单理解为开关,当LE为高电平时,Dx和Qx之间的通道就打开)
    (2)D0-D7确定改变的数据,其中D0-D7与Q0-Q7一一对应,由单片机P0决定(正输出——不管之后输入什么数据,之后都保持输出之前输入的数据)

1.2.2 SN74HC02DRG4四路二输入或非门

  1. 原理图:
    ​​​​​​​​​​在这里插入图片描述

  2. 功能:集成了四个二输入或非门的模块,其中A、B为输入,Y为输出
    ​​在这里插入图片描述

1.2.3 74HC138译码器

  1. 原理图:在这里插入图片描述
  2. 功能:实现用A0-A2控制Y0-Y7,其中对应方式是以二进制与十进制的对应方式,如100控制Y4=0,其他都为1(反输出)

1.3 整体电路理解

  我们要将所有电路结合起来看,就可以有一个大概的控制LED流程:

  1. 首先我们通过P0口传入LED控制数据
  2. 寻根溯源:由74HC573锁存器图可知,LED锁存器由Y4C控制;又由四路二输入或非门图可知,Y4C由Y4和WR控制;又由74HC138译码器图可知,Y4由P27、P26、P25控制。(至于WR我们就不用管了,J13是板子外接的排针,由跳帽短接决定,其中涉及到MM模式我们之后再说,现在我们可以默认它接到GND,即与0相或,对结果没有影响)
  3. 由以上两点分析可知,LED控制由P0和P27、P26、P25决定:
    (1)其中LED另一端接到VCC,即P0中为低电平的IO口对应的LED亮
    (2)P27、P26、P25分别为100,即选择Y4

第二章 具体实验

2.1 实验内容

  使八个LED灯顺序点亮,然后再顺序熄灭,最后全部闪三下(每个要加适当的延时)

2.2 无操作系统代码

注:一开始接触可以就写这个代码,过省赛应该是没问题的

2.1.1 按照以上思路写的代码

// 使用程序前,将J13调整为IO模式(2-3脚短接)
#include "reg52.h"
#define u8 unsigned char
#define u16 unsigned int
sbit HC138_A2=P2^7;
sbit HC138_A1=P2^6;
sbit HC138_A0=P2^5;

void LED_LE_ON();
void LE_OFF();
void Buzzer_LE_ON();
void Delay_1ms(u16 num);
// 主函数
void main(void)
{
	u8 i;
  while(1)
  { 
		//关闭蜂鸣器
		Buzzer_LE_ON();
		P0=0x00;	
		LED_LE_ON();
		//顺序点亮
		for(i=0;i<=8;i++)
		{
			P0=0XFF<<i;
			Delay_1ms(100);
		}
		Delay_1ms(800);
		//顺序熄灭
		for(i=0;i<=8;i++)
		{
			P0=~(0XFF<<i);
			Delay_1ms(100);
		}
		Delay_1ms(800);
	  //全部连续闪三下
    for(i=0;i<3;i++)
		{
			P0=0x00;
			Delay_1ms(300);
			P0=0xff;
			Delay_1ms(300);
		}		
		Delay_1ms(800);
		LE_OFF();
  }
}

void LED_LE_ON()
{
	HC138_A2=1;
	HC138_A1=0;
	HC138_A0=0;
}
void Buzzer_LE_ON()
{
	HC138_A2=1;
	HC138_A1=0;
	HC138_A0=1;
}
void LE_OFF()
{
	HC138_A2=0;
	HC138_A1=0;
	HC138_A0=0;
}

// 延时函数,大概时间
void Delay_1ms(u16 num)
{
  unsigned int i;
  while(num--)
    for(i=0; i<628; i++);
}

2.1.2 模块化

// 使用程序前,将J13调整为IO模式(2-3脚短接)
#include "reg52.h"
#define u8 unsigned char
#define u16 unsigned int
void Delay_1ms(u16 num);
void Close_All(void);
void LED_ON(u8 L_X);

// 主函数
void main(void)
{
	u8 i;
	Close_All();
  while(1)
  { 
		//顺序点亮
		for(i=0;i<=8;i++)
		{
			LED_ON(0XFF<<i);
			Delay_1ms(100);
		}
		Delay_1ms(800);
		//顺序熄灭
		for(i=0;i<=8;i++)
		{
			LED_ON(~(0XFF<<i));
			Delay_1ms(100);
		}
		Delay_1ms(800);
	  //全部连续闪三下
    for(i=0;i<3;i++)
		{
			LED_ON(0x00);
			Delay_1ms(300);
			LED_ON(0xff);
			Delay_1ms(300);
		}		
		Delay_1ms(800);
  }
}

/*
	输入变量:P0口的对应的16进制数
	输出变量:无
	功能:选择相应的锁存器后,通过P0口控制LED灯亮
*/
void LED_ON(u8 L_X)
{
	P0 = L_X;
	P2 = (P2 & 0x1f) | 0x80;
	P2 &= 0x1f;//用完就关,随手关门从我做起
}

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

/*
	输入变量:无
	输出变量:无
	功能:关闭蜂鸣器和继电器
*/
void Close_All(void)
{
	//关闭蜂鸣器和继电器
	P0 = 0x00;
	P2 = (P2 & 0x1f) | 0xA0;
	P2 &= 0x1f;
	//关闭LED灯
	P0 = 0xff;
	P2 = (P2 & 0x1F) | 0x80;
	P2 &= 0x1f;	
}

2.1.3 使用了更复杂的位操作

// 使用程序前,将J13调整为IO模式(2-3脚短接)
#include "reg52.h"
#define u8 unsigned char
#define u16 unsigned int

void Delay_1ms(u16 num);
void Close_All(void);
void LED_ON(u8 L_X);
void LED_ON_Lx(u8 L_X);
u8 last_led = 0xff;
// 主函数
void main(void)
{
	u8 i;
	Close_All();
  while(1)
  { 
		//顺序点亮
		for(i=0;i<=8;i++)
		{
			LED_ON_Lx(i);
			Delay_1ms(100);
		}
		Delay_1ms(800);
		//顺序熄灭
		for(i=0;i<=8;i++)
		{
			LED_ON_Lx(i);
			Delay_1ms(100);
		}
		Delay_1ms(800);
	  //全部连续闪三下
    for(i=0;i<3;i++)
		{
			LED_ON(0x00);
			Delay_1ms(300);
		  LED_ON(0xff);
			Delay_1ms(300);
		}		
		Delay_1ms(800);
  }
}

/*
	输入变量:P0口的对应的16进制数
	输出变量:无
	功能:选择相应的锁存器后,通过P0口控制LED灯亮
*/
void LED_ON(u8 L_X)
{
	P0 = L_X;
	P2 = (P2 & 0x1f) | 0x80;
	P2 &= 0x1f;
}

/*
	输入变量:Lx灯翻转
	输出变量:无
	功能:选择相应的锁存器后,通过P0口控制某个LED灯翻转,但不影响其他LED灯
	注意:使用前要对last_led进行宏定义
*/
void LED_ON_Lx(u8 L_X)
{
	//由于P0口是公用的口,我们要对每次点灯的数据进行记录,不然会受其他操作的影响
	P0 = last_led ^ (0x01<<(L_X-1));
	last_led = P0;
	P2 = (P2 & 0x1f) | 0x80;
	P2 &= 0x1f;
}

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

/*
	输入变量:无
	输出变量:无
	功能:关闭蜂鸣器和继电器
*/
void Close_All(void)
{
	//关闭蜂鸣器和继电器
	P0 = 0x00;
	P2 = (P2 & 0x1f) | 0xA0;
	P2 &= 0x1f;
	//关闭LED灯
	P0 = 0xff;
	P2 = (P2 & 0x1F) | 0x80;
	P2 &= 0x1f;	
}

2.3 RTX51代码

国赛必备,优点是可以在延时的时候畅通无阻的执行其他东西

#include <rtx51tny.h>
#include <STC15F2K60S2.H>
#define u8 unsigned char
#define u16 unsigned int	
u8 l_data;
void All_Close();
void LED_Show(u8 l_data);
void Startup() _task_ 0
{
	All_Close();
	os_create_task(1);
	os_create_task(2);
	os_delete_task(0);
}

void task1() _task_ 1
{
	static u8 i;
	while(1)
	{
		for(i=0;i<=8;i++)
		{
			l_data = 0xff<<i;
			os_send_signal(2);
			os_wait2(K_IVL,100);
		}
		os_wait2(K_IVL,800);
		
		for(i=0;i<=8;i++)
		{
			l_data = ~(0xff<<i);
			os_send_signal(2);
			os_wait2(K_IVL,100);
		}		
		os_wait2(K_IVL,800);
		for(i=0;i<3;i++)
		{
			l_data = 0x00;
			os_send_signal(2);		
			os_wait2(K_IVL,500);
			l_data = 0xff;
			os_send_signal(2);		
			os_wait2(K_IVL,500);
		}
		os_wait2(K_IVL,800);
	}
}

void task2() _task_ 2
{
	while(1)
	{
		os_wait1(K_SIG);
		LED_Show(l_data);
	}
}
/******************************/

//选择锁存器,输出数据
void Select(u8 cs,u8 s_data)
{
	P0 = s_data;
	P2 = P2 & 0x0f | (cs<<5);
	P2 &= 0x0f;
}

//关闭外设
void All_Close()
{
	//关闭蜂鸣器
	Select(5,0x00);
	//关闭LED
	Select(4,0xff);	
	//关闭数码管
	Select(7,0xff);		
}

//输入8位数据亮灯,1为亮灯
void LED_Show(u8 l_data)
{
	Select(4,~l_data);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Claude的奇妙之旅:一起探索人工智能的无限可能

是一款由Anthropic公司开发的人工智能应用&#xff0c;可以在Slack中使用。可以理解和生成自然语言&#xff0c;帮助用户完成各种任务&#xff0c;如写小说、编写代码、解释概念等。的特点是&#xff1a; - 是免费的&#xff0c;不需要申请或下载&#xff0c;只需要在Slack中添…

网络安全合规-OKR和KPI

首先我们还是要区分OKR和KPI的关系区别&#xff1a; 我们可以从几个方面来看两者的差别&#xff1a; 第一&#xff0c;从核心驱动上区分 KPI 以考核为核心驱动&#xff1b;OKR 以成果为核心驱动。 KPI &#xff1a;就是把工作“量化成数据”&#xff0c;当成个人的考核标准&…

若依框架讲解后端利用DefaultKaptcha生成验证码及校验

pom文件中引入DefaultKaptcha的依赖 <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version></dependency>Kaptcha 是一个可高度配置的实用验证码生成工具&#xff0c;…

个人 [Raft项目] 记一次内存泄漏排查

1 .发现过程 笔者在一步一步写Raft协议, 在可以跑了一天后,发现Leader节点的内存使用量缓慢上涨, 且手动执行GC后也没达到预期水平线 Leader节点内存情况 在对Java有深入了解的读者其实是可以理解内存使用量的产生 笔者的测试用例是: 启动四个节点,查看一天后的内存攀升, Le…

大专生,本科生,正在成为求职市场最尴尬的存在-我反对此言论,因为高成本,低科技,低利润产业将是中国未来五十年的主要特点

有很多视觉人机器视觉粉丝咨询我,我大专生可以学机器视觉开发吗? 我这里回答下:可以,你要自信点,下三年苦功夫,去学习,去专研,去找一个好点公司平台或者好点的培训机构。 学历不是评价一个人的唯一标准,但是它一直是社会对个人综合素质和知识储备的一种重要衡量标准…

卡尔曼滤波器-公式简单推导 | 原理分析 | 将卡尔曼滤波器在MatLab中简单实现

目录 1.状态转移2.协方差矩阵3.噪声协方差矩阵的传递4.观测矩阵5.状态更新6.噪声协方差矩阵的更新7.在MatLab中实现卡尔曼滤波器1.状态转移 卡尔曼滤波器又称为最佳线性滤波器。优点有实现简单、纯时域滤波器、不需要进行频域变换等。 假设有一辆汽车在路上行驶,用位置和速度…

Android+SQLite家庭食物储藏有效期提醒信息app源码

一个新的时代--移动互联网已经微笑着迎面而来。移动互联网与智能手机有着自身独特的优势&#xff0c;使得人们更方便的办公、娱乐&#xff0c;生活更加轻松。为了使人们对家庭里的食物能够更科学的管理&#xff0c;让人们随时随地能了解家庭所储藏食物的情况&#xff0c;及时让…

《程序员面试金典(第6版)》面试题 16.21. 交换和(哈希法,双指针,二分查找)

题目描述 给定两个整数数组&#xff0c;请交换一对数值&#xff08;每个数组中取一个数值&#xff09;&#xff0c;使得两个数组所有元素的和相等。题目入口 返回一个数组&#xff0c;第一个元素是第一个数组中要交换的元素&#xff0c;第二个元素是第二个数组中要交换的元素。…

vscode编译mysql-boost-5.7.37如何设置Cmake:configuration以及成功debug教程

前提&#xff1a;已经在服务器上编译安装好mysql5.7.37源码了&#xff0c;这里只是记录一下使用vscode远程连接服务器时如何成功debug&#xff0c;这篇与我发布的关于openGauss源码部署有双向链接关系&#xff0c;后续可方便查看。 1. 远程连接服务器进入连接界面 2. 设置Cmak…

《计算机网络—自顶向下方法》 第三章Wireshark实验:DNS协议分析

域名系统 DNS(Domain Name System) 是互联网使用的命名系统&#xff0c;用于把便于大家使用的机器名字转换为 IP 地址。许多应用层软件经常直接使用 DNS&#xff0c;但计算机的用户只是间接而不是直接使用域名系统。 互联网采用层次结构的命名树作为主机的名字&#xff0c;并使…

达索的有限元分析软件Abaqus 2023版本下载与安装配置教程

目录 前言一、安装前准备二、Abaqus 安装总结 前言 Abaqus软件是一款广泛使用的有限元分析软件&#xff0c;可用于模拟各种工程应用程序&#xff0c;包括结构、流体力学、热传递、电磁和声学等。该软件提供了广泛的建模功能和多种求解器&#xff0c;可以帮助工程师预测材料和结…

lowcode-cms开源社区源码设计分享

开源背景 lowcode可视化社区 是我之前在设计研发 Dooring低代码 平台时开发的一个面向低代码内容分享的知识社区, 内容端采用 SSR 技术来渲染页面, 对 SEO 更加友好, 同时后端服务采用 Nodejs 来实现, 内容端和服务端同端, 也就是传说中的内容服务“同构”. 管理端采用前端最最…

【JUC】线程池有哪 4 种拒绝策略?

第一种拒绝策略是 AbortPolicy&#xff0c;这种拒绝策略在拒绝任务时&#xff0c;会直接抛出一个类型为 RejectedExecutionException 的 RuntimeException&#xff0c;让你感知到任务被拒绝了&#xff0c;于是你便可以根据业务逻辑选择重试或者放弃提交等策略。 第二种拒绝策略…

ChatGPT自动生成大厨菜谱

大厨菜谱 最近几年&#xff0c;越来越多年轻人也开始尝试自己在家做菜吃饭&#xff0c;而不仅仅是外出就餐或点外卖。有些人可以向长辈讨教做菜心得&#xff0c;有些人则开始尝试从互联网搜索学习菜谱。著名的"下厨房" App&#xff0c;就是针对这个需求应运而生的。…

华为许超:伙伴成功,才有华为企业业务成功

伙伴&#xff0c;可以说是今年ICT行业最为重要的词。各大厂商都在强调伙伴优先&#xff0c;发力伙伴体系构建。然而行业内更多是厂商单维度的信息释放&#xff0c;重视强调厂商面向伙伴的支持与赋能。这个过程中&#xff0c;似乎普遍缺少一个视角&#xff1a;那就是伙伴究竟需要…

美团一面:Spring Cloud 如何构建动态线程池?

美团一面&#xff1a;Spring Cloud 如何构建动态线程池&#xff1f; 说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如美团、极兔、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a;…

最强linux抓包工具优劣势对比分析

ngrep 核心参数 参数名称参数介绍-q禁止在屏幕上输出匹配行-d定义网络接口&#xff0c;可以多次使用-W设置缓冲区大小&#xff0c;单位为MB&#xff0c;默认为2MB-n不解析ASCII数据-i设置网络接口&#xff0c;与-d参数相同-P将解析的协议名称作为输出的一部分-t显示时间戳-O输出…

Linux——线程1

背景知识 堆区细粒堆划分 我们在申请堆空间时&#xff0c;我们只是设置了空间大小&#xff0c;并未设置空间从哪里结束。 堆区里面的详细信息&#xff0c;如某段空间从哪开始&#xff0c;从哪结束&#xff0c;由vm_area_struct负责记录&#xff0c;每申请一段空间就增加一个vm_…

优于FCOS:在One-Stage和Anchor-Free目标检测中以最小的成本实现最小的错位(代码待开源)...

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 作者&#xff1a;Edison_G 与基线FCOS&#xff08;一种单阶段和无锚目标象检测模型&#xff09;相比&#xff0c;新提出的模型…

STL-map容器

作为关联式容器的一种&#xff0c;map 容器存储的都是 pair 对象&#xff0c;也就是用 pair 类模板创建的键值对。其中&#xff0c;各个键值对的键和值可以是任意数据类型&#xff0c;包括 C基本数据类型&#xff08;int、double 等&#xff09;、使用结构体或类自定义的类型。…