×
单片机 > 其他资讯 > 详情

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

发布时间:2020-07-10 发布时间:
|

要求:


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


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


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


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


一、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

 

#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;

}

}

}

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
详解漏电保护器的工作原理