基于单片机的乒乓球游戏系统设计

  • 格式:doc
  • 大小:279.00 KB
  • 文档页数:13

基于单片机的乒乓球游戏系统的设计

姓 名:

学 号:

专业班级:

院(系):

设计时间:

设计地点:

指导教师评语: 成绩:

签名:

年 月 日

目录

一、题目要求…………………………………………………………………………

二、方案设计…………………………………………………………………………

三、硬件原理…………………………………………………………………………

四、软件设计…………………………………………………………………………

五、结论与体会………………………………………………………………………

附:硬件原理图

基于单片机的乒乓球游戏系统的设计

一、题目要求

以STC12C5410AD单片机为核心设计一款“乒乓球游戏机”。用8支连续排列的发光二极管,通过发光二极管的依次点亮代表乒乓球的运动。再用2个按键模拟左右2个球拍,键按下代表球拍击球。“左拍”按下可使发光二极管从左向右依次点亮,模拟乒乓球从左向右飞来;反之,“右拍”按下则可使发光二极管从右向左依次点亮,代表球从右向左运动。

本游戏供两人玩,以一方按键(发球)开始,这时乒乓球就向对方运动,接球方应在乒乓球到达终点之前击球。如果击球时机合适,则把球击回,否则就算失误,由对方重新发球。在游戏过程中用LED数码管显示双方比分。

二、方案设计

(1) 本游戏开始时球在左方甲手中,数码管显示双方最初比分00。

(2)当甲方按下按键T1时,球开始往右边移动,此时8位LED灯从左至右逐次点亮。左右的速度移动一位。

(3)若接球方乙提前或迟后按下按键T2击球,则判已失误,由甲得分,乒乓球停止运动(发光二极管熄灭),数码管显示得分。球重新回到甲手中,由甲方再次发球,游戏进入下一回合。

(4)若接球方乙击球时机合适,即在LED灯到达最右端之前按下按键T2,则把球击回,LED灯即刻以0.5S每位左右的速度从右向左依次移动,等待甲方接球。若甲方接球失误,则判乙方得分,乒乓球停止运动(LED灯灭),数码管显示得分。球回到乙方手中,由乙方发球,游戏继续,开始进入下一回合。

(5)当甲乙中有一人得分为9后,游戏进入下一轮,得分较少方一端的LED灯亮,数码管重新显示00。此时发球权交给在上轮比赛中落后(得分较少)的一方,当其按下按键后下一轮游戏正式开始。

三、硬件原理

1.STC12C5410AD单片机的主电路

a 复位电路

复位操作有两种基本形式:一种是上电复位,另一种是按键复位。按键复位具有上电复位功能外,若要复位,只要按图中的RESET键,电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。上电瞬间RESET引脚获得高电 平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。按键复位电路图如图3.1.a所示。

图3.1.a 复位电路

b 振荡电路

单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。通过这两个引脚在芯片外并接石英晶体振荡器和两只电容(电容一般取30Pf)这样就构成了一个稳定的自激振荡器,振荡电路脉冲经过二分频后作为系统的时钟信号,再在二分频的基础上三分频产生ALE信号,此时得到的信号时机器周期信号。

振荡电路如图3.1.b所示:

图3.1.b 晶体振荡电路

2. LED灯接口电路

图3.2 LED灯接口电路 3. LED数码管显示电路

图3.3 LED数码管显示电路

4. 按键设定电路

独立式键盘:独立式键盘中,每个按键占用一根I/O口线,每个按键电路相对独立。I/O口通过按键与地相连,I/O口有上拉电阻,无键按下时,引脚端为高电平,有键按下时,引脚电平被拉低。I/O口内部有上拉电阻时,外部可不接 上拉电阻。本设计中键盘接口电路如图3.4所示:

图3.4 按键设定电路

四、软件设计

软件设计流程图大体为:

软件设计原代码为:

#include

#define uchar unsigned char

#define uint unsigned int 开始

初始化

按键K1(甲发球)

K2适时? N

Y 显示甲得分

K1适时? 显示乙得分 N

按键K2(乙发球) Y 乙得分为9? Y

N

甲得分为9?

Y N

#define led P1

#define shuma P2

sbit k1=P3^0;

sbit k2=P3^1;

sbit dig1=P3^2;

sbit dig2=P3^3;

uchar code table[]={ 0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71 };

uchar flag1,flag2,pair1,pair2,score1,score2,wait;

void delay(uint);

void ledmove();

void keyscan();

void score();

void showscore();

void delay(uint time)

{

uint i,j;

for(i=time;i>0;i--)

for(j=100;j>0;j--);

}

void main()

{

A0: led=0x7f;

score1=0;

score2=0;

flag1=0;

flag2=0;

dig1=1;

dig2=1;

shuma=table[0];

delay(2000);

B0: while(1)

{

keyscan();

ledmove();

score();

showscore();

if(score1==9||score2==9)

{

break;

}

}

if(score2==9)

{

showscore();

delay(1000);

goto A0;

}

if(score1==9)

{

showscore();

delay(1000);

led=0xfe;

score1=0;

score2=0;

flag1=0;

flag2=0;

dig1=1;

dig2=1;

shuma=table[0];

delay(2000);

goto B0;

}

}

void ledmove()

{

if((led==0x7f)&&(pair1==1))

{

flag1=1;

flag2=0;

}

if(flag1==1)

{

led=(led>>1)|(0x80);

delay(300);

wait=1;

}

if((led==0xfe)&&(pair2==1))

{

flag2=1;

flag1=0;

}

if(flag2==1)

{

led=(led<<1)|(0x01);

delay(300);

wait=1;

}

}

void keyscan()

{

if(k1==0)

{

delay(20);

if(k1==0)

{

pair1=1;

}

else pair1=0;

}

else pair1=0;

if(k2==0)

{

delay(20);

if(k2==0)

{

pair2=1;

}

else pair2=0;

}

else pair2=0;

}