spi api
https://nodemcu.readthedocs.io/en/master/en/modules/spi/
单片机一个io口如何控制两颗发光二极管led
引脚图
IMG_6250.JPG
timg.jpg
0a4.png
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
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都不会很亮
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所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。