一、设计要求
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
暂无评论