基于单片机的贪吃蛇设计

news2024/11/19 3:32:00

  

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,单片机内部有将其上拉,所以在没按下按键时按键输入为高电平,按键另一端接地,当按下按键时输入则为低电平。所以循环扫描按键是否有变成低电平,当找输入到低电平,就使蛇向相应的方向改变。

资料包括:

 

 

需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。

纷传点击用微信打开即可,过程有点繁琐请见谅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dreamweaver网页设计作业制作 学生NBA篮球网页 WEB静态网页作业模板 大学生校园篮球网页代码 dw个人网页作业成品

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

第五章:双指针与离散化的映射

第五章:双指针、离散化、二进制运算与区间合并一、双指针1、什么是双指针?2、双指针的模板3、双指针例题(1)思路:(2)解答:C版:C版:二、离散化1、什么是离散化…

java面试强基(3)

重载和重写的区别? 重载 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。 重载就是同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理。 重写 重写发生在运行期,…

go语言基本环境搭建

下载地址 Go官网下载地址:https://studygolang.com/dl 一、下载对应电脑得安装包 二、下载完成点击安装下一步(选择目录尽量简单) 三、是否安装成功 四、环境变量 GOROOT和GOPATH都是环境变量,其中GOROOT是我们安装go开发包的路…

【计算机毕业设计】Springboot医疗管理系统源码

一、系统截图(需要演示视频可以私聊) 摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 医疗服务系统,主要的模块包括查看管理员;首页、个人中心…

tomcat官网下载配置全部详细步骤(包含各种报错解决办法)

前言: 名字由来:翻译是野猫,tomcat的作者初衷是希望这个软件可以自力更生,自给自足。不依赖其他插件,独立达到提供web服务的效果 1.tocat和java的关系? tomcat是用Java语言编写的,需要运行在…

大三,请问现在自学Java还来得及吗?

前言 如果还在为入门Java晚而发愁时间够不够,首先你是准备自学,那么我们可以看看现在网络上一些比较热门的Java全体系的学习需要化多长时间,先拿B站上做的比较好的黑马教程和尚硅谷举例: 2022黑马程序员Java学习路线图​www.bili…

耗时半月,终于把牛客网软件测试面试八股文,整理成了文档资料.....

一、面试基础题 简述测试流程: 1、阅读相关技术文档(如产品PRD、UI设计、产品流程图等)。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划。 4、编写测试用例(等价类划分法、边界值分析法等)。 5、用例评审(…

飞象星球落地重庆云阳86所学校,县乡4万学生迎来素质课堂

猜生字笔画顺序、学习硬笔书法;跟随老师认识情绪、写下心里话……自从重庆云阳县86所中小学引入飞象星球双师素质课堂,4万多名县城和乡村孩子的课后素质课堂一下子变得丰富多彩起来。 图:洞鹿小学双河村校上双师素质书法课 云阳县地处三峡库…

代码随想录算法训练营第三十六天| LeetCode435. 无重叠区间、LeetCode763. 划分字母区间、LeetCode56. 合并区间

一、LeetCode435. 无重叠区间 1:题目描述(435. 无重叠区间) 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 2:解题思路 class …

MySQL面试问题汇总(2022)

一、MySQL架构 锁 什么是锁? 当多个连接并发地存取MySQL数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 加锁是实现数据库并发控制的一个非常重要的…

BFV同态加密方案初步学习

BFV是把Bra12的LWE版本推到了RLWE版本,Bra12也可以叫做BFV。 经典的RLWE的公钥加密算法回顾 对比以前的Regev的LWE公钥加密方案,其实几乎只是把明文空间换了,也就是在最大比特编码的时候把2换成t,即,Δ⌊q/t⌋\Delta…

web网页设计期末课程大作业——香格里拉旅游网页设计 5页 HTML+CSS+JavaScript

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

一起来看看AMD最新显卡驱动22.11.1!

AMD最新推出了显卡驱动22.11.1,可以支持新上线的使命召唤:战区2,并且还修复了一系列的问题,AMD忠实用户们期待了嘛~ 更新内容 支持 使命召唤:战区 2.0 漫威蜘蛛侠:迈尔斯莫拉莱斯™ 固定问题 Radeon™ RX 6…

【mycat】mycat水平分表

mycat完成水平拆分 简介 相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的…

【Try Hack Me】内网专项---Wreath

THM 学习笔记 【Try Hack Me】内网专项—Wreath 🔥系列专栏:Try Hack Me 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月17日🌴 🍭作…

编程基础都要懂的计算机组成

学习目标: 1. 能够说出计算机有那两部分组成 2. 能够说出操作系统的作用 1.1计算机组成 计算机是可以进行数值计算和逻辑运算, 并且具有存储功能的电子机器. 计算机由硬系统件和软件系统组成. 1.1.1 硬件系统 主要分为主机和外设两部分, 是指那些构成计算机系统的物理实体,…

123456

hostname web1 bash 113.219.215.44 ctyun/Ctyun2022 cd /data/html/ tar -cvf /home/ctyun/html_zy.tar ./ mysqldump -uctyun -p --skip-lock-tables -R ultrax>ultrax_zhouyue.sql cd /etc/httpd tar -cvf /home/ctyun/httpd_zhouyue.tar ./ 关机改云主机私有网卡…

APP逆向案例之(一)过 app 更新提示

案例:某APP打开时提示更新 思路:想这是查壳看看有没有加壳,没有就去反编译按照提示搜索下,结果却是没有加壳反编译了下搜索,搜索不到,后来想到是不是网络传过来的,那这样是不是就要先获取本身AP…

Spring(十四)- Spring注解原理解析

文章目录一、Spring注解原理解析1. 使用xml配置扫描组件的原理解析2. 使用配置类扫描组件的原理解析一、Spring注解原理解析 1. 使用xml配置扫描组件的原理解析 使用Component等注解配置完毕后&#xff0c;要配置组件扫描才能使注解生效 ⚫ xml配置组件扫描&#xff1a; <c…