基于单片机的篮球计分器设计
设计LCD显示篮球比分牌
通过加分按钮可以给A队或B队加分
设计对调功能,A队和B队分数互换,意味着中场交换场地
显示比赛倒计时功能
创新内容:如显示第几小节


本实验的目的是设计并实现一个基于单片机的篮球计分器。该计分器能够显示A队和B队的比分,并具备倒计时功能,可以通过按钮对分数进行调整。除此之外,计分器还具有显示当前比赛进行到第几小节和支持中场交换场地时交换显示分数的位置的功能。
使用的是51单片机,主要硬件接口如下:
P1口连接按键,用于检测用户的输入;
LCD显示屏,用于显示比分和倒计时时间;
定时器,用于计时控制。
按键连接到单片机P1端口的不同引脚,具体定义如下:
key_01: P1 ^ 0
key_02: P1 ^ 1
key_03: P1 ^ 2
key_04: P1 ^ 3
key_05: P1 ^ 4
key_06: P1 ^ 5
key_07: P1 ^ 6
按键通过电阻下拉接地,按下时对应引脚电平变低,通过检测电平变化判断按键状态。LCD显示屏通过并口连接单片机,用于显示当前比分和倒计时时间。定时器设定每秒中断一次,通过中断服务程序更新倒计时。
程序主要分为以下几个模块:
按键扫描:检测各个按键的状态,确定哪个按键被按下。
延时函数:用于消抖,避免按键误触发。
LCD显示:更新比分和倒计时时间。
定时器中断:每秒触发一次中断,更新倒计时。
按键检测函数通过轮询的方式扫描各个按键的状态。按键按下时,函数会返回对应的按键编号。为防止按键抖动,使用了简单的延时消抖方法。
c展开代码unsigned char KeySscan(void) {
    if (key_01 == 0) {
        delay_ms_key(10);
        if (key_01 == 0) {
            while (key_01 == 0);
            return 1;
        }
    }
    // 其他按键检测类似
    return 0;
}
定时器每50ms触发一次中断,在中断服务程序中累加计数,达到1秒时更新倒计时。若倒计时未结束,则每秒减1秒。
c展开代码void T1_time() interrupt 3 {
    TH1 = (65536 - 50000) / 256;
    TL1 = (65536 - 50000) % 256;
    num2++;
    if (num2 == 20) {
        num2 = 0;
        if (START == 1) {
            if (rtc_sec > 0) {
                rtc_sec--;
            }
        }
    }
}
主程序初始化LCD显示,设置定时器,并不断循环检测按键状态,根据按键输入更新比分和倒计时时间。具体功能包括:
A队加分、减分;
B队加分、减分;
暂停/开始计时;
中场交换比分显示位置;
小节计数。
c展开代码void main() {
    u8 key = 0;
    u8 dis_str[16];
    u8 count = 0;
    LCD_init();
    TMOD = 0x10;
    TH1 = (65536 - 50000) / 256;
    TL1 = (65536 - 50000) % 256;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
    while (1) {
        key = KeySscan();
        if (key != 0) {
            // 根据按键进行不同操作
            // 更新显示
            updateDisplay();
        }
        if (sec_last != rtc_sec) {
            sec_last = rtc_sec;
            updateTimeDisplay();
        }
    }
}
根据当前分数和中场交换状态,更新LCD显示内容。
c展开代码void updateDisplay() {
    u8 count = 0;
    if (jiaohuan_AB == 0) {
        // 显示A队和B队分数
    } else {
        // 显示B队和A队分数
    }
    LCD_write_str(1, 1, dis_str);
}
void updateTimeDisplay() {
    u8 count = 0;
    dis_str[count++] = 'J';
    dis_str[count++] = ':';
    dis_str[count++] = '0' + xiaojie;
    dis_str[count++] = ' ';
    dis_str[count++] = ' ';
    dis_str[count++] = '0' + rtc_sec / 60 / 10;
    dis_str[count++] = '0' + rtc_sec / 60 % 10;
    dis_str[count++] = ':';
    dis_str[count++] = '0' + rtc_sec % 60 / 10;
    dis_str[count++] = '0' + rtc_sec % 60 % 10;
    dis_str[count++] = ' ';
    dis_str[count++] = 0;
    LCD_write_str(1, 0, dis_str);
}
本实验通过设计并实现基于单片机的篮球计分器,掌握了按键检测、LCD显示和定时器中断处理的基本方法。该计分器不仅能够准确记录和显示比分,还能在比赛中提供倒计时和中场交换显示的功能,提高了设计的实用性和灵活性。


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!