兵乓球游戏机设计任务为:
使用乒乓游戏
机的甲乙双方各在不同的位置发球或击球。
乒乓球的位置和移动方向由灯亮及依次点燃的方向决定,球移动的速度为0.1~1s移动一位。游戏者根据球的位置发出相应的动作,提前击球或出界均判失分。
比赛用11分为一局来进行,甲乙双方都应设置各自的记分牌,任何一方先记满11分,该方就算胜了此局。当记分牌清零后,又可开始新的一局比赛。
兵乓球游戏机设计概述:
基于51单片机的乒乓游戏机设计,结果用LCD1602显示屏显示。软件方面,使用Keil uVision4进行编程。硬件设计包含单片机电路、模拟球台电路、按键电路、显示电路等电路的设计。软件设计包括:主程序、按键组程序(球拍模拟和暂停/开始子程序)、发球程序、线路程序(包括线路选择和LED点阵子程序)、回球程序、LCD显示程序。
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1KUdnyRgPf8Aw-tqIn0oh0A?pwd=8888
部分代码展示
#include<reg52.h>
#include"lcd1602.h"
sbit P1_7=P1^7;
sbit P1_6=P1^6;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
void delay(int q);
void chang0(void);
void chang1(void);
void chang2(void);
void chang3(void);
void chang4(void);
void qiuquan(void);
void Ajiqiu(void);
void Bjiqiu(void);
void xianlu(void);
void huiqiu(void);
void Ahuiqiu(void);
void Bhuiqiu(void);
void Awin(void);
void Bwin(void);
void fuwei(void);
void delay_1(int t);
int a[10]={0,1,2,3,4,5,6,7,8,9};
int q[16]={11,10,9,8,12,13,14,15,131,130,129,128,132,133,134,135};//仿真
//int q[16]={9,13,11,15,8,12,10,14,129,133,131,135,128,132,130,134}; //实际
int b[16]={1164,1182,1437,1455,1710,1692,1983,1965,2112,2130,2385,2403,2658,2640,2931,2913};
int i1=0,i2=0,i3=0,i4=0,i=20,k=4,n=0,w=1,t,f=-1,x,m,s1,c1,s2,c2,v;
void main()
{
write_com(0x01);
P2=0;
fuwei();
EA=1;
EX0=1;
EX1=1;
ET0=1;
IT0=1;
IT1=1;
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
qiuquan();
while(1)
{
int t=1000+w*1000;
P2=q[n];
delay_1(t);
xianlu();
}
}
void ex0(void) interrupt 0
{
}
void it0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i--;
if(P1_0==0)
{
while(P1_0==0);
chang0();
i=20;
}
c1=P0_0&&P0_1&&P0_2;
c2=P0_4&&P0_5&&P0_6;
if(n<8&&!c1&&v)
Ahuiqiu();
else if(n>=8&&!c2&&v)
Bhuiqiu();
}
//暂停模块
void ex1(void)interrupt 2
{
if(P1_1==0)
{
P1_7=1;
chang0();
}
}
void chang0(void)
{
P1_7=1;
while(1)
{
if(P1_1==0)
{
P1_7=0;
return;
}
}
}
//回球模块
void delay_1(int t)
{ int z;
for(;t>0;t--)
for(z=50;z>0;z--)
{
}
}
//A回球
void Ahuiqiu(void)
{w=P0_3;
//D2
if(n==0)
{
if(x==13&&!P0_0)
{
if(!w)
x=3;
else
x=0;
while(!P0_0) ;
m=b[x];
}
if(x==8)
{
if(!P0_0)
{ x=3;
while(!P0_0);
m=b[x];}
else if(!P0_1)
{ x=0;
while(!P0_1);
m=b[x];}
}
}
//D3
else if(n==1)
{
if(x==10&&!P0_1)
{
x=2;
while(!P0_1) ;
m=b[x];
}
else if(x==15&&!P0_0)
{
x=2;
while(!P0_1);
m=b[x];
}
}
//D4
else if(n==2)
{
if(x==12&&!P0_1)
{
x=4;
while(P0_1);
m=b[x];
}
else if(x==9&&!P0_0)
{
if(!w)
x=4;
while(!P0_1);
m=b[x];
}
}
//D5
else if(n==3)
{
if(x==11&&!P0_2)
{
if(!w)
x=5;
else
x=6;
while(!P0_2) ;
m=b[x];
}
else if(x==14)
{
if(!P0_2)
{ x=5;
while(!P0_2);
m=b[x];}
else if(!P0_1)
{ x=6;
while(!P0_1);
m=b[x];}
}
}
//D6
if(n==4)
{
if(x==8)
{
if(!P0_0)
{ x=1;
while(!P0_0);
m=b[x]%256;}
else if(!P0_1)
{ x=0;
while(!P0_1);
m=b[x]%256;}
}
}
//D7
else if(n==5)
{
if(x==10)
{
if(!P0_0)
{ x=3;
while(!P0_0);
m=b[x]%256;}
else if(!P0_1)
{ x=2;
while(!P0_1);
m=b[x]%256;}
}
else if(x==13&&!P0_0)
{
x=2;
while(!P0_0) ;
m=b[x]%256;
}
}
//D8
else if(n==6)
{
if(x==11&&!P0_2)
{
if(!w)
x=5;
else
x=4;
while(!P0_2) ;
m=b[x]%256;
}
else if(x==12)
{
if(!P0_2)
{ x=5;
while(!P0_2);
m=b[x]%256;}
else if(!P0_1)
{ x=4;
while(!P0_1);
m=b[x]%256;}
}
}
//D9
if(n==7)
{
if(x==14)
{
if(!P0_2)
{ x=7;
while(!P0_2);
m=b[x]%256;}
else if(!P0_1)
{ x=6;
while(!P0_1);
m=b[x]%256;}
}
}
//else
//chang3();
return;
}