要求:
(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; } } }
上一篇:课程设计题十四:双机通信
下一篇:课程设计题十二:电子密码锁
推荐阅读最新更新时间:2024-11-13 14:36
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 LTC1624CS 的参考设计
- VAR-DVK-OM37_CE7,基于安装了 Windows Embedded Compact 7 的 VAR-SOM-OM37 SOM 处理器的开发套件
- STA015E,MPEG 第三层解码器和 ADPCM CODEC 评估板
- LT3970IMS-3.3 3.3V 降压转换器的典型应用
- DC1739B-C,具有 LTC3765EMSE/LTC3766EGN 120W 隔离式正向转换器和同步整流功能的演示板
- #第五届立创电子设计大赛#智能家居
- STM32746G-EVAL,评估板是基于ARM Cortex-M7内核的STM32F746NGH6微控制器的完整演示和开发平台
- DC503A,使用 LT5512EUF 高信号电平、下变频混频器的演示板,适用于(宽 IF 输出、CATV 应用)
- LTC3823EUH 演示板,具有差分输出检测和跟踪功能的高效率、高功率降压转换器
- 使用 Analog Devices 的 AD7716 的参考设计