http://www.breeziemaples.com

NodeMCU 扩展74HC595 控制数码管

金沙网www.js55.com 1

spi api

https://nodemcu.readthedocs.io/en/master/en/modules/spi/

单片机一个io口如何控制两颗发光二极管led

引脚图

金沙网www.js55.com 2

IMG_6250.JPG

金沙网www.js55.com 3

timg.jpg

金沙网www.js55.com 4

0a4.png

金沙网www.js55.com 5

0a3.png

金沙网www.js55.com,单片机工程师在面试的过程中,经常会碰到一些相同的问题,笔者总结了十个提问率较高的问题,供大家参考。现在我们来分析单片机工程师常遇面试问题之一:一个单片机io口如何控制两颗led?

接法

  • SCLR(10脚): 低点平时将移位寄存器的数据清零。通常我将它接Vcc。
  • SCK(11脚):上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;
    下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。我通常都选微秒级)
  • RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。
  • G(13脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。

将两颗led命名为d1、d2,两颗led就会有如下4种组合:d1和d2都熄灭-d1亮d2灭-d1灭d2亮-d1和d2都亮。首先我们来看一下两个io口控制两颗led的情况,电路图如下:led1和led2直接接单片机两个io口,可以看出,led1输出高电平和低电平分别控制着d1的亮和熄灭,同理led2输出高电平和低电平也控制着d2的亮和熄灭。所以用两个io口来控制是很容易实现的。

youtube教学

单595连通led

金沙网www.js55.com 6

image.png

https://gist.github.com/lucsmall/66d9b6539df7a0daa569

youtube此视频提供的代码:

latch_pin = 2
gpio.mode(3,gpio.INPUT)
gpio.mode(latch_pin, gpio.OUTPUT)
gpio.write(latch_pin,gpio.LOW)
result = spi.setup(1,spi.MASTER,spi.CPOL_HIGH,spi.CPHA_LOW,8,0)
print(result)  
index = 0x00ff
function next()
    print(index, string.format("0x%02X", index))
    spi.send(1,index) 
    gpio.write(latch_pin,gpio.HIGH)
    gpio.write(latch_pin,gpio.LOW)
    index = index+1
end  
next() 
gpio.trig(3,"up",next)

按照上面接线, 成功点亮, 但是貌似没有逻辑, 逻辑分析仪显示也和led亮灭相符

num bitcode led real led should correct ?
0 0000 - - right
1 0001 - 1 wrong
2 0010 - 2 wrong
3 0011 1,2 1,2 right
4 0100 - 3 wrong
5 0101 - 1,3 wrong
6 0110 3 2,3 wrong
7 0111 1,2,3 1,2,3 right
8 1000 - 4 wrong
9 1001 - 1,4 wrong
10 1010 - 2,4 wrong
11 1011 2 1,2,4 wrong
12 1100 3,4 3,4 wrong
13 1101 1,3,4 1,3,4 right
14 1110 3,4 2,3,4 wrong
15 1111 1,2,3,4 1,2,3,4 right

后来发现把spi的clock divide设置为1就正常了, 其他分频都不正常, 未知原因, 没有逻辑分析仪, 无法深入研究, 会的可以留言说明一下

两个io口控制两颗led线路图

双595级联

现在是正确的级联方案,

latch_pin = 2
gpio.mode(3,gpio.INPUT)
gpio.mode(latch_pin, gpio.OUTPUT)
gpio.write(latch_pin,gpio.LOW)
result = spi.setup(1,spi.MASTER,spi.CPOL_LOW,spi.CPHA_HIGH,16,8)
print(result)  
index = 0x00ff
function next()
    print(index, string.format("0x%02X", index))
    spi.send(1,index) 
    gpio.write(latch_pin,gpio.HIGH)
    gpio.write(latch_pin,gpio.LOW)
    index = index+1
--    if(index>255) then
--        index = 0
--    end
end  
next() 
gpio.trig(3,"up",next)

但是一个单片机io只有高、低、高阻三种状态,显然靠io口这三种状态来控制是不够的,还需加辅助元器件。

595级联压降问题

第二个595 led有高电平时, 第一个595对应的led压降为0.23~0-26
第二个595 led无高电平时, 第一个595对应的led压降为0.012
现象: 不管第一级led亮没亮, 第二级led都不会很亮

金沙网www.js55.com 7

16灯全亮状态

我们来看上面这个线路图是否可以达到控制效果。led3接单片机io口。当led3输出高电平,q1导通,则d4亮,d3两端没有压差,d3熄灭;当led3输出低电平,q1截至,则d4熄灭,此时d3通过io口到地形成回路,d3亮;当led3处于高阻状态,此时d3没有形成回路,q1截至,则d3和d4都熄灭,现在我们已经实现三种状态了,那么d3和d4全亮的状态是否可以实现呢?答案时候可以实现,当led3输出pwm时,d3和d4会交替亮灭,如果这个变化过程够快,那么人眼将无法捕捉这个变化,这样看起来的效果就是d3和d4全亮,这类似于段位数码管的驱动。所以这个电路时可以实现一个io控制两颗led。

郑重声明:本文版权归金沙网www.js55.com所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。