首页 毕业设计(论文)-基于单片机的微型游戏机--贪吃的蛇

毕业设计(论文)-基于单片机的微型游戏机--贪吃的蛇

举报
开通vip

毕业设计(论文)-基于单片机的微型游戏机--贪吃的蛇毕业设计(论文)-基于单片机的微型游戏机--贪吃的蛇 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 基于单片机的微型游戏机—贪吃的蛇 摘 要 单片微型机简称单片机,它是在一片芯片上集成了中央处理部件,存储器、定时器/计数器和各种输入输出设备等接口部件。单片机是微机发展的一个重要的分支,自问世以来,性能不断地改善和提高,加之单片机具有集成度高、功能强、速度快、体积小、功耗小、使用方便、性能可靠、价格便宜等优点,故在工业控制、数据采集和处理、通信系统、家用电器等领域的应用日益广泛。国内虽然起步较晚,...

毕业设计(论文)-基于单片机的微型游戏机--贪吃的蛇
毕业 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 论文 政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载 )-基于单片机的微型游戏机--贪吃的蛇 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 基于单片机的微型游戏机—贪吃的蛇 摘 要 单片微型机简称单片机,它是在一片芯片上集成了中央处理部件,存储器、定时器/计数器和各种输入输出设备等接口部件。单片机是微机发展的一个重要的分支,自问世以来,性能不断地改善和提高,加之单片机具有集成度高、功能强、速度快、体积小、功耗小、使用方便、性能可靠、价格便宜等优点,故在工业控制、数据采集和处理、通信系统、家用电器等领域的应用日益广泛。国内虽然起步较晚,但单片机的潜力越来越被人们所重视,尤其在工业控制、自动化仪器仪表、计算机系统接口、智能化外设等应用领域发展很快。它的应用对于产品升级换代、机电一体化都具有重要的意义,在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数,被用于各种不同产品的生产。在通信行业更为广泛利用,手机从只能基本通话,到现在一台手机拥有各种不同的功能,单片机得到了广泛的应用。手机可以听音乐,听收音机,玩游戏,照相片等等,比较流行的手机游戏贪吃蛇就能用单片机实现。 关键词:51单片机 贪吃蛇 游戏 I 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) Based on single chip micro-game - greedy snake ABSTRACT Single-chip microprocessor referred to as microcontrollers, which is integrated on a chip, a central processing unit, memory, timer / counters and a variety of input and output devices such as Interface Unit. SCM is a microprocessor development, an important branch, since its inception, performance, continuous improvement and increase, coupled with microcontroller with an integrated high, strong function, high speed, small size, power consumption, easy to use, reliable, cheap, etc. advantages, so in the industrial control, data acquisition and processing, communication systems, home appliances and other fields increasingly wide range of applications. Although the domestic late start, but the potential of SCM has been growing attention, especially in industrial control, automation instruments and meters, computer system interface, intelligent peripherals and other applications developed rapidly. Its application for the upgrading of products, mechanical and electrical integration, have important significance in industrial production, current, voltage, temperature, pressure, flow, flow rate and switching capacity are commonly used parameters of the main accused, was used for a variety production of different products. More extensive use of the communications industry, cell phone calls from can only be basic to the present, mobile phones have a variety of functions, single-chip has been widely used. Phone can listen to music, listening to the radio, play games, according to photos, etc., the more popular cell phone game Snake will be able to use SCM. Keyword:51singlechip snake game II 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 目 录 1 第一章 绪论 ............................................................................................................................... 1 1.1 概述 ............................................................................................................................... 1 1.2 选 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 背景 ....................................................................................................................... 1 1.3 课题 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 ....................................................................................................................... 1 1.4 思路设计 ....................................................................................................................... 1 2 第二章 系统的基本组成和工作原理 ..................................................................................... 2 2.1 系统的基本组成 ........................................................................................................... 2 2.2 系统的工作原理 ........................................................................................................... 2 3 第三章 显示电路的选取和设计 ............................................................................................. 2 3.1 游戏显示的器件选择 ................................................................................................... 2 3.2 显示功能的硬件电路 ................................................................................................... 3 4 第四章 键盘扫描的电路设计 ................................................................................................. 4 4.1 键盘扫描思路设计 ....................................................................................................... 4 4.2 键盘硬件电路设计 ....................................................................................................... 4 5 第五章 系统程序设计 ............................................................................................................. 5 5.1 编译软件 ....................................................................................................................... 5 5.2 软件设计工具 ............................................................................................................... 5 5.3 C51 优化的 C 语言交叉编译器 ............................................................................... 10 5.4 系统设计 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 图 ......................................................................................................... 11 参考文献......................................................................................................................................... 15 附 录............................................................................................................................................. 16 谢辞................................................................................................................................................. 43 III 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 1 第一章 绪论 1.1 概述 本设计采用80C51核心的单片机最小系统,80C51是MCS—51系列单片机钟CHMOS工艺的一个典型品种。另外,其他厂商以8051为基核开发出CHMOS工艺单片机产品统称为80C51系列。贪吃蛇游戏采用ATS892的80C51系列的芯片,AT89S52具有8KB空间ROM,256B的RAW,4个并行接口,1个串行接口,3个定时计数器,6个中断源。拥有大量的程序存储空间,大大减轻了对程序的编写和算法的要求。丰富的硬件资源可使外围电路变得更简单。 1.2 选题背景 贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。我希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。 1.3 课题分析 贪吃蛇游戏设计主要硬件由单片机最小系统,TFT彩屏,4X4矩阵键盘,整个的游戏设计外围电路比较少,主要核心在于游戏的程序设计,本设计的游戏规则也参照现在手机流行的贪吃蛇游戏的规则去设计,当蛇吃到食物时,蛇身就会自动增加一格,食物随机出现在屏幕上,当蛇碰到墙壁时,游戏结束。 本设计需要考虑的问题有以下几个: 1. 显示彩屏的选择 2. 保证游戏的流畅性和及时响应性 3. 游戏的设计应该接近人性化 4. 电路连接距离应尽量短,避免信号线受外界干扰 1.4 思路设计 游戏的运行由矩阵键盘去控制,显示由TFT彩色屏幕完成。本设计的键盘扫描电路不同于以往一般的矩阵键盘,而由中断扫描代替,当有按键按下时,才执行扫描键盘,这样就可以节省很多CPU资源,同时也可以及时的反应出按键操作。 1 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 2 第二章 系统的基本组成和工作原理 2.1 系统的基本组成 贪吃蛇游戏设计由三部分组成,屏幕显示,最小系统及矩阵键盘。最小系统采用Atmel公司的51核的AT89S52芯片,AT89S52芯片具有8K的程序存储器,256B的数据存储器,已经为程序的设计带来了很大的方便,解决了因程序容量庞大而导致硬件选择困难的问题。同时也节约了设计成本,一块AT89S52只需要5块钱就足够了,对于一般人来讲是可以承受得了的。加上屏幕的应用比较简单,有相应的配套应用命令子程序,减低了设计者重新编写屏幕应用子程序的麻烦,同时设计者可根据自身设计需要,增添或修改程序,使得程序更完善。 2.2 系统的工作原理 系统的程序设计分为一个主函数,3个子函数,子函数分别是键盘扫描函数,贪吃蛇运行子程序和TFT屏幕自带的子程序。在主程序里只对LCD的初始化,中断设备的初始化,然后死循环执行贪吃蛇运行程序。 3 第三章 显示电路的选取和设计 3.1 游戏显示的器件选择 游戏设计的显示屏可以有很多种的选择,选择不同的屏幕,程序的编写也随之不同。屏幕可以选择LCD128X64,8X8点阵LED,TFT彩色屏幕等等。 LCD128X64是比较通用,大众化,容易使用的液晶屏,若采用LCD128X64液晶屏,则要用到8位的I/O口作数据传送,6位I/O口作选通位,一共要用到14个I/O口,占用单片机最小系统的资源比较多,另外,LCD128X64每一个显示格由8x8像素组成,若使用每一个显示单元格作为贪吃蛇的蛇身显示,显然有点大,不美观,若利用LCD128X64里可编辑每个单元格的显示图案的功能,将会使得编写程序变得很麻烦,而且CPU要执行的程序显然增加了很多。 8X8点阵LED比LCD128X64结构更简单,不需要任何的指令集,即对I/O口直接输出可以使用。若选用8X8点阵LED显示屏,首先16位的I/O口已经被占用,8X8的点阵能使用的范围很少,对增强游戏的功能方面加以限制。 TFT彩色屏幕具有很强的显示功能,能显示262k颜色,屏幕由具有丰富的功能子程序,为使用者节省了不少时间,而且占用I/O口少,只用到5个I/O口。本设计将采用SSD1283A型号的彩屏。 SSD1283A的TFT驱动器是一种智能都在同一个驱动器,集成了电源电路,门驱动器,内存为单芯片驱动器和源。它可以驱动132号决议的RGB × 132的一个小组26万色为a - TFT。 2 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 它也集成了控制器的功能和组成132高达39204个字节(132 ×132 × 18 / 8)图形显示数据RAM(GDDRAM),6800接口,这样它与普通单片机通过8/9/16/18-bits系列/ 8080系列兼容的并行接口或串行接口和存储数据的GDDRAM研究。辅助18位视频接口(垂直同步,HSYNC,DOTCLK,启用和RR0 - RR5,GG0 - GG5,BB0 - BB5)是SSD1283A纳入图像显示动画。 只有外部电容器9只,它嵌入的DC - DC转换器,振荡器和电压发生器提供一切必要的组件所需的电压由外部的驱动程序最低限度。通用的电压产生电路包含驱动液晶显示器对电极。伽玛控制电路的集成,也包括可通过软件命令调整,以提供最大的灵活性和最佳的显示质量。 3.2 显示功能的硬件电路 图3-1 游戏显示硬件电路图 如图所示,显示电路占用了P00-P04口,仅占用了5个接口。P0口的每一位口线可以驱动8个LSTTL负载。在作为通用I/O口时,由于输出驱动电路是开漏方式,有集电极的开路(OC门)电路或漏极电路驱动是需外接上拉电阻,本设计采用4.7K的排电阻做上拉电阻,足以使P0口驱动TFT液晶显示屏。 3 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 4 第四章 键盘扫描的电路设计 4.1 键盘扫描思路设计 键盘是人机对话的一个重要的桥梁,通过按键控制单片机的操作。键盘的设计有两种方式,一种是独立键盘,就是独立每一个I/O口单独连接一个按钮,这样的设计是最简单的,可是具有很大的局限性,因为单片机的I/O口本身就很有限,而且8个按键需要8个I/O口,浪费了单片机的资源。第二种方式是矩阵键盘,矩阵键盘采用行列式结构按键设置在行列的交点上。当口线数量为8时,可以将4根口线定义为行线,另4根口线的定义为列线,形成4X4键盘,可以配置16个按键。同样利用8根口线,矩阵键盘可以配置16个键,而独立键盘只能配置8个按键,从此看出,矩阵键盘比独立键盘拥有更丰富的性能。 4.2 键盘硬件电路设计 图1-2矩阵键盘电路图 如图所示,矩阵键盘的行线连接P1口的前四位,列线连接P1口的后四位。矩阵键盘上某一键闭合时,该键所对应的行线和列线短接。此时该行线电平将由被短接的列线电平所决定。 4 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 5 第五章 系统程序设计 5.1 编译软件 关于程序的编写,在C51单片机中,可以用汇编语言编写程序,也可以用C语言编写。汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言,其主要优点是占用资源少、程序执行效率高,但是不同的CPU,其汇编语言可能有所差异,所以不易移植。C语言是一种结构化的高级语言,其优点是可读性好,移植容易,是普遍使用的一种计算机语言,缺点是占用资源较多,执行效率没有汇编高。对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。 综合本设计的情况,由于编写程序容量并不是很大,而且对于初学者更好理解程序的设计,故采用keilC 编译器来完成程序的编写。 5.2 软件设计工具 uVision2 集成开发环境 uVision2 IDE是一个基于Window的开发平台包含一个高效的编辑器一个项目管理器和一个MAKE工具。 uVision2 支持所有的KEIL 8051工具包括C编译器,宏汇编器,连接/定位器 目标代码到HEX的转换器。uVision2 通过以下特性加速你的嵌入式系统的开发过程: 1) 全功能的源代码编辑器。 2) 器件库用来配置开发工具设置。 3) 项目管理器用来创建和维护你的项目。 4) 集成的 MAKE 工具可以汇编 编译和连接你的嵌入式应用。 5) 所有开发工具的设置都是对话框形式的。 6) 真正的源代码级的对 CPU和外围器件的调试器。 7) 高级 GDI(AGDI)接口用来在目标硬件上进行软件调试 以及和Monitor-51 进行通信。 8) 与开发工具手册和器件数据手册和用户指南有直接的链接。 uVision2界面提供一个菜单,一个工具条以便你快速选择命令按钮,另外还有源代码的显示窗口,对话框和信息显示uVision2允许同时打开浏览多个源文件。 5 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 图5-1开发环境界面 菜单条,工具条和快捷键 菜单条提供各种操作菜单,如:编辑操作,项目维护,开发工具选项设置,调试程序,窗口选择和处理,在线帮助,工具条按钮允许你快速地执行uVision2命令。键盘快捷键(你自己可以配置)允许你执行uVision命令。下面的表格列出了uVision2菜单项命令,工具条图标,默认的快捷键以及他们的描述: 文件菜单和命令 File 菜单 快捷键 描述 New Ctrl+N 创建新文件 Open Ctrl+O 打开已经存在的文件 Close 关闭当前文件 Save Ctrl+S 保存当前文件 Save all 保存所有文件 Save as 另外取名保存 Device Database 维护器件库 Print Setup 设置打印机 Print Ctrl+P 打印当前文件 Print Preview 打印预览 1-9 打开最近用过的文件 Exit 退出 uVision2 提示是否保存文件 6 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 编辑菜单和编辑器命令(Edit) 菜单 快捷键 描述 Home 移动光标到本行的开始 End 移动光标到本行的末尾 Ctrl+Home 移动光标到文件的开始 Ctrl+End 移动光标到文件的结束 Ctrl+<- 移动光标到词的左边 Ctrl+-> 移动光标到词的右边 Ctrl+A 选择当前文件的所有文本内容 Undo Ctrl+Z 取消上次操作 Redo Ctrl+Shift+Z 重复上次操作 Cut Ctrl+X 剪切所选文本 Ctrl+Y 剪切当前行的所有文本 Copy Ctrl+C 复制所选文本 Paste Ctrl+V 粘贴 Indent 将所选文本右移一个制表键的距离 Selected Text Unindent 将所选文本左移一个制表键的距离 Selected Text Toggle Bookmark Ctrl+F2 设置/取消当前行的标签 Goto Next Bookmark F2 移动光标到下一个标签处 Goto Previous Bookmark Shift+F2 移动光标到上一个标签处 Clear All Bookmarks 清除当前文件的所有标签 Find Ctrl+F 在当前文件中查找文本 F3 向前重复查找 Shift+F3 向后重复查找 Ctrl+F3 查找光标处的单词 Ctrl+] 寻找匹配的大括号,圆括号,方括号 (用此命令将光标放到大括号,圆括 号或方括号的前面) Replace Ctrl+H 替换特定的字符 Find in Files 在多个文件中查找 选择文本命令 7 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 在 uVision2中, 你可以通过按住Shift键和相应的光标操作键来选择文本 如 Ctrl+->是移动光标到下一个词 那么 Ctrl+Shift+->就是选择当前光标位置到下一个词的开始位置间的文本。 当然 你也可以用鼠标来选择文本 操作如下: 要选择„ 鼠标操作 任意数量的文本 在你要选择的文本上拖动鼠标 一个词 双击此词。 一行文本 移动鼠标到此行的最左边,直到鼠标变成右指向的箭头,然后 单击。 多行文本 移动鼠标到此行的最左边 直到鼠标变成右指向的箭头 然后相 应拖动。 一个距形框中的文本 按住 Alt键 然后相应拖动鼠标。 视图菜单 View 菜单 快捷键 描述 Status Bar 显示/隐藏状态条 File Toolbar 显示/隐藏文件菜单条 /隐藏编译菜单条 Build Toolbar 显示 Debug Toolbar 显示/隐藏调试菜单条 Project Window 显示/隐藏项目窗口 Output Window 显示/隐藏输出窗口 Source Browser 打开资源浏览器 Disassembly Window 显示/隐藏反汇编窗口 Watch & Call 显示/隐藏观察和堆栈窗口 Stack Window Memory Window 显示/隐藏存储器窗口 Code Coverage Window 显示/隐藏代码报告窗口 Performance Analyzer Window 显示/隐藏性能分析窗口 Symbol Window 显示/隐藏字符变量窗口 Serial Window #1 显示/隐藏串口 1 的观察窗口 Serial Window #2 显示/隐藏串口 2 的观察窗口 Toolbox 显示/隐藏自定义工具条 Periodic Window Update 程序运行时刷新调试窗口 Workbook Mode 显示/隐藏窗口框架模式 Options 设置颜色 字体 快捷键和编辑器的选项 8 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 调试菜单和调试命令 Debug 菜单 快捷键 描述 Start/Stop Ctrl+F5 开始/停止调试模式 Debugging Go F5 运行程序 直到遇到一个中断 Step F11 单步执行程序 遇到子程序则进入 Step over F10 单步执行程序 跳过子程序 Step out of Ctrl+F11 执行到当前函数的结束 Current function Stop Running ESC 停止程序运行 Breakpoints 打开断点对话框 Insert/Remove 设置/取消当前行的断点 Breakpoint Enable/Disable 使能/禁止当前行的断点 Breakpoint Disable All 禁止所有的断点 Breakpoints Kill All 取消所有的断点 Breakpoints Show Next 显示下一条指令 Statement Enable/Disable 使能/禁止程序运行轨迹的标识 Trace Recording View Trace 显示程序运行过的指令 Records Memory Map 打开存储器空间配置对话框 Performance 打开设置性能分析的窗口 Analyzer Inline Assembly 对某一个行重新汇编 可以修改汇编代码 Function Editor 编辑调试函数和调试配置文件 9 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 外围器件菜单 Peripherals 菜单 快捷键 描述 Reset CPU 复位 CPU Interrupt, 打开片上外围器件的设置对话框 I/O-Ports, 话框的种类及内容依赖于你选择CPU Serial, Timer, A/D Converter, D/A Converter, I2C Controller, CAN Controller, Watchdog 工具菜单 Tool 利用工具菜单,你可以配置,运行Gimpel PC-Lint,Siemens Easy-Case 和用户程序通过Customize Tools Menu菜单,你可以添加你想要添加的程序。 菜单 快捷键 描述 Setup PC-Lint 配置 Gimpel Software的PC-Link 程序 Lint 用 PC-Lint 处理当前编辑的文件 Lint all C Source Files 用PC-Lint处理你项目中所有的C 源代码文件 Setup Easy-Case 配置 Siemens的 Easy-Case 程序 Start/Stop Easy-Case 运行/停止 Siemens的 Easy-Case 程序 Show File (Line) 用Easy-Case 处理当前编辑的文件 Customize Tools Menu 添加用户程序到工具菜单中 5.3 C51 优化的 C 语言交叉编译器 Keil C51 交叉编译器是一个基于ANSI C标准的针对8051系列MCU的C编译器生成的可执行代码快速,紧凑。在运行效率和速度上可以和汇编程序得到的代码相媲美。 和汇编语言相比,用C语言这样的高级语言有很多优势,比如: 1) 对处理器的指令集不必了解8051 CPU的基本结构可以了解,但不是必须的。 2) 寄存器的分配以及各种变量和数据的寻址都由编译器完成。 3) 程序拥有了正式的结构(由C语言带来的),并且能被分成多个单独的子函 10 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 数。这使整个应用系统的结构变得清晰,同时让源代码变得可重复使用。 4) 选择特定的操作符来操作变量的能力提高了源代码的可读性 5) 可以运用和人的思维很接近的词汇和算法表达式 6) 编写程序和调试程序的时间得到很大程度的缩短 7) C 运行连接库包含一些标准的子程序 如 格式化输出 数字转换 浮点运算 8) 由于程序的模块结构技术 使得现有的程序段可以很容易的包含到新的程序 中去 9) ANSI标准的C语言是一种丰常方便的,获得广泛应用的,在绝大部分系统中 都能够很容易得到的语言。 因此 如果需要 现有的程序可以很快地移植到其他的处理器上,节省投资。 5.4 系统设计流程图 开始 LCD屏幕初始化 贪吃蛇设计初始化 贪吃蛇运行子程序 图5-2系统主程序流程图 如图所示,程序设计的主程序即main函数很简单,主要完成初始化工作,主要完成对LCD屏幕,贪吃蛇结构的初始化,然后不断运行贪吃蛇游戏程序。下面逐一分析每一个子程序的设计。 11 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 开始 初始化定时器 绘制游戏初始界面 初始化贪吃蛇参数 结束 图5-3贪吃蛇初始化子程序流程图 定时器的作用在于产生随机数,用于随机摆放食物,定时器的工作模式为模式一,即16位计数器,当计数溢出时,定时器中断程序重装计数初值,清除中断标志位。TFT显示屏幕的显示范围是132x132个像素点,定义贪吃蛇的活动范围为从左第7个像素到84个像素,从上第7个像素到120个像素。在屏幕的坐标为(96,24)开始显示游戏得分值,坐标为(96,97)显示游戏的级数。初始化贪吃蛇参数是直接给贪吃蛇的结构体赋初值。 12 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 开始 根据按键选择蛇的方向 Y 判断蛇是否死亡 蛇死亡界面 N Y 判断是否有按键 判断蛇是否最长 Y N N 等待 过关界面 判断蛇是否吃到食物 Y Y N 判断是否有按键 N 等待 放果子程序 图5-4贪吃蛇运行子程序 贪吃蛇运行子程序是整个程序设计的核心,首先由系统检测是否有按键按下,确定有按键按下后,外部中断程序自动执行,开始扫描矩阵键盘,得到键值,根据键值判断贪吃蛇要走的方向。在游戏运行的期间,系统不断检测蛇是否死亡,蛇是否已经最长,蛇是否吃到了食物。若蛇已经死亡,则蛇的死亡标记位被置位,跳转到死亡界面,检测是否有按键按下,有就跳转到游戏开始界面,重新开始游戏,无则等到有任意键按下。若检测到蛇身的长度已经达到最长,则游戏的级数自动升高一级,游戏的级数越高,贪吃蛇移动的速度越快。游戏的速度控制由延时程序决定,若延时程序延时短,则蛇移动得快,若延时比较长,则蛇移动得慢。若蛇已经吃到食物,则在放食物的原来的坐标会消除显示,重新读取计数器的值,通过计算得到要放置食物的坐标,在该坐标上显示食物。 13 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 开始 P1低四位输出1 N P1是否等于0x0f 延时 Y N P1是否等于0x0f 取出低四位 Y P1输出0xf0 取出高四位 取出键值 结束 图5-5键盘扫描子程序 由于该子程序出现在中断服务程序当中,不需要在主程序里重复运行,所以为CPU省下了许多资源,只占用了INIT0口,在主程序当中只需要执行对中断的设置和把P1置0x0f输出就可以了。在扫描程序当中,首先P1输出0x0f,若有按键按下,则在P1口的低四位会有低电平出现,在P1口的低四位分别连接着四个二极管的阴极,二极管的阳极连接着中断口P3.2和VCC,没有按键按下的时候,P3.2呈现高电平,有按键按下的时候,四个二极管当中至少有一个导通,P3.2的高电平被拉低,只要把P3.2设置成下降沿中断响应模式,那样就可以进入中断服务程序。进入中断程序后,系统再次检测P1口的电平是否等于0x0f,若P1口的电平依然不等于0x0f,则把读到P1口的值的低四位保存起来,再输出0xf0,读取P1口的值,把高四位保存起来。根据高四位(列值)跟低四位(行值)的值计算出键值。 14 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 参考文献 [1] 明浩:《单片机 C 语言入门教程》[J],2005 年电子报 [2] 谷树忠,闫胜利:《PROTEL 2004 使用教程》[M],电子工业出版社第一版 [3] 胡耀辉:《单片机系统开发实例经典》[M],北京冶金工业出版社,2006 [4] 李军:《51系列单片机高级实例开发指南》[M],北京航空航天大学出版社, 2005 [5] 姚燕南:《微型计算机原理》[M],安电子科技大学出版社 [6] 谢嘉奎:《电子线路》[M],高等教育出版社 [7] 李秉操:《机接口技术在工业控制中的应用》[M], 陕西电子编辑部 [8] 蔡美琴:《MCS—51单片机系统及其应用》[M],高等教育出版社 [9] 周利功:《增强型80C51单片机速成和实战》[M],北京航空航天大学出版社 [10] 王天曦 ,李洪儒:《电子技术工艺基础》[M],清华大学出版社 2000 [11] 李光才,楼然笛:《单片机课程设计 实例指导》[M],北京航空航天大学 出版社 2004 15 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) 附 录 Main.c #include #include #include "LCD_SSD1283.H" #include "SNAKE.h" void main(void) { LCD_ssd1283a_Init(); Init_SNAKE(); Interrupt0_Key(); while(1) { Run_SNAKE(); } } Snake.c #include #include #include "LCD_SSD1283.H" #include "SNAKE.h" //================================================================= // 使用结构体定义变量 使程序的名称更加的清楚 //================================================================= struct { uchar X; uchar Y; uchar Yes; }Food; //食物结构体 #define SNAKE_Max_Long 20 //最大长度 struct { uchar X[SNAKE_Max_Long]; 16 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) uchar Y[SNAKE_Max_Long]; uchar Long; uchar Life; uchar Score; //蛇的分数 uchar Level; //蛇的等级 }Snake; //蛇结构体 取出上次按键值 uchar Key_V_temp=0; // //函数功能:1ms延时函数 //晶 振:11.0592 M void Delay_1mS(unsigned int n) { unsigned int i; unsigned char j; for(i=0;i=19||Snake.Y[Snake.Long-1]>=28)//判蛇头 是否撞到墙壁 { Snake.Life=1; } for(i=3;i>1); //获得随机数 Food.Y=TL1&0X1B; for(i=0;i #include unsigned char Key_Value=0; unsigned char Key_flag =0; void Interrupt0_Key (void) { IT0=1; //设置下降沿中触发 EA=1; //开总中断 EX0=1; //开外部中断 Key_Port=0X0f; } unsigned char code Key_code[]= 23 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) { //p0 p1 p2 p3 0xee,0xed,0xeb,0xe7, //p4 0xde,0xdd,0xdb,0xd7, //p5 0xbe,0xbd,0xbb,0xb7, //p6 0x7e,0x7d,0x7b,0x77 //p7 }; //以上为键码,换他们排列顺序就可以调整 void Int0 () interrupt 0 { unsigned char KeyV_l,KeyV_h,KeyV,i; if(Key_Port!=0X0f) //0000 1111 有按键的时候就可能是0000 1110; { //Delay(); if(Key_Port!=0X0f) //0000 1111 有按键的时候就可能是0000 1110; { 低4位 KeyV_l=Key_Port&0x0f; //取出键码的 Key_Port=0XF0; KeyV_h=Key_Port&0xf0; //取出键码的 高4位 KeyV=KeyV_h+KeyV_l; //合并键码 /************************************* 按键编码 对应 键值 Ee ed eb e7 1 5 9 13 De dd db d7 2 6 10 14 Be bd bb b7 3 7 11 15 7e 7d 7b 77 4 8 12 16 *************************************/ for(i=0;i<16;i++) //利用键码查找键值 { if(Key_code[i]==KeyV) Key_Value=(i+1); } Key_Port=0X0f; } } Key_flag =1; } 24 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) LCD_SSD1283.C #include #include #include "LCD_SSD1283.H" #include "ziku.h" #define uchar unsigned char void Write_Byte(uchar dat) { uchar i; c_d =1; LcdCS=0; for(i=0;i<8;i++) { sclk = 0; dat=dat<<1; sdata = CY; sclk = 1; sclk = 0; } LcdCS=1; } void Write_Word(unsigned int dat) { uchar dataH,dataL; dataH=dat/256; dataL=dat&0xff; Write_Byte(dataH); Write_Byte(dataL); } void Write_IR(uchar reg) { uchar i; c_d =0; LcdCS=0; for(i=0;i<8;i++) { sclk = 0; reg=reg<<1; sdata = CY; sclk = 1; 25 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) sclk = 0; } LcdCS=1; } void Write_WDR(uchar reg,unsigned int dat) { Write_IR(reg); Write_Word(dat); } void Delay_XMS(unsigned int MS) { uchar us,usn; while(MS!=0) //for 12M { usn = 2; while(usn!=0) { us = 0xf5; while (us!=0) { us--; }; usn--; } MS--; } } void LCD_ssd1283a_Init(void) { int i; Write_WDR(0x10,0x2f8e); Write_WDR(0x11,0x000c); Write_WDR(0x07,0x0021); Write_WDR(0x28,0x0006); Write_WDR(0x28,0x0005); Write_WDR(0x27,0x057f); Write_WDR(0x29,0x89a1); Write_WDR(0x00,0x0001); Delay_XMS(100); 26 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) Write_WDR(0x29,0x80b0); Delay_XMS(30); Write_WDR(0x29,0xfffe); Write_WDR(0x07,0x0023); Delay_XMS(30); Write_WDR(0x07,0x0033); Write_WDR(0x01,0x2183); Write_WDR(0x2f,0xffff); Write_WDR(0x2c,0x8000); Write_WDR(0x03,0x6830); Write_WDR(0x27,0x0570); Write_WDR(0x02,0x0300); Write_WDR(0x0b,0x580c); Write_WDR(0x12,0x0609); Write_WDR(0x13,0x3100); Write_WDR(0x2a,0x1dd0); Write_WDR(0x2b,0x0a90); Write_WDR(0x2d,0x310f); Delay_XMS(100); Write_WDR(0x45,0x8300); Write_WDR(0x44,0x8300); Write_WDR(0x21,0x0000); Write_WDR(0x1e,0x00bf); Delay_XMS(1); Write_WDR(0x1e,0x0000); Delay_XMS(100); Write_WDR(0x45,0x8300); Write_WDR(0x44,0x8300); Write_WDR(0x21,0x0000); Write_IR(0x22); for (i=0;i<17424;i++) {Write_Byte(0xff); Write_Byte(0xff);} //主函数就有的初始化,先放在这 Write_WDR(0x21,0x0202); Write_WDR(0x44,0x8302); Write_WDR(0x45,0x8302); Write_IR(0x22); CLR_Led_ssd1283a(0xBE5F); } /*------------------------------------------------------------------- 27 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) * 函数名:SetXY * 功能:设置读取或写入的GRAM地址 * 输入:点位置x,y(0-129) * 输出:无 -----------------------------------------------------------------------------*/ void SetXY(uchar x,uchar y) { Write_WDR(RAM_ADDRESS_SET,( 0x02+x + ((unsigned int)((y+2) << 8)))); } /*------------------------------------------------------------------- * 函数名:RGB * 功能:RGB颜色混合函数 * 输入:R 0-31,G 0-63,B 0-31 * 输出:混合后的颜色值 --------------------------------------------------------------------- unsigned int RGB(uchar R,uchar G,uchar B) { return ((unsigned int)R << 11)|((((unsigned int)G) << 5) & 0x07E0)|(unsigned int)(B & 0x1F); } -*/ /*------------------------------------------------------------------- * 函数名:RGB565_Trans * 功能:透明颜色计算,用于产生半透明的效果 * 输入:前景色rgb1,背景色rgb2 * 透明度Alpha (0-5) * 输出:计算后的颜色值 -------------------------------------------------------------------- //unsigned int RGB565_Trans(unsigned int rgb1,unsigned int rgb2,uchar Alpha) //{ // uchar r1 = 0,g1 = 0,b1 = 0,r2 = 0,g2 = 0,b2 = 0; // r1 = (rgb1 >> 11) & 0x1F; // g1 = (rgb1 >> 5) & 0x3F; // b1 = (rgb1 & 0x1F); // r2 = (rgb2 >> 11) & 0x1F; // g2 = (rgb2 >> 5) & 0x3F; // b2 = (rgb2 & 0x1F); //return(RGB((r1+r2)>>1,(g1+g2)>>1,(b1+b2)>>1)); //return(RGB((r1+(r2>>Alpha)),(g1+(g2>>Alpha)),(b1+(b2>>Alpha)))); // return 28 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) RGB((((r2-r1)<>5)+r1,(((g2-g1)<>5)+g1,(((b2-b1)<>5)+b1); //} /*----------------------------------------------------------------- * 函数名:Put_pixel * 功能:在屏幕上画点 * 输入参数:坐标x(0~129)y(0~129) * color颜色 * 输出参数:无 ----------------------------------------------------------------*/ void Put_pixel(uchar x,uchar y,unsigned int color) { SetXY(x,y); Write_WDR(WRITE_DATA_TO_GRAM,color); } /*----------------------------------------------------------------- * 函数名:Line * 功能:在屏幕上画线 * 输入参数:起始X0(0~129)Y0(0~129)坐标,终点X1(0~129)Y1(0~129)坐标 * color颜色 * 输出参数:无 ----------------------------------------------------------------*/ void Line( uchar X0, uchar Y0, uchar X1, uchar Y1, unsigned int color) { int dx = X1 - X0; int dy = Y1 - Y0; int P = 2 * dy - dx; int dobDy = 2 * dy; int dobD = 2 * (dy - dx); int PointX = 0,PointY = 0; int incx = 0,incy = 0; int distance = 0,xerr = 0,yerr = 0; unsigned int i = 0; if(dx == 0) //k=1斜率为1 { PointX = X0; if(Y0 < Y1) { 29 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) PointY = Y0; } else { PointY = Y1; } for(i = 0;i <= ((Y0 0) incx = 1; else if(dx == 0) incx = 0; else incx = -1; if(dy > 0) incy = 1; else if(dy == 0) 30 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) incy = 0; else incy = -1; dx = ((X0>X1) ? (X0-X1) : (X1-X0)); dy = ((Y0>Y1) ? (Y0-Y1) : (Y1-Y0)); if(dx>dy) distance=dx; else distance=dy; PointX = X0; PointY = Y0; for(i=0;i<=distance+1;i++) { Put_pixel(PointX,PointY,color); xerr+=dx; yerr+=dy; if(xerr>distance) { =distance; xerr- PointX+=incx; } if(yerr>distance) { yerr-=distance; PointY+=incy; } } } /*------------------------------------------------------------------- * 函数名:Rectangle * 功能:绘制一个矩形框 * 输入:矩形的起始位置left,top (0-127) * 矩形的结束位置right,bottom (0-127) * 矩形框的颜色color * 输出:无 -------------------------------------------------------------------- void Rectangle( uchar left, uchar top, uchar right, uchar bottom, unsigned int color) { 31 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) Line(left,top,right,top,color); Line(left,top,left,bottom,color); Line(right,top,right,bottom,color); Line(left,bottom,right,bottom,color); } /*------------------------------------------------------------------- * 函数名:Bar * 功能:绘制一个填充的平面矩形 * 输入:矩形的起始位置left,top (0-127) * 矩形的结束位置right,bottom (0-127) * 矩形颜色color * 输出:无 --------------------------------------------------------------------- void Bar( uchar left, uchar top, uchar right, uchar bottom, unsigned int color) { uchar i = 0,k = 0; unsigned int bkcolor = 0; for(k = top;k < bottom;k++) { SetXY(left,k); Write_IR(WRITE_DATA_TO_GRAM); for(i = left+1;i <= right;i++) { Write_Word(color); } } } /*------------------------------------------------------------------- * 函数名:Bar3D * 功能:绘制一个立体的矩形体 * 输入:矩形的起始位置left,top (0-127) * 矩形的结束位置right,bottom (0-127) * 矩形体颜色color * 输出:无 --------------------------------------------------------------------- void Bar3D( uchar left, uchar top, uchar right, 32 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) uchar bottom, unsigned int color) { Bar(left+1,top+1,right-1,bottom-1,color); Line(left,top,right,top,1); Line(left+1,top+1,right-1,top+1,RGB(31,63,31)); Line(left,top,left,bottom,1); 1,RGB(31,63,31)); Line(left+1,top+1,left+1,bottom- Line(left,bottom-1,right,bottom-1,1); Line(left,bottom,right,bottom,RGB(31,63,31)); Line(right-1,top,right-1,bottom-1,1); Line(right,top,right,bottom,RGB(31,63,31)); }-*/ /*------------------------------------------------------------------- * 函数名:LCD_EN_Disp * 功能:显示一个英文字符 * 输入:显示起始位置x,y (0-129) * 显示的字符在字库中的索引cidx * 字符的前景色forecolor,背景色bkcolor (0-65535) * 输出:无 -------------------------------------------------------------------- void LCD_EN_Disp( uchar x, uchar y, uchar cidx, unsigned int forecolor, unsigned int bkcolor) { uchar dispbuf; uchar k = 0,t = 0; for(k = 0;k < 16;k++) { SetXY(x,y+k); { dispbuf = nAsciiDot[((unsigned int)(cidx - 0x20) << 4)+ k]; Write_IR(0x22); for(t = 0;t < 8;t++) { if((dispbuf << t) & 0x80) { Write_Word(forecolor); } else { 33 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) Write_Word(bkcolor); } } } } } //================================================= //函数名称: LCDShow_uCharNumber((); //入口参数:uCharNumber //返 回值:无 //说 明:向LCD发送一个0--255的数值 //================================================= void LCDShow_uCharNumber( uchar x, uchar y, uchar uCharNumber, unsigned int forecolor, unsigned int bkcolor) { LCD_EN_Disp(x,y,uCharNumber/100+'0',forecolor,bkcolor); LCD_EN_Disp(x+8,y,uCharNumber/10%10+'0',forecolor,bkcolor); LCD_EN_Disp(x+16,y,uCharNumber%10+'0',forecolor,bkcolor); } /*----------------------------------------------------------------- * 函数名:GetHzIndex * 功能:获得汉字在字库中的位置 * 输入:汉字内码hznm * 输出:汉字在字库中的位置 ----------------------------------------------------------------*/ uchar GetHzIndex(unsigned int hznm) { uchar i = 0; for(i = 0;i <= HZMAXNUM;i++) { if(hznm == hzIndex[i]) break; } return(i); } /*------------------------------------------------------------------- * 函数名:LCD_HZ_Disp 34 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) * 功能:显示一个中文字符 * 输入:显示起始位置x,y (0-127) * 显示的字符在字库中的索引cidx * 字符的前景色forecolor,背景色bkcolor (0-65535) * 输出:无 -------------------------------------------------------------------- void LCD_HZ_Disp( uchar x, uchar y, uchar cidx, unsigned int forecolor, unsigned int bkcolor) { uchar k = 0,t = 0; uchar dispbuf = 0; for(k = 0;k < 16;k++) { dispbuf = (DotTbl16[((unsigned int)cidx << 5) + (k << 1)]); SetXY(x,y+k); Write_IR(0x22); for(t = 0;t < 8;t++) { if((dispbuf << t) & 0x80) { Write_Word(forecolor); } else { Write_Word(bkcolor); } } } for(k = 0;k < 16;k++) { dispbuf = DotTbl16[((unsigned int)cidx << 5) + (k << 1) + 1]; SetXY(x+8,y+k); Write_IR(0x22); for(t = 0;t < 8;t++) { if((dispbuf << t) & 0x80) 35 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) { Write_Word(forecolor); } else { Write_Word(bkcolor); } } } } /*------------------------------------------------------------------- * 函数名:LCD_Display * 功能:实现中英文混合显示,超过一行的自动换下行显示(注:最后一行除 外) * 输入:显示起始位置x,y (0-127) * 显示的字符串str * 字符的前景色forecolor,背景色bkcolor (0-65535) * 输出:无 -------------------------------------------------------------------- void LCD_Display(uchar x, uchar y, //显示位置 uchar *str,//显示字符串 unsigned int forecolor, unsigned int bkcolor)//前景色及背景色 { uchar i = 0,k = 0; uchar dx = 0,dy = 0; unsigned int hznm = 0; uchar hzindex = 0; for(i = 0;i < strlen(str);i++) { if(str[i] < 0x80) //英文 { LCD_EN_Disp(x+dx,y+dy,str[i],forecolor,bkcolor); dx += 8; if((x+dx) >= 128) { x = 0; dx = 0; dy += 16; } } 36 北京理工大学珠海学院2006届本科毕业生毕业设计(论文) else //中文 { hznm = ((unsigned int)str[i] << 8) + str[i+1]; hzindex = GetHzIndex(hznm); if(hzindex >= HZMAXNUM) { LCD_EN_Disp(x+dx,y+dy,' ',forecolor,bkcolor); LCD_EN_Disp(x+dx+8,y+dy,' ',forecolor,bkcolor); } else LCD_HZ_Disp(x+dx,y+dy,hzindex,forecolor,bkcolor); dx += 16; i++; if((x+dx) >= 128) { x = 0; dx = 0; dy += 16; } } } } /* void DispBMP(uchar disX,uchar disY,uchar *puts) //disX disY图像显示起点坐标 { unsigned int x=8; uchar i,j,w,h; w=puts[3]; h=puts[5]; Write_WDR(0x44,( 0x02+disX + ((unsigned int)((disX+1+w) << 8)))); Write_WDR(0x45,( 0x02+disY + ((unsigned int)((disY+1+h) << 8)))); Write_WDR(0x21,( 0x02+disX + ((unsigned int)((disY+2) << 8)))); Write_IR(0x22); for(i=0;i
本文档为【毕业设计(论文)-基于单片机的微型游戏机--贪吃的蛇】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_191127
暂无简介~
格式:doc
大小:183KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-10-15
浏览量:24