目录

  • 1 学习情境一、媒体播放器
    • 1.1 项目背景和工作目标
    • 1.2 工作任务
    • 1.3 工作任务一:需求分析
    • 1.4 工作任务二:系统设计
    • 1.5 工作任务三:编码实现
    • 1.6 工作任务四:系统集成与测试
    • 1.7 工作任务五:项目总结
  • 2 学习情境二、Qt连连看游戏
    • 2.1 项目背景和工作目标
    • 2.2 工作任务
    • 2.3 工作任务一:需求分析
    • 2.4 工作任务二:系统设计
    • 2.5 工作任务三:编码实现
    • 2.6 工作任务四:系统集成与测试
    • 2.7 工作任务五:项目总结
  • 3 学习情境三、毕业电子相册
    • 3.1 项目背景和工作目标
    • 3.2 工作任务
    • 3.3 工作任务一:需求分析
    • 3.4 工作任务二:系统设计
    • 3.5 工作任务三:编码实现
    • 3.6 工作任务四:系统集成与测试
    • 3.7 工作任务五:项目总结
  • 4 第一章 单片机概述
    • 4.1 单片机简介
    • 4.2 单片机特点
    • 4.3 单片机应用领域
    • 4.4 单片机发展趋势
    • 4.5 MCS-51系列与AT89S5x系列单片机
    • 4.6 其他嵌入式处理器简介
  • 5 AT89S51单片机的片内硬件结构
    • 5.1 AT89S51单片机的硬件组成
    • 5.2 AT89S51单片机的引脚
    • 5.3 AT89S51的CPU
    • 5.4 AT89S51单片机存储器的结构
    • 5.5 AT89S51单片机的并行I/O端口
    • 5.6 时钟电路和时序
    • 5.7 复位操作和复位电路
    • 5.8 看门狗定时器的使用
  • 6 C51语言编程基础与KEIL uVision3开发平台
    • 6.1 C51编程语言概述
    • 6.2 C51语言程序设计基础
    • 6.3 C51语言的函数
    • 6.4 Keil uVision3环境下的C51语言程序开发
  • 7 虚拟仿真平台Porteus的使用(自学)
  • 8 单片机开关检测、键盘输入与显示接口设计
    • 8.1 单片机控制LED显示
    • 8.2 开关状态检测
    • 8.3 单片机控制LED数码管显示
  • 9 中断系统
    • 9.1 中断技术概述
    • 9.2 中断系统结构
    • 9.3 中断允许中断优先级的控制
    • 9.4 响应中断请求的条件
    • 9.5 外部中断响应时间
    • 9.6 外部中断触发方式选择
    • 9.7 中断请求的撤消
    • 9.8 中断函数
    • 9.9 中断系统应用举例
  • 10 定时/计数器
    • 10.1 定时/计数器结构
    • 10.2 定时计数器的4种工作方式
    • 10.3 对外部输入的计数信号的要求
    • 10.4 定时/计数器的编程和应用
  • 11 串行口的工作原理及应用
    • 11.1 串行口结构
    • 11.2 串行口的4种工作方式
    • 11.3 多机通信
    • 11.4 波特率的制定方法
    • 11.5 串行口应用设计实例
  • 12 单片机系统的扩展
    • 12.1 系统并行扩展技术
    • 12.2 外部数据存储器的并行扩展
    • 12.3 EEPROM存储器的并行扩展
  • 13 AT89S52单片机与DAC、ADC的接口
    • 13.1 单片机扩展DAC 概述
    • 13.2 单片机扩展并行8位DAC0832芯片的设计
    • 13.3 单片机扩展ADC概述
    • 13.4 单片机并行扩展8位A/D转换器ADC0809
  • 14 课程导学
    • 14.1 课程介绍
    • 14.2 课程对接职业技能证书标准
    • 14.3 实训过程演示
  • 15 基础性实验
    • 15.1 实验1 实验平台搭建
    • 15.2 实验2 设备状态指示灯的控制——LED灯的控制
    • 15.3 实验3 八路病房呼叫系统——数码管应用
    • 15.4 实验4 三相交流电故障检测系统——外部中断的应用
    • 15.5 实验5 模拟报警声控制——定时器的应用
    • 15.6 实验6 单片机双机通信——串口通信的应用
  • 16 综合性实验
    • 16.1 实验1 倒车警示器
    • 16.2 实验2 心形多路花样彩灯
    • 16.3 实验3 简易计算器
    • 16.4 实验4 多功能电子时钟
    • 16.5 实验5 自动化生产线产品计数打包系统
    • 16.6 实验6 简易数字电压表
    • 16.7 实验7 光控小夜灯
  • 17 创新性实验
    • 17.1 实验1 带倒计时功能的交通信号灯
    • 17.2 实验2 基于串口通信的LED点阵广告屏
    • 17.3 实验3 带温度显示的电子万年历
  • 18 考试题库
    • 18.1 电信5-8班 电信12班考试题库
    • 18.2 电信3、4班考试题库
工作任务一:需求分析


2.3工作任务一:需求分析

2.3.1任务描述

“连连看游戏”能给别人提供乐趣,也能给自己放松心情,又能乐在其中。通过项目的学习,既提高学员学习的兴趣,又在快乐中掌握程序设计的基础常识,并能编写需求分析报告,供软件设计人员的设计依据和用户的验收标准。

2.3.2任务目的

本任务的目的是对“连连看游戏”进行相应阐述,培养学生学习程序设计的兴趣,让学生感受到快乐学习,在快乐中掌握程序设计的相关常识。学会对“连连看游戏”进行需求分析,了解程序设计的方法和步骤,提高学生交流沟通协作的能力,培养学生解决问题、自我学习、信息处理、创能力。

2.3.3任务实现

通过开发人员与用户进行交流,填写用户需求调查表(如表1.1),综合分析,设计出的需求规格说明书。常见需求调查方式有:与用户交谈,向用户提问题;参观用户的工作流程,观察用户的操作;向用户群体发调查问卷;与同行、专家交谈,听取他们的意见;分析已经存在的同类软件产品,提取需求;从行业标准、规则中提取需求;从Internet上搜查相关资料。

                                                    
 

需求标题1

 

 

调查方式

 

 

调查人

 

 

调查对象

 

 

时间、地点

 

 

 

 

需求信息记录

   

 

 

1.1 用户需求调查表

1、功能需求

本次设计是在传统的连连看上设计实现对战的连连看,玩家通过达到一定的积分来获得继续闯关的机会,还有机会开启神秘的应藏关,以此来增加游戏的可玩性。

游戏的基本规则:程序随机产生任意成对的图片,当定点击开始游戏时,电脑根据时间参数随机生成固定的成对图片,游戏再次开始,玩家可通过鼠标上的左键,自由的点两张图片。如果点击两次时,两张图片相同,且满足程序的算法则这两张图片可消去。消去图片后,游戏可给玩家加分,若在规定的时间内,玩家没有消掉所有的图片则游戏失败。由于是闯关模式,达到一定分数的玩家可以继续挑战新的游戏,游戏的难度会相应增加,并且还增加了新玩法。具体的游戏功能如下:

游戏界面需求:设计良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏的背景取自网上中的图片,体现了游戏的挑战性。  

鼠标处理事件需求:通过点击主窗体中相应的按钮,可以实现游戏的开始、暂停、结束,通过点击选项设置中相应的按钮,可设置声音的大小及方向键↓的功能。显示需求:当两次点击的图片相同且满足算法可以消去,当达到一定分数的时候,游戏会进入下一关,并有障碍了。

游戏闯关设计需求:随着游戏的难度不同,玩法会发生改变,需要在游戏中设置障碍,蒙手游戏。如果玩家能到达并完成最后一关,则玩家挑战成功,游戏结束。

本次设计连连看主要是在原连连看对战的基础上设计挑战模式,具体的功能如下所述:

(1)             游戏运行界面简单美观,操作简单,运行稳定;

(2)             能够根据不同的等级模式播放不同的游戏背景音乐,包括操作方向键、消行时的声音,音量由玩家操作控制;

(3)             设计不同的游戏难度,当玩家达到一定的积分,可以进入相关难度的等级;

玩家可直接操作界面上的相关按钮来控制游戏的开始、暂停、设置、退出等功能。

2、非功能需求

(1)用户界面需求

本软件要求能够通过鼠标点击进行各项操作,应具备系统主菜单。

(2)软硬件环境需求

本次的开发环境所采用的操作系统为Linux操作系统的Ubuntu10.10版本,编程环境是基于Qt 4.7Qt creator版本,由于本游戏对硬件的要求不是很严格,所以硬件需求不做讨论。

软件环境:应安装有windows操作系统。

硬件环境:普通PC机。

3)产品质量需求

正确性:保证程序运行的正确性,数据记录准确勿误同时能够按照用户需求正确执行任务。

健壮性:软件设计保证软件本身能够抵御非法数据干扰,尽力避免程序运行异常并能对程序异常进行有效处理避免程序崩溃。

性能,效率:系统架构设计、算法设计合理。

可扩展性:系统架构设计应充分考虑功能的扩展,采用低耦合的分层结构对系统各职责部分进行切分,保证在添加其它功能的情况下无需变更系统架构降低需求变更成本。

2.3.4知识准备

1游戏简介

    游戏连连看顾名思义就是找出相关联的东西,这个连连看在网上基本是用在小游戏中,就是找出相同的两样东西,在一定的规则之内可以做为相关联处理。连连看的发展经历了从桌面游戏、在线游戏、社交游戏三个过程。

  游戏连连看是源自台湾的桌面小游戏,自从流入大陆以来风靡一时,也吸引众多程序员开发出多种版本的连连看。这其中,顾方编写的阿达连连看以其精良的制作广受好评,这也成为顾方阿达系列软件的核心产品。并于2004年,取得了国家版权局的计算机软件著作权登记证书。

  随着Flash应用的流行,网上出现了多种在线Flash版本连连看。如水晶连连看果蔬连连看等,流行的水晶连连看以华丽界面吸引了一大批的女性玩家。

2008年,随着社交网络的普及和开放平台的兴起,连连看被引入了社交网络。连连看与个人空间相结合,被快速的传播,成为一款热门的社交游戏,其中以开发者JoneveyManyou开放平台上推出的宠物连连看最为流行

2 选择开发语言

根据自己以前所学的关于C语言、C++Java、以及Qt的相关知识,并通过网上查找相关资料,了解到 CC++VBDelphiC#Java等均可以现劳拉方块游戏的设计。下面简单介绍下VBC++JavaQt各自的特点:

(1)VB的特点

全称Visual Basic,它是以Basic语言作为其基本语言的一种可视化编程工具。在中国乃至全世界都能看到它的身影,它曾是在中国最为流行的编程工具,到现在还占据着非常重要的地位,对于它的好坏大家都有一定的了解,VB作为一种较早出现的开发程序以其容易学习,开发效率较高,具有完善的帮助系统等优点曾影响了好几代编程人员,但是由于VB不具备跨平台这个特性,从而也决定了VB在未来的软件开发中将会逐渐地退出其历史舞台;它对组件技术的支持是基于COMActiveX,对于组件技术不断完善发展的今天,它也显出了它的落后性;同时VB在进行系统底层开发的时候也是相对复杂的,调用API函数需声明,调用不方便,不能进行DDK编程,不可能深入Ring0编程,不能嵌套汇编;而且面向对象的特性差;网络功能和数据库功能也没有非常突出的表现,综上所述,VB作为一种可视化的开发工具由于其本身的局限性,导致了它在未来软件开发中逐步被其他工具所代替。

 

2C++的特点

C/C++的哲学就不一样了,同一份程序代码,只要在该平台重新Compile成该平台的执行档,就能在该平台执行,若文字模式下的程序,的确可以跨平台,程序完全不需修改,但GUI盛行以后,由于各GUILibrary都不一样且没有标准,所以GUI程序并没办法跨平台Compile,因为各平台都有专属的Library。但是C/C++优势就是执行速度快,若能解决GUI Library的问题,则跨平台即可解决。

除了GUI Library需要统一外,还得看该Library设计的好不好才行,Linux GUI我没写过就不说了,若在Windows平台,BorlandC++Builder使用DelphiVCL LibraryMicrosoftVisual C++可以用MFC.NET Framework,首先来看BorlandC++Builder,它使用标准的ANSI C++语言开发,利用VCL写出来的程序也算蛮漂亮的,执行速度很快,比较麻烦的是C++Builder当初为了缩短上市时间,并没有设计自己的Library,而是藉用DelphiLibrary,导致C++ BuilderCompile时,是先用DelphiCompilerVCLcompileobject file后,再用C++ Builder将你写的C++程序compileobjectfile,最后再用Linker将所有的object file link起来,由于这都是IDE在做,对程序设计师似乎影响不大,但VCL由于是DelphiLibrary,所以若想深入研究VCLsourcecode时,则必须学DelphiPascal才行,否则看不懂VCL source code,这也是很多人对C++Builder却步的原因。

再来看MicrosoftVisualC++MFC用的是完整的ANSI C++语言,所以语言部分不是问题,但若你看过用MFC写的程序,你一定会惊讶为什么这么复杂,程序代码非常冗长不好看,且MFC是有名的难学,若 Visual C++搭配.NETFramrwork,则无法使用ANSI C++,得用其.NET平台版本的C++/CLI,相信这点很多人就有意见了,不过.NETFramework由于设计的不错,所以写出来的程序相当精简漂亮,感觉和C++ Builder差不多,不过无论是C++ BuilderVisualC++开发的GUI,所开发出来的程序都无法跨平台,当然也无法跨平台Compile

(3) Java的特点

Java具有安全性、可移植性、多线程机制以及跨平台的良好特性,但是由于本人对Java语言不是很熟悉,所以此方案也予以否决。

 

(4) Qt的特点

Qt拥有一个单一的Library,让你开发各种不同平台的程序,目前支持WindowsLinuxMacUNIXEmbeddedLinux,讲白话点,就是它提供了一个Library让你开发GUI程序,写好之后,只要在各平台重新Compile后,就可以在各平台执行,而且使用完整的ANSI C++语言,且不限Compiler,只要是C++Compiler都可以,重要的是,该Library相当漂亮,写出来的程序很像C++ Builder.NET Framework的那样精简,不会向MFC那样复杂。目前Qt已经到第四个版本,GUI部分算支持的相当完整,且支持数据库、XMLMulti-ThreadSocket等方面的programming。若以后台角度来说,无论后端是什么数据库,只要透过相同的Interface,不同数据库的Class来实做这个Interface,前端GUI的程序写法完全不用改变,同理,面对不同的OS,理论上只要透过相同的Interface,不同OSClass各自实做这个Interface,前端GUI的程序也完全不用改变,最后只要靠Compiler将程序compile成各平台的原生程序即可,这样即可保证其执行速度,不用再靠Virtual Machine。但很可惜这个理想,这么多年来都没人可以做出来,或许是我孤陋寡闻吧。Qt无疑是GUI终极解决方案,有强力的ANSI C/C++语言背书,又有单一的GUI Library,且精简漂亮,又能Compile成各平台的原生执行档,几乎是最完美的解决方案了。

(5) 方案的选择

经过以上比较好,考虑到Qt的众多良好特性,尤其是其跨平台性,加上自己最近正在学习Qt为了能够更进一步掌握Qt编程,因此决定使用Qt开发连连看游戏。

 

3 Qt关键技术的介绍

(1)可移植性:Qt是一个跨平台GUI工具箱,不仅适用于Unix,它同样适用于MSWindows如果开发平台是MS Windows,可能选择的GUI工具箱为MicrosoftFoundationClassesMFC),这样就会失去众多的 Unix用户。相反,如果开发平台是 Unix可能选择其它工具箱,如Motif等,同样会失去众多的Windows用户。如果选择的GUI工具箱为Qt则只要在不同的平台上简单的编译源代码,就可以使原程序在不同的平台上运行,从而解决丢失用户的问题。

Qt把在处理不同窗口系统时的潜在问题隐藏了起来。为使Qt使用方便,Qt包含了一系列类,这些类使开发人员避免了在文件处理、时间处理等方面存在的依赖操作系统方面的细节。

(2) 国际化:所谓国际化,通俗的讲,就是指在某国开发的软件可以方便的被其它国家的人使用Qt为本地化应用提供完全的支持,所有用户界面文本都可以基于消息翻译表被翻译成各国语言。另外Qt完全支持双字节16 bit国际字符标准。利用Qt开发跨平台的国际化软件是一个方便、增量的过程。在开发过程中,利用Qtlinguist界面工具就能方便的将开发的软件翻译成各国语言,从而实现软件的国际化。

(3) 面向对象:Qt是一个C++工具箱,它由几百个C++类构成。在程序设计中可以使用这些类,如果Qt没有提供真正适合需求的组件,则可以方便的修改现有的组件或者重新编写组件Qt具有模块设计和注重软件构件或元素的可重用性的特点。一个组件不需要知道它的内容,而通过Qt特有的signalslot机制与外界通信、交流。

使用Qt进行应用程序的开发,可以充分利用其面向对象和模块化的特征,从繁琐的编程中解脱出来,专注于应用程序本身的实现。

(4) 可用户化的外观:Qt支持主题,所以基于Qt的应用软件能在Motif外观、Windows外观,以及另一些用户化的外观之间互换,甚至改变运行时间。这些应用程序不管是在X Windows下还是在Microsoft Windows下都可以独立操作、运行。

(5) 独有的Signal Slot机制:Signal Slot机制是Qt最重要的特征。在MS Windows中,程序通过消息机制和事件循环来实现图形对象行为的触发和处理;在Qt中,程序在一个类中定义多个SignalSlotSignal就相当于“事件”,而Slot就相当于响应事件的“方法”。为了实现“事件驱动”,需要将一个类的Signal和另一个类的Slot连接起来(使用connect)。采用这种机制是一种安全可靠的方法,它允许回调。并支持对象之间在彼此不知道对方信息的情况下进行合作,这使Qt非常适合于真正的构件编程。

(6) 开发程序的方便性:Qt提供了一个可视化的开发工具Qt Designer,使用该工具就像在Windows中使用Visual C++那样可以直接向项目中添加各种组件,而不需要一步一步地编写代码,这个特点是其它非可视化编程工具望尘莫及的Qt Designer中包含全面的联机帮助文档,包括超文本方式的Qt Manualman帮助手册页和补充指南。这些帮助不论是对于初学者还是专业人士,都是非常方便的。

(7) 强大的功能:Qt的强大功能主要体现在以下几方面:拥有一套完整的组件,用户可以直接基于这些现成的组件开发出优秀的界面;拥有丰富的API函数,大概有250多个C++类;具有优越的绘画功能和2D/3D图形润色功能,Qt的绘画工具类Qpainter, 可以在任意一个绘画设备上润色图形,对于更高级的2D/3D图形可以结合使用OpenGLQt的组件,使用OpenGL就像用任意一个Qt组件一样方便,而且效果比纯粹使用OpenGL2D/3D图形更好;支持XML

(8)Qt类库大致可以分为三个部分:控件,框架和工具。

1控件:控件部分包括环境控件,主窗口控件,标准对话框, 基本的GUI控件,扩展GUI控件,GUI组织控件,以及帮助系统控件。

环境控件为应用程序提供全局服务的类,包括系统设定、国际化等。例如Qtranslator, Qapplication。主窗口类为应用程序提供界面框架,可以在上面添加菜单、工具条等,为应用程序提供集装箱的功能,如QMainWindow。标准对话框类是为打开/关闭文件,选择颜色等预先设计的标准对话框,如QColorDialog, QFileDialog。基本控件包括所有的GUI控件,如按钮、组合框等,如QPushButton。扩展的控件包括树状视图、进度条等, QListViewGUI组织类负责对各种控件进行组织以构成复杂的对话框, QGroupBox。帮助系统控件是为应用程序提供在线帮助的类,QStatusBar,QtoolTip

2)框架:框架部分包括的是一些抽象的类,通常不可见,如对象模型、抽象控件、绘图、拖放、控件外观。对象模型是框架的基础,如QObject。可见的控件一般从抽象控件派生,如QButton。绘图类控制绘图, QBrush。拖放类控制拖放操作,如QDragObject。控件外观类控制控件的外观如颜色、字体等。例如QColor

3)工具:工具部分包括时间日期和链表树等数据结构,它们和GUI无关。普通工具包括链表、堆栈、队列、树等常见数据结构,如QArray。图形处理工具控制图像的编码/解码算法。如QImageIOI/O控制工具处理I/O的一些类,如QFile。时间和日期工具类处理时间和日期,Qdate, Qtime。另外还有其他杂类如Qsignal, QIconSet等。

(9) Qt对象通讯机制

对象间通讯是面向对象程序设计的一个极其重要的内容,类似于MicrosoftMFC的消息映射和事件循环Qt的对象间通讯采用的是信号—槽(signal—slot)机制,信号就好像是事件,而槽则是响应事件的方法。如果需要实现对象间的通讯,只需要把一个对象的信号和另外一个对象的槽使用连接(connect)起来。

信号—槽机制说明:

Qt下对象间的通讯用信号—槽机制来实现。信号—槽机制是Qt的一个中心特征并且也是它与其它图形工具包的最不相同的部分。图2-1直观地表示了这种机制是如何工作的。

图2-1  信号与槽的连接原理图

在图形用户界面编程中,经常希望一个窗口部件的一个变化被通知给另一个窗口部件。更一般地,希望任何一类对象可以和其它对象进行通讯。例如,如果正在解析一个XML文件,当遇到一个新的标签时,也许要通知列表视图正在用来表达XML文件的结构。较老的工具包是使用一种被称作回调的通讯方式来实现同一目的。回调是指一个函数的指针,所以如果希望一个处理函数通知一些事件,可以把另一个函数(回调)的指针传递给处理函数,处理函数在适当的时候调用回调函数。回调有两个主要缺点:首先他们不是类型安全的,从来都不能确定处理函数使用了正确的参数来调用回调;其次回调和处理函数是非常强有力地联系在一起的,因为处理函数必须知道要调用哪个回调。

Qt中有一种可以替代回调的技术:使用信号和槽。当一个特定事件发生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号,但是总是可以通过继承来加入自己定义的信号。槽就是一个可以被调用处理特定信号的函数。Qt的窗口部件有很多预定义的槽,通常也可以加入自己的槽,这样就可以处理感兴趣的信号了。

信号—槽机制是类型安全的:一个信号的签名必须与它的接收槽的签名相匹配。实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名。因为签名是一致的,编译器就可以帮助检测类型是否匹配。信号和槽是宽松地联系在一起的:一个发射信号的类不用知道哪个槽要接收这个信号。Qt的信号和槽的机制可以保证如果把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型安全的,不会再有回调核心转储。

QObject类或者它的一个子类(比如QWidget类)继承的所有类都可以包含信号槽。当对象的状态发生改变的时候,信号被发送给其它对象,从而实现了该对象与其它对象的通信。对象在发射信号时,无须知道有没有槽接收它所发射的信号,而槽是正常的成员函数,一个槽不知道它是否被任何信号连接,这就是信息封装,这种封装确保了对象可以用作一个软件组件。此外,使用对象时也无须知道这种通讯机制的实现细节。在信号—槽机制实现的过程中,可以把许多信号和单一槽相连,也可以把一个信号和许多槽相连。把一个信号和另一个信号直接相连也是可以的。(这时,只要第一个信号被发射时,第二个信号立刻就被发射)。总体来看,信号和槽构成了一个强有力的组件编程机制。