Mixly开源项目设计26: 移位寄存器(一)——将LED点亮

2018-09-28 07:24隋杰峰
中国信息技术教育 2018年17期
关键词:低电平高电平寄存器

隋杰峰

流水灯项目是我们在开源硬件学习项目中很常见的一个项目。实验中,我们常用一个管脚控制一个LED,这样我们做一个8位流水灯,就需要占用8个管脚,而常用的Arduino UNO R3开发板只有20个管脚,如果要做一个30位流水灯,如果依然让一个管脚控制一个LED,那么UNO上的管脚显然是不够的,这时,我们应该怎么办呢?换成管脚更多的Mega2560吗?同样,如果我们要做64位流水灯,Mega2560的管脚也是不够的,所以,我们换个角度来想,不如想办法用少量的管脚控制多个LED,74HC595移位寄存器这个小小的芯片就能够帮我们实现这种想法。

74HC595是一块8位串行输入、并行输出(也可以串行输出)的芯片,我们使用它,只需要UNO的3个管脚即可控制8个独立的LED(如图1)。

网络上介绍74HC595的文章很多,但采用的全是代码编程,让很多不懂代码的初学者望而生畏,实际上,在图形化编程软件Mixly中有一个模块是与它相关的。因此,本文中将用Mixly轻松玩转74HC595,力图让初学者也能秒懂。

如图2所示,74HC595共有16只脚,下面我们就来认识一下它的各个引脚。

在74HC595芯片上有个小凹口,只要与图上引脚的小凹口对应,即可知道它的各个引脚。

VCC和GND自不必说,分别接UNO的5V和GND即可;

Q0~Q7是并行输出,本文中我们接8个LED;

DS、SHCP(下面简称SH)、STCP(下面简称ST)是输入端;

DS是串行数据输入端(一般Arduino的代码里会定义一下引脚,74HC595的案例中,dataPin指的是接这个脚);

SH是串行时钟输入端(clockPin指的是接这个脚);

ST是锁存端(latchPin指的是接这个脚);

OE是输出使能引脚,低电平时输出,高电平时不输出,所以,直接接在GND上使其一直保持低电平输出数据;

MR是用来重置内部寄存器的引脚,低电平时重置内部寄存器,所以,直接连接在VCC上一直保持高电平;

Q7S是串行输出(可以接下一个74HC595的DS,数据可作为串行输入,这就是74HC595的级联,也就是说,此时3个输入控制16个输出),此引脚不用可以空置。

需要的元件(如下页表所示)

电路连接

电路连接如下页图3所示,8个LED的负极(短脚)分别通过一个220Ω电阻与GND连接;74HC595有小凹口的一面向左,VCC接5V,VCC与GND之间接一个104电容,GND接GND;DS接管脚2,ST接管脚3,SH接管脚4,OE接GND,MR接VCC,Q7S空置。

程序设计

应用74HC595做流水灯,在Arduino IDE中我们会用到shiftOut这个函数,在Mixly中也有对应的模块,如图4所示。

首先,我们通过一个程序来了解一下74HC595串行输入、并行输出的过程。将图5程序上传,我们会发现Q7脚接的灯是亮的,如图6所示。

下面,我们来解释一下这个过程:

首先,管腳3给了锁存端(ST)一个低电平,意思是说“嗨,74HC595,开始干活了”,然后,管脚2给了数据(DS)一个十进制数1,关键是74HC595不认识它,所以,就需要转换成8位的二进制数00000001,不足8位的,前面加0补足8位,为啥是8位的?因为,74HC595是8位移位寄存器,有8个输出(如图7)。

这时候,时钟(SH)开始干活了,管脚4每制造一次上升沿(先拉低电平再拉高电平),这一串数就进去一个,8次之后,都进去了,每个数就都有自己的一个位置了,即每个动作只操作一位数据,这就叫串行输入(如图8)。

至于谁先进去,进去之后,每一个数字都在哪个位置,这得看是低位先入还是高位先入,什么意思呢?我们先要弄明白低位和高位,以二进制数00000001为例,左边0这一端是高位,右边1这一端是低位,所以,低位先入的意思就是从最右边的1(低位)开始依次进入,直到最左边的0(高位)进去;高位先入的则刚好相反,从最左边的0(高位)开始依次进入,直到最右边的1(低位)进去。

下面我们以低位先入为例,用上大巴车做个比方:在二进制数00000001中,低位先入,给SH脚制造一次上升沿(我们可以理解为检票),那第一个上大巴车的肯定是最右边的1,它上去了之后,就占据了第一排的位置(如图9)。

继续给SH脚制造一次上升沿之后,1左边的0,开始上车,然后,它并不是走向第二排座位,而是让1往后挪一个,它坐第一排(如图10)。

继续给SH脚制造一次上升沿,已经上车的1和0继续往后挪,新上车的0占据第一排座位(如图11)。

如此继续给SH脚制造上升沿,高位的0,继续上车,车上的数继续往后排顺延,直到发生第8次上升沿,所有的数字都上车了(如图12)。

然后,管脚3给了锁存端(ST)一个高电平,让每个数都记住自己的位置,在自己的位置坐着(绝对不允许换座位)(如图13)。

最后,每个数掌管一个输出,即每个动作操作多位(这里是8位)数据,这就是并行输出。这样,Q0~Q6脚都得到了一个0(低电平),Q7脚得到一个1(高电平),所以,Q0~Q6脚接的灯都是灭的,Q7脚接的灯是亮的。

同样的道理,将数据输入改为3,程序如图14所示。这时候,我们把十进制数2变为8位二进制就是00000011,采用低位先入,按照我们上面的推算方法,应该是Q6、Q7高电平,其余低电平,Q6脚和Q7脚接的LED亮,实验结果也是如此(如图15)。

下面,我们再看高位先入,输入数据1,将程序继续改动(如图16),我们会发现,结果正好与程序1低位先入相反。这是因为,将十进制1转换为8位二进制为00000001,高位先入,即从左边的0依次进入移位寄存器。最终,Q0对应的是1,高电平,其他脚对应的是0,低电平,所以,Q0接的LED亮,其他脚接的LED灭(如图17)。

同样,我们也可以继续改变输入的数值,设置低位先入或高位先入,控制这8个LED的亮灭,不过,我们输入的数值尽量不要超过255。当我们输入255,上传程序后,灯是全部都亮的,我们把十进制的255转换为二进制为11111111,这已经是8位二进制最大的数了,所以,0到255这总共256个数值就已经能全部体现出8个LED亮灭的所有情形。

猜你喜欢
低电平高电平寄存器
一种实用的电脑接口判断方法
高电平MMC子模块电容电压控制策略研究
飞思卡尔单片机脉宽调制模块用法研究
移位寄存器及算术运算应用
数字电子技术的应用
数字电路环境下汽车控制电路信号设计
浅谈物理电路与数字电路
关于Multisim10.0的高电平调幅电路仿真研究
DX型中波发射机PB200单元控制板时钟电路工作原理