乒乓球游戏机doc.docx
《乒乓球游戏机doc.docx》由会员分享,可在线阅读,更多相关《乒乓球游戏机doc.docx(24页珍藏版)》请在冰豆网上搜索。
乒乓球游戏机doc
学校代码:
10128
单片机工程实践
(第二组)
题目:
乒乓球游戏机
设计时间:
2011年3月7日~2011年3月18日
一、设计目的:
通过设计乒乓球游戏机的综合实验掌握单片机编程的基本思想,以及蜂鸣器,LED,键盘,中断、定时程序的基本编写方法。
二、设计任务:
1、用5个LED显示器作为乒乓球台,用LED显示器的中间横线“一”代表乒乓球
2、用两个按键代表球拍。
3、比赛规则:
当“一”到了最左侧LED时,左侧要及时击球,右侧同理。
4、输赢判断:
当乒乓球到达某一侧时,若提前或滞后按键(击球),则为输,用声音和显示来表示。
5、球速要随着比赛回合的增加而加快,击球判断时间逐渐减小。
6、可以显示比分。
任务分工:
共同完成蜂鸣器自检,黄伟钦主要负责键盘自检,张娅鑫主要负责数码管自检。
主程序中黄伟钦负责采键部分,张娅鑫负责击球过程编辑,向睿负责球运动过程的编写和主程序的调试。
三、框图(包括自检和任务的框图):
1、硬件编程框图及相关说明
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
LED =LightEmittingDiode,发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光。
键盘是指经过系统安排操作一台机器或设备的一组键,主要的功能是输入资料。
74LS138为3线-8线译码器,共有54/74S138和54/74LS138两种线路结构型式。
其工作原理如下:
①当一个选通端(E1)为高电平,另两个选通端(E2)和/(E3))为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。
比如:
A0A1A2=110时,则Y6输出端输出低电平信号。
②利用E1、E2和E3可级联扩展成24线译码器;若外接一个反相器还可级联扩展成32线译码器。
③若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。
AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
ULN2803是8个输入端,GND为接地端,VCC为电压输入端。
74HC245可以用于缓冲输入,三个状态的输入/输出,输出电平与TTL相容,具有大电流的三态输入,可直接驱动总线活最多驱动15个LSTTL负载。
2、主程序框图、子程序框图及相关说明
四、程序清单:
蜂鸣器自检:
LOOP:
MOVR7,#0C8H
MOVR6,#0C8H
MOVR5,#032H
LOOP0:
clrP2.3
LCALLDELAY
SETBP2.3
LCALLDELAY
DJNZR7,LOOP0
lab:
clrp2.3
LCALLDELAY1
SETBP2.3
LCALLDELAY1
DJNZR6,lab
lab1:
clrp2.3
LCALLDELAY2
SETBP2.3
LCALLDELAY2
DJNZR6,lab1
LJMPLOOP
DELAY:
MOVR0,#014H
LOOP1:
MOVR1,#0F8H
LOOP2:
DJNZR1,LOOP2
DJNZR0,LOOP1
RET
DELAY1:
MOVR0,#0AH
LOOP3:
MOVR1,#0F8H
LOOP4:
DJNZR1,LOOP4
DJNZR0,LOOP3
RET
DELAY2:
MOVR0,#028H
LOOP5:
MOVR1,#0F8H
LOOP6:
DJNZR1,LOOP6
DJNZR0,LOOP5
RET
;/**/
键盘自检:
ORG0000H
LJMPmain
main:
MOVP0,#0
LCALLSEL8
MOVP1,#0FFH
MOVA,P1
ORLA,#0F0H
cjneA,#0FFH,loop1
ljmpmain
loop1:
LCALLDELAY
cjneA,#0FFH,loop2
ljmpmain
loop2:
clrp2.5
clrp2.6
clrp2.7
movr0,#06h
movp0,r0
LCALLDELAY
;wait2:
JNBP1.0,wait2
SETBP2.3
LCALLSEL7
ljmpmain
RET
SEL7:
CLRP2.7
SETBP2.6
SETBP2.5
RET
SEL8:
SETBP2.7
SETBP2.6
SETBP2.5
RET
DELAY:
MOVR7,#01EH;延时15ms
del0:
MOVR6,#0F8H
del1:
DJNZR6,del1
DJNZR7,del0
RET
数码管自检:
org0000h
mov20h,#07eh;o-F段代码(数码管共阴,自测段代码)
mov21h,#0ch
mov22h,#0b6h
mov23h,#09eh
mov24h,#0cch
mov25h,#0dah
mov26h,#0fah
mov27h,#0eh
mov28h,#0feh
mov29h,#0deh
mov2ah,#0eeh
mov2bh,#0ffh
mov2ch,#072h
mov2dh,#07fh
mov2eh,#0f2h
mov2fh,#0e2h
start:
lcallplay1
ljmpstart
play1:
movr0,#20h;把20放到r0
movr1,#10h;控制循环次数
loop1:
movp0,@r0
lcallsel5;选中第一位数码管
lcalldelay
lcalldelay
lcalldelay
incr0
djnzr1,loop1
movr0,#20h
movr1,#10h
loop2:
movp0,@r0
lcallsel4;选中第二位数码管
lcalldelay
lcalldelay
lcalldelay
incr0
djnzr1,loop2
movr0,#20h
movr1,#10h
loop3:
movp0,@r0
lcallsel3;选中第度三数码管
lcalldelay
lcalldelay
lcalldelay
incr0
djnzr1,loop3
movr0,#20h
movr1,#10h
loop4:
movp0,@r0
lcallsel2;选中第度四数码管
lcalldelay
lcalldelay
lcalldelay
incr0
djnzr1,loop4
movr0,#20h
movr1,#10h
loop5:
movp0,@r0
lcallsel1;选中第五数码管
lcalldelay
lcalldelay
lcalldelay
incr0
djnzr1,loop5
;wait1:
movr5,#0ah
;movp0,#071h
;lcallsel3
;lcalldelay1
;movp0,#012h
;lcallsel4
;lcalldelay1
;movp0,#01eh
;lcallsel5
;lcalldelay1
;djnzr5,wait1
movr3,#0ah;控制循环次数
wait2:
mova,#00h
pusha
movdptr,#tab
movca,@a+dptr
movp0,a
lcallsel3
lcalldelay1
movp0,#0
popa
inca
pusha
movca,@a+dptr
movp0,a
lcallsel4
lcalldelay1
movp0,#0
popa
inca
pusha
movca,@a+dptr
movp0,a
lcallsel5
lcalldelay1
popa
lcallsel6
movp0,#0
lcalldelay
lcalldelay
lcalldelay
djnzr3,wait2
clrp2.3
movr3,#0f8h
wait3:
movp0,#0deh
lcallsel3
lcalldelay2
movp0,#0ch
lcallsel4
lcalldelay2
movp0,#0ch
lcallsel5
lcalldelay2
djnzr3,wait3
lcalldelay
lcalldelay
setbp2.3
ret
sel1:
clrp2.5
clrp2.6
clrp2.7
ret
sel2:
clrp2.5
clrp2.6
setbp2.7
ret
sel3:
clrp2.5
setbp2.6
clrp2.7
ret
sel4:
clrp2.5
setbp2.6
setbp2.7
ret
sel5:
setbp2.5
clrp2.6
clrp2.7
ret
sel6:
setbp2.5
clrp2.5
setbp2.7
ret
tab:
db072h,012h,01eh
delay:
movr7,#0c8h;延时100ms
del0:
movr6,#0f8h
del1:
djnzr6,del1
djnzr7,del0
ret
delay1:
movr7,#064h;延时50ms
del2:
movr6,#0f8h
del3:
djnzr6,del3
djnzr7,del2
ret
delay2:
movr7,#02h;延时1ms
del4:
movr6,#0f8h
del5:
djnzr6,del5
djnzr7,del4
ret
end
乒乓球:
score1equ30h;用来记录右边是否在球运行过程中击球
score2equ31h;用来记录左边是否在球运行过程中击球
org0000h
ljmpstart
org000bh;定时器0溢出中断入口
ljmpTime0_interrupt
org001bh
ljmpTime1_interrupt
start:
movr0,#0;记录左边接球数
movr1,#0;记录右边接球数
movr2,#04h;打3个回合
movr6,#0
movr7,#0
main:
movp0,#00h
movr3,#0
movscore1,#01h
movscore2,#01h
lcalltime0;启动T0
djnzr2,begin
ljmpxs
ljmpstart
begin:
lcallsel8
movp1,#0ffh;p1作为输入口
mova,p1
orla,#0f0H;屏蔽高4位
cjnea,#0ffh,loop
ljmpbegin
loop:
lcalldelay
LCALLSEL8
MOVP1,#0FFH
MOVa,P1
ORLa,#0F0H
cjnea,#0FFH,loopz
ljmpbegin
loopz:
cjnea,#0feh,caiy
jx1:
lcallleft_r
mova,score1
cjnea,#0,pand_1
ljmpmain
pand_1:
lcallr_jq
cjner5,#01h,main
lcallright_l
mova,score2
cjnea,#0,pand_2
ljmpmain
pand_2:
lcalll_jq
cjner4,#01h,main
ljmpjx1
main1:
ljmpmain;添加中间跳板
caiy:
cjnea,#0fbh,begin
;lcallsel6
jx2:
lcallright_l
mova,score2
cjnea,#0,pand_3
ljmpmain
pand_3:
lcalll_jq
cjner4,#01h,main
lcallleft_r
mova,score1
cjnea,#0,pand_4
ljmpmain
pand_4:
lcallr_jq
cjner5,#01h,main1
ljmpjx2
xs:
movr2,#064h
clrtr0
clrp2.3;响铃比赛结束
xs_1:
movr7,#0
mova,#0
movdptr,#tab
mova,r0
movca,@a+dptr
;lcalltime0
movp0,a;送字形
lcallsel3;选中一位数码管
lcalltime1
loopxs1:
cjner6,#02h,loopxs1
movr6,#0
clrtr1
mova,#0
movdptr,#tab
mova,r1
movca,@a+dptr
movp0,a;送字形
lcallsel5;选中一位数码管
setbtr1
loopxs2:
cjner6,#02h,loopxs2
movr6,#0
clrtr1
djnzr2,xs_1
setbp2.3;响铃比赛结束
ljmpstart
ret
tab:
db07eh,0ch,0b6h,09eh,0cch,0dah,0fah,0eh,0feh,0deh
sel1:
clrp2.5
clrp2.6
clrp2.7
ret
sel2:
clrp2.5
clrp2.6
setbp2.7
ret
sel3:
clrp2.5
setbp2.6
clrp2.7
ret
sel4:
clrp2.5
setbp2.6
setbp2.7
ret
sel5:
setbp2.5
clrp2.6
clrp2.7
ret
sel6:
setbp2.5
clrp2.6
setbp2.7
ret
sel8:
setbp2.5
setbp2.6
setbp2.7
ret
;球从左向右运行
left_r:
movp0,#010h;调试过程中改变
lcalltime0
lcallsel2
loop_1:
cjner7,#08h,loop_1
movr7,#0
lcallsel8
movp1,#0ffh;p1作为输入口
mova,p1
orla,#0f0H;屏蔽高4位
cjnea,#0fbh,lp_2;右边提前击球
incr0
movscore1,#0
ljmpany
lp_2:
lcallsel3
loop_2:
cjner7,#08h,loop_2
movr7,#0
lcallsel8
movp1,#0ffh;p1作为输入口
mova,p1
orla,#0f0H;屏蔽高4位
cjnea,#0fbh,lp_3
incr0
movscore1,#0
ljmpany
lp_3:
lcallsel4
loop_3:
cjner7,#08h,loop_3
movr7,#0
lcallsel8
movp1,#0ffh;p1作为输入口
mova,p1
orla,#0f0H;屏蔽高4位
cjnea,#0fbh,lp_4
incr0
movscore1,#0
ljmpany
lp_4:
lcallsel5
loop_4:
cjner7,#08h,loop_4
movr7,#0
any:
ret
;球从右向左运行
right_l:
movp0,#02h
lcalltime0
lcallsel5
loop1:
cjner7,#08h,loop1
movr7,#0
lcallsel8;采集键盘是否犯规
movp1,#0ffh;p1作为输入口
mova,p1
orla,#0f0H;屏蔽高4位
cjnea,#0feh,lp2
incr1
movscore2,#0
ljmpany2
lp2:
lcallsel4
loop2:
cjner7,#08h,loop2
movr7,#0
lcallsel8
movp1,#0ffh;p1作为输入口
mova,p1
orla,#0f0H;屏蔽高4位
cjnea,#0feh,lp3
incr1
movscore2,#0
ljmpany2
lp3:
lcallsel3
loop3:
cjner7,#08h,loop3
movr7,#0
lcallsel8
movp1,#0ffh;p1作为输入口
mova,p1
orla,#0f0H;屏蔽高4位
cjnea,#0feh,lp4
incr1
movscore2,#0
ljmpany2
lp4:
lcallsel2
loop4:
cjner7,#08h,loop4
movr7,#0
any2:
ret
r_jq:
cjner7,#0ah,lab_1;右边接球
movr7,#0
movr5,#0;未击球成功r5==0
incr0;记录甲赢球个数
clrtr0;关闭定时器0
ljmprover
lab_1:
lcallsel8
movp1,#0ffh;p1作为输入口
mova,p1
orla,#0f0H;屏蔽高4位
cjnea,#0ffh,xd_2
ljmpr_jq
xd_2:
lcalldelay
lcallsel8
movp1,#0ffh;p1作为输入口
mova,p1
orla,#0f0H;屏蔽高4位
cjnea,#0fbh,lab_1
movp0,#0ch
lcallsel5
lcalldelay
clrp2.3
lcalldelay
setbp2.3
movr5,#01h;用来判断是否击球成功
rover:
ret
l_jq:
cjner7,#014h,lab_2;左边接球
movr7,#0
movr4,#0;未击球成功r4==0
incr1;记录甲赢球个数
clrtr0;关闭定时器0
ljmplover
lab_2:
lcallsel8
movp1,#0ffh;p1作为输入口
mova,p1
orla,#0f0H;屏蔽高4位
cjnea,#0ffh,xd_1
ljmpl_jq
xd_1:
lcalldelay
lcallsel8
movp1,#0ffh;p1作为输入口
mova,p1
orla,#0f0H;屏蔽高4位
cjnea,#0feh,lab_2
movp0,#060h
lcallsel2
lcalldelay
clrp2.3
lcalldelay
setbp2.3
movr4,#01h;用来判断是否击球成功
lover:
ret
delay:
movr7,#02h;延时1ms
del0:
movr6,#0f8h
del1:
djnzr6,del1
djnzr7,del0
ret
time0:
movtmod,#011h
movth0,#03ch
movtl0,#0afh
movie,#082h
setbtr0
ret
Time0_interrupt:
pushacc
pushpsw
movth0,r3;定时ms
movtl0,#0h
incr7
incr3
poppsw
popacc
reti
time1:
movtmod,#11h
movth1,#0ech
movtl1,#077h
movie,#088h
setbtr1
ret
Time1_interrupt:
pushacc
pushpsw
movth1,#0ech;定时5ms
movtl1,#077h
incr6
poppsw
popacc
reti
end
五、设计体会
张桠鑫:
单片机的实验是一个综合实验。
开始还以为特别难,后来慢慢也就做下来了,虽然做的不是特别好。
在这过程中,了解到单片机的一些基础工作原理。
为期两个星期的学习使我发现《单片机》的确是一门很有用的课程,对今后的学习工作有很大的帮助,因为单片机目前在社会中有在和极其广泛的用途,各个地方都离不开它的。
但是我觉得就我们在课堂上学到的这点知识还是极其有限的,更多的东西还靠我们自己去课下学习。
老师只起到一个引导我们学习的作用,关键还是在于我们自己,这就是所谓的“师傅领进门,修行在个人”吧。
冰冻三尺非一日之寒,滴水穿石非一时之功,谨以此自勉。
黄伟钦:
时间过的真快,转眼两个星期的单片机实践就要过去了,我在这两个星期里学习到大量单片机知识,对软硬件有了更深刻的了解。
在这两个星期里我们做了三个自检程序:
蜂鸣器的自检、键盘的自检、数码管的自检。
书到用时方恨少,平时功夫没有用到,对很多指令的用法不了解,只有现学现卖,其中苦果自知。
后来我们组分到了乒乓球游戏机,我只能对它有自己的一系列想法,可对如何击球却没有自己的思路。
经过组长的指导,对它才有头绪。
由于知识系统没有组长全面,一做就错,刚开始实践时我做的较少,老师说过后我也觉的不行,便要求在组长指导下完成部分程序的编写。
经过自己的学习,对上学期单片机编程知识才做到基本掌握。
简短程序自己可以独立完成。