1 绪论
1.1 设计目的
在21世纪的今天,人们的生活开始变得更加丰富多彩。在繁忙的工作之余,娱乐成为人们生活不可或缺的一份子,而游戏作为近年来逐渐兴起的一种娱乐方式,已经越来越受到人们的青睐。在工作学习之余,通过玩游戏来放松、调节紧张的学习工作压力是不错的选择;然而大型的网络游戏玩起来比较耗费时间,且不能随时随地的玩。那么如果这时候拥有一款简单易携带,并且能够缓解压力的小游戏将是个不错的选择,所以,我就设计了这样一款简单易携带的经典小游戏——贪吃蛇。
1.2 设计要求
①制作一个的贪吃蛇游戏,系统以单片机为控制器,用四个输入端表示四个控制键(上下左右)。
②游戏初始化蛇的节数,以及障碍墙壁。
③当蛇的头碰到障碍墙壁或蛇的身体时自动结束。
2 总体方案
2.1 总体框图
图 2‑1总体框图
2.2 方案选择
2.2.1 点阵驱动电路选择
由于单片机IO口的驱动能力有限,当驱动16*16点阵时,行控制IO口需要控制16个LED,单个IO口驱动能力达不到良好的显示效果,故需要驱动电路来控制16*16点阵,具体有以下两种方案以供选择:
方案一:选用74HC595作为点阵驱动。74HC595是一个8位串行输入、并行输出的位移缓存器。可使用4个74HC595来控制点阵的行列,在控制点阵时仅需6个IO口,但每次控制时需要发送16次数据。
方案二:选用74LS138配合74HC373作为点阵驱动。74LS138为3线-8线译码器,可由2个74LS138构成一个4线-16线译码器来驱动点阵的行。74HC373是八路D型锁存器,可用来并行驱动点阵的列,每次控制只需执行一次命令。但在此方案中需要20个IO口来控制电路。
根据以上两种方案的描述,再结合我们的系统设计,IO口还未完全利用,为使刷新速度更快,故采取用方案二。
2.2.2 按键电路设计方案
在本设计中,我们需要通过按键来实现改变贪吃蛇的运动方向。那么,键盘就是整个系统中不可缺少的一部分。具体有以下两种方案以供选择:
方案一:矩阵式键盘,这种键盘I/O口利用率高,但电路连接复杂,软件编程也比较复杂,适用于需要大量使用案件的系统。
方案二:独立式键盘,这种键盘每个按键之间是相互独立的,每个按键占用一个IO口,当按键数量较多时,I/0口利用率不高,但程序编写简单,适用于所需按键较少的场合。
根据以上两种方案的描述,再结合我们的系统设计,显而易见,我们需要独立式键盘,所以,这里我们选择方案一。
2.2.3 电源供电选择
电源电路是一个电子产品的重要组成部分,本设计中的单片机与驱动电路都需要电源。在本设计中的单片机、74HC373和74LS138的电压典型值都为5V,故需要一个5V的电源供电。具体有以下三种方案以供选择:
方案一:使用直流电源供电,例如手机充电器,可以直接获取5V的电源,并且可以长时间供电,但必须有电线连接,不具有便携性。
方案二:使用干电池供电,电池无需电线连接,具有便携性。并且单节干电池由1.5V的电压,3节干电池串联即可得到4.5V的电压,基本满足需求。但干电池仅能单次使用,没电后需更换电池,造成浪费。
方案三:使用锂电池供电,电池无需电线连接,比干电池更加轻便,更具有便携性。锂电池还可以重复充电循环使用,设计产品可有更长的寿命。另外锂电池典型电压为3.7V,不满足系统所需的5V,但市面上有类似于FM3209M之类的锂电池管理芯片只需搭配简单的外围电路即可获得5V的电压。
根据以上两种方案的描述,我们选用方案三,使用锂电池为本设计供电,以便使设计产品更加便捷。
3 硬件设计
3.1 单片机最小系统
3.1.1 单片机选型
本设计选用STC89C52单片机作为系统的主控芯片,控制该贪吃蛇系统的整体运行。STC89C52单片机的优点为功耗低、八位CMOS微处理器性能高,片内具有8k在线编程Flash存储器,采用MCS-51内核,指令完全兼容MCS-51,具有开发简单、可在线编程下载、成本低等优点。[1]
最小系统主要由STC89C52单片机、晶振电路、复位电路构成。电源采用锂电池供电,晶振电路为12M石英晶振,并联两个电容,可以起到频率微调作用。复位电路有上电自动复位和开关复位两种复位方式。
3.1.2 单片机最小系统
单片机最小系统原理图如图 3‑1所示:
图 3‑1单片机最小系统
[1] 时钟电路
图 3‑2单片机最小系统-时钟电路
单片机内部具有一个高增益反相放大器,用于构成振荡器。通常在引脚XTALI和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,系统时钟电路结构如图 3‑2所示,在本设计中时钟电路采用12M石英晶振作为基准时钟。
[2] 复位电路
图 3‑3单片机最小系统-复位电路
复位电路用于重新启动系统,使得单片机回到原始状态。设置复位电路的目的是当系统失去控制或程序跑飞时,通过复位按钮恢复默认设置,系统重新启动运行。[2]
复位电路由电容串联电阻构成,由图 3‑3并结合“电容电压不能突变”的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位。一般教科书推荐C 取10u,R取8.2K。当然也有其他取法的,原则就是要让RC组合可以在RST脚上产生不少于2个机器周期的高电平。
式 3‑1电容充电时间计算公式
在本设计中C取10u,R取10K。由式 3‑1计算得 =0.1s远大于两个机器周期(2us),故可以实现上电复位功能,另外还设置了一个按键作为复位按键,即按下后直接将单片机RST端接至5V复位单片机,当按键松开后再重复电容充电的过程恢复正常运行。
3.2 点阵驱动电路
图 3‑5点阵LED内部原理图
点阵LED内部原理图如图 3‑5所示,外侧的就是点阵LED的引脚号,左侧的8个引脚是接的内部LED的阴极,上侧的8个引脚接的是内部LED的阳极。从图上可以看出来,我们的9脚如果是低电平,13脚是高电平的话,最左上角的那个LED小灯就会亮。
控制一个8*8的点阵需要16个引脚,将四个点阵行与行分别连接,列与列分别连接,控制这个16*16点阵仍然需要32个引脚,占用了过多的单片机IO口,所以需要一定的驱动电路来控制点阵。具体驱动方式如下述所示。
3.2.1 4-16线译码器(行驱动)
图 3‑6由两片74LS138构成的4~16线译码器
设计中采用74LS138译码器。译码器每一时刻的输出口会根据输入信号的译码来选择,同一时刻仅有一个端口输出与其他端口的输出不同,该电平信号就是设计所需的。只要在输入端给出连续的编码信号,输出端就会产生由低位端口到高位端口输出的电平信号。由于16×16点阵给出的行引脚为16根,而74LS138仅有8位输出引脚,所以要想实现译码选择行线的话一片,74LS138显然是不够的,因此该设计中采用两片74LS138译码器级联成4~16线译码器。那么怎样才能实现两片74LS138级联成为4~16线译码器呢?级联原理如图 3‑6所示,从图中可以看到,两片74LS138的输入端被相应地连在一起组成4~16译码器的低三位,关键是第四位的连接方式,从图中可以看出,当D3=0时,会使73LS138(1)对输入信号译码,而输出端也仅会在73LS138(1)的Y0到Y7之间进行选择。这与一片74LS138的译码关系一样,74LS138(2)则不参与译码,而全部输出默认电平,但从输入端看是输入了四位信号而产生了16位数据。再当D3=1时,73LS138(2)对输入的低三位信号译码,73LS138(2)被屏蔽,输出端全部输出高电平。这样,只要将4~16线译码器的输入端口接入单片机的IO端口上,16位输出端接在16×16点阵的行线接口上,即可完成点阵的行驱动。[3]
图 3‑7点阵行驱动电路
在本设计中,如图 3‑6所示通过单片机的P2.0、P2.1、P2.2和P2.3四个引脚作为4~16线译码器的输入,4~16线译码器的输出接至四个点阵的阴极。
3.2.2 D锁存器(列驱动)
74HC373是八路D型锁存器,每个锁存器具有独立的D型输入,以及适用于面向总线的应用的三态输出。
锁存器的主要作用 | |
[1] | 缓存 |
[2] | 完成高速的控制其与慢速的外设的不同步问题 |
[3] | 是解决驱动的问题(提供的电流比51IO口输出电流大) |
[4] | 拓展I/O口(可以用锁存器幂叠加方法,即锁存器的Q再接锁存器实现IO口的无限拓展) |
表 3‑1锁存器的主要作用
在本设计中就是用到了锁存器的第三个功能,微控制器的IO口均不能流过过大的电流,LED点亮时有约10ms的电流,因此点阵阳极不要直接接单片机IO口,应先经过一个缓冲器74HC373。单片机IO口只需很小的电流控制74HC373即可间接的控制点阵阳极的显示,而74HC373输出也能负载约10mA的电流。设置数码管段的驱动电流为ID=15mA,这个电流点亮度好,并且有一定的裕度。
图 3‑8点阵列驱动电路
在本设计中,如图 3‑7所示将锁存器串如单片机与点阵之间,将锁存器的OE接低电平、LE接高电平,以使锁存器的输出始终等于输入。从而实现扩大电流的作用。
3.3 按键电路
4 软件设计
4.1 主函数
图 4‑1主函数流程图
单片机复位后,单片机运行main()函数,初始化定时器并点亮由两个LED构成的蛇身和一个食物,蛇开始默认向左运动。初始化完成后单片机循环执行点阵扫描函数(点阵显示扫描函数)与按键扫描函数(检测按键是否被按下)。
点阵扫描函数:点阵的显示原理是在每一时刻仅显示一行数据,然后通过每行轮流显示,以很快的速度不断地刷新,也就产生了静态的显示效果。在本设计中,单片机P2.0-P2.3引脚控制4~16线译码器从而控制点阵的行,P0与P1控制点阵的列。当P2.0-P2.3分别是0、0、0、0时,选中的是点阵的第一行,其显示内容由P0与P1控制,IO口为高电平时点阵上对应LED点亮反之低电平则不亮,当P0与P1分别是0xff与0x00时,第一行的左八个LED点亮右八个熄灭。当P2.0-P2.3分别是0、0、0、1时,选中的是点阵的第二行,依次类推从而实现点阵每行的显示。控制P2.0-P2.3引脚以实现选中1-16行,并使其依次循环选中,并通过P0与P1发送数据从而实现点阵整片的显示。
按键扫描函数:在本设计中按键使用的是单片机的P3.2-P3.5,单片机内部有将其上拉,所以在没按下按键时按键输入为高电平,按键另一端接地,当按下按键时输入则为低电平。所以循环扫描按键是否有变成低电平,当找输入到低电平,就使蛇向相应的方向改变。