基于51单片机的篮球比赛计时器

2023-05-16

目录

  • 基于51单片机的篮球比赛计时器
    • 1、PCB原理图
    • 2、仿真图
    • 3、毕设要求:
    • 4、总体方案设计
    • 5、程序源码
    • 6、资源下载

基于51单片机的篮球比赛计时器

注:本毕设资源可在微信公众号:“Kevin的学习站” 中获取!

原文地址:http://www.51hei.com/bbs/dpj-215748-1.html

1、PCB原理图

2、仿真图

img
img

3、毕设要求:

计分系统:
(1)分为“A队”和“B队”的“3分”,“2分”,“1分”各六个按键输入部分,以及两队比分的LED显示部分。在每次增加分数的同时,“24秒”计时恢复为初始值,“12分钟”计时暂停,等待比赛的继续进行
计时系统:
(1)比赛开始/继续:当“比赛开始/继续”键按下后,“24s”和“12分钟”计时器开始倒计时;
(2)手动24s复位:当“24s复位” 键按下后,“24s”倒计时恢复初始值,“12分钟”倒计时暂停,等待比赛的继续;
(3)比赛暂停:“比赛暂停”键按下后,“24s”倒计时和“12分钟”倒计时均暂停,等待比赛的继续进行;
(4)自动增加比赛节数:当“12分钟”倒计时完成后,判断当前节数是否为最后一节,若不是,则节数自动增加,并“12分钟”和“24s”均恢复默认值,等待下一节比赛的进行。

4、总体方案设计

篮球比赛计时计分器主要包括单片机控制系统、数码管/LCD显示模块、按键控制模块、报警模块、时钟电路及复位电路。通过几个模块的协调工作就可以完成相应的计时计分控制和显示功能。模块框图如下图所示。

本设计采用单片机AT89C51作为本设计的核心元件。利用LCD1602显示屏作为显示器件。LCD1602显示的内容包括比赛队伍的名称和比分情况,并且显示赛程时间(分钟:秒钟)以及比赛节数和“24S”倒计时。本设计中设立了10个按键,其中6个用于设置两队的比分,1个用于比赛开始/比赛继续,1个用于暂停,1个用于手动增加比赛节数,一个用于恢复“24s”倒计时等功能。赛程计时采用倒计时方式,本节比赛结束时,蜂鸣器报警模块进行报警。

5、程序源码

/*=================================================================================================================
 项目说明:计分系统:(1)分为“A队”和“B队”的“3分”,“2分”,“1分”各六个按键输入部分,以及两队比分的LED显示部分。
                      在每次增加分数的同时,“24秒”计时恢复为初始值,“12分钟”计时暂停,等待比赛的继续进行
          计时系统:
                     (1)比赛开始/继续:当“比赛开始/继续”键按下后,“24s”和“12分钟”计时器开始倒计时;
                     (2)手动24s复位:当“24s复位” 键按下后,“24s”倒计时恢复初始值,“12分钟”倒计时暂停,等待比赛的继续;
                     (3)比赛暂停:“比赛暂停”键按下后,“24s”倒计时和“12分钟”倒计时均暂停,等待比赛的继续进行;
                     (4)自动增加比赛节数:当“12分钟”倒计时完成后,判断当前节数是否为最后一节,若不是,则节数自动增加,
                      并“12分钟”和“24s”均恢复默认值,等待下一节比赛的进行。
==================================================================================================================*/

#include"KeyBord.h"
#include"LCD1602.h"
#include"Timer.h"

sbit Beep = P1^5;

char rule_time = 24;   //24S规则

unsigned int A_Score = 0;       //A队分数
unsigned int B_Score = 0;       //B队分数
unsigned char match = 1;        //比赛节数
unsigned char rule_flag = 0;    //记录24S规则是否启用
unsigned char Beep_flag =0 ;    //判断蜂鸣器是否报警
unsigned char Start_flag = 0;   //开始标志位

unsigned char Time_Data[4];    //数组用于存放处理的设定时间
unsigned char Score[6];        //用于存储处理的比赛分数
unsigned char Temp[4];         //用于存储处理的比赛节数和24S规则

void Key_Control();

void main()
{  
    Beep_flag = 1;            //蜂鸣器报警启用
	LCD_Init();
    Timer0_Init();

    while(1)
    {
        Key_Control();

        Time_Data[0] = '0' + minute / 10;     //赛程时间 分 十位
        Time_Data[1] = '0' + minute % 10;     //赛程时间 分 个位
        Time_Data[2] = '0' + second / 10;     //赛程时间 秒 十位
        Time_Data[3] = '0' + second % 10;     //赛程时间 秒 个位

        Temp[0] = '0' + match / 10;           //赛程节数   十位
        Temp[1] = '0' + match % 10;           //赛程节数   个位
        Temp[2] = '0' + rule_time / 10;       //24秒倒计时 十位
        Temp[3] = '0' + rule_time % 10;       //24秒倒计时 个位

        Score[0] = '0' + A_Score / 100;         //A队分数 百位
        Score[1] = '0' + A_Score % 100 / 10;    //A队分数 十位
        Score[2] = '0' + A_Score % 100 % 10;    //A队分数 个位
        Score[3] = '0' + B_Score / 100;         //B队分数 百位
        Score[4] = '0' + B_Score % 100 / 10;    //B队分数 十位
        Score[5] = '0' + B_Score % 100 % 10;    //B队分数 个位

        LCD_Write_Str(1,0,"H.T");               //对应的位置显示
        LCD_Write_Char(5,0,Score[0]);
        LCD_Write_Char(6,0,Score[1]);
        LCD_Write_Char(7,0,Score[2]);
        LCD_Write_Str(8,0,":");
        LCD_Write_Char(9,0,Score[3]);
        LCD_Write_Char(10,0,Score[4]);
        LCD_Write_Char(11,0,Score[5]);
        LCD_Write_Str(13,0,"R.T");

        LCD_Write_Char(0,1,Time_Data[0]);
        LCD_Write_Char(1,1,Time_Data[1]);
        LCD_Write_Str(2,1,":");
        LCD_Write_Char(3,1,Time_Data[2]);
        LCD_Write_Char(4,1,Time_Data[3]);
        LCD_Write_Str(6,1,"SEC-");
        LCD_Write_Char(10,1,Temp[0]);
        LCD_Write_Char(11,1,Temp[1]);
        LCD_Write_Char(13,1,Temp[2]);
        LCD_Write_Char(14,1,Temp[3]);

        if(second < 0)
        {
            if(minute == 0)       //判断某节点是否结束
            {
                if(match < MATCH)      //判断是否为最后一节比赛
                {
                    //计时系统恢复为默认值,比赛节数加一
                    match++;       
                    minute = SET_TIME;
                    rule_time = RULE_TIME;     
                    second = 0;
                }
                else
                {
                    second = 0;
                }
                TR0 = 0;     //停止时钟,等待下一次比赛开始

                while(Beep_flag)
                {
                    Key_Control();
                    Beep = ~Beep;    //板子为无源蜂鸣器
                    DelayUs2x(10);
                }
  
            }
            else
            {
                second = 59;
                minute--;
            }
        }
        
        if(rule_time < 0 && rule_flag)      //24秒结束,球未出手,计时器暂停,24秒复位
        {
            TR0 = 0;
            rule_time = RULE_TIME;
        }
    }
}

/*========================================
 函数名称:Key_Control
 函数功能:按键控制,每个按键对应功能
=========================================*/
void Key_Control()
{
	switch(KeyScan())
	{
		case 0x77:            //比赛开始/继续
            TR0 = 1;             //定时器开关打开,开始计时
            rule_flag = 1;      //24S规则启用
            Beep_flag = 1;      //蜂鸣器报警启用
            break;

		case 0xb7:            //比赛暂停
            TR0 = 0;          //定时器开关打开,停止计时
            break;

		case 0x7b:             //手动24S倒计时复位
            if(TR0 == 1)
            {
                rule_time = 0;      //24秒清零,等待下次球权
                rule_flag = 0;      //24秒功能停用

            }
            else
            {
                rule_flag = 0;      24秒功能停用

            }
            break;

		case 0xbb:             //增加比赛节数,同时总计时器和24秒复位
            if((match >= MATCH) && (minute == 0))     //判断比赛结束是否超过四节以及此节比赛是否结束
            {  
                TR0 = 0;                   //定时器停止
                match++;                   //赛程节数加一
                minute = 5;                //加时赛赛程时间设置 5分钟
                second = 0;
                rule_time = RULE_TIME;     //24秒恢复初值
                rule_flag = 0;

            }
            break;

		case 0xdb:
            Beep_flag = 0;      //关闭蜂鸣器
 
            break;
                                           //每队加分后赛程停止计时,24秒恢复初值,等待比赛继续开始
		case 0x7d:                         //A队加3分
            TR0 = 0;
            A_Score += 3;                 
            rule_time = RULE_TIME;
            rule_flag = 0;
            break;

		case 0xbd:                         //A队加2分
            TR0 = 0;
            A_Score += 2;
            rule_time = RULE_TIME;
            rule_flag = 0;
            break;    
                                 
		case 0xdd:                         //A队加1分
            TR0 = 0;
            A_Score += 1;
            rule_time = RULE_TIME;
            rule_flag = 0;
            break;

		case 0x7e:                         //B队加3分
            TR0 = 0;
            B_Score += 3;
            rule_time = RULE_TIME;
            rule_flag = 0;
            break;

		case 0xbe:                         //B队加2分
            TR0 = 0;
            B_Score += 2;
            rule_time = RULE_TIME;
            rule_flag = 0;
            break;

		case 0xde:                         //B队加1分
            TR0 = 0;
            B_Score += 1;
            rule_time = RULE_TIME;
            rule_flag = 0;
            break;

		default:break;	
	}
}

6、资源下载

在这里插入图片描述

原文下载地址:http://www.51hei.com/bbs/dpj-215748-1.html

项目的仿真和PCB工程已经放在下面公众号里面,可以关注公众号:Kevin的学习站,输入关键字:“篮球比赛计时器”,就可以免费获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于51单片机的篮球比赛计时器 的相关文章

  • 两台ubuntu之间文件互传方法

    1 查找本机ip地址 终端输入 xff08 不是自己的电脑 xff0c 是服务其的IP xff09 xff1a ifconfig span class token operator span a 查看inet 192打头的地址 2 查找本机
  • 单片机通过串口发送浮点类型数据

    单片机通过串口向串口助手或者其他器件发送数据时是不能直接发送浮点类型数据的 xff0c 通过printf 34 f 34 1 28 发送浮点数据 在串口助手看似是小数 xff0c 其实是字符串类型 xff0c 它们是各符号对应的ASSCII
  • 制作系统启动盘和制作windows+Ubuntu双系统启动盘

    制作windows 43 Ubuntu双系统启动盘 前言1 准备软件和工具 xff1a 开始1 软件和系统镜像自行在网上下载 2 下载好系统镜像之后 xff0c 开始制作ubuntu系统盘 xff1a 3 制作好ubuntu启动盘之后 xf
  • 虚拟机分配的硬盘太大怎么办?

    虚拟机分配的硬盘太大怎么办 xff1f 虚拟机分配的硬盘太大怎么办 xff1f 文章来源说明 xff1a 开始1 首先需要将虚拟机中多余的硬盘空间删除 xff0c 在此电脑中右键管理 xff0c 然后在磁盘管理中右键有多余空间的磁盘进行压缩
  • QT界面窗口的显示和隐藏,关闭

    这里写目录标题 QT窗口的显示和隐藏 xff1a 1 隐藏窗口1 1 介绍 xff1a 2 显示窗口2 1 介绍 xff1a 3 关闭窗口常用函数有 xff1a QT窗口的显示和隐藏 xff1a 1 隐藏窗口 span class toke
  • QT的中文显示乱码问题解决

    QT的中文显示乱码问题解决 QT的中文显示乱码问题解决 xff1a 1 查看源文件的编码格式 xff0c 有必要的话转换源文件的编码格式再重新编译运行尝试汉字能否正常显示 2 在代码里面解决 xff1a 3 用法 xff1a QT的中文显示
  • 0.9 - GPIO寄存器的C语言映射与STM32库函数雏形构建思路

    首先 xff0c 从参考手册可知 xff0c 程序存储器 xff08 flash xff09 数据存储器 SRAM 寄存器 外设控制 和输入输出端口被组织在同一个4GB的线性地址空间内 数据字节以小端格式存放在存储器中 一个字里的最低地址字
  • Linux文件/文件夹建立软硬链接

    建立软连接 xff1a sudo ln s home spike Downloads redis src redis server usr local bin redis server 源文件 链接到 目标文件 xff0c 这两个文件目录都
  • Linux中记录终端(Terminal)输出到文本文件四种方法

    Linux中记录终端 xff08 Terminal xff09 输出到文本文件 Linux中记录终端 xff08 Terminal xff09 输出到文本文件 一 xff0c 如何把命令运行的结果保存到文件当中 二 command gt f
  • C++ 标准库头文件汇集:

    C 43 43 标准库头文件汇集 xff1a C 43 43 标准库的接口由下列头文件的汇集定义 C 43 43 标准库头文件汇集 xff1a 概念库协程库工具库动态内存管理数值极限错误处理字符串库容器库迭代器库范围库算法库数值库本地化库输
  • C++开源库列表总结记录

    开源 C 43 43 库列表 前言包管理器库音频 音频指纹格式标签CD 性能测试 通信 并发 配置 XMLJSONYAMLTOMLHOCONCSS容器 密码学 数据库 嵌入语言绑定 嵌入式 实时 文件元数据 金融计算 游戏引擎架构 通用多媒
  • C++转义序列和操作符优先级

    C 43 43 转义序列和操作符优先级 1 转义序列 xff1a 2 C 43 43 运算符优先级注解 1 转义序列 xff1a 转义序列 描述 表示 简单转义序列 39 单引号 ASCII 编码中为字节 0x27 34 双引号 ASCII
  • PX4:Policy “CMP0097“ is not known to this version of CMake.

    make px4 fmu v3 时报的错 CMake版本的问题 由https blog csdn net zhizhengguan article details 118380965推测 xff0c 删除cmake policy也没事 ma
  • 安装Anaconda3后再安装ROS(用于PX4)

    记录一下安装anaconda后再安装ROS xff0c 方便未来找错误 出现no module wstool 仔细观察报错信息发现调用的库都在anaconda3 lib python3 7里面了 随后按照https www cnblogs
  • Offboard仿真时出现CMD: Unexpected command 176, result 0

    在用PX4 43 gazebo 43 ROS仿真offboard例程时 xff0c 如果出现以下问题 xff1a 运行以下命令 xff1a roslaunch mavros px4 launch fcu url span class tok
  • Offboard例程的python版本

    因为python的库很丰富 xff0c 有现成的解方程库 xff0c 比如sympy 自己写了一份python版本的自动起飞2m的程序 假设自定义的包名为offb xff0c 在offb下新建scripts文件夹 xff0c 将py文件放在
  • 子类与父类构造函数调用顺序

    子类与父类构造函数调用顺序 构造函数 当创建子类对象时 构造函数的调用顺序 xff1a 静态数据成员的构造函数 gt 父类的构造函数 gt 非静态的数据成员的构造函数 gt 自己的构造函数 注意 无论创建几个对象 该类的静态成员只构建一次
  • 0.1- 机械加工工艺-----切削加工基础

    1 钳工 xff1a 通过工人手持工具进行切削加工 机械加工 xff1a 采用不同的机床 xff08 如车床 铣 床 刨床 磨床 钻床等 xff09 对工 件进行切削加工 2 零件几何参数 xff1a 1 宏观几何参数 xff1a 包括 x
  • 判断当前机器的字节序是大端还是小端?

    字节序 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序 大端字节序 xff08 Big endian xff09 大端存储模式是指数据的高字节保存在内存的低地址中 xff0c 而数据的低字节保存在内存的高地址中 小端字
  • Qt简易计算器实现复数运算绘图等等

    太久没更新博客了前段时间弄了个计算器 实现了加减乘除复数 带记忆 绘图计算二维图形等功能 先简单讲解下我代码的分块 用图片描述虽然画的丑 实现效果图片 代码放心使用转载请通知 1 Ui 2 在Maindow 类实现计算 maindow h

随机推荐