基于单片机的乒乓球游戏系统设计
- 格式: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;
}