基于单片机的拔河游戏

一、设计要求

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

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

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

4、创新内容

1)添加一个指示灯。裁判按下按钮,指示灯闪亮三次后甲乙按下按钮才有效。当一方到达任一方的终端二极管,指示灯长亮。

2)添加预设按钮,可以对比赛的分数进行预设,当任意一方达到预设分数后,灯闪烁。

     点按按钮,预设值加1;长按按钮预设值减一

二、整体模块

2.1单片机系统模块

图2-1

    2.2按钮模块

   比分预设按钮(YUSEH)、玩家1(PLAYER1)、复位和开始按钮(RES-START)、玩家2(PLAYER2)

图2-2

    2.3数码显示模块

   第一个数码管和第二个数码管(显示玩家1玩家2的得分);第三个数码管显示预设分数

图2-3

    2.4二极管模块

图2-4

   2.5指示灯模块

图2-5

三、元件选择 

元件名称

元件个数

LED-YELLOW

×1

LED-BLUE

×5

LED-RED

×5

LED-GREEN

×1

7SEG-MPX4-CA

×1

PNP

×1

RES-300Ω

×9

RES-2000Ω

×1

RES-1000Ω

×2

RESPACK-8

×1

BUTTON

×5

80C52

×1

CRYSTAL

×1

CAP

×2

CAP-POL

×2

四、代码程序

 main.c

#include <reg52.h>
#include <intrins.h>
#include <demo.h>
#define uchar unsigned char
#define uint unsigned int
void main()
{
	init();
	disp();
	while(1)
	{
		disp();
		key_init();
	}
}

demo.h

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void key_init();//控制灯左移右移
void delay(uchar z);//延时
void di(void);//蜂鸣器响应
void disp();//显示比分
void init();//初始化
void buzzer();//指示灯
void yushe();//预设比分制
void shanliang();//灯光闪亮

 demo.c

#include <reg52.h>
#include <intrins.h>
#include <demo.h>
#define uchar unsigned char
#define uint unsigned int
sbit player1=P3^0;//玩家1计数
sbit player2=P3^1;//玩家2计数
sbit button1=P3^4;//复位--开始按钮
sbit button2=P3^2;//玩家1
sbit button3=P3^3;//玩家2
sbit button4=P3^7;//预设按键
sbit bee=P3^5;//指示灯
sbit numer=P3^6;//预设值
uchar temp1,temp2,a,b,num;
uchar n,m,c;//c=预设值
uchar y;//标志位 y  
uint n1,n2;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码表段位,共阳数码管显示0到9
/*********************************************/
void delay(uchar z)//延时
{
	uchar i;
	while(z--)
	for(i=0;i<120;i++);
}
void disp()//控制数码管
{
	if(n>9)
	{
		n=9;
	}
	if(m>9)
	{
		m=9;
	}
	if(c>9)
	{
		c=9;
	}
	if(c<0)
	{
		c=0;
	}
	player1=1;
	P1=table[n];
	delay(10);
	player1=0;
	
	player2=1;
	P1=table[m];
	delay(10);
	player2=0;
	
	numer=1;
	P1=table;
	delay(10);
	numer=0;
}
void key_init()
{
	  yushe();//预设
		if(button1==0)//按下开始按钮;端口P0,P2赋初值
		{
			  buzzer();
			  while(!button1);//类似于消除抖动,保证按下按钮只执行一次
				temp1=0xef;
				temp2=0xff; 
				P0=temp1;
				P2=temp2;
			  y=1;
    }
		if(button2==0&&y==1)//玩家1按下
		{
			while(!button2);
			delay(5);
			if(temp1!=0xef&&temp2==0xfe)//重新赋值
			{
				temp2=0xff;
				P2=temp2;
				temp1=0x7f;
				P0=temp1;
			}
			else
			{
				temp1=_cror_(temp1,1);
				P0=temp1;
			}
		}
		 if(button3==0&&y==1)//玩家2
		{
			while(!button3);
			delay(5);
			if(temp2==0xff&&P0==0x7f)//判断是否在初始位置
			{
					temp1=0xff;
					P0=temp1;
					temp2=0xfe;
					P2=temp2;
			}
			else
			{
				temp1=_crol_(temp1,1);
				P0=temp1;
			}
		}			
		if(P0==0xfe&&y==1)//判断是否到最左
	  {
		  bee=0;
			y=0;
			n++;
			while(button1!=0&&n==c)
			{
				shanliang();
			}
	  }
	  if(P2==0xfe&&y==1)//判断是否到最右
	  {
			bee=0;
			y=0;
			m++;
			while(button1!=0&&m==c)
			{
				shanliang();
			}
	  }
}
void init()
{
	P0=0xef;
	n1=0;
	n2=0;
	num=0;
	n=0;
	m=0;
	bee=1;
	numer=0;
	c=0;
	
}
void buzzer()
{
		bee=0;
		delay(2000);
		bee=1;
		delay(2000);
		bee=0;
		delay(2000);
		bee=1;
		delay(2000);
		bee=0;
		delay(2000);
		bee=1;
}
void yushe()
{
	if(button4==0)
	{
		delay(1000);
		if(button4==0)
		{
			while(!button4);
			c--;
		}
		else
		{
			while(!button4);
			c++;
		}
	}
}
void shanliang()
{
	P0=0xaa;
	P2=0xf1;
	delay(100);
	P0=0x55;
	P2=0x00;
	delay(100);
}

版权声明:本文为CSDN博主「学不会D码」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_58013758/article/details/122323567

一、设计要求

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

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

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

4、创新内容

1)添加一个指示灯。裁判按下按钮,指示灯闪亮三次后甲乙按下按钮才有效。当一方到达任一方的终端二极管,指示灯长亮。

2)添加预设按钮,可以对比赛的分数进行预设,当任意一方达到预设分数后,灯闪烁。

     点按按钮,预设值加1;长按按钮预设值减一

二、整体模块

2.1单片机系统模块

图2-1

    2.2按钮模块

   比分预设按钮(YUSEH)、玩家1(PLAYER1)、复位和开始按钮(RES-START)、玩家2(PLAYER2)

图2-2

    2.3数码显示模块

   第一个数码管和第二个数码管(显示玩家1玩家2的得分);第三个数码管显示预设分数

图2-3

    2.4二极管模块

图2-4

   2.5指示灯模块

图2-5

三、元件选择 

元件名称

元件个数

LED-YELLOW

×1

LED-BLUE

×5

LED-RED

×5

LED-GREEN

×1

7SEG-MPX4-CA

×1

PNP

×1

RES-300Ω

×9

RES-2000Ω

×1

RES-1000Ω

×2

RESPACK-8

×1

BUTTON

×5

80C52

×1

CRYSTAL

×1

CAP

×2

CAP-POL

×2

四、代码程序

 main.c

#include <reg52.h>
#include <intrins.h>
#include <demo.h>
#define uchar unsigned char
#define uint unsigned int
void main()
{
	init();
	disp();
	while(1)
	{
		disp();
		key_init();
	}
}

demo.h

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void key_init();//控制灯左移右移
void delay(uchar z);//延时
void di(void);//蜂鸣器响应
void disp();//显示比分
void init();//初始化
void buzzer();//指示灯
void yushe();//预设比分制
void shanliang();//灯光闪亮

 demo.c

#include <reg52.h>
#include <intrins.h>
#include <demo.h>
#define uchar unsigned char
#define uint unsigned int
sbit player1=P3^0;//玩家1计数
sbit player2=P3^1;//玩家2计数
sbit button1=P3^4;//复位--开始按钮
sbit button2=P3^2;//玩家1
sbit button3=P3^3;//玩家2
sbit button4=P3^7;//预设按键
sbit bee=P3^5;//指示灯
sbit numer=P3^6;//预设值
uchar temp1,temp2,a,b,num;
uchar n,m,c;//c=预设值
uchar y;//标志位 y  
uint n1,n2;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码表段位,共阳数码管显示0到9
/*********************************************/
void delay(uchar z)//延时
{
	uchar i;
	while(z--)
	for(i=0;i<120;i++);
}
void disp()//控制数码管
{
	if(n>9)
	{
		n=9;
	}
	if(m>9)
	{
		m=9;
	}
	if(c>9)
	{
		c=9;
	}
	if(c<0)
	{
		c=0;
	}
	player1=1;
	P1=table[n];
	delay(10);
	player1=0;
	
	player2=1;
	P1=table[m];
	delay(10);
	player2=0;
	
	numer=1;
	P1=table;
	delay(10);
	numer=0;
}
void key_init()
{
	  yushe();//预设
		if(button1==0)//按下开始按钮;端口P0,P2赋初值
		{
			  buzzer();
			  while(!button1);//类似于消除抖动,保证按下按钮只执行一次
				temp1=0xef;
				temp2=0xff; 
				P0=temp1;
				P2=temp2;
			  y=1;
    }
		if(button2==0&&y==1)//玩家1按下
		{
			while(!button2);
			delay(5);
			if(temp1!=0xef&&temp2==0xfe)//重新赋值
			{
				temp2=0xff;
				P2=temp2;
				temp1=0x7f;
				P0=temp1;
			}
			else
			{
				temp1=_cror_(temp1,1);
				P0=temp1;
			}
		}
		 if(button3==0&&y==1)//玩家2
		{
			while(!button3);
			delay(5);
			if(temp2==0xff&&P0==0x7f)//判断是否在初始位置
			{
					temp1=0xff;
					P0=temp1;
					temp2=0xfe;
					P2=temp2;
			}
			else
			{
				temp1=_crol_(temp1,1);
				P0=temp1;
			}
		}			
		if(P0==0xfe&&y==1)//判断是否到最左
	  {
		  bee=0;
			y=0;
			n++;
			while(button1!=0&&n==c)
			{
				shanliang();
			}
	  }
	  if(P2==0xfe&&y==1)//判断是否到最右
	  {
			bee=0;
			y=0;
			m++;
			while(button1!=0&&m==c)
			{
				shanliang();
			}
	  }
}
void init()
{
	P0=0xef;
	n1=0;
	n2=0;
	num=0;
	n=0;
	m=0;
	bee=1;
	numer=0;
	c=0;
	
}
void buzzer()
{
		bee=0;
		delay(2000);
		bee=1;
		delay(2000);
		bee=0;
		delay(2000);
		bee=1;
		delay(2000);
		bee=0;
		delay(2000);
		bee=1;
}
void yushe()
{
	if(button4==0)
	{
		delay(1000);
		if(button4==0)
		{
			while(!button4);
			c--;
		}
		else
		{
			while(!button4);
			c++;
		}
	}
}
void shanliang()
{
	P0=0xaa;
	P2=0xf1;
	delay(100);
	P0=0x55;
	P2=0x00;
	delay(100);
}

版权声明:本文为CSDN博主「学不会D码」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_58013758/article/details/122323567

生成海报
点赞 0

学不会D码

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

【电子系统综合实践】--2021电赛F题智能送药小车

主要内容     设计并制作智能送药小车,模拟完成在医院药房与病房间药品的送取作业。院区结构示意如图1所示。院区走廊两侧的墙体由黑实线表示。走廊地面上画有居中的红实线,并放置标识病房号的黑色数字可移动纸张。药房和近端

基于单片机的拔河游戏

一、设计要求 1、电路使用 9 个发光二极管表示拔河的“电子绳”,开机后只有中间一个发亮,此即拔河的中心点。游戏甲乙双方各持一个按钮,迅速地、不断地按动产生脉冲,谁按得快,

【电子系统综合实践】--2021电赛F题智能送药小车

主要内容     设计并制作智能送药小车,模拟完成在医院药房与病房间药品的送取作业。院区结构示意如图1所示。院区走廊两侧的墙体由黑实线表示。走廊地面上画有居中的红实线,并放置标识病房号的黑色数字可移动纸张。药房和近端