找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1853|回复: 0
收起左侧

基于单片机乒乓球游戏机控制系统

[复制链接]
ID:190577 发表于 2023-7-28 20:04 | 显示全部楼层 |阅读模式
一、系统方案

首先,我们编写的这个游戏是一个小型游戏,实现的功能比较简单,不像大型游戏那样功能复杂,它只要LED灯逐个点亮到一方,在最靠近自己的LED点亮时按下按键即可,难度随着局数的增加而加大,对于实现这样一个功能,程序不是太复杂,用一块单片机足以达到目的。
其次,它的按键也比较少只有5个功能键,这些控键在Proteus中用弹跳式按键代替即可。
第三,本游戏只需要两个两位的数码管显示比分即可,不需要LCD液晶屏,也用不着电脑显示屏。
第四,就编程语言方面来说,编写这样一个简单的小游戏不需要什么高级的语言,C语言或汇编语言就足以完成,C语言是一种通用型的语言,编程灵活、可读性强、移植性好;汇编语言是一种直接面向硬件的基础语言,最接近机器语言,执行速度快(本游戏采用C语言编写)。由以上几点可知:单片机上此游戏在硬件和软件两个方面都是可行的。
乒乓球比赛是由甲乙双方参赛,再加上裁判的三人游戏。乒乓球比赛模拟机是一种用发光二极管模拟乒乓球运动的电子游戏机,同时可以容纳三人玩耍。
1. 用8个LED排成一条直线,以中点为界,两边各代表参赛双方的位置。其中一只点亮的LED指示球的当前位置。点亮的LED依次从左到右,或从右到左移动,其移动速度应能进行调节。
2. 当球(点亮的那只LED)运动到某方德最后一位时,参赛者应能果断地按下位于自己一方的按钮开关,即表示启动球拍击球,若击中则使球向相反方向移动,若未击中,则对方得一分。
3. 一方得分时,电路自动响铃3s,这期间发球无效,等铃声停止后方能继续比赛。
4. 设置自动计分电路。甲乙双方各用两位数码管进行计分显示,每记满11分为1局。最好考虑双方各10分之后,领先2分者为胜。
5. 甲乙双方各设置一个发光二极管表示拥有发球权,每得2分自动交换发球权,拥有发球权的一方发球才能有效。
1.png


二、硬件设计
原理图如下:
2.png


三、单片机软件设计
1、首先是系统初始化:
        InitTimer();    //初始化定时器
        EA=1;      //全局中断开关
        TR0=0;
        TR1=0;
        ET0=1;      //开启定时器0
        ET1=1;
    EX0=0;
    EX1=0;

2、中断服务程序
void timer1(void) interrupt 3                                //用于产生报警信号
{
        TH1=0x4c;
        TL1=0x00;                 //50ms
        TR1=1;
        count_1miao++;
        if(count_1miao==60)
        {
                count_1miao=0;
                flag_1miao=1;
                ALAM=1;
                TR1=0;
        }
}

3、数码管程序
/*****显示分数子程序*****/
void Disp_score(void)     //显示温度
{
        P0=LEDData[scoreL/10];
        P2=0x7F;
        Delay(200);
        P2=0xFF;

        P0=LEDData[scoreL%10];
        P2=0xBF;
        Delay(200);
        P2=0xFF;

        P0=LEDData[scoreR/10];
        P2=0xDF;
        Delay(200);
        P2=0xFF;

        P0=LEDData[scoreR%10];
        P2=0xEF;
        Delay(200);
        P2=0xFF;
}

4、核心算法程序
                if((start==0)&&(run==0)&&flag_1miao==1)                        //停止状态下,控下start键
                {
                        Disp_score();         //调用数码管显示
                        {
                                if(start==0)         //开始按键按下
                                {
                                        if(((scoreL==11)&&(scoreR<10))||((scoreR==11)&&(scoreL<10))||((scoreL>11)&&(scoreL-scoreR==2))||((scoreR>11)&(scoreR-scoreL==2)))
                                        //        判断左右方到11,另一方小于10,或者大于12,两方差大于2,这局结束
                                        {
                                                TR1=0;
                                                ALAM=1;
                                                scoreL=0;
                                                scoreR=0;
                                        }
                                        run=1;           //         运行标志位置1
                                        jiqiu_l=0;
                                        jiqiu_r=7;
                                        zongjiqiushu=0;
                                        if((scoreL+scoreR)%4<=1)  //所得分数和4取余,(比如1+1和为2和4取余余数为2大于1)余数小于1就是左侧发球,大于一就是右侧发球         ,就是每侧发球两次        ,
                                        L_R=0;
                                        else
                                        L_R=1;
                                        if(L_R==0)
                                        {
                                                countt0=0;
                                                P1=PPQdata[0];
                                                EX0=1;
                                                EX1=0;
                                        }
                                        else
                                        {        
                                                countt0=7;
                                                P1=PPQdata[7];
                                                EX0=0;
                                                EX1=1;
                                        }
                                }                                       
                        }
                }

四、proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
3.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表