单片机设计兵乓球游戏模拟器设计.docx

上传人:b****5 文档编号:7254541 上传时间:2023-01-22 格式:DOCX 页数:21 大小:461.94KB
下载 相关 举报
单片机设计兵乓球游戏模拟器设计.docx_第1页
第1页 / 共21页
单片机设计兵乓球游戏模拟器设计.docx_第2页
第2页 / 共21页
单片机设计兵乓球游戏模拟器设计.docx_第3页
第3页 / 共21页
单片机设计兵乓球游戏模拟器设计.docx_第4页
第4页 / 共21页
单片机设计兵乓球游戏模拟器设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

单片机设计兵乓球游戏模拟器设计.docx

《单片机设计兵乓球游戏模拟器设计.docx》由会员分享,可在线阅读,更多相关《单片机设计兵乓球游戏模拟器设计.docx(21页珍藏版)》请在冰豆网上搜索。

单片机设计兵乓球游戏模拟器设计.docx

单片机设计兵乓球游戏模拟器设计

单片机课程设计

 

 

时间:

2009年6月3日

摘要

以AEDK5196ET实验系统为平台,藉由51单片机与可编程接口芯片8279,利用单片机中的定时器、I/O接口系统及数码管显示电路,设计一个具有一定功能的乒乓球游戏模拟器,可以在仿真环境下模拟单轨道的乒乓球比赛。

设计的电路采用P1口模拟球的移动,用8个LED灯反映。

主要实现了比赛中的左右击球、比分的调节和清零等功能;并在基本要求基础上,引入“击球失误”情况判断,进一步完善了该游戏模拟器。

出于操作方便考虑,模拟器以开关量K1~k8电平状态的改变作为信号输入。

K1和K8分别对应乒乓球的右击、左击,K2实现所有比分清零,K3、K4和K6、K7用于双方局数或每局比分的调节。

赛制设定为每局11分制、三局两胜制,并增设了“胜利”判定功能。

关键字:

单轨道乒乓球游戏8279芯片开关电平量数码管显示

 

目录

一、实验目的1

二、实验器材1

三、实验基本步骤1

四、系统主要功能1

五、硬件电路设计及描述2

1.硬件设计描述2

2.硬件连线3

六、实验控制原理4

七、实验设计程序9

八、效果分析及有待改进之处15

九、实验心得体会15

参考文献:

16

 

一、实验目的

结合自己所学,在单片机系统箱上设计一个具有一定功能的单轨道乒乓球游戏模拟器。

通过该实验,从日常接触的游戏机设计入手,进一步了解单片机系统的基本组成与使用方法,切身体会到单片机设计的基本流程,提高自身解决实际问题的能力。

同时,在实践中检验所学理论的疏漏与不足,做到查漏补缺、学以致用。

本实验重点培养学生对单片机的定时器设置、I/O接口电路和可编程芯片8279管理显示数码管的能力。

二、实验器材

AEDK5196ET实验系统

三、实验基本步骤

(1)熟悉AEDK5196ET实验系统,了解各模块的布局,及各接口芯片硬件电路。

(2)完成实验指导书上的基础实验和创新部分,掌握试验系统的基础应用。

(3)选定设计题目,即乒乓球游戏模拟器设计。

(4)根据实验要求,采用P1口模拟球的移动,选取8279及数码管完成比分的

显示,并拟定了诸如比分清零、调节等扩展功能部分。

(5)完成硬件的连线与程序的设计工作。

经反复调试,最终圆满实现了所有的

实验设计效果,达到了实验目的。

四、系统主要功能

所设计的游戏模拟器,可在仿真环境下进行模拟乒乓球比赛,实现以下功能:

1.基本功能

(1)采用两个开关K1、K8作为击球键。

为便于操作,以开关量的电平改变作为

输入信号,分别实现乒乓球的左击和右击。

(2)采用P1口模拟球的移动,并在LED反映乒乓球的运动状态。

(3)按乒乓球游戏规则设计打球的基本过程模拟。

基本规则为:

每局采用采用

11分制、三局两胜制,在各数码管上反映双方比分。

每当一方得分后,采用一球轮换制发球,由对方选手开始发球。

若球移至最边上一个LED后,对应的选手还在1s仍内未击回,即判定另一方选手得分。

2.提高功能

所有提高功能均依赖于开关量K,以其电平的改变作为触发信号。

(1)加设“失误”判断模式,即一方发球,在球还未到对方近前时,若对方提

前击球,则认为其击球失误,判负。

(2)所有比分清零。

等待发球时,拨动K2,可实现双方局数、每局分数的清零。

(3)比分调节。

等待发球时,拨动K3、K4可实现双方局数比分的自增调节,拨

动K6、K7可实现双方每局比分的自增调节。

五、硬件电路设计及描述

1.硬件设计描述

AEDK5196ET实验系统

芯片:

8279,74LS138,74LS244,74LS240,数码管

实验系统内部连接块如下:

(1)8279键盘显示

图18279键盘显示电路

(2)138译码电路

图2138译码电路

空间地址8000-87FFH,由D274LS138分成8个片选信号,

其中:

Y0:

8000HY1:

8100HY2:

8200HY3:

8300HY4:

8400HY5:

8500HY6:

8600Y7:

8700H

(3)单片机I/O线

图3单片机I/O线

(4)开关量输入

图4开关量输入电路

开关向上拨至H端,输出孔为"1";开关向下拨至L端,输出孔为"0"。

(5)简单并行口输入

图5简单并行口输入电路

(6)单色LED灯

图6单色LED灯电路

2.硬件连线:

(参见图7)

(1)开关量输入K1~K8接74LS244的输入端PI0~PI7。

(2)74LS244设备选择端“CS*”接编号为8000H的译码器输出端。

(3)输出端P1.0~P1.7接发光二极管驱动器74LS240的输入端DL1~DL8,其

输出控制发光二极管的显示。

(4)有关8279芯片实验系统箱内已经布好线,不用再另行连接(参见图1)。

图7输入输出口的硬件连线

六、实验控制原理

1.概述

有8支连续排列的发光二极管,依次点亮其代表乒乓球的移动。

开关量K1、K8模拟两个球拍,拨动K1、K8(电平变化)代表球拍击球。

拨动“左拍”(K1)可使发光LED从左向右依次点亮,如同乒乓球从左向右飞来,拨动“右拍”(K8)则可以使LED从右向左以此点亮,代表乒乓球从右向左运动。

本游戏共两人玩耍。

以一方“拨动”(发球)开始,这时“乒乓球”就向对方运动。

如发球方为甲方,接球方为乙方,甲方先发球,乙方必须在乒乓球到达终点时刻接球。

如接球时机合适,把球击回,双方都不得分,接着甲方准备接球。

如果乙方在球未到达前挥拍(过早击球),或在球到达后仍不接球(超时击球),则视为击球失误,此时甲方得分。

根据一球轮换制,此后等待乙方发球。

在比赛过程中,用数码管显示双方比分。

2.具体实现方法说明

(1)采用P1口输出,用LED模拟乒乓球的运动。

游戏中“乒乓球”移动速度是固定的,假定每秒移动1位(发光LED)。

(2)在“乒乓球”移动一次的过程中,进行50次测量(即每20us一次),查询击球方是否有击球动作;

(3)发球采用一球轮换制,比分采用11分制,三局两胜制。

倘任意一方胜利局数到达2,比赛结束。

此时清空所有显示数码管,只显示胜利方对应的局数比分“02”以示其胜利。

(4)接球方的击球动作应发生在“乒乓球”到达本方最后一位发光二极管(即点亮)1秒钟时间之内。

如接球方在此1秒钟之内拨动开关,则击球成功,“乒乓球”转为相反方向运动。

此后,原发球方变为接球方,接球方变为发球方,游戏继续进行。

(5)如接球方过早或超时击球,则接球方失误,发球方得分。

此时“乒乓球”熄灭,数码管显示器显示出双方比分。

根据一球轮换制,双方换发球。

3.开关功能说明

出于操作方便的考虑,设计中使用开关时一律以其电平的变化作为触发信号。

只需拨动相应开关就可实现其对应功能。

开关量输入电路可参见图4,而各开关量的对应功能详见表1。

说明

开关量

代表含义

附加说明

K1

左击球

乒乓球左移

K2

清比分

实现双方局数、每局分数的清零

K3

左方局数修改

实现左方局数比分的自增修改

K4

左方局数修改

实现右方局数比分的自增修改

K5

K6

左方每局分数修改

实现左方每局分数的自增修改

K7

右方每局分数修改

实现右方每局分数的自增修改

K8

右击球

乒乓球右移

表1开关量功能

4.数码管显示内容说明

数码管显示位置参见图8,各数码管对应的内容见表2。

图8数码管显示位置

说明

数码管

显示内容

8号、7号

左方胜利局数

6号、5号

右方胜利局数

4号、3号

左方每局分数

2号、1号

右方每局分数

表2数码管显示内容

5.设计流程图

(1)程序总体流程:

(2)右移程序流程:

对于左移程序,其功能与右移程序一样,只不过是把“乒乓球”的右移变左移,把判断右拍击球改为判断左拍击球。

因此,左移程序只需稍作修改即可得到。

(3)左方每局分数(自增)调节流程:

(4)显示子程序流程:

(5)20MS延时子程序流程

(6)左方胜利子程序流程

七、实验设计程序

S8279EQU0FF82H;8279状态口地址

D8279EQU0FF80H;8279数据口地址

KEYLEDEQU00H;键盘/显示命令字

;8字符显示,左入口,编码键盘扫描,双键互锁

LEDCLREQU0C1H;清显示RAM控制字

CLKTEQU2FH;扫描速率设置

LEDWREQU70H;写显示RAM控制字

TEMP1EQU30H;暂存A中数据(开关状态K0到K7)

TEMP2EQU31H;暂存球速N值(20MS*N)

KINEQU8000H

DTIME1EQU32H

DTIME2EQU33H;设置DELAY20MS中的延时系数

;------------------------------------------------------------

ORG0000H

AJMPSTART

ORG0100H

START:

SETDATA:

MOVSP,#60H

MOVDPTR,#S8279

MOVA,#KEYLED

MOVX@DPTR,A;设置8279的LED/键盘工作方式

MOVA,#CLKT

MOVX@DPTR,A;设8279分频速率

MOVA,#LEDCLR

MOVX@DPTR,A;清显示RAM

WAIT1:

MOVXA,@DPTR

JBACC.7,WAIT1;等待清除完毕

MOVR3,#00H;左方每局分数初始化

MOVR4,#00H;右方每局分数初始化

MOVR5,#00H;左方局数初始化

MOVR6,#00H;右方局数初始化

MOVR7,#00H;移位计数器初始化

ACALLDSHOW;调用显示子程序

;-------键盘及其相关-----------------------------------

GETKEY:

MOVDPTR,#KIN;指向K0到K7口读结果

MOVXA,@DPTR

MOVTEMP1,A;将A值放入TEMP1暂存

GETKEY1:

MOVXA,@DPTR

XRLA,TEMP1

JBACC.1,TORESET;P1.1改变,转入初始化程序(全部清零)

JBACC.2,SETMCH_L;左局数自加

JBACC.3,SETMCH_R;右局数自加

JBACC.5,SETPT_L;左每局分数自加

JBACC.6,SETPT_R;右每局分数自加

JBACC.0,TOPLAR;P1.0改变,转入右移程序(左拍击球)

JBACC.7,TOPLAL;P1.0改变,转入右移程序(右拍击球)

SJMPGETKEY1

TOPLAR:

AJMPPLAR

TOPLAL:

AJMPPLAL

;--------清零复位------------------------

TORESET:

MOVR3,#00H

MOVR4,#00H

MOVR5,#00H

MOVR6,#00H

ACALLDSHOW

SJMPGETKEY

;---------------------------------------

SETMCH_L:

INCR5;左局数自加

CJNER5,#02H,SETMCH_L1

MOVR5,#00H

SETMCH_L1:

CLRC

ACALLDSHOW

SJMPGETKEY

;---------------------------------------

SETMCH_R:

INCR6;右局数自加

CJNER6,#02H,SETMCH_R1

MOVR6,#00H

SETMCH_R1:

CLRC

ACALLDSHOW

SJMPGETKEY

;---------------------------------------

SETPT_L:

INCR3;左每局分数自加

CJNER3,#0BH,SETPT_L1

MOVR3,#00H

SETPT_L1:

CLRC

ACALLDSHOW

SJMPGETKEY

;---------------------------------------

SETPT_R:

INCR4;右每局分数自加

CJNER4,#0BH,SETPT_R1

MOVR4,#00H

SETPT_R1:

CLRC

ACALLDSHOW

SJMPGETKEY

;--------右移(左拍击球)------------------------

PLAR:

MOVDPTR,#KIN

MOVXA,@DPTR

MOVTEMP1,A;将A值放入TEMP1暂存

SETBC;再进位设置乒乓球

MOVR7,#08H;设移位次数

CLRA;清楚A中数据,以便乒乓球移动

PLAR1:

RLCA;带进位循环(DL1<--DL8)

MOVP1,A;输出乒乓球状态

DJNZR7,PLAR_CON;移完否,未完至PLAR_CON

AJMPPLAR_FIN;移完至PLAR_FIN

PLAR_CON:

MOVTEMP2,#32H;1S延时常数

PLAR_CON1:

ACALLDELAY20MS;调用20MS延时子程序

PUSHACC

MOVXA,@DPTR

XRLA,TEMP1;将现在K0到K7状态与TEMP1中相较(下同)

JBACC.7,PLAR_ADDS;过早击球(失误),至PLAR_ADDS;否则顺序执行

POPACC

DJNZTEMP2,PLAR_CON1;1S延时未到,继续循环

AJMPPLAR1;1S延时已到,球移位

PLAR_FIN:

MOVTEMP2,#32H;重置1S延时常数

PLAR_FIN1:

ACALLDELAY20MS;调用20MS延时子程序

PUSHACC

MOVXA,@DPTR

XRLA,TEMP1

JBACC.7,PLAL;若有击球(PI.7改变),转PLAL;否则顺序执行

POPACC

DJNZTEMP2,PLAR_FIN1;1S延时未到,继续循环

PLAR_ADDS:

INCR3;左分数加1

CJNER3,#0BH,NEXT1;左满11分,局数加1,分数清零

MOVR3,#00H

MOVR4,#00H

INCR5

CJNER5,#02H,NEXT1

AJMPWIN_L;3局2胜,左方获胜

NEXT1:

ACALLDSHOW;显示新分数

AJMPGETKEY;重新发球,发球权由个人手动确定

;------------左移(右拍击球)--------------------------------------

PLAL:

MOVDPTR,#KIN

MOVXA,@DPTR

MOVTEMP1,A;将A值放入TEMP1暂存

SETBC;再进位设置乒乓球

MOVR7,#08H;设移位次数

CLRA

PLAL1:

RRCA;带进位循环(DL1-->DL8)

MOVP1,A;输出乒乓球状态

DJNZR7,PLAL_CON;移完否,未完至PLAL_CON

AJMPPLAL_FIN;移完至PLAL_FIN

PLAL_CON:

MOVTEMP2,#32H;1S延时常数

PLAL_CON1:

ACALLDELAY20MS;调用20MS延时子程序

PUSHACC

MOVXA,@DPTR

XRLA,TEMP1

JBACC.0,PLAL_ADDS;过早击球(失误),至PLAl_ADDS;否则顺序执行

POPACC

DJNZTEMP2,PLAL_CON1;1S延时未到,继续循环

AJMPPLAL1;1S延时已到,球移位

PLAL_FIN:

MOVTEMP2,#32H;重置1S延时常数

PLAL_FIN1:

ACALLDELAY20MS

PUSHACC

MOVXA,@DPTR

XRLA,TEMP1

JBACC.0,PLAR;若有击球(PI.0改变),转PLAL;否则顺序执行

POPACC

DJNZTEMP2,PLAL_FIN1;1S延时未到,继续循环

PLAL_ADDS:

INCR4;右分数加1

CJNER4,#0BH,NEXT2;右满11分,局数加1,分数清零

MOVR3,#00H

MOVR4,#00H

INCR6

CJNER6,#02H,NEXT2

AJMPWIN_R;3局2胜,右方获胜

NEXT2:

ACALLDSHOW;显示新分数

AJMPGETKEY;重新发球,发球权由个人手动确定

;---------------左方胜利--------------------------------------

WIN_L:

MOVDPTR,#S8279

MOVA,#LEDCLR

MOVX@DPTR,A;显示RAM清除

WAIT2:

MOVXA,@DPTR

JBACC.7,WAIT2

MOVA,#76H

MOVX@DPTR,A

MOVDPTR,#D8279

MOVA,#5BH

MOVX@DPTR,A

MOVA,#3FH

MOVX@DPTR,A

AJMPEXIT

;---------------右方胜利--------------------------------------

WIN_R:

MOVDPTR,#S8279

MOVA,#LEDCLR

MOVX@DPTR,A;显示RAM清除

WAIT3:

MOVXA,@DPTR

JBACC.7,WAIT3

MOVA,#74H

MOVX@DPTR,A

MOVDPTR,#D8279

MOVA,#5BH

MOVX@DPTR,A

MOVA,#3FH

MOVX@DPTR,A

AJMPEXIT

;--------------延时子程序--------------------------------------

DELAY20MS:

MOVDTIME1,#24H

LOOP:

MOVDTIME2,#0FFH

DJNZDTIME2,$

DJNZDTIME1,LOOP

RET

;-------------显示子程序---------------------------------------

DSHOW:

MOVA,#LEDWR

MOVDPTR,#S8279

MOVX@DPTR,A;置写显示RAM命令字

MOVDPTR,#D8279

MOVA,R4;右方分数

ACALLEXCHANGE

MOVA,R3;左方分数

ACALLEXCHANGE

MOVA,R6;右方局数

ACALLEXCHANGE

MOVA,R5;左方局数

ACALLEXCHANGE

RET

EXCHANGE:

CLRC

DAA;将A中数据转为十进制BCD码显示

MOVR2,A;将A中数据置于R2中暂存

ANLA,#0FH;屏蔽高4位,取低4位

PUSHDPL

PUSHDPH

MOVDPTR,#SEG

MOVCA,@A+DPTR;查显示码

POPDPH

POPDPL

MOVX@DPTR,A;输出低位

MOVA,R2;取值

ANLA,#0F0H;屏蔽低4位,取高4位

SWAPA;交换高低4位

PUSHDPL

PUSHDPH

MOVDPTR,#SEG

MOVCA,@A+DPTR;查显示码

POPDPH

POPDPL

MOVX@DPTR,A;输出高位

RET

SEG:

DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;显示码

;0123456789

;-------------------------------------------------------

EXIT:

AJMPGETKEY

END

 

八、效果分析及有待改进之处

实现中,使用LED对单轨道乒乓球游戏进行模拟,实验效果较为良好,并未出现仪器方面的问题。

设计中尽量多的考虑到了游戏的实际情况,如过早击球等情况,并增设了比分清零、调节等辅助功能,使设计系统的实用性能大大提高。

另外,开关量的电平触发也起到了较好的效果。

通过与类似设计相较,发现本设计的操作具有明显的优越性。

设计尚存在以下有待改进之处。

第一,发现有些开关量存在接触不良的状况,对操作造成了一些影响。

其次,本实验限定了球速,这一点上过于简化。

第三,对于发球轮换制的要求,是由选手自身约定的,缺少程序上的支持。

针对以上问题,提出一些改进的方法。

首先,针对开关松动问题,可在代码段中加入消抖动子程序(软件),或改用8279键盘作为输入设备(硬件)。

其次,对于球速,在程序设计中可增设一组击球开关,以对应不同的延时常数TEMP2,如此可以实现每一击都有不同的球速。

最后,针对轮换发球的限制,可在GETKEY代码段添加约束,自动阻止连续发球现象。

设计中多采用查询的方式,增加了CPU的处理时间,可以将部分检验改成中断处触发形式,以提高CPU的运行效率。

 

九、实验心得体会

亲身经历了这门课程的实验设计,使我真正感受到单品机技术在各行各业中的广泛应用。

同时,也使我体会到:

要开发单片机的应用,不但要掌握单片机硬件和软件方面的知识,而且还要有继而不舍的钻研精神,要善于学习新的知识,只有将这两方面的知识融会贯通和有机结合,才能设计出优良的应用系统。

实验开始时,由于缺乏动手能力,加之对8279键盘显示功能的不了解,我的设计曾一度停滞不前。

但是,通过大量查找、阅读相关资料,和同学们积极讨论,并经常寻求老师的指导,终于使自己的设计思路愈发清晰、明朗,最终达到了要求的实验效果。

经过四星期时间的不断摸索和一些基础实验的设计操作,使我对单片机系统有了更加深刻的了解,同时也大大提高了我的动手实践能力,培养了浓厚的科研兴趣,使我在学习的过程中获益匪浅。

虽然实验时间只有短短四周,但我更觉得它十分珍贵。

在这段时间里,我真正将所学和所用结合了起来,做到学以致用,由衷的感到获益匪浅。

 

参考文献:

[1]茹国宝.刘克刚,《单片机原理与应用实验指导书》,武汉大学电子信息学院

[2]李朝青.《单片机原理与接口技术》.北京航空航天大学出版社,1998

[3]张红润,易涛,《单片机应用技术教程》(第二版),清华大学出版社,2003

[4]于殿泓,王新年,《单片机原理与程序实验设计教程》,西安电子科技大学出版社,,2007

[5]徐爱钧,《8051单片机实践教程》, 电子工业出版社, 2005

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1