基于单片机的贪吃蛇设计

  

1         绪论

1.1 设计目的

21世纪的今天,人们的生活开始变得更加丰富多彩。在繁忙的工作之余,娱乐成为人们生活不可或缺的一份子,而游戏作为近年来逐渐兴起的一种娱乐方式,已经越来越受到人们的青睐。在工作学习之余,通过玩游戏来放松、调节紧张的学习工作压力是不错的选择;然而大型的网络游戏玩起来比较耗费时间,且不能随时随地的玩。那么如果这时候拥有一款简单易携带,并且能够缓解压力的小游戏将是个不错的选择,所以,我就设计了这样一款简单易携带的经典小游戏——贪吃蛇。

1.2 设计要求

①制作一个的贪吃蛇游戏,系统以单片机为控制器,用四个输入端表示四个控制键(上下左右)。

②游戏初始化蛇的节数,以及障碍墙壁。

③当蛇的头碰到障碍墙壁或蛇的身体时自动结束。

2         总体方案

2.1 总体框图

 

 2‑1总体框图

2.2 方案选择

2.2.1            点阵驱动电路选择

由于单片机IO口的驱动能力有限,当驱动16*16点阵时,行控制IO口需要控制16LED,单个IO口驱动能力达不到良好的显示效果,故需要驱动电路来控制16*16点阵,具体有以下两种方案以供选择:

方案一:选用74HC595作为点阵驱动。74HC595是一个8位串行输入、并行输出的位移缓存器。可使用474HC595来控制点阵的行列,在控制点阵时仅需6IO口,但每次控制时需要发送16次数据。

方案二:选用74LS138配合74HC373作为点阵驱动。74LS1383线-8线译码器,可由274LS138构成一个4线-16线译码器来驱动点阵的行。74HC373是八路D型锁存器,可用来并行驱动点阵的列,每次控制只需执行一次命令。但在此方案中需要20IO口来控制电路。

根据以上两种方案的描述,再结合我们的系统设计,IO口还未完全利用,为使刷新速度更快,故采取用方案二。

2.2.2            按键电路设计方案

在本设计中,我们需要通过按键来实现改变贪吃蛇的运动方向。那么,键盘就是整个系统中不可缺少的一部分。具体有以下两种方案以供选择:

方案一:矩阵式键盘,这种键盘I/O口利用率高,但电路连接复杂,软件编程也比较复杂,适用于需要大量使用案件的系统。

方案二:独立式键盘,这种键盘每个按键之间是相互独立的,每个按键占用一个IO口,当按键数量较多时,I/0口利用率不高,但程序编写简单,适用于所需按键较少的场合。

根据以上两种方案的描述,再结合我们的系统设计,显而易见,我们需要独立式键盘,所以,这里我们选择方案一。

2.2.3            电源供电选择

电源电路是一个电子产品的重要组成部分,本设计中的单片机与驱动电路都需要电源。在本设计中的单片机、74HC37374LS138的电压典型值都为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单片机最小系统-时钟电路

单片机内部具有一个高增益反相放大器,用于构成振荡器。通常在引脚XTALIXTAL2跨接石英晶体和两个补偿电容构成自激振荡器,系统时钟电路结构如图 3‑2所示,在本设计中时钟电路采用12M石英晶振作为基准时钟。

[2]    复位电路


 

 

 3‑3单片机最小系统-复位电路

复位电路用于重新启动系统,使得单片机回到原始状态。设置复位电路的目的是当系统失去控制或程序跑飞时,通过复位按钮恢复默认设置,系统重新启动运行。[2]

复位电路由电容串联电阻构成,由图 3‑3并结合“电容电压不能突变”的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位。一般教科书推荐10uR8.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点阵给出的行引脚为1674LS138仅有8位输出引脚所以要想实现译码选择行线的话一片74LS138显然是不够的因此该设计中采用两片74LS138译码器级联成416线译码器。那么怎样才能实现两片74LS138级联成为416线译码器呢?级联原理如图 3‑6所示从图中可以看到两片74LS138的输入端被相应地连在一起组成416译码器的低三位关键是第四位的连接方式从图中可以看出D3=0会使73LS138(1)对输入信号译码而输出端也仅会在73LS138(1)Y0Y7之间进行选择。这与一片74LS138的译码关系一样74LS138(2)则不参与译码而全部输出默认电平但从输入端看是输入了四位信号而产生了16位数据。再当D3=173LS138(2)对输入的低三位信号译码73LS138(2)被屏蔽输出端全部输出高电平。这样只要将416线译码器的输入端口接入单片机的IO端口上16位输出端接在16×16点阵的行线接口上即可完成点阵的行驱动。[3]

 3‑7点阵行驱动电路

在本设计中,如图 3‑6所示通过单片机的P2.0P2.1P2.2P2.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线译码器从而控制点阵的行,P0P1控制点阵的列。当P2.0-P2.3分别是0000时,选中的是点阵的第一行,其显示内容由P0P1控制,IO口为高电平时点阵上对应LED点亮反之低电平则不亮,当P0P1分别是0xff0x00时,第一行的左八个LED点亮右八个熄灭。当P2.0-P2.3分别是0001时,选中的是点阵的第二行,依次类推从而实现点阵每行的显示。控制P2.0-P2.3引脚以实现选中1-16行,并使其依次循环选中,并通过P0P1发送数据从而实现点阵整片的显示。

按键扫描函数:在本设计中按键使用的是单片机的P3.2-P3.5,单片机内部有将其上拉,所以在没按下按键时按键输入为高电平,按键另一端接地,当按下按键时输入则为低电平。所以循环扫描按键是否有变成低电平,当找输入到低电平,就使蛇向相应的方向改变。

 

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值