课程设计题十三:乒乓球比赛

要求:

(1)  乒乓游戏机甲、乙双方各有两只开关,分别为发球开关和击球开关。

(2)  乒乓球的移动用16或12只LED发光二极管模拟运行,移动的速度可以调节。

(3)  球过网到一定的位置方可,接提球前击球或出界击球均判为失分。

(4)  比赛用21分为一局,任何一方先记满21分就获胜,比赛一局就结束。当记分牌清零后,又可开始新的一局比赛。

获取该程序的方式:

1、CSDN下载:

https://download.csdn.net/download/qq_38351824/11422468

2、关注微信公众号下载:

     ① 关注微信公众号:Tech云  

     ②

3、可以关注点赞并在下方评论,我给你邮箱发过去。

一、Protues仿真图:

二、程序源码:

因为注释非常的全,这里就不再进行讲解了。

/*******************************************************************************
================================================================================
【平    台】STC89C51_sumjess平台
【编    写】sumjess
【E-mail  】1371129880@qq.com
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网    站】
           https://blog.csdn.net/qq_38351824
           http://www.51hei.com/bbs/mcu-2-1.html
---------------------------------------------------------------------------------
【dev.env.】MDK4.02及以上版本
【Target  】STC89C51
第一次修订:2019/05/09
第二次修订:2019/05/21
第三次修订:2019/06/10
【problem 】
    (1)库内补充的不全面;
    (2)库内解释部分不全面;
    (3)库内还存在一定的bug;
【direction】
      下一步的目标就是把库继续集成!
【explain 】
      为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!
【warning】
      目前程序中暂无错误 !   
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/	
#include <reg52.h>

#define uchar unsigned char  //无符号字符型 宏定义	变量范围0~255
#define uint  unsigned int	 //无符号整型 宏定义	变量范围0~65535

数码管
#define SEG P2				
sbit SCAN1 = P3^4;
sbit SCAN2 = P3^5;
sbit SCAN3 = P3^6;
sbit SCAN4 = P3^7;

sbit KEY_A_START = P1^4;	 //开始按键
sbit KEY_A_HIT = P1^5;		 //A击打
sbit KEY_B_START = P1^6;	 //开始按键
sbit KEY_B_HIT = P1^7;		 //B击打

LED
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sbit LED4 = P0^3;
sbit LED5 = P0^4;
sbit LED6 = P0^5;
sbit LED7 = P0^6;
sbit LED8 = P0^7;
sbit LED9 = P1^0;
sbit LED10 = P1^1;
sbit LED11 = P1^2;
sbit LED12 = P1^3;

变量声明
uchar A_num = 0;  //A分数
uchar B_num = 0;  //B分数
uchar number=0;
uchar display=0;//数码管刷新
uchar ball_time = 300;
uchar ball_num = 0;
uchar flag_ball = 0;
uchar ball_state = 0;
uchar flag_A_B = 0;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void scan_ball();

//延时1ms
void delay(uint j) 
{
	uchar i=250;
	for(;j>0;j--)
	{
		while(--i);
		i=249;
		while(--i);
		i=250;
	}
}

//关闭所有LED
void None_LED()
{
	LED1=1;
	LED2=1;
	LED3=1;
	LED4=1;
	LED5=1;
	LED6=1;
	LED7=1;
	LED8=1;
	LED9=1;
	LED10=1;
	LED11=1;
	LED12=1;		
}
//按键扫描
void Key_scan()
{
	if(KEY_A_START==0)//按下甲开始按键
	{
		delay(10);
		if(KEY_A_START==0)
		{
			while(KEY_A_START==0);
			flag_A_B=1;
			flag_ball=1;			
		}		
	}
	else if(KEY_A_HIT==0)//按下甲击球按键
	{
		delay(10);
		if(KEY_A_HIT==0)
		{
			flag_A_B=0;
			scan_ball();
			while(KEY_A_HIT==0);
			if(ball_state==2)
			{
				A_num++;
				None_LED();
				flag_ball=0;
			}
			else flag_A_B=1;
		}
      }
	else if(KEY_B_START==0)//按下乙开始按键
	{
		delay(10);
		if(KEY_B_START==0)
		{
			while(KEY_B_START==0);
			flag_A_B=2;
			flag_ball=12;
		}
     }
	else if(KEY_B_HIT==0)//按下乙击球按键
	{
		delay(10);
		if(KEY_B_HIT==0)
		{
			flag_A_B=0;
			scan_ball();
			while(KEY_B_HIT==0);
			if(ball_state==1)
			{
				B_num++;
				None_LED();
				flag_ball=0;
			 }
			else flag_A_B=2;		
		 }
       }	
}

void scan_ball()//返回当前球的位置 0 未发球   1在A球区   2 在B球区
{
	if((LED9 & LED10 & LED11 & LED12)==1) ball_state=1;
    else ball_state=2;
}

void main()
{
	TMOD |= 0x01;
	TH0=0XFC;
	TL0=0X18;
	TR0=1;
	ET0=1; 
	EA=1;	 
	while(1)
	{		
		 Key_scan();
	}	
}



void t0isr() interrupt 1//定时器0函数
{
	TH0=0XFC;
	TL0=0X18;
    display++;		   
	ball_num++;
	if(display==2)
	{
		display=0;
		SEG=0xff;

		switch(number)
		{
			case 0:SCAN4=1;SCAN3=0;SCAN2=0;SCAN1=0;SEG=distab[A_num%10];break;
			
			case 1:SCAN4=0;SCAN3=1;SCAN2=0;SCAN1=0;SEG=distab[A_num/10];break;
			
			case 2:SCAN4=0;SCAN3=0;SCAN2=1;SCAN1=0;SEG=distab[B_num%10];break;
			
			case 3:SCAN4=0;SCAN3=0;SCAN2=0;SCAN1=1;SEG=distab[B_num/10];break;
			
			default:break;			
           }
		number++;
        if(number>3)number=0;
	  }
		
	if(ball_num==ball_time)
	{
		ball_num=0;
		None_LED();
		switch(flag_ball)
		{
			case 1:LED1=0;break;
			case 2:LED2=0;break;
			case 3:LED3=0;break;
			case 4:LED4=0;break;
			case 5:LED5=0;break;
			case 6:LED6=0;break;
			case 7:LED7=0;break;
			case 8:LED8=0;break;
			case 9:LED9=0;break;
			case 10:LED10=0;break;
			case 11:LED11=0;break;
			case 12:LED12=0;break;				
		  }
		if(flag_A_B==1) flag_ball++;
		else if(flag_A_B==2) flag_ball--;
		if(flag_ball==13 && flag_A_B==1)
		{
			if(B_num!=20)
			{
				B_num++;
				flag_A_B=0;
			 }
			else if(B_num==20)
			{
				flag_A_B=0;
				A_num=0;
				B_num=0;
			 }
			None_LED();
			flag_ball=0;
		}
		else if(flag_ball==0 && flag_A_B==2)
		{
			if(A_num!=20)
			{
				A_num++;
				flag_A_B=0;
			}
			else if(A_num==20)
			{
				flag_A_B=0;
				A_num=0;
				B_num=0;
			}
			None_LED();
			flag_ball=0;
		}
			
	}	
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值