一、功能描述 由键盘输入每个瓶子将装入的药片数。当每个瓶子的药片正好装满时,以下两个事件同时发生:(1)停止药片装入;(2)传送机将装满药片的瓶子移走,下一个空瓶自动进入装药位置。一旦空瓶进入合适位置,传送机立即发出控制信号,开始第2瓶药片的装入,药片装瓶示意图如图1所示。 file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps1.png 图1 药片装瓶示意图 二、电路实现的主要功能 考虑到系统中电路设计的简单性,每瓶装入的药片数及瓶数限制在10以内。电路实现的主要功能如下: (1)通过键盘或按键设置每瓶将装入的药片数(1-9); (2)1位数码管显示当前已装药瓶数(最大值为9); (3)2位数码管显示当前已装的总药片数(最大值为81)。 三、系统模块框图 系统模块框图如图1所示,共包括五个功能。 file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps2.jpg 图1 系统模块框图 四、电路设计与功能实现 1、功能一:药片输入信号的模拟与移瓶模块 (1)我们通过每一个时钟信号的输入来模拟单个瓶子中每一个药片的装入,利用555定时器设计自激多谐振荡器,来产生所需要的时钟信号,电路设计如下图所示: file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps3.jpg 要实现对于药瓶移动过程的模拟,我们可以通过74LS161芯片和与非门设计的电路实现对于自激多谐振荡器产生的信号进行14分频,并利用其file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps4.jpg端产生14分频的方波。进而达到在CP信号为0(也即药瓶移动的过程)时药片的装入停止。 利用置数法设计的M=14计数器的状态转移真值表如下图所示: file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps5.pngfile:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps6.pngfile:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps7.pngfile:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps8.jpg 具体的电路图如下图所示: file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps9.jpg (2)对药片的输入数量进行计数的电路通过74160芯片连接而成的的M=9的计数器电路进行实现,其电路图如下图所示:(其中序号U20的74160芯片的CLR端在功能三的介绍中还有其他信号接入,因此此图中暂时先不接入) file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps10.jpg 2、功能二:比较模块与由键盘输入设置单瓶装入的最大药片数(1~9) (1)设我们需要每瓶装的药片数为B,且有file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps11.jpg。其中file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps12.jpg为B由十进制转换为二进制得到的二进制数。为了实现由键盘输入设置单瓶药片装入的最大药片数,我们可以通过74147BCD编码器来实现对于B的输入。其中B由键盘输入的控制可以通过一个单刀双掷开关来实现对于B数据输入的选择。电路图如下所示: 其中74147的DCBA输出端分别对应file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps13.jpg file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps14.jpg (2)对于当前瓶中药片数量的增加(也即药片的装入),我们可以通过74LS160芯片设计的计数器电路来实现,并且为了使在第一片药片也即第一个周期的CP信号输入时药片的初始计数为1,我们需要通过置数法实现 74LS160芯片的1~9的计数。为了实现使每瓶药片装的药片数是我们需要的数字,我们可以利用74LS85数据比较器来实现对于每瓶药片数的控制。设当前瓶中的药片数为A,有file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps15.jpg,即A的二进制数为file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps16.jpg。在A<B时,7485芯片的OALTB端口输入为1,在A=B时,OALTB端口的输出为0。定义该端口的输出变量为X、移瓶模块的输出变量为Y那么我们将药片计数模块的时钟信号输入为file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps17.jpg。在A<B时X=1,file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps18.jpg,也就是在每一次Y的下降沿使得74160芯片计数加一(装入一个药片)。在A=B的情况中,此时X=0,那么74160芯片的的输入信号被与非门“封锁”,输入信号为file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps19.jpg始终为1,停止计数。进而实现我们对于每瓶药片需要装入数量的控制。电路设计如下图所示: file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps20.jpg 3、功能三:当前已装瓶数(1~9)的显示于当前已装入药片总数(1~81)的显示 (1)我们通过功能二实现过程中所用的7485芯片,可以实现对于当前已装瓶数的记录,在A=B时,7485比较器的OAEQB端会输出高电平,定义该端口输出变量为Z。那么在A<B时,Z=0,在A=B时Z=1。也就是在A<B到A=B的过程中Z信号会进行由0到1的变化,而在下一个时钟周期信号时,Z又会由1变成0。对于已装药瓶数可以通过74160通过置数法连接形成M=9的计数器电路来实现计数。将Z作为74160的时钟信号,在Z由0到1再到0的时钟周期刚好与移瓶模块的信号周期相同,并且通过与非门将file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps21.jpg作为记录当前药片数的74160芯片的清零端的输入,保证在当前瓶中药片数达到我们要求之后会清零。其电路图如下图所示:(前面已经连接出来的电路的接线在此处进行省略) file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps22.jpg (2)总药片数量的记录我们利用置数法通过两片74160芯片实现M=81的计数器电路,其中二者的时钟信号端与单瓶药片计数器的74160芯片的时钟信号端相同。电路结构如下图所示: file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps23.jpg 四、功能四:通过数码管显示各个计数器所代表的数据 通过74160芯片连接形成的计数器、4511显示译码器与共阴极数码管可以实现对当前计数器的数据的显示,电路结构如下: file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps24.jpg 综合上述功能,以及对电路进行连接,得到最终的电路结构如下,并且经过验证符合我们所需要的各种功能。 file:///C:/Users/Zbqxl/AppData/Local/Temp/ksohtml19576/wps25.jpg 从左往右各个显示数码管所代表的分别为: 左一:当前瓶子中的药片数 左二:已装的瓶数 左三与左四:当前已装的总药片数
|