基于单片机的拔河游戏

基于单片机的拔河游戏一 设计要求 1 电路使用 9 个发光二极管表示拔河的 电子绳 开机后只有中间一个发亮 此即拔河的中心点 游戏甲乙双方各持一个按钮 迅速地 不断地按动产生脉冲 谁按得快 亮点向谁方向移动 每按一次 亮点移动一次 亮点移到任一方终端二极管 这一方就获胜

大家好,我是讯享网,很高兴认识大家。

一、设计要求

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[c]; 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); }

小讯
上一篇 2025-03-26 16:17
下一篇 2025-02-14 10:59

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/126799.html