要求:
(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;
}
}
}