乒乓球实验报告.docx
- 文档编号:26524254
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:36
- 大小:411KB
乒乓球实验报告.docx
《乒乓球实验报告.docx》由会员分享,可在线阅读,更多相关《乒乓球实验报告.docx(36页珍藏版)》请在冰豆网上搜索。
乒乓球实验报告
东南大学
《乒乓球比赛》
微机课程设计实验报告
姓名:
王祎学号:
08008401
专业:
自动化实验室:
计算机硬件技术
实验时间:
2010年10月26日报告时间:
2010年10月28日
评定成绩:
审阅教师:
一、实验目的与内容……………………………………………………………2
二、总方案设计及原理…………………………………………………………3
(一)比赛规则………………………………………………………………3
(二)面板设计………………………………………………………………3
(三)方案流程图……………………………………………………………3
三、方案实现与测试……………………………………………………………5
(一)各模块硬件设计………………………………………………………5
(二)整体硬件连线图…………………………………………………………6
(三)系统框图………………………………………………………………7
(四)主程序设计……………………………………………………………7
(1)主程序流程图………………………………………………………7
(2)主要程序片段………………………………………………………9
(五)子程序设计……………………………………………………………11
(1)延时子程序………………………………………………………11
(2)屏幕显示子程序……………………………………………………12
(3)数码管扫描比分子程序………………………………………………13
(4)移动速度选择子程序………………………………………………16
(5)规定等待时间选择子程序……………………………………………17
四、程序设计中遇到的问题及解决方法………………………………………18
五、分析与总结…………………………………………………………………18
附录………………………………………………………………………………19
一.实验目的与内容
1)基本要求
用8个LED发光管(红黄绿)的来回滚动显示来模拟打乒乓球时乒乓球在两边球台上的来回运动。
比赛
双方用按钮/开关(双方各用1个按钮/开关)来模拟发球与接球,即发球方按动其控制的按钮/开关,球从
发球方一侧向另一方运动(LED发光管从发球方到对方逐个点亮,滚动显示),当球运动至接球方时,接球
方立即按动其控制的按钮/开关,“击球”使球“弹回”发球方一侧,如此周而复始,直至在规定的击球时间内有一方未能完成击球动作,从而对方得一分,然后继续比赛。
比赛规则可参照一般的乒乓球比赛规则。
要求:
(1)球以每0.5秒滚过1个LED的速度移动;
(2)回球需在球到达后的0.5秒内进行(按下按钮),否则按失球计;
(3)球未到达提前按下按钮按失球处理,不起回球作用;
(4)在PC机上显示比赛过程,同时用2个八段数码管显示比分(按10进制计数,初始值0:
0,可自行设计显示及规则,可简化为0-9,也可为0-99);
(5)要求精确计时。
2)设计提示
球到达接球方后,立即读接球方的按钮状态,若未按则有效(若已按下则按失球计),并开始0.5秒的计时,在这个0.5秒内不断读接球方按钮状态,直到按下代表“击球”动作。
3)进一步设计要求
(1)通过拨动开关控制球的移动速度,即可设置每个LED点亮时间(0.5秒、0.3秒、0.2秒);
(2)通过拨动开关控制允许击球的时间(0.3秒、0.2秒、0.1秒);
(3)用8×8点阵配合比赛过程,显示比分;
(4)用一个开关控制进入智能模式,智能模式要求:
球移动速度取决于击球时间,球移动速度(每个LED点亮时间)在0.2~0.5秒内可变,具体取决于球到达接球方后击球所花的时间0~0.5秒,如花费的时间短则回球后球移动速度快,反之回球后移动速度慢,如下表所示。
球移动速度与击球时间对应表
球到达至击球时间
0~0.2秒
0.2~0.3秒
0.3~0.4秒
0.4~0.5秒
球移动速度(灯点亮时间)
0.2秒
0.3秒
0.4秒
0.5秒
二.总方案设计及原理
(一)比赛规则
对题目进行理解和深化后,将乒乓球比赛的规则规定如下:
(1)使用两个开关K0、K7模拟左方和右方的发球和接球,拨向0表示不做任何动作,拨向1则表示接球和发球。
(2)球未到达提前将开关拨向1则按失球处理,不起回球作用。
(3)回球需在球到达后的规定时间内进行(按下按钮),否则按失球计。
接球的规定时间默认为0.5秒,但是可以通过相应开关K4/K5选择其它规定时间,如0.3秒、0.2秒和0.1秒。
(4)球的移动速度默认为0.5秒,但是可以通过相应开关K2/K3选择其它速度,如0.3秒、0.2秒。
(5)该比赛采取9分制,即先得到9分的选手获胜,即一场比赛结束。
(6)每次发球由上一次失分方执行(输方发球)。
(7)在PC机上显示比赛过程,同时用两个八段数码管显示比分。
(二)面板设计
实验方案的面板设计如下:
(三)方案流程图
三.方案实现与测试
(一)各模块硬件设计
通过分析,确定需要用到芯片8255监测开关状态、输出灯的动态流向和输出数码管的段选。
需要用到芯片8253精确计时。
需要芯片74LS273用于位选。
(1)8255
8255是实现并行输入输出功能的芯片,对于流水灯和数码管显示有很好的实现效果。
8255有三个口供选择,我将其设定为方式0,A、B口输出、C口输入,C口对应的PC0~PC7(除PC1、PC6外)分别与开关K0~K7(除K1、K6外)相对应,用于监测左方和右方的发球与接球、改变灯移动时间间隔和改变规定的等待时间。
A口对应的PA0~PA7与LED灯L0~L7相连接,通过A口并行输出控制灯的流动。
B口对应的PB0~PB7与八段数码管的a~h相对应,通过B口并行输出控制数码管断码的选择。
(2)8253
8253用于精确定时,由于用于定时器要定时到0.5秒、0.3秒、0.2秒和0.1秒,又由于最大初始值为65536,所以需要计数器通道0和1级联使用。
GATE0、GATE1都接5V高电平,CLK0输入接1MHZ脉冲信号,计数器通道0输出的OUT0与计数器通道1的输入CLK1相连接,最终的通道1的输出OUT1与8255的PC1口相连接,监测是否计数已满,计数器通道0采用计数方式3,计数器通道1采用计数方式2。
(3)74LS273
由于8255的口都被占用了,所以要使用74LS273对数码管的位选进行选择。
数码管的显示在比赛过程中一直显示,两个数码管的显示要用动态显示,即通过位选,使数码管一位一位地显示,由于显示的速度过快,则肉眼看到觉得两个数码管是一起亮的。
74LS273的输出Q1接位选的S0,输出Q2接位选的S1,而74LS273的输入接实验箱的D0、D1的数据输出。
但是不能一直对其进行位选,所以应该将数码管显示程序多放在整个程序当中,使得数码管看上去在整个比赛过程中一直亮着。
(二)整体硬件连线图
(三)系统框图
(四)主程序设计
(1)主程序流程图
(2)主要程序片段
、8255设置控制字
MOVDX,IO8255;给8255控制字
MOVAL,89H;方式0,A、B输出,C口输入
OUTDX,AL
、8255C口监测开关状态及计数器计数状态
A:
是否发球(右方):
BEGIN11:
CALLDISP;扫描比分
MOVDX,IO8255C;监视开关,是否开始;右边发球
INAL,DX
TESTAL,01H;右边是否开关已拨
JZBEGIN11;未拨,继续监测开关
B:
是否接球(左方):
MOVDX,IO8255C;先判断左边开关的状态;检测左边开关
INAL,DX
TESTAL,80H;1000000
JNZFAIL2;先按下,按失球计
;开始检测是否接到球
JMPJIXU1
JIXU1:
CALLWAITTIME;开始等待响应计时
JIEQIU2:
CALLDISP;扫描比分
MOVDX,IO8255C;左边接球
INAL,DX
TESTAL,80H;判断左边是否击到球
JNZJIDAO2;击到球,比赛继续
INAL,DX
TESTAL,02H
JNZJIEQIU2;一直循环,当0.5S完时,算失球
JMPFAIL2;跳转到失球程序
、8255A口并行输出(球的移动)
A:
发球后球的移动(从右到左):
MOVBL,01H;起始状态,最右边开始亮
MOVAL,BL
MOVDX,IO8255A;输出A口
OUTDX,AL;00000001
MOVCL,8;八次移动
BISAI1:
CALLDISP;扫描比分子程序
MOVDL,0FFH;判断是否有ESC键按下
MOVAH,06H
INT21H
CMPAL,27
JZEXIT1;有键按下,则退出
CALLDELAY;调用延时子程序
ROLBL,1;向左移动一次
MOVAL,BL
MOVDX,IO8255A;输出A口
OUTDX,AL
CALLDISP;调用扫描子程序
DECCL;每移动一次减一
CMPCL,1;判断是否在最左边
JNZBISAI1;若未完,继续
B:
接球后球的移动(从左到右):
MOVBL,40H;左边第二个马上亮;左边击到球
MOVDX,IO8255A
MOVAL,BL
OUTDX,AL
MOVCL,7;7次移动
JMPBISAI2;跳转到从左到右的流水灯的程序
C:
失球后灯要全灭(左失球后):
FAIL2:
CALLDISP;先显示一下以前的比分
MOVBL,00H;一次结束后灯全部熄灭
MOVAL,BL
MOVDX,IO8255A
OUTDX,AL
、显示字符串程序
例如:
MOVDX,OFFSETSTRING0;STRING0为字符串“比赛开始”
MOVAH,09H;显示信息“比赛开始”
INT21H
(五)子程序设计
(1)延时子程序
流程图
主要程序
DELAYPROCNEAR;延迟子程序
PUSHAX
PUSHDX
CALLLEDTIME;送初始值
JM:
CALLDISP;扫描比分
MOVDX,IO8255C;看计时状态
INAL,DX;右边第二个开关检测计时器是否满
TESTAL,02H
JNZJM;未满,继续监测
POPDX
POPAX
RET;开始移动
DELAYENDP
(2)屏幕显示子程序
流程图
主要程序
PCXSPROCNEAR;显示屏幕子程序
PUSHAX
PUSHDX
MOVDX,OFFSETSTRING10
MOVAH,09H;显示信息“现在比分”
INT21H
MOVAL,YF;比分转换,转换为对应的ASCII码
MOVAH,ZF
ADDAL,30H
ADDAH,30H
MOVYX,AL
MOVZX,AH
MOVDL,ZX;显示真实比分,左边得分
MOVAH,02H
INT21H
MOVDL,3AH;显示“:
”
MOVAH,02H
INT21H
MOVDL,YX;显示右方得分
MOVAH,02H
INT21H
POPDX
POPAX
RET
PCXSENDP
(3)数码管扫描比分子程序
流程图
主要程序
例如输出左边分数:
MOVDX,LS273
MOVAL,00H
OUTDX,AL;送全灭位选码
XORSI,SI
MOVSI,OFFSETLED
MOVBL,ZF;选择左边分数相对应的断码
MOVBH,00H
ADDSI,BX
MOVAL,BYTEPTR[SI]
MOVDX,IO8255B
OUTDX,AL;并行输出左边分数
MOVDX,LS273
MOVAL,02H;位选选择02H,使左边数码管亮
OUTDX,AL
如果要输出右边分数,则应选择右边分数相对应的断码,位选选择01H,使右边数码管亮。
(4)移动速度选择子程序
流程图
主要程序
通过K2/K3选择灯的移动速度,速度默认为0.5.,另可选择0.3/0.2:
MOVDX,IO8253C;给8253控制字
MOVAL,36H;计数器0先写低后写高,方式3,二进制
OUTDX,AL
MOVDX,IO8255C;读开关状态
INAL,DX
ANDAL,00001100B;开关2/3调节速度
CMPAL,04H;2/3=1/0
JNZNEXT1
MOVAX,600;速度0.3
JMPTIME
NEXT1:
CMPAL,08H;2/3=0/1
JNZNEXT2
MOVAX,400;速度0.2
JMPTIME
NEXT2:
MOVAX,1000;速度0.5
TIME:
MOVDX,IO8253A
OUTDX,AL;先写低字节
MOVAL,AH
OUTDX,AL;后写高字节
MOVDX,IO8253C
MOVAL,74H;方式2
OUTDX,AL
MOVAX,500;写入循环计数初值500
MOVDX,IO8253B
OUTDX,AL;先写低字节
MOVAL,AH
OUTDX,AL;后写高字节,开始计时
(5)规定等待时间选择子程序
流程图
主要程序
子程序中的其它部分与上面的移动速度子程序相同,规定等待时间默认为0.5,另可通过K4、K5选择速度0.3/0.2/0.1,不同的部分程序如下:
MOVDX,IO8255C;读开关状态
INAL,DX
ANDAL,00110000B;开关4/5调节等待响应时间
CMPAL,10H;5/4=0/1
JNZWAIT1
MOVAX,600;速度0.3
JMPWTIME
WAIT1:
CMPAL,20H;5/4=1/0
JNZWAIT2
MOVAX,400;速度0.2
JMPWTIME
WAIT2:
CMPAL,30H;5/4=1/1
JNZWAIT3
MOVAX,200;速度0.1
JMPWTIME
WAIT3:
MOVAX,1000速度0.5
四.程序设计中遇到的问题及解决方法
1、8255的A、B、C口都被占用,数码管的位选无法使用8255实现。
解决方法:
8255B口连接断码a~h,两个数码管要动态显示,需要使用74LS273进行位选,实现数码管显示。
2、在调试过程中发现只有右边的数码管亮,左边的不亮。
解决方法:
先检查硬件设备,没有问题。
再利用单步调试,发现程序也没有问题。
后来发现左边的数码管有亮,但是因为亮的时间不够,肉眼看到的就是不亮,而右边的之所以一直亮,是因为在退出数码管扫描显示子程序时,选中了位码S0,所以一直亮。
只需要将扫描子程序多多放在流水灯的主程序里面,多运行几次,肉眼看到数码管就都是亮的,就能解决这个问题。
3、发现主程序过长,从程序尾跳到程序头不能一步实现。
解决方法:
在程序中设置过渡跳转程序即可解决。
4、当接到球后,从左到右移动时,发现会有两个两个灯一起移动的情况。
解决方法:
单步调试时发现程序有问题。
赋给流水灯的值为60H,即01100000,应将赋的值为40H,即01000000,左边第二个灯亮。
5、当在主程序中有的地方加上数码管扫描比分子程序后,出现了流水灯不走的情况。
解决方法:
在单步调试中发现,这种情况都是发生在子程序加在JZ、JNZ等判断条件前一行的。
说明子程序是改变了标志寄存器中的一些标志位。
所以应将子程序的调用放在其它地方,不能放在判断条件的前一行。
五.分析与总结
1、具体实验分析见各部分的调试实验分析。
2、硬件是基础,做实验时要首先检查硬件设备是否可用,保证后续实验的可检测性。
3、在实验中应不要带电接线、插拔芯片;插拔接线时轻微转动,便于插拔。
4、在实验中学会使用示波器、万用表、逻辑笔观察、测量。
5、实验中出现问题时,要进行单步调试来发现问题。
6、在程序设计中,设计流程图是十分关键的,有了流程图后对软件设计有一定的指导方向。
附录:
程序代码
IOPORTEQU0EC00H-0280H;tpc卡中设备的io地址
IO8255AEQUIOPORT+288H;8255A口地址
IO8255BEQUIOPORT+289H;8255B口地址
IO8255CEQUIOPORT+28AH;8255C口地址
IO8255EQUIOPORT+28BH;8255控制寄存器端口地址
IO8253CEQUIOPORT+283H;8253控制寄存器地址
IO8253AEQUIOPORT+280H;计数器通道0地址
IO8253BEQUIOPORT+281H;计数器通道1地址
LS273EQUIOPORT+2A8H;273,位选地址
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DATASEGMENT
ZFDB00H;左边队员的比分
YFDB00H;右边队员的比分
ZXDB00H;左边队员比分显示
YXDB00H;右边队员比分显示
STRING0DB0DH,0AH,'competitonbegin:
',0DH,0AH,'$'
STRING1DB0DH,0AH,'rightfaqiu',0DH,0AH,'$'
STRING2DB0DH,0AH,'leftfaqiu',0DH,0AH,'$'
STRING3DB0DH,0AH,'rightgetready',0DH,0AH,'$'
STRING4DB0DH,0AH,'leftgetready',0DH,0AH,'$'
STRING5DB0DH,0AH,'rightgetgoal',0DH,0AH,'$'
STRING6DB0DH,0AH,'leftgetgoal',0DH,0AH,'$'
STRING7DB0DH,0AH,'rightwin!
',0DH,0AH,'$'
STRING8DB0DH,0AH,'leftwin!
',0DH,0AH,'$'
STRING9DB0DH,0AH,'gameover!
',0DH,0AH,'$'
STRING10DB0DH,0AH,'scoreleft:
right',0DH,0AH,'$'
LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;段码(分别为0,1,2,3,4,5,6,7,8,9)
DATAENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
STACKSSEGMENTSTACK
DB100DUP()
STACKSENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;右边的标志为1,左边为2,规则为输家发球,流水灯及接球发球功能,显示在PC上的游戏进程和比分
;开关2/3控制流水灯速度,默认速度是0.5,等待时间和由4/5控制,默认速度是0.5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACKS
START:
MOVAX,STACKS
MOVSS,AX
MOVAX,DATA
MOVDS,AX
MOVDX,IO8255;给8255控制字
MOVAL,89H;方式0,A、B输出,C口输入
OUTDX,AL
START1:
MOVDX,OFFSETSTRING0
MOVAH,09H;显示信息“比赛开始”
INT21H
BEGIN1:
MOVDX,OFFSETSTRING1
MOVAH,09H;显示信息“请右边队员发球”
INT21H
BEGIN11:
CALLDISP;扫描比分
MOVDX,IO8255C;监视开关,是否开始;右边发球
INAL,DX
TESTAL,01H;右边是否开关已拨
JZBEGIN11
MOVDX,OFFSETSTRING4
MOVAH,09H;显示信息“请左边队员接球”
INT21H
MOVBL,01H;起始状态,最右边开始亮
MOVAL,BL
MOVDX,IO8255A;输出A口
OUTDX,AL;00000001
MOVCL,8;八次移动
BISAI1:
CALLDISP;扫描比分
MOVDL,0FFH;判断是否有ESC键按下
MOVAH,06H
INT21H
CMPAL,27
JZEXIT1;有键按下,则退出
CALLDELAY;从右边到左边
ROLBL,1;向左移动一次
MOVAL,BL
MOVDX,IO8255A;输出A口
OUTDX,AL
CALLDISP
DECCL;每移动一次减一
CMPCL,1;判断是否在最左边
JNZBISAI1;若未完,继续
MOVDX,IO8255C;先判断左边开关的状态;检测左边开关
INAL,DX
TESTAL,80H;1000000
JNZFAIL2;先按下,按失球计
;开始检测是否接到球
JMPJIXU1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BEGIN4:
JMPBEGIN1;远程跳转
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
JIXU1:
CALLWAITTIME;开始等待响应计时
JIEQIU2:
CALLDISP;扫描比分
MOV
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 乒乓球 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)