要求:

1、电路使用7个发光二极管表示拔河的“电子绳”,开机后只有中间一个发亮,此即拔河的中心点。游戏甲乙双方各持一个按钮,迅       速地、不断地按动产生脉冲,谁按得快,亮点向谁方向移动,每按一次,亮点移动一次。亮点移到任一方终端二极管,这一方         就获胜,此时双方按钮均无作用,输出保持,只有复位后才使亮点恢复到中心。

2、由裁判下达比赛开始命令后,甲乙双方才能输入信号,否则,输入信号无效。

3、用数码管显示获胜者的盘数,每次比赛结束自动给获胜方加分。

获取该程序的方式:

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

     ① 关注微信公众号:Tech云  

     ②

课程设计题十一:拔河游戏机设计_LED驱动

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

一、Protues仿真图:

课程设计题十一:拔河游戏机设计_动态数码管显示_02

课程设计题十一:拔河游戏机设计_全注释代码_03

课程设计题十一:拔河游戏机设计_protues_04

课程设计题十一:拔河游戏机设计_protues_05

课程设计题十一:拔河游戏机设计_全注释代码_06

二、程序源码:

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

/*******************************************************************************
================================================================================
【平 台】STC89C51_sumjess平台
【编 写】sumjess
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网 站】
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<reg51.h>

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

#define KeyPort P1
unsigned char KeyState; //记录按键的状态,0没有,1有

uchar count=3; //两人按键处理该参数作为自加或者自减运算 0 1 2《==自减3==》自加 4 5 6
uchar k=0,M=0; //分别记录两人胜的次数
uchar flag; //每局胜出标志位

uchar code DSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20}; //位码表 第6位为控制LED位码
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段码表段位,共阳数码管显示0到9
uchar code DSY_IDC[]={0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

unsigned char KeyScan(void); //键盘扫描函数,使用行列反转扫描法

void delayms(uchar n) //延时ms函数
{
uchar i;
while(n--)
for(i=0;i<120;i++);
}

void delay(uchar t) //延时函数
{
uchar i,p,j;
for(i=0;i<t;i++)
{
for(p=13;j>0;j--);
{
;
}
}
}
void main()
{
while(1)
{
P2=DSY_IDX[0];P0=DSY_CODE[k];delay(50); //显示分数
P2=DSY_IDX[1];P0=DSY_CODE[M];delay(50); //显示分数
flag=1;
KeyScan();
if(KeyScan()==0x7e )
{
while((KeyPort&0xf0)!=0xf0);//等待松开并输出
while(flag)
{
KeyScan();
switch(count)
{
case 0:k=k+1;P2=DSY_IDX[5]; P0=DSY_IDC[0];delayms(10); flag=0; count=3;
break;

case 1:P2=DSY_IDX[5]; P0=DSY_IDC[1];delayms(10);
break;

case 2:P2=DSY_IDX[5]; P0=DSY_IDC[2]; delayms(10);
break;

case 3:P2=DSY_IDX[5]; P0=DSY_IDC[3];delayms(10);
break;

case 4:P2=DSY_IDX[5]; P0=DSY_IDC[4]; delayms(10);
break;

case 5:P2=DSY_IDX[5]; P0=DSY_IDC[5]; delayms(10);
break;

case 6:M=M+1;P2=DSY_IDX[5]; P0=DSY_IDC[6];delayms(10);flag=0; count=3;
break;
}

if(KeyScan()==0x7d)
{
count--;
while((KeyPort&0xf0)!=0xf0);//等待松开并输出
}

if(KeyScan()==0x7b)
{
count++;
while((KeyPort&0xf0)!=0xf0);//等待松开并输出
}

if(KeyScan()==0x7e) //主持人按键开始后参赛者按键才有效
{
flag=0;
count=3;
P2=DSY_IDX[5];
P0=DSY_IDC[3];//中间那盏灯亮对应P13
}
}
}
}
}


unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l; //行列值中间变量
KeyPort=0x0f; //行线输出全为0
cord_h=KeyPort&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delayms(10); //去抖
if((KeyPort&0x0f)!=0x0f)
{
cord_h=KeyPort&0x0f; //读入列线值
KeyPort=cord_h|0xf0; //输出当前列线值
cord_l=KeyPort&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}
return(0xff); //返回该值
}