1设计目的
在21世纪的今天,人们的生活开始变得更加丰富多彩。在繁忙的工作之余,娱乐成为人们生活不可或缺的一份子,而游戏作为近年来逐渐兴起的一种娱乐方式,已经越来越受到人们的青睐。在工作学习之余,通过玩游戏来放松、调节紧张的学习工作压力是不错的选择;然而大型的网络游戏玩起来比较耗费时间,且不能随时随地的玩。那么如果这时候拥有一款简单易携带,并且能够缓解压力的小游戏将是个不错的选择,所以,我就设计了这样一款简单易携带的经典小游戏——贪吃蛇。1.2 设计要求
①制作一个的贪吃蛇游戏,系统以单片机为控制器,用四个输入端表示四个控制键(上下左右)。②游戏初始化蛇的节数,以及障碍墙壁。③当蛇的头碰到障碍墙壁或蛇的身体时自动结束。2 总体方案
2.1 总体框图
图 2‑1总体框图
(资料图)
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,单片机内部有将其上拉,所以在没按下按键时按键输入为高电平,按键另一端接地,当按下按键时输入则为低电平。所以循环扫描按键是否有变成低电平,当找输入到低电平,就使蛇向相应的方向改变。资料包括:
需要完整的资料可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。