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

要求:

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

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

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

获取该程序的方式:

1、CSDN下载:

https://download.csdn.net/download/qq_38351824/11391513

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

     ① 关注微信公众号:Tech云  

     ②

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

一、Protues仿真图:

课程设计题十一:拔河游戏机设计_第1张图片

课程设计题十一:拔河游戏机设计_第2张图片

课程设计题十一:拔河游戏机设计_第3张图片

课程设计题十一:拔河游戏机设计_第4张图片

课程设计题十一:拔河游戏机设计_第5张图片

二、程序源码:

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

/*******************************************************************************
================================================================================
【平    台】STC89C51_sumjess平台
【编    写】sumjess
【E-mail  】[email protected]
【软件版本】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 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;i0;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);                //返回该值
}

 

你可能感兴趣的:(北京交通大学海滨学院单片机课设,STC51精通+项目)