LQB02控制LED灯,74HC138芯片,74HC02芯片,74HC573芯片。

news2024/11/28 19:01:30

一,硬件图解读。
二,控制LED需要的74HC595程序编程。
三,控制某个LED亮,其他保持不变,或者控制整8个LED,其他不变;
四,读取某个LED的状态,一秒时间读取一次,如果是低电平,那么变为高电平,如果是高电平,那么变为低电平。

硬件图。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解读。
硬件接线:WR和GND用跳线帽短接起来。WR一直等于0.

芯片74HC138的使用。

这个芯片俗称3/8译码器。
意思是通过ABC三个引脚的高低电平,有8个状态,这8个状态会影响到Y0-Y7八个通道的选择。
看比赛官方提供的芯片手册。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解读这个图。
这个芯片的G1是高电平,G2是低电平的时候,才能进行选择,不然就是没用。
在这里插入图片描述
原理图中,已经让G1=VCC等于高电平,G2都是GND,都是低电平,所以这个芯片一直在使用。

当CBA=000,时候,Y0=0,其他都是1;
当CBA=001的时候,Y1=0,其他都是1;
同理。
所以就起到一个开关的作用了。

74HC02芯片;

74HC02是或非门芯片。
看芯片手册;

在这里插入图片描述
半月形,是或门;后面有个小圆,表示非门。
则合并起来,就是或非门。
看芯片手册。
在这里插入图片描述
看到当两个输入都是低电平的时候,那输出就是高电平,否则,当两个输入有一个是高电平输出就是0.

74HC573芯片。

在这里插入图片描述
这个芯片的使能开关,有两个,一个是OE,一个是LE,OE上面有个横线,看图片,代表低电平有效,这一直接GND,所以等于0,一直有效;
LE是高电平有效,没有横线,因此如果要选择LED的这个573芯片,需要让Y4C等于1。

在这里插入图片描述
根据上面的原理图,需要让Y4C=1,我们让WR和GND短接。
然后让Y4=0;WR=0,经过或非门,才有Y4C=1;
如何Y4=0呢?
看3/8译码器的图,
让CBA=100,就选择了Y4了。

就是P27=1,P26=0,P25=0,那么就可以选择了Y4C=1了,可以让P0口控制8个LED灯了。
P00控制L1;
P01控制L2;

当P00=0的时候,LED1点亮,否则熄灭。
当P01=0的时候,LED2点亮,否则熄灭。

初步编程,点亮LED灯;

#include <stc15.h>
void main()
{
while(1)
{
选择LED的分支电路;
P27=1,P26=0,P25=0;
选择对应的LED灯;
P00=0,让L1点亮;
P01=0,让L2点亮;
delay(1000);
P0=0xFF;全部熄灭;
delay(1000);
P0=0x00;全部点亮;
delay(1000);
}
}
将上述的代码细化一下,就可以实现LED的控制。

改良版本

上面的代码如果单单控制LED,是没问题的,但是比赛的过程中,总是结合了蜂鸣器,结合了数码管等等外设,那么P27=1,P26=0,P25=0也能控制LED支路的选通。
结合上面的74HC138的真值表。
在这里插入图片描述
Y4—LED支路;P27=1,P26=0,P25=0;
Y5—步进电机,蜂鸣器,继电器,直流电机支路;P27=1,P26=0,P25=1;
Y6–数码管com口支路;P27=1,P26=1,P25=0
Y7–数码管数据支路;P27=1,P26=1,P25=1;
如果我们不断让这三个IO口电平切换,由于代码是一行一行的执行的,会导致一些意想不到的错误。
所以再切换不同的573的时候,最好先选择Y0通道,由于Y0通道闲置的,所以不会影响其他的芯片。
闲置之后,我们再同时让三个都等于选通的状态,而不是位操作一个个。
怎么实现呢?
很简单。
让P27=0,P26=0,P25=0,就是选择Y0,我们用这个语句代替:
P2= P2与0001 1111,与0肯定等于0,与1等于自身,那么就是P2=P2&0x1F,就是锁住四个支路,都不选通它,P0不能控制四个支路的外设。

选择Y4,则是
P2 =(P2&0x1F) | 1000 0000=(P2&0x1F) | 0x80。

选择Y5,则用这个语句;
P2 =(P2&0x1F) | 1010 0000=(P2&0x1F) | 0xA0。这个作用是先清空,然后让对应为等于1,这里让P27=1,P25=1。

同理,选择Y6,用
P2 =(P2&0x1F) | 1100 0000=(P2&0x1F) | 0xC0。

同理,选择Y7,用
P2 =(P2&0x1F) | 1110 0000=(P2&0x1F) | 0xE0。

我们把上面的五个语句进行总结,写一个函数。

void choose573(unsigned char channeltemp)
{
	switch(channeltemp)
 {
 	case 0:P2=P2&0x1F;break;//关闭所有的573通道的四个支路
 	case 4:P2=(P2&0x1F) | 0x80;break;//选择Y4C支路
 	case 5:P2=(P2&0x1F) | 0xA0;break;
 	case 6:P2=(P2&0x1F) | 0xC0;break;
 	case 7:P2=(P2&0x1F) | 0xE0;break;
 	default:break;
  }
}

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

改善之后的制LED的代码;

 void choose573(unsigned char channeltemp)
{
	switch(channeltemp)
 {
 	case 0:P2=P2&0x1F;break;//关闭所有的573通道的四个支路
 	case 4:P2=(P2&0x1F) | 0x80;break;//选择Y4C支路
 	case 5:P2=(P2&0x1F) | 0xA0;break;
 	case 6:P2=(P2&0x1F) | 0xC0;break;
 	case 7:P2=(P2&0x1F) | 0xE0;break;
 	default:break;
  }
}
 void main()
 {
 	while(1)
 	{
 		choose573(4);//选择LED的通道;
 		P0=0x00;//LED都点亮;
 	 	choose573(0);//关闭LED通道,此时由于573有锁存的功能,因此,LED会保持0x00;
 	 	delayms(1000);
 	 	choose573(4);//选择LED的通道;
 		P0=0x01;//LED点亮L1;
 	 	choose573(0);//关闭LED通道,此时由于573有锁存的功能,因此,LED会保持0x00;
 	 	 	delayms(1000);
 	}
}

再次改善,改善原因。添加缓冲变量

改善原因。
由于P0口是共用的口,虽然有四个分支,比如我想控制LED灯,又想控制蜂鸣器,同时又想控制数码管,比如显示温度这些数据。

那么思路一般是这样。
选择LED支路,
设置P0=LED状态;
关闭LED支路;
选蜂鸣器支路,
设置P0=蜂鸣器状态;
关闭支路;
选择数码管状态,
设置P0=数码管的信息;
关闭支路。

这样,这个P0的数据直接输出去了,后面被其他的P0数据覆盖了,LED状态没有得到保存,我们就不可以读取到LED的状态了。同理,也不能得到蜂鸣器的状态了。

怎么解决这个问题呢?
我们设置一个缓冲变量,每个设备都有一个,那就可以了。要改变也是改变这个变量,然后将该变量赋值给P0口。

比如我们设置一个LEDbuf,作为LED状态的缓冲,ULNbuf,作为蜂鸣器和继电器的哪个通道的缓冲,数码管的位选和数据选支路,不用缓冲,因为我们不需要知道数码管的信息。
在这里插入图片描述

那么上面的流程,可以这么设置。
选择LED支路,
LEDbuf=0x05;
P0=LEDbuf;
关闭LED支路;

选择蜂鸣器支路;蜂鸣器是P06控制的,就是ULNbuf的bit6位控制,低电平发声。

ULNbuf=(ULNbuf &1011 1111)=(ULNbuf &0xbf);//让蜂鸣器发声;
P0=ULNbuf;
关闭蜂鸣器支路;

这样的话,LED的当前状态,蜂鸣器的当前状态,都可以得到保存。
经过上面的操作之后,我们可以读取到状态,比如我们读取LED2的状态。
(草稿)readLED2=(LEDbuf>>1) &0000 0001=(LEDbuf>>1)&0x01
readLED2=(LEDbuf>>1)&0x01

比如我们读取蜂鸣器P06的状态。
(草稿)readBUZ=(ULNbuf>>6) &00000001=(ULNbuf>>6)&0x01

readBUZ=(ULNbuf>>6)&0x20

综上,我们得到最后的用于LED控制的代码。
需要一个选择573的函数;
需要一个缓冲变量;
需要明白如何设置某个LED的状态;
需要明白如何读取某个LED的状态;
需要明白如何对某个状态取反。
比如我们相对L2的状态取反;
可以这么实现;
用异或1进行实现。
选择LED支路;
LEDbuf=LEDbuf^00000010=LEDbuf ^ 0x02
P0=LEDbuf;
关闭LED支路。

案例代码:

功能:控制L1点亮熄灭,间隔1秒;完整的代码

由于一开机,开发板的蜂鸣器会出声音,因此,需要开机的时候,关闭所有的外设。这里还没学到蜂鸣器,我们先记得代码就好了。
我们这里的LED灯,蜂鸣器这些不用做模块化。尽量简化代码。后面数码管和按键做一下优化的代码。

void choose573(unsigned char channeltemp);
void delayms(int ttms);
unsigned char  LEDbuf;
unsigned char  ULNbuf;
#define LED 4
#define ULN   5
#define SMGCOM 6
#define SMGDDAT   7

void main()
{
//关闭LED灯
	choose573(LED);
	ledbuf=0xFF;
	P0=ledbuf;
	choose573(0);
//关闭蜂鸣器和继电器
	choose573(ULN);
	ULNbuf=0xFF;
	P0=ULNbuf;
	choose573(0);
//关闭数码管COM
	choose573(SMGCOM);//共阳数码管
	P0=0xFF;
	choose573(0);
//关闭数码管DAT
	choose573(SMGDAT);//共阳数码管
	P0=0x00;
	choose573(0);
while(1)
{
	choose573(LED);
	LEDbuf=LEDbuf |0x01;   //0000 0001,点亮LED1
	P0=LEDbuf;
//	choose573(0);
  delayms(1000);
//	choose573(LED);
	LEDbuf=LEDbuf &0xF0;   //1111 1110,熄灭LED1
	P0=LEDbuf;
//	choose573(0);
delayms(1000);
//判断LED2;
if(1==(LEDbuf>>1)&0x01)
	{
		
     }
     
     //LED3取反
     LEDbuf=LEDbuf ^0x04;   //0000 0100
     	P0=LEDbuf;
     	delayms(1000);
}

	
}

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

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

相关文章

mapreduce与yarn

文章目录一、MapReduce1.1、MapReduce思想1.2、MapReduce实例进程1.3、MapReduce阶段组成1.4、MapReduce数据类型1.5、MapReduce关键类1.6、MapReduce执行流程1.6.1、Map阶段执行流程1.6.2、Map的shuffle阶段执行流程1.6.3、Reduce阶段执行流程1.7、MapReduce实例WordCount二、…

版本控制软件SVN

SVN学习 1 版本控制软件定义及用途 版本控制软件是为适应软件配置管理的需要&#xff0c;控制软件的修改&#xff0c;减少混乱&#xff0c;提高软件生产效率&#xff0c;其是软件质量保证的重要环节软件配置管理是对软件修改进行标识、组织和控制的技术&#xff0c;用来协调和…

MASA MAUI Plugin (八)Android相册多选照片(Intent 方式)

背景 MAUI的出现&#xff0c;赋予了广大.Net开发者开发多平台应用的能力&#xff0c;MAUI 是Xamarin.Forms演变而来&#xff0c;但是相比Xamarin性能更好&#xff0c;可扩展性更强&#xff0c;结构更简单。但是MAUI对于平台相关的实现并不完整。所以MASA团队开展了一个实验性项…

代码随想录NO49 | 动态规划 _LeetCode1143.最长公共子序列 1035.不相交的线 53. 最大子序和

动态规划 _LeetCode1143.最长公共子序列 1035.不相交的线 53. 最大子序和今天继续子序列问题&#xff01; 1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符…

docker全解

目录说明docker简介为什么是docker容器与虚拟机比较容器发展简史传统虚拟机技术容器虚拟化技术docker能干什么带来技术职级的变化开发/运维&#xff08;Devops)新一代开发工程师Docker应用场景why docker&#xff1f;docker的优势docker和dockerHub官网Docker安装CentOS Docker…

10 种 Spring事务失效场景

10 种 Spring事务失效场景 1.概述 Spring针对Java Transaction API (JTA)、JDBC、Hibernate和Java Persistence API(JPA)等事务 API&#xff0c;实现了一致的编程模型&#xff0c;而Spring的声明式事务功能更是提供了极其方便的事务配置方式&#xff0c;配合Spring Boot的自动…

supervisor看守进程

supervisor可以用于看守正在运行的服务&#xff0c;如果服务以外停止&#xff0c;他会在设置的时间间隔内重新启动该服务。 本测试使用的系统是TencentOS3.1. 安装supervisor最简单方法是使用yum。 yum install supervisor supervisor需要python3支持&#xff0c;因此请先确…

【Android玩机】跟大家聊聊面具Magisk的使用(安装、隐藏)

目录:1、Magisk中文网2、隐藏面具和Root&#xff08;一共3种方法&#xff09;1、Magisk中文网 &#xff08;1&#xff09;首先Magisk有一个中文网&#xff0c;对新手非常友好 &#xff08;2&#xff09;这网站里面主要包含&#xff1a;6 部分 &#xff08;3&#xff09;按照他给…

c++常用stl算法

1、头文件 这些算法通常包含在头文件<algorithm> <functional> <numeric>中。 2、常用遍历算法 for_each(v.begin(),v.end(), 元素处理函数/仿函数) 注意&#xff1a;在使用transform转存时&#xff0c;目标容器需要提取开辟合适的空间。 void printfunc(…

【C++】类和对象入门必知

面向过程和面向对象的初步认识类的引入类的定义类的访问限定符封装类的作用域类的实例化类对象模型this指针C语言和C实现Stack的对比面向过程和面向对象的初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解…

【归一化小记】,batchnorm,layernorm,IN,GN,分布式归一化...

BatchNorm 最早在全连接网络中被提出&#xff0c;对每个神经元的输入做归一化。扩展到 CNN 中&#xff0c;就是对每个卷积核的输入做归一化&#xff0c;或者说在 channel 之外的所有维度做归一化。 BN 带来的好处有很多&#xff0c;这里简单列举几个&#xff1a; 防止过拟合&am…

【HTML】HTML 表单 ④ ( textarea 文本域控件 | select 下拉列表控件 )

文章目录一、textarea 文本域控件二、select 下拉列表控件一、textarea 文本域控件 textarea 文本域 控件 是 多行文本输入框 , 标签语法格式如下 : <textarea cols"每行文字字符数" rows"文本行数">多行文本内容 </textarea>实际开发中 并不…

聚观早报 | 嘀嗒出行重启赴港IPO;饿了么到店业务将与高德合并

点击蓝字 / 关注我们今日要闻&#xff1a;嘀嗒出行重启赴港 IPO&#xff1b;饿了么到店业务将与高德合并&#xff1b;美团香港骑手月收入高达3.5万港元&#xff1b;腾讯或引进Meta旗下VR眼镜Quest 2&#xff1b;苹果将阻止用户免费装开测版iOS 17 嘀嗒出行重启赴港 IPO 港交所文…

Java企业开发学习笔记(2)利用组件注解符精简Spring配置文件

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/iSeSH】 文章目录一、 利用组件注解符精简Spring配置文件1.1 创建新包1.2 复制四个类1.3 修改杀龙任务类1.4 修改救美任务类1.5 修改勇敢骑士类1.6 修改救美骑士类1.7 创建Spring配置文件1.8 创建…

【数据库】redis数据持久化

目录 数据持久化 一&#xff0c; RDB 1&#xff0c; 什么是RDB 2&#xff0c;持久化流程 3&#xff0c; 相关配置 案例演示&#xff1a; 4&#xff0c; 备份和恢复 1、备份 2、恢复 3&#xff0c;优势 4&#xff0c; 劣势 二&#xff0c;AOF 1&#xff0c;什么是A…

Java笔记026-集合/数组、Collection接口、ArrayList、Vector、LinkedList

集合集合的理解和好处保存多个数据使用的是数组&#xff0c;分析数组的弊端数组1、长度开始必须指定&#xff0c;而且一旦指定&#xff0c;不能更改2、保存的必须为同一类型的元素3、使用数组进行增加/删除元素的示意代码-比较麻烦Person数组扩容示意代码Person[] pers new Pe…

ChatGPT三个关键技术

情景学习&#xff08;In-context learning&#xff09; 对于一些LLM没有见过的新任务&#xff0c;只需要设计一些任务的语言描述&#xff0c;并给出几个任务实例&#xff0c;作为模型的输入&#xff0c;即可让模型从给定的情景中学习新任务并给出满意的回答结果。这种训练方式能…

论文笔记:How transferable are features in deep neural networks? 2014年NIP文章

文章目录一、背景介绍二、方法介绍三、实验论证四、结论五、感想参考文献一、背景介绍 1.问题介绍&#xff1a; 许多在自然图像上训练的深度神经网络都表现出一个奇怪的共同现象&#xff1a;在第一层&#xff0c;它们学习类似于Gabor过滤器和color blobs的特征。这样的第一层特…

c++提高篇——list容器

一、基本概念 功能:将数据进行链式存储 链表&#xff08;(list)是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的&#xff0c;链表由一系列结点组成。 结点的组成:一个是存储数据元素的数据域&#xff0c;另一个是存储下一个…

3DVR营销是什么?是否成为市场热门?

在当今市场经济环境中&#xff0c;营销对于在企业发展中的作用至关重要。市场是企业发展的战场&#xff0c;谁能在市场营销方面做得更好&#xff0c;就能够吸引公域平台流量、占据主流市场、开拓新局面从而稳定现有规模。这将确保企业不被市场淘汰&#xff0c;而是能够可持续性…