一,硬件图解读。
二,控制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   7void main()
{//关闭LED灯choose573(LED);ledbuf=0xFF;P0=ledbuf;choose573(0);
//关闭蜂鸣器和继电器choose573(ULN);ULNbuf=0xFF;P0=ULNbuf;choose573(0);
//关闭数码管COMchoose573(SMGCOM);//共阳数码管P0=0xFF;choose573(0);
//关闭数码管DATchoose573(SMGDAT);//共阳数码管P0=0x00;choose573(0);
while(1)
{choose573(LED);LEDbuf=LEDbuf |0x01;   //0000 0001,点亮LED1P0=LEDbuf;
//  choose573(0);delayms(1000);
//  choose573(LED);LEDbuf=LEDbuf &0xF0;   //1111 1110,熄灭LED1P0=LEDbuf;
//  choose573(0);
delayms(1000);
//判断LED2是不是高电平
if(1==(LEDbuf>>(2-1))&0x01){}//判断LED5是不是低电平
if(0==(LEDbuf>>(5-1))&0x01){} //LED3取反LEDbuf=LEDbuf ^0x04;   //0000 0100P0=LEDbuf;delayms(1000);
}}

LQB02控制LED灯,74HC138芯片,74HC02芯片,74HC573芯片。相关推荐

  1. python控制树莓派led_Python 控制树莓派 GPIO 输出:控制 LED 灯

    树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...

  2. python控制灯_Python 控制树莓派 GPIO 输出:控制 LED 灯

    树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...

  3. python控制树莓派gpioled,Python 控制树莓派 GPIO 输出:控制 LED 灯

    树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧. 树莓派版本:Model 3B+ 树莓派系统:Raspbian Stretch with desktop and recommend ...

  4. ZYNQ FPGA控制LED灯不闪烁

    1.1 ZYNQ FPGA控制LED灯不闪烁 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)ZYNQ FPGA控制LED灯不闪烁: 5)结束语. 1.1.2 本节引言 ...

  5. 记录1——stm32f411CEU6之点亮一盏LED灯+按键控制LED灯

    文章目录 前言 一.准备工作 二.点亮一盏LED灯 1.配置工程 2.代码实现 3.程序烧录注意 三.按键控制LED灯 1.配置工程 2.代码实现 按键控制 按键进阶1: 按键进阶2 3.基于自己理解 ...

  6. 利用Proteus仿真STM32实现按键控制LED灯设计

    1. 前言 Proteus是英国著名的EDA工具(仿真软件),从原理图布图.代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计.是世界上唯一将电路仿真软件.PC ...

  7. 【安信可ESP32语音开发板专题①】ESP32-A1S音频开发板之离线语音识别控制LED灯

    ---------- 本博客学习由 安信可开源团队 潜心编写,做ESP32-A1S离线语音初步入门技术交流分享.如有不完善之处,请留言,本团队及时更改. 文章目录 一.前言 二.离线语音框架 2.1 ...

  8. 【tiny4412】按键控制led灯亮灭

    前言:使用友善之臂tiny4412进行嵌入式学习,对于初学者而言并不是一件轻松事情,即使该平台已经存在很多年,网上也有很多分享,但由于官方文档相对还是不够全面,导致很多初学者遇到问题不知如何下手,如果 ...

  9. esp32录音功能开发_【安信可ESP32语音开发板专题①】ESP32-A1S音频开发板之离线语音识别控制LED灯...

    本博客学习由 一.前言 离线语音,顾名思义:在不连网络的状态下,产品能识别语音指令并执行相应的控制输出. 安信可基于乐鑫ESP32芯片开发的ESP32-A1S开发板智能语音助手,可支持唤醒词引擎(Wa ...

最新文章

  1. android的webView的教程,Android WebView 应用界面开发教程
  2. matlab仿真随机数的产生
  3. 为什么不使用volatile,其它线程也能得到当前线程修改后的值,不使用volatile也不存在可见性问题?原来解决可见性问题不一定需要volatile,println也可以
  4. 使用Windows8开发Metro风格应用五
  5. [NOI2018]冒泡排序
  6. 核心动画与UIView的区别
  7. Linux文件查询笔记
  8. Scala之集合Collection
  9. wdatepicker不显示秒_为什么别人电脑开机只要3秒,你有固态硬盘却要等上18秒?...
  10. D - 昂贵的聘礼(最短路径)
  11. PID控制理解及口诀
  12. w10桌面不显示计算机了,win10系统电脑开机后不显示桌面的详细方案
  13. 解决网易云音乐ubuntu客户端播放中无声音
  14. 警惕!2007年网络***十大手段
  15. ppt中如何合并流程图_PPT流程图文件的合并
  16. 苹果手机 生成html文件,苹果手机这个功能太厉害了,1秒就能将纸质文档转换为Word...
  17. 【23届秋招总结系列】一个普本23届小学弟的秋招总结,上岸金山云开发(云计算方向)
  18. 姚振华,一个想要胜天半子的男人
  19. 单目图像深度估计 - 迁移篇:Depth Extraction from Video Using Non-parametric Sampling
  20. regsvr32 注册 ocx 时卡死,不退出

热门文章

  1. 按层次遍历二叉树算法
  2. c++ 判断两圆位置关系
  3. 中国水环境治理行业投融资分析及“十四五”规划建议报告2022~2028年
  4. 本地开发环境搭建(windows)
  5. Visio 画流程图
  6. Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]
  7. Leetcode 1233 删除子文件夹 (C++题解)
  8. 2022年齿轮行业市场发展趋势分析及重点企业主要竞争指标分析预测
  9. 基于工业路由器的工业机器人远程监控系统方案应用
  10. 零基础学 Python3(22):2019 豆瓣电影排行