基于单片机的篮球计分器设计

148 阅读4分钟

一、项目背景

篮球比赛是一项节奏快、对时间和比分要求精确的运动。在常规比赛中,场馆使用专业的电子计分系统来记录比赛时间、比分以及进攻时间。对于单片机学习者来说,设计一个简易的篮球计分器,不仅能够加深对 数码管显示、按键输入、定时器中断 等知识的理解,还能锻炼嵌入式系统整体设计能力。

本文介绍一个 基于单片机的篮球计分器设计,系统能够实现:

  • 比分显示(四位数码管)
  • A队、B队比分加分功能
  • 中场交换:分数对调功能
  • 比赛时间显示(分钟、秒)
  • 进攻时间倒计时(24秒)

二、功能需求分析

  1. 比分显示

    • 使用四位数码管,前两位显示A队得分,后两位显示B队得分。
    • 每支队伍可通过按键实现加1分、加2分、加3分。
  2. 分数对调

    • 比赛中场时,交换场地后,需对比分显示进行对调。
  3. 比赛时间

    • A组:比赛倒计时(例如从10:00开始倒计时)。
    • B组:比赛正计时(从0:00开始计时)。
    • C组:进攻24秒倒计时。
  4. 按键功能

    • A队加1/2/3分
    • B队加1/2/3分
    • 比分对调
    • 比赛时间启动/暂停/复位
    • 进攻时间重置

三、系统方案设计

  1. 硬件部分

    • 单片机:STC89C52 或者 STM32 均可实现,这里以 51 单片机为例。
    • 显示模块:4位共阴极数码管(动态扫描)。
    • 按键模块:独立按键 8~10 个。
    • 蜂鸣器(可选) :进攻时间到 0 时蜂鸣提示。
  2. 软件部分

    • 定时器 T0:用于比赛时间计时。
    • 定时器 T1:用于数码管动态扫描。
    • 按键扫描:消抖、功能识别。
    • 逻辑控制:分数加减、对调、进攻时间刷新。

四、硬件电路设计(思路)

  1. 数码管连接

    • P0 口 → 数码管段选(a~g、dp)。
    • P2 口 → 数码管位选(位1~位4)。
  2. 按键连接

    • P3 口用于独立按键输入,低电平有效。
  3. 蜂鸣器(可选)

    • P1.0 控制蜂鸣器。

五、软件流程

主程序流程

  1. 系统初始化(定时器、IO 口)。

  2. 进入主循环:

    • 按键扫描 → 更新比分/功能。
    • 定时器中断 → 更新时间(倒计时/正计时/24秒)。
    • 数码管刷新显示。

定时器中断服务

  • T0:1s 定时 → 更新时间。
  • T1:2ms 定时 → 动态扫描数码管。

六、核心代码框架(示例,C语言-51单片机)

#include <REGX52.H>

unsigned char code smg_duan[10] = {0x3f,0x06,0x5b,0x4f,
                                   0x66,0x6d,0x7d,0x07,
                                   0x7f,0x6f}; // 数码管段码

unsigned char scoreA = 0, scoreB = 0;
unsigned char sec = 0, min = 10; // 比赛10分钟倒计时
unsigned char atk24 = 24;        // 24秒进攻时间

// 数码管显示缓存
unsigned char display[4] = {0,0,0,0}; 

void Delay(unsigned int t){
    while(t--);
}

// 数码管显示函数
void DisplaySMG(unsigned char pos, unsigned char num){
    P0 = 0x00;  // 清空段选
    P2 = ~(0x01 << pos); // 位选
    P0 = smg_duan[num];
    Delay(100);
    P2 = 0xFF; // 熄灭
}

// 定时器初始化
void Timer0_Init(){
    TMOD |= 0x01;   // 定时器0模式1
    TH0 = 0xFC;     // 1ms定时
    TL0 = 0x18;
    ET0 = 1; EA = 1; TR0 = 1;
}

unsigned int count = 0;
void Timer0_ISR(void) interrupt 1{
    TH0 = 0xFC;
    TL0 = 0x18;
    count++;
    if(count >= 1000){ // 1秒
        count = 0;
        if(sec>0) sec--;
        else{
            sec=59;
            if(min>0) min--;
        }
        if(atk24>0) atk24--;
    }
}

// 主函数
void main(){
    Timer0_Init();
    while(1){
        // 更新数码管数据
        display[0] = scoreA/10;
        display[1] = scoreA%10;
        display[2] = scoreB/10;
        display[3] = scoreB%10;

        // 动态扫描
        DisplaySMG(0, display[0]);
        DisplaySMG(1, display[1]);
        DisplaySMG(2, display[2]);
        DisplaySMG(3, display[3]);
    }
}

说明:

  • 此处仅给出核心框架,实际需增加 按键扫描函数分数对调逻辑24秒复位功能 等。
  • 在定时器中断里可以同时处理 比赛时间进攻时间
  • 数码管显示时,可以通过切换模式选择显示比分 / 时间 / 进攻24秒。

七、效果展示

  • 比分可实时更新,支持加分、交换显示。
  • 倒计时和正计时可灵活切换。
  • 24秒倒计时到 0 时蜂鸣器报警。
  • 有问题联系QQ849723859

image.png

23d0cd5be97c74d6000bc31015858b0a_720.jpg