首页 理论教育 精密的骰子

精密的骰子

时间:2022-02-09 理论教育 版权反馈
【摘要】:当使用者按下按钮时,计数器立即停止计数,显示出一个不可预知的骰子点数的图案。因此当555定时器旁边的LED熄灭时,就是计数器加1的时候。图4-105的示意图显示一步步数下来的各个状态。在二进制中,我们干的是同一件事情,所不同的是我们将自己限制在0和1这两个数字。计数到1时,再往左边的下一个位置加1,但是,这个位置原来已经有一个1了,它也就不能再往更高的数字计数了。

在这个实验中,我希望你使用TTL逻辑家族的74LSxx代芯片,而不要使用CMOS家族中的74HCxx代芯片,原因有两个。首先,我需要用到7492计数器,这个芯片在HC家族中是找不到的;第二,你应该了解TTL家族中LS系列芯片的基本知识,因为它们仍然时常会出现在你所遇到的一些电子学书籍以及网上的一些电路中。

此外,你将要学习像74LS06反相器这样的“开路集电极”的TTL芯片,在你想要输出高达40 mA 的电流的时候,它们可以方便地用来替代晶体管。

本实验项目的电路极其简单:利用一个555定时器来产生极快的脉冲,再由一个计数器来对该脉冲进行六进制的计数,以驱动按一定方式排列的LED来模拟骰子上的点。计数器计数的速度很快,骰子上的点是模糊不清的。当使用者按下按钮时,计数器立即停止计数,显示出一个不可预知的骰子点数的图案。

骰子仿真已经出现很多年了,你甚至可以在网上买到相应的套件。不过我们这个实验电路的功能更多,它还可以用来展示二进制码的原理。

好啦,如果你已经准备好面对TTL芯片、开路集电极以及二进制这三重挑战,那么就让我们继续吧。

以下是你需要用到的东西。

□ 74LS92计数器,例如德州仪器公司生产的SN74LS92N,数量:1个(如果你想制作一个骰子),或者2个(如果想制作两个骰子)。

□ 74LS27三输入或非门,例如德州仪器公司生产的SN74LS27N,数量:1个。

□ 555定时器,数量:1个(如果你想制作一个骰子)或者2个(如果想制作两个骰子)。

□ 信号二极管,1N4148或类似的,数量:4个或8个(想制作两个骰子时)。

观看二进制

我们以前使用过的计数器比较特别,其输出是专门用来驱动七段数码管的。更为普通的计数器的输出是按二进制来进行计数的。

74LS92的引脚功能如图4-101所示。将其插在你的面包板上,按图4-102那样进行接线。开始的时候,555定时器将驱动计数器缓慢计数,大约每秒一步。图4-103所示为面包板上器件的实际布置情况。

图4-101 74LS92 计数器芯片不仅引脚的布局很特别,而且它还有4 个引脚在内部没有任何连接,因此在外部也可以不予连接

图4-102 这个简单电路使用慢速运行的555定时器来控制74LS92二进制计数器,并对输出的高电平进行实时显示

图4-103 这是图4-102 所示电路原理图的面包板实现,用来显示74LS92计数器的输出

请注意,这个计数器的电源引脚比较特别,是在引脚5和引脚10上,而不是位于角落处。此外,它还有4个引脚完全未被使用,在芯片内部没有连接到任何地方。因此,在外部你也无需将它们连接到任何导线上。

现在我要来介绍TTL家族的74LSxx代芯片的第一个全新的、会给应用带来困难的特点,对于我们的用途来讲,这个特点使得它们不如我在前一个实验项目中推荐的CMOS家族中的74HCxx代芯片那么受人欢迎。现代已经得到广泛应用的HC系列芯片的每个逻辑输出,都会提供或者吸收4 mA 的电流。但是较老的LS 代芯片却很特别,它的输出在低电平时可以从正电源吸收大约8 mA 的电流,但是当其输出为高电平时,却几乎不会给你提供任何电流。其基本原则是这样的。

□ TTL逻辑芯片的输出是专为吸收电流而设计的。

□ 其在设计上没有能力输出显著的电流。

实际上,74LS92 的额定输出电流不到0.5 mA。如果你仅仅是将其输出连接到另外一个逻辑芯片,这完全是可以接受的,但是当你希望驱动一个外部设备时,它却不能提供足够的电流来满足需要。

解决这个问题的正确做法是对这个芯片说:“好的,我们将按你的方式行事。”然后先把正电源接到一个负载电阻器上,再在负载电阻器的后面串联你想要使用的LED,最后再连接到芯片的输出端上。这是一个“较好”的选择,如图4-104所示。

图4-104 大多数TTL 芯片(包括LS 代芯片)没有能力从它们的逻辑输出引脚输出足够的电流(左图),因此通常需要被连接成从正电源吸收电流的形式(右图)

但现在的唯一问题就是,LED是在计数器的输出为低时才发光,但计数器的设计本意是输出高电平脉冲来点亮数字的。因此现在你的LED在该亮的时候不亮,而在不该亮的时候却亮着。

你可以让信号通过一个反相器来解决这个问题,但是我已经对这种不方便厌烦了。我解决这个问题的方法(至少为演示目的我是这样做的)是使用图4-104所示的“不怎么好的”方案,让一个极低电流的LED和一个4K7的大负载电阻器相串联,终于使其工作起来了。这使得我们可以“看到”计数器的输出,而它的输出电流却没有必要超过它的额定值。当然,如果你想让最终版的骰子电路达到更加强劲的视觉效果,就需要选择后一个方案。我用万用表测到4K7的电阻器中的电流在0.3 mA到0.4 mA之间,这是计数器的额定最大电流。

请按照图4-102和图4-103搭建初始版本的电路。由于计数器的引脚布置是非标准的,因此你必须小心连接其正负供电电源。

555定时器将工作在非稳态模式,大约每秒输出一个脉冲。这个输出脉冲被用作计数器的时钟信号。而计数器输出的前三位则用来驱动3个LED。

当输入信号从高变到低时,计数器的计数就加1。因此当555定时器旁边的LED熄灭时,就是计数器加1的时候。

如果你紧盯着由输出产生的LED灯光构成的图案足够长的时间,你也许可以看出其中的逻辑关系,不过你要记住,其零状态对应于LED全部熄灭的状态,若再往上数5步的话,就会从头重来。图4-105的示意图显示一步步数下来的各个状态。如果你想弄明白这个图案为何会是这个样子,请看“理论知识:二进制算术”。

图4-105 按照二进制计数法,当计数器从000往上计数到101时,每一步中74LS92计数器的3个输出引脚的电平高、低情况所构成的图案(以红色圆圈表示高电平输出,以黑色圆圈表示低电平输出)

理论知识

二进制算术

二进制计数法只是我们日常使用的计数法的一个变种,不过我们兴许对日常使用的计数法缺少思考。在十进制的系统中,我们从0开始数到9,再往左边的下一个位置进位“1”,然后最右边的位置又重新从0到9开始计数。我们重复这个过程直到99,然后往一个新的位置进位“1”,得到100,再继续计数。

在二进制中,我们干的是同一件事情,所不同的是我们将自己限制在0和1这两个数字。因此在最右边的位置上从0开始,计数到1。由于1是极限,为了继续计数,我们就往左边的下一个位置进位“1”,然后最右边的位置又重新从0开始计数。计数到1时,再往左边的下一个位置加1,但是,这个位置原来已经有一个1了,它也就不能再往更高的数字计数了。因此,就会从这里往旁边的下一个位置进位“1”,依次类推。

如果发光的LED代表1,熄灭的LED代表0,那么图4-105中的图案就以无与伦比的方式,表示出了74LS92计数器从0开始计数到5(十进制时)或101(二进制)的过程。我在图4-106给出另一个图案(它同样用LED的亮和灭来代表1和0),该图案可以说明一个有着4位二进制输出的计数器是如何从0计数到十进制的15的。

图4-106 一个十六进制(基于16的倍数)的二进制计数器在从0开始计数到十进制的15时,其4个输出引脚的高、低电平状态变化所构成的图案(红圈表示高电平输出)

我现在有一个问题想要问你:需要多少个LED才能将十进制数1024表示成二进制数?若要表示1023的话,又需要多少个LED?

显而易见,二进制码非常适合于完全由只有高、低两种状态的逻辑器件构成的机器。这正是所有的数字计算机都使用二进制算术的原因(计算机会将二进制转换成十进制,但这仅仅是为了迎合人类的口味)。

现在回到我们的实验项目:我希望得到这3个二进制的输出,用它们来产生类似骰子上的斑点那样的图案。怎么才能做到这一点呢?看了以下内容之后,你就会明白这其实很容易。

我假定用7个LED来模仿骰子上斑点构成的图案。这些图案可以被分解成小的分组,在图4-107中,我已经将这些分组分配给了计数器的3个输出。第一个输出(最右边的那个输出)可以用来驱动中央的那个LED(代表骰子面中心的点)。第二个输出(中间的那个输出)可以用来驱动对角线上的另外两个LED。第三个输出则必须点亮4个角上的所有LED。

图4-107 这个简化的电路原理图显示了如何将74LS92 计数器的输出与信号二极管以及一个三输入的或非门组合,来产生骰子上斑点的图案。图中着色的导线并无特殊的含义,仅仅是为了便于将它们从其他导线中区分出来

以上的方案对于图案1到图案5都是可行的,但却无法点亮骰子上的6这个图案。假定我们将计数器的3个输出连接到一个具有3个输入的或非门上。那么仅当它的3个输入都为低时,其输出才为高,也就是说,只有当计数器的输出全部为低的时候,它才发出一个高电平输出。我们可以利用这一点来实现6这个图案。

请注意,将LS代的TTL芯片与HC代的CMOS芯片混在一起使用是一个很坏的习惯,因为它们的输入和输出范围不同。所以我们的或非门必须使用74LS27,而不能使用74HC27。

这样我们就有了一个简单的电路原理图,如图4-108所示。在该图中,我给某些导线加了颜色,其目的只是为了让你更方便地辨识这些导线,这些颜色并无特别的含义。

各个LED都通过一个单独的4K7的负载电阻器接地。遗憾的是,这意味着在显示6的图案时,它们都是并联工作在或非门的输出上的,这将使它过载。不过只要你不让这个模式的显示时间过长,应该不会引起什么问题。你可以通过增大负载电阻来进行补偿,也可以让多个LED共用一个电阻器,但这将导致它们发光过于黯淡而难以看清,因为负载电流已经太接近它们的电流下限了。

图4-108 74LS92 计数器的二进制输出可以用来驱动分组的LED 阵列,以模仿骰子上的斑点图案

请注意我是如何添加D1~D4这4个信号二极管的。当输出C变高时,它必须点亮角落上的所有4个LED,因此其输出电流会通过褐色以及灰色的导线。但是我们必须阻止一个输出回馈到另一个输出,因此在输出C为高时,需要使用D4来保护输出B。

现在由于在B和C之间存在着连接,因此在输出B为高时,我们就需要D2来保护输出C。又由于必须保证输出B只给角落上的两个LED供电,所以我们也需要D3来阻止它去点亮角落上的另外两个LED。此外,在输出C或者输出B为高时,我们必须保护或非门的输出,这就需要用到D1

图4-109以面包板布局的格式给出了上面描述的所有电路细节,而图4-110给出的则是我搭建的测试版本的电路。请注意74LS27芯片上未用的逻辑输入全部被短接在一起并连接到了电源的正端。以下是一些规则。

□ 当使用CMOS 芯片时(譬如HC 系列),应将未用的逻辑输入连接到电源的负端。

□ 当使用TTL芯片时(譬如LS系列),应该将未用的逻辑输入连接到电源的正端。

图4-109 在多添加了一些器件以后,图4-102和图4-108中的电路原理图就可以组合成这个能够工作的骰子模拟电路

图4-110 面包板上搭建的电子骰子电路,其中上部的按钮用来启动和停止计数器,底部的7个LED用来显示输出

我假定你已经玩够了观察LED缓慢计数的游戏,因此我现在改变了555定时器的电容器和电阻器的参数值,以使其速度从每秒大约1个脉冲增加到每秒大约50 000 个脉冲。这个计数器有能力跑得更快,但我的目的只是希望它循环得足够快,当用户按下并释放按钮的时候,计数能够停止在一个不可预测的数值就可以了。

按钮的作用仅仅是通过给定时电路供电和断电来启动和停止555定时器。这跟摇动并抛出骰子的做法是等效的。

当计数器运行很快时,LED闪光的速度就会快得好像它们全部是同时点亮的。与此同时,电路给一个我新添加在按钮和地之间的68 µF 的电容器充电。当你释放按钮时,这个电容器通过一个1 kΩ 的定时电阻器放电。随着电荷的耗散,定时电容器将花费越来越长的时间进行充电和放电,因此555定时器的频率将逐渐地减慢下来。结果,LED闪光的速度也将变慢下来,就像拉斯维加斯老虎机的转盘慢慢地停下来一样。这增加了玩这个模拟骰子的紧张程度,因为玩家可以看到骰子显示的计数朝着他们期望的数字前进——当然也可能会多走一步而超过他们期望的数字。

请注意,为了达到最大效果,按钮按下的时间至少应该有整整1 s甚至更长,这样在按钮释放之前68 µF 的电容器才能够充满电。

好啦,这个电路已经达到了最初的目标。不过它能不能被改得更好呢?当然可以!

功能增强

我想改进的主要性能是LED的显示亮度。我可以给每个LED增加一个晶体管来放大其电流,但是这里有个更简单的选择:采用TTL“开集电极”反相器。

我想使用反相器的原因在于,在TTL的世界里,如我以前提及的那样,我们可以往芯片的输入引脚中输入相当大的电流,但是能够从其中引出的电流却十分微小。因此,我将把每个LED转一个方向,将它们的负载电阻连到电源的正端上。这样一来,LED的电流就可以由反相器的输出端来吸收。

反相器芯片的“开路集电极”版本的最大优势在于它吸收电流的能力要比普通的TTL逻辑芯片大得多。其每个引脚的额定值是40mA。其唯一的缺点是根本不能发出任何的电流,在输出为高的状态下,它的行为就像一个开路的开关一样。不过这对于我们的电路来讲不会引起什么问题。

所以本实验项目的下一个也是最后一个电路原理图(图4-111)中包含了74LS06反相器,这些反相器也添加到了在面包板上搭建的电路里,如图4-112所示。我建议你将这些小的低电流LED放在一边,代之以一些标准尺寸的LED。使用今台电子公司型号为WP15031D 的5 mm“标准”LED时,我发现在串联120 Ω 的电阻器时每个LED 的压降大约为2 V,通过的电流几乎刚好为20 mA。由于74LS06反相器的每个输出引脚每次接通的LED不超过两个,因此正好在其额定范围之内。我建议在你搭建这个电路时,要检查你自己选定的LED的电流消耗,如果有必要的话,要调整电阻器。

图4-111 如果在骰子电路中添加开路集电极的反相器,它就可以以高达40 mA 的电流来驱动全尺寸的LED,但前提是必须将LED调个头,让TTL的输出级来吸收电流,而不是让其来发出电流

请记住:为了测量LED上的电压降,只需简单地将万用表的探针跨接在发光的LED的两端。而为了测量其电流,则需要断开LED的某一侧,并在LED的引脚与电路中LED的正常连接点之间接入处于毫安模式的万用表。

图4-112 面包板上搭建的电路,它利用开路集电极的反相器来驱动大个头的LED[5]

为了真正获得戏剧性的效果,你可以找一些直径1 cm 的LED(图4-113)。检查其参数,你会发现,许多这样的LED所消耗的电流并不比通常的5 mm的LED多。不管使用何种LED,都不要忘记将它们调个头,让其负的一侧面对反相器,正的一侧面对连接在电源正端的电阻器。

最后一个细节:我不得不在这个版本的电路中添加两个10 kΩ 的电阻器。你能想到其中的原因吗?D1到D4的二极管是用来在恰当的时候往反相器传输正电压的,而在计数器的输出为低时,它们则起着阻止反相器的输入端“看到”电源负端的作用。这些反相器的输入端需要下拉电阻器来防止自己“浮位”和产生错误的结果。

增加其他的功能取决于你的需要。最可能的是,你可以增加第二个骰子,因为许多游戏都要求两个骰子。74LS27芯片中还有两个或非门没有使用,你可以使用其中一个,但你还需要添加一个555定时器,它必须运行在明显不同的速度之下,以确保随机性,此外还需要可供驱动的第二个计数器。

搭建好自己的骰子并能够运行之后,你也许想要测试一下它的随机性。由于来自555定时器的脉冲是等长度的,因此每个数字有同等的机会出现;但是你按下启动按钮的时间越长,你真正随机地中断计数过程的可能性就越大。任何使用你的电子骰子的人都应该被告知,“摇动”骰子的时间必须满1 s 是一个强制规定。

当然,我也可以通过写几行软件代码来在屏幕上产生随机数,从而更加容易地模仿骰子,但是即使是奇特的屏幕图像也不可能达到制造良好的硬件的同样效果。图4-113 显示了白色1 cm 的LED 安装在磨砂的聚碳酸脂外壳中以产生戏剧性效果。

图4-113 在骰子电路中,开路集电极的反相器芯片相当强大,足以驱动1 cm的白色LED(每个这种LED消耗大约20 mA的电流,产生2 V的电压降)。在这个最终的版本中,LED嵌在0.5 in厚的聚碳酸脂板下方钻出的孔中,而该聚碳酸脂板则经过轨道磨砂机的处理,以产生半透明的抛光效果

最重要的是,通过使用简单的、专用的芯片来展示每台计算机中都需要用到的二进制算术,我得到了满足。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈