简 介: 本文介绍了一种使用单个IO口独立控制两个LED点亮的方案。并对于不同颜色的LED和不同工作电压下的MCU进行了讨论。给出了在不同的颜色组合、工作电压的情况下不同的驱动方案。

关键词IOMCU单片机IO复用

  今天在公众号“芯片之家”看到一篇推文, 介绍使用单片机的一个IO端口,分别控制两个发光二极管各自独立的点亮与熄灭 ,总共四个状态。为了控制两个LED的目的,需要应用到MCU的IO端口的四个工作状态:输出高电平、输出低电平、高阻状态以及输出连续对称方波这四种状态。

  在下面的面包板上,演示了使用一条IO控制线控制l两个LED分别点亮和熄灭的四种状态。

▲ 一个单片机IO端口分别控制两个LED

  为了理解其中的工作原理,则需要熟悉LED的两个工作特性:
  1. 单向导电特性;

  2. 导通阈值特性;

  正如发光二极管名字所说,LED只能向二极管那样单向导电发光。如果施加电压极性反了,LED则不工作。

  导通阈值特性是指,只要施加的正向电压超过一定阈值之后,LED才能够导通。这一点可以从下面这支红色LED的正向V-A特性曲线看出。

▲ 红色LED的V-A特性

  上面曲线表明,只有当正向电压超过大约1.5V之后,电流才会出现快速增加。在此之前,正向导通电流很小。

  不同颜色的LED由于所使用的半导体材料不同,导通阈值电压会有所区别。比如下面这支黄色LED的正向导通电压超过了1.7V。

▲ 黄色LED的V-A曲线

  如果LED发射光谱中包括更短的光谱成分,则相应的导通会更高。下面的绿色和蓝色LED的正向导通电压的阈值都已经超过了2.5V了。

▲ 绿色LEDV-A特性曲线

▲ 蓝色LED的V-A曲线

  将不同LED的V-A特性曲线绘制在一起,可以凸显出不同LED的阈值电压的差异。值得说明的是,当电压小于阈值电压的时候,LED并不是不导电,只是电流极小。比如在2.5V,虽然还没有超过蓝色LED的阈值电压,但在LED灯芯处还是能够隐约看到发光。

  一旦电压超过阈值电压,LED正向导通电流便会迅速增加到1mA以上。之后虽然电流增加很快,但看起来,在正向导通电流2 ~ 10mA之内,LED都显示为点亮状态,亮度倒是看起来差不多。

▲ 不同颜色LED的伏安特性

  合理的 应用LED的单向导电和导通阈值特性,便可以在一条单片机IO口的四种工作状态下,来控制两个LED的点亮和熄灭了。

  比如利用LED管的单向导通特性,将两个LED正反向并联在一起,分别连接在分压电阻中心和单片机的IO口上,就可以实现单个IO口控制两个LED的目标。在下图中,显示了在一个工作在5V电压下的单片机IO控制两个LED(红色,黄色)的四中状态。

▲ 两个LED正反并联连接在MCU的IO口与分压电阻中点

  当IO口为高阻状态,两个LED都熄灭;当IO端口为高电平时,红色LED点亮;当IO端口为低电平的时候,黄色LED点亮;当IO输出方波信号时(通常要求频率大于100Hz),两个LED交替点亮,根据人眼色视觉暂留特性,看起来两个LED都点亮了。

  下面动图显示了IO口的四种状态对应两个LED的点亮与熄灭。

▲ 对应两个LED四个状态的IO输出波形

  上面的LED并联方案是利用了LED的单向导通特性。如果考虑到LED的阈值特性,这种方案就会受到一定限制。比如,控制的LED绿色或者蓝色时,由于它们的导通阈值电压超过了2.5V,因此绿色和蓝色LED就很难被点亮。

  下面动图显示,绿色和蓝色LED只能发出微弱的光线。

▲ 对于两个LED四种状态的IO波形

  如果当单片机和LED的供电电压为3.3V时,情况将会更加严重。比如在3.3V供电情况下,使用并联LED方案,对于红色的LED还可以勉强工作,但对于绿色和蓝色LED则无法点亮了。

▲ 对于两个LED四种状态的IO波形

  在前面推文中则介绍了另外一种方案,即LED串联方案,可以解决蓝色和绿色LED控制问题。

  下图显示了LED串联方案电路示意图:

▲ 两个LED串联控制方案

  当IO端口为高阻时,由于两个LED的导通阈值电压之和大于电源电压(+5V),它们都不导通;当IO端口为低电平时;上面的绿色LED点亮;当IO端口为高电平时,下面的蓝色LED点亮;当输出高频方波信号时,两个LED都被点亮。

▲ 对应两个LED四种状态IO波形

  串联LED控制模式只能应用于两个LED的电压加起来超过电路电源电压的情况。比如蓝色、绿色LED,工作在3.3V,5V电压下都是可以的。

  如果将两个LED更换成红色(1.6V)和绿色(2.5V),使用串联模式,则只能应用在电源电压小于4.1V的情况下,比如3.3V的单片机电路中。如果在5V电路中,则会出现两个LED无法同时熄灭的情况。

  下面就显示了一个红色,一个绿色LED工作在5V电源电压下,当IO为高阻时,它们实际上无法熄灭。

▲ 对应两个LED四种状态IO波形

  在5V电压下,那么对于红色、绿色LED使用前面并联LED方案行不行呢?

  通过实验会发现,也出现了问题。由于绿色LED在2.5V下无法点亮,因此并联方案也无法工作。如下图所示:

▲ 对应两个LED四种状态IO波形

  那么问题来了,在5V电压下,该使用什么方案,才能够利用单片机一个IO口的四种模式,来分别控制一个绿色LED和一个红色LED的点亮和熄灭呢?就像下面这个动图里所示的那样。

▲ 对于两个LED四种状态的IO波形

  如果并联LED和串联LED工作原理已经理解了,我想此时,你的脑子里已经有了答案了。如果你有了想法,就将答案写在后面的留言中吧。

▌补充说明


  在 用一个I/O口控制1个三色指示灯, 2个单色指示灯 ,作者对于串联方案进行补充。使用另外一个二极管对串联的两个LED进行并联,消除无法完全关闭的问题。

▲ 改进的方案

▲ 在没有旁滤二极管的时候,红色、黄色LED无法截止

▲ 有着旁滤的二极管是,红色黄色LED可以有效截止了

▲ 增加旁滤二极管的时候,可以有效解决无法截止的问题

  ■ 相关文献链接:

  • 介绍使用单片机的一个IO端口,分别控制两个发光二极管各自独立的点亮与熄灭
  • 用一个I/O口控制1个三色指示灯, 2个单色指示灯

▌附录


1.记录不同状态的程序

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# LEDLIGHT.PY                  -- by Dr. ZhuoQing 2021-02-05
#
# Note:
#============================================================from headm import *
from tsmodule.tsvisa        import *#------------------------------------------------------------
gifid = 25
textid = 22dg1062open()def outvolt(v):dg1062volt(1, 0.001)dg1062offset(1, v)dg1062on(1)def outwave(v):dg1062volt(1, v)dg1062offset(1, v/2)dg1062on(1)#------------------------------------------------------------#------------------------------------------------------------tspgiffirst(gifid)outvolt(5)
time.sleep(1)dg1062off(1)time.sleep(2)
tspgifappend(gifid)outvolt(3.3)
time.sleep(1)
outvolt(0)
time.sleep(2)
tspgifappend(gifid)outvolt(5)
time.sleep(1)
outvolt(3.3)
time.sleep(2)
tspgifappend(gifid)outvolt(5)
time.sleep(1)
outwave(3.3)
time.sleep(2)
tspgifappend(gifid)printf('\a')#------------------------------------------------------------
#        END OF FILE : LEDLIGHT.PY
#============================================================

2.测量LED的V-A特性

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2021-02-05
#
# Note:
#============================================================from headm import *
from tsmodule.tsstm32       import *
from tsmodule.tsvisa        import *vout = linspace(0, 6, 50)
vdim = []
cdim = []#------------------------------------------------------------
voltage = 0
current = 0gifid = 5#------------------------------------------------------------plt.plot(vdim, cdim)
plt.xlabel("Voltage(V)")
plt.ylabel("Current(mA)")
plt.title('Voltage:%5.3fV, Current:%5.3fmA'%(voltage, current))
plt.grid(True)
plt.tight_layout()
plt.draw()
dh1766volt(0)
plt.pause(.5)tspgiffirst(gifid)#------------------------------------------------------------
for v in vout:dh1766volt(v)time.sleep(1)current = dh1766curr()*1000     # unit:mAmeter = meterval()voltage = meter[0]printff(v, voltage, current)vdim.append(voltage)cdim.append(current)tspsave("ledred", v=vdim, c=cdim)plt.clf()plt.plot(vdim, cdim)plt.xlabel("Voltage(V)")plt.ylabel("Current(mA)")plt.title('Voltage:%5.3fV, Current:%5.3fmA'%(voltage, current))plt.grid(True)plt.tight_layout()plt.draw()plt.pause(.1)tspgifappend(gifid)dh1766volt(5)
printf('\a')#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

如何使用一个单片机的IO口控制两个LED?相关推荐

  1. 记录一个 三个io口控制四个LED灯和一个按键的电路和怎么检测

    昨天要写个底层程序 发现要控制四个led灯和一个按键,按键开始一直不能很好的检测, 后面论坛问人才搞好. 分时扫描: 前1-4驱动LED,5检测KEY 1,LED1输出高,LED2输出低,LED3输入 ...

  2. IO口多路查理复用:三个单片机IO口控制六个LED

    简 介: 本文介绍了单片机的IO控制 LED 中的复用技术,特别查理复用基本原理和特点进行了介绍.使用一款IS31FL3731可以构成16×9的PWM亮度可控的 LED 矩阵. 关键词: 查理复用,C ...

  3. 单片机两个IO口控制三个LED灯

    在项目中经常会遇到单片机IO口资源不够用的情况,那么如何让单片机的IO口利用最大化呢,这里分享一下用单片机两个IO口控制三个LED灯的几种方法. 方法一:      S1和S2分别接单片机两个IO口, ...

  4. 一个I/O口控制两个LED灯

    方案1: 优点:平时基本没有功耗: 缺点:电路复杂. 经本人在PIC18F4550测试板上测试,完全没有问题. 方案二: 本人没有测试. 优点:电路简单 缺点:平时还有功耗,二极管VD1一直导通态. ...

  5. 用3个IO口控制6个LED灯,怎么做到的?查理复用!

    ▲ 本文要分析的电路 事情是这样开始的. 买了个电动牙刷,几十块钱那种: 收到的实物长这样: 牙刷手柄上有1个按键和6个LED灯: 拆开看看电路板: 可以看出,电路板上用的单片机,只有8个脚,却要控制 ...

  6. 如何巧妙利用4个IO口驱动12个LED灯

    在电路设计过程中有时经常遇到单片机的IO口不够用的情况.对于这样的问题,我们可以选择换单片机,也可以尝试一些巧妙的设计来避免IO口不够用的问题.例如当我们在设计中遇到许多LED灯需要控制的时候,而单片 ...

  7. 巧用GPIO口控制多个LED

    3个IO口控制6个LED灯 这个电路用到了单片机GPIO的三种状态: 高电平 低电平 高阻态 所谓"高阻态",是指GPIO对外部电路表现出极大的阻抗.因阻抗很大,几乎不会吸入电流, ...

  8. 51c语言单片机io口控制实验报告,单片机I/O口控制实验

    描述 实验 单片机I/O 口控制实验 一. 实验目的 利用单片机的P1 口作IO 口,使用户学会利用P1 口作为输入和输出口. 二. 实验设备及器件 IBM PC 机 一台 DP-51PROC 单片机 ...

  9. 8255总线实验 编写程序利用8255扩展单片机的IO口,控制8位数码管显示1-8。

    8255总线实验 编写程序利用8255扩展单片机的IO口,控制8位数码管显示1-8. 程序: #include<reg51.h> #include<absacc.h> #def ...

最新文章

  1. javaweb jsp页面无法解析${message}
  2. 第七章部分例题最大乘积
  3. PostgreSQL Pattern Matching
  4. labview小波包分解
  5. eclipse svn插件下载地址
  6. 数据库在一对一、一对多、多对多怎么设计表关系
  7. 利用python自动在火狐浏览器上输入账号密码
  8. 简单的模拟京东商城购买过程-pymysql
  9. 内核文件管理-IRP(一)创建或打开文件
  10. 分销商城系统开发应用概述详解
  11. yield用法 (转载)
  12. C++读取Wav文件
  13. cdh 简介_CDH的介绍和部署
  14. 电商互动消息如何进行架构演进?
  15. Java冒泡,快速,插入,选择排序^_^+二分算法查找
  16. VOXEL 技术在即时渲染地形中的应用 by 樊一鹏
  17. 有感于李开复演讲(2)
  18. Linux:python数据库(mysql),多线程以及套接子(socket)
  19. matlab的length是什么,大家好!matlab中length是什么意思?,matlab中的length表示什么?应该如何使用?...
  20. 硕盟type-c转接头HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞

热门文章

  1. es6变量的解构赋值
  2. 书评 —— 深入网站开发和运营
  3. mysql中不同事务隔离级别下数据的显示效果--转载
  4. svn import无法上传库文件lib.a
  5. Android学习——基础组件
  6. linux系统管理学习笔记之一-------linux解压缩命令
  7. 为何那么多人的网名都叫易天啊
  8. 《易学Python》——第6章 类与面向对象编程 6.1 类是什么
  9. UBUNTU下SUBLIME TEXT3的安装+破解+汉化+中文输入
  10. Codeforces Gym 100523E E - Gophers SET