基于51单片机篮球计时计分器(Proteus仿真+Keil源码+设计文档)附下载链接!

提供对应的Proteus仿真电路图,Keil程序源码(C语言),设计文档等电子资料参考学习,文末附全部资料的下载链接

01设计要求

设计一个基于51单片机的心形流水灯设计设计:

功能:

1.在整个比赛过程中记录比赛时间和改变比赛时间。

2.可以在比赛期间随时更新A和B队的比分。

3中场休息期间交换场地,交换A队和B队的位置。

4.当添加比赛分数时,如果有错误,可以手动更改赛场分数。

5.赛事结束时可以触发警报。

02系统概述

该设计显示A队B队赛场比分的程序、主程序、报警程序、赛场比赛时倒计时程序、赛场比赛时间显示程序、时间重置初设状态程序、交换A队B队场地程序、初始化以及按键和子程序协同调节都由主程序按流程来控制的。

03Proteus仿真

在这里插入图片描述

04示例代码

#include <reg51.h>
typedef unsigned char uchar;

// 引脚、全局变量省略定义
sbit beep=P1^7; uchar start,time,fen,miao,fena,fenb,flag,beep_time;
sbit k1=P3^0;sbit k2=P3^1;sbit k3=P3^2;sbit k4=P3^3;sbit k5=P3^4;sbit k6=P3^5;sbit k7=P3^6;
sbit led1=P1^0;sbit led2=P1^1;
sbit smg1=P2^0,smg2=P2^1,smg3=P2^2,smg4=P2^3,smg5=P2^4,smg6=P2^5,smg7=P2^6,smg8=P2^7;
uchar code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uchar t){while(t--);}

/************************
主函数:数码管刷新+按键扫描
************************/
void main(void)
{
    uchar k=0;
    TMOD |= 0x11;       // T0/T1为模式1 16位定时器
    TH0=0x3C; TL0=0xB0; // T0初值50ms中断
    TH1=(65536-1000)/256; TL1=(65536-1000)%256;
    ET0=ET1=EA=TR0=1;   // 开中断、启动T0
    while(1)
    {
        // 状态指示灯
        led1=(start==1)?0:1; led2=(start==2)?0:1;
        // 动态扫描时间数码管(分、秒)
        P0=smgduan[fen/10];smg1=0;delay(100);smg1=1;
        P0=smgduan[fen%10]|0x80;smg2=0;delay(100);smg2=1;
        P0=smgduan[miao/10];smg3=0;delay(100);smg3=1;
        P0=smgduan[miao%10];smg4=0;delay(100);smg4=1;
        // 动态扫描双方分数数码管
        P0=flag?smgduan[fenb/10]:smgduan[fena/10];smg5=0;delay(100);smg5=1;
        P0=flag?smgduan[fenb%10]:smgduan[fena%10];smg6=0;delay(100);smg6=1;
        P0=!flag?smgduan[fenb/10]:smgduan[fena/10];smg7=0;delay(100);smg7=1;
        P0=!flag?smgduan[fenb%10]:smgduan[fena%10];smg8=0;delay(100);smg8=1;

        // 按键逻辑:加减分、启动暂停、交换场地、清零
        if(start>0){
            if(!k1&&k!=1){k=1;if(fena<99)fena++;}
            if(!k2&&k!=2){k=2;if(fena>0)fena--;}
            if(!k3&&k!=3){k=3;if(fenb<99)fenb++;}
            if(!k4&&k!=4){k=4;if(fenb>0)fenb--;}
        }
        if(!k7&&k!=7){
            k=7;
            if(start==0){start=1;fen=12;miao=0;}
            else start=(start==1)?2:1;
        }
        if(start==0){
            if(!k6&&k!=6){k=6;flag=!flag;}
            if(!k5&&k!=5){k=5;fen=fena=fenb=miao=0;}
        }
        if(k1&&k2&&k3&&k4&&k5&&k6&&k7) k=0;
    }
}

/************************
定时器0 50ms中断:倒计时计时、蜂鸣控制
************************/
void Timer0() interrupt 1
{
    TH0=0x3C; TL0=0xB0; // 重装50ms初值
    if(start == 1) // 计时运行状态
    {
        if(time < 19) time++; // 累计20次=1s
        else{
            time=0;
            if(miao>0) miao--;
            else if(fen>0){fen--;miao=59;}
            else{start=0;beep_time=60;} // 时间到,蜂鸣触发
        }
    }
    else time=0,TR1=0;
    TR1 = (beep_time>0) ? 1 : 0; // 控制蜂鸣器定时器开关
    if(beep_time>0) beep_time--;
}

注:

  1. 源码使用Keil4或Keil5打开

  2. 仿真使用的是Proteus7.8及以上版本,版本过低可能会打不开。

05资料获取

1)项目完整资料获取链接:下载链接

2)Keil、Proteus各个版本安装包: 下载链接

posted @ 2026-06-29 10:27  _Passion  阅读(21)  评论(0)    收藏  举报