乒乓球游戏机doc.docx

上传人:b****6 文档编号:5890783 上传时间:2023-01-01 格式:DOCX 页数:24 大小:316.08KB
下载 相关 举报
乒乓球游戏机doc.docx_第1页
第1页 / 共24页
乒乓球游戏机doc.docx_第2页
第2页 / 共24页
乒乓球游戏机doc.docx_第3页
第3页 / 共24页
乒乓球游戏机doc.docx_第4页
第4页 / 共24页
乒乓球游戏机doc.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

乒乓球游戏机doc.docx

《乒乓球游戏机doc.docx》由会员分享,可在线阅读,更多相关《乒乓球游戏机doc.docx(24页珍藏版)》请在冰豆网上搜索。

乒乓球游戏机doc.docx

乒乓球游戏机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

五、设计体会

张桠鑫:

单片机的实验是一个综合实验。

开始还以为特别难,后来慢慢也就做下来了,虽然做的不是特别好。

在这过程中,了解到单片机的一些基础工作原理。

为期两个星期的学习使我发现《单片机》的确是一门很有用的课程,对今后的学习工作有很大的帮助,因为单片机目前在社会中有在和极其广泛的用途,各个地方都离不开它的。

但是我觉得就我们在课堂上学到的这点知识还是极其有限的,更多的东西还靠我们自己去课下学习。

老师只起到一个引导我们学习的作用,关键还是在于我们自己,这就是所谓的“师傅领进门,修行在个人”吧。

冰冻三尺非一日之寒,滴水穿石非一时之功,谨以此自勉。

黄伟钦:

时间过的真快,转眼两个星期的单片机实践就要过去了,我在这两个星期里学习到大量单片机知识,对软硬件有了更深刻的了解。

在这两个星期里我们做了三个自检程序:

蜂鸣器的自检、键盘的自检、数码管的自检。

书到用时方恨少,平时功夫没有用到,对很多指令的用法不了解,只有现学现卖,其中苦果自知。

后来我们组分到了乒乓球游戏机,我只能对它有自己的一系列想法,可对如何击球却没有自己的思路。

经过组长的指导,对它才有头绪。

由于知识系统没有组长全面,一做就错,刚开始实践时我做的较少,老师说过后我也觉的不行,便要求在组长指导下完成部分程序的编写。

经过自己的学习,对上学期单片机编程知识才做到基本掌握。

简短程序自己可以独立完成。

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

当前位置:首页 > 高等教育 > 工学

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

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