乒乓球游戏机C程序乒乓球游戏机C程序
基于51单片机的乒乓球游戏机设计
前一段时间田老师给我们班一些选题,让我们每个人都选一个,我选的是基于51单片机乒乓游戏设计。我设计乒乓球游戏已有一段时间,在一个星期之前,我就已经设计好了一个能正常游戏的功能,但是我认为有些方面还是没设计好,所以就没发上来。今天想想还是发上来吧,不好的地方以后再该。乒乓球游戏机的设计主要偏重于软件部分,我主要也是在程序上下工夫。
我设计的乒乓球游戏机足要是在精简mini51版的平台上实现的。乒乓球游戏的设计主要功能如下:
1、能够对乒乓球的游戏轨迹移动速度进行调节。...
乒乓球游戏机C程序
基于51单片机的乒乓球游戏机
前一段时间田老师给我们班一些选题,让我们每个人都选一个,我选的是基于51单片机乒乓游戏设计。我设计乒乓球游戏已有一段时间,在一个星期之前,我就已经设计好了一个能正常游戏的功能,但是我认为有些方面还是没设计好,所以就没发上来。今天想想还是发上来吧,不好的地方以后再该。乒乓球游戏机的设计主要偏重于软件部分,我主要也是在程序上下工夫。
我设计的乒乓球游戏机足要是在精简mini51版的平台上实现的。乒乓球游戏的设计主要功能如下:
1、能够对乒乓球的游戏轨迹移动速度进行调节。
2、能过通过数码管显示等级难度和比赛分数。
3、比赛中若是没及时按下按键会有有报警声发出。
给出几张图如下:(注:这里有根跳线是因为乒乓球led轨迹用的是P1口,蜂鸣器是P1.7,我为了使两者减少干扰故用跳线将蜂鸣器接到P2.0口上。还有就是led中的一个led总亮着是因为数码管的扫描用到这一引脚故这一引脚常亮。)
图一:按键说明
图二:难度等级8,开始时0:0
图三:难度等级8,比赛结果2:1
图四:难度等级10,比赛结果6:6,当然比赛是不会出现这种结果喽,因为比赛还没
结束。
程序源代码如下:
#include
#define TIME_PER_SEC 640 //定义数码管扫描频率,8*40Hz #define CLOCK 22118400 //定义时钟晶振,单位Hz
//按键和595的引脚定义
sbit SH_CP = P2^4;
sbit ST_CP = P1^5; sbit DS = P2^5;
sbit CP_key= P3^2;
sbit C_key= P3^3;
sbit A_key= P3^4;
sbit B_key= P3^5;
//流水灯
unsigned char disp[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//数码管字表
unsigned char code
led_bit[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//{0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,
0xfe};
unsigned char code
led_seg[17]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,
0x71,0xff};//0xfd
//全局变量
unsigned char Ascore,Bscore,mov,level,L;
unsigned char count0,count1,count2;
unsigned char buffer[8];
//key按键
bit flag;
bit flag1;
//蜂鸣器定义
sbit Buzzer=P2^0 ;
/*--------------- 初始化 --------------*/
void initial595()
{
SH_CP = 0;
ST_CP = 0;
DS = 0;
}
/*--------------- 发送数据 ---------------*/
void send_data(unsigned char d)
{
unsigned char i;
for(i=0;i<8;i++)
{
DS = d&0x01; //发送最低位
SH_CP = 1;
SH_CP = 0; //移位寄存器移位
d = d>>1; //数据移位
}
}
//延时程序
void delay(unsigned int t)
{
while(--t);
}
//定时器0初始化
void timer_init(void) {
TMOD = 0x11; //定时器0工作在模式1,16Bit定时器模式
TH0 = (65536-CLOCK/TIME_PER_SEC/12) / 256;
TL0 = (65536-CLOCK/TIME_PER_SEC/12) % 256;
TR0 =1;
ET0 =1;//开启定时器和中断
TH1 = (65536-5000) / 256;
TL1 = (65536-5000) % 256;
TR1 =1;
ET1 =1;
}
void main()
{ unsigned char j=0;
initial595();
timer_init();
count0=0;
count1=0;
count2=0;
mov=0;
Ascore=0;
Bscore=0;
flag=0;
flag1=0;
L=1;
level=20;
EA=1;
while(1)
{
if(CP_key==0) //设置等级
{ delay(200);
if(CP_key==0)
{
level=level-2;
while(CP_key==0);
//等级
if(level==18)L=2;
if(level==16)L=3;
if(level==14)L=4;
if(level==12)L=5;
if(level==10)L=6;
if(level==8)L=7;
if(level==6)L=8;
if(level==4)L=9;
if(level==2)L=10;
if(level==0||level==20)
{
level=20;
L=1;
}
}
}
if(C_key==0) //判断比赛是否开始
{
delay(200);
if(C_key==0)
{
flag=~flag; //使下面的中断的Bscore的多的一分减去
Bscore=-1;
while(C_key==0);
}
}
if(flag1==1)
{ flag1=0;
if(flag==1)
{
count0++;
if(count0==level)
{
count0=0;
if(count1++ > 13) count1 = 1;
if(count1==1)
{
if(A_key)
{
delay(200);
if(A_key)
{
P1=disp[0];
Bscore++;
for(j=0;j<100;j++)
{
Buzzer = 0x0;
delay(50);
Buzzer = 0x1;
delay(50);
}
}
while(A_key);
}
}
if(count1==8)
{
if(B_key)
{
delay(200);
if(B_key)
{
P1=disp[7];
Ascore++;
for(j=0;j<100;j++)
{
Buzzer = 0x0;
delay(50);
Buzzer = 0x1;
delay(50);
}
}
while(B_key);
}
}
P1=disp[mov];
if(count1<8)mov++;
else mov--;
}
}
}
}
}
void timer0_int(void) interrupt 1 {
static unsigned char i=0;
TR0=0;
TH0 = (65536-CLOCK/TIME_PER_SEC/12) / 256;
TL0 = (65536-CLOCK/TIME_PER_SEC/12) % 256;
TR0=1;
send_data(led_seg[buffer[i]]);
send_data(led_bit[i]);
ST_CP=1;
ST_CP=0;
i = ++i&0x07;
buffer[7] = L;
buffer[6] = 16;
buffer[5] = 16;
buffer[4] = Ascore/10;
buffer[3] = Ascore%10;
buffer[2] = 16;
buffer[1] = Bscore/10;
buffer[0] = Bscore%10; }
void timer1_int(void) interrupt 3 {
unsigned char j=0;
TR1=0;
TH1 = (65536-50000) / 256;
TL1 = (65536-50000) % 256;
TR1=1;
flag1=1;
}
本文档为【乒乓球游戏机C程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。