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

发布者:EnchantedWish最新更新时间:2019-09-29 来源: eefocus关键字:乒乓球比赛  仿真图  STC89C51 手机看文章 扫描二维码
随时随地手机看文章

要求:


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

}

}

}

关键字:乒乓球比赛  仿真图  STC89C51 引用地址:课程设计题十三:乒乓球比赛

上一篇:课程设计题十四:双机通信
下一篇:课程设计题十二:电子密码锁

推荐阅读最新更新时间:2024-11-13 14:36

单片机信号脉宽测量程序+Proteus仿真图
参考教材改了一下,添加了显示程序,数码管只能显示4为,理论最高可显示9999us的脉宽。有兴趣的同学可以扩展一下,添加数码管,算法可以改进,多次求平均值等等。仿真出来还算可以。测量脉宽原理很简单,教材和百度上都有。 仿真原理图如下 调制输入信号 2019-10-22 01:00 上传 直接上代码 上图 看一下 下面的代码 我仿真里面设置的脉冲周期是2ms 占空比是50% 由这个代码得到的高电平的时间 理论值是1000us 测得位1000us正确。 单片机源程序如下: #include regx51.h #include intrins.h #define uchar unsigned cha
[单片机]
单片机信号脉宽测量程序+Proteus<font color='red'>仿真图</font>
单片机自动浇花系统
自己做的基于stc89c51单片机的自动浇花系统,有自动和手动两种模式,可以设置湿度的上下限,利用lcd1602显示,有一点遗憾的是设置湿度上下限时,没有光标闪动提示,希望大家给点建议,帮助改进,我把源程序附在这。 仿真原理图如下 原理图: 单片机源代码: #include reg51.h #define uchar unsigned char #define uint unsigned int sbit ad_cs=P1^3; //ADC0832的控制位 sbit ad_clk=P1^0; sbit ad_dat=P1^1; sbit lcd_rs=P2^7; //LCD1602的控制位 s
[单片机]
单片机自动浇花系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved