基于51单片机的篮球计时器Proteus仿真

发布于:2024-07-01 ⋅ 阅读:(9) ⋅ 点赞:(0)


一、篮球计时器

1.题目要求

以51单片机为核心,设计并制作篮球计时器

基本功能如下:

设有比赛总时长(如10min)和24秒进攻时限的倒计时,允许在倒计时内进行投篮加分,分别有一分球、两分球、三分球三种进球方式。每次得分之后要有一个积分栏,要记录两队的比分。篮球比赛开始和结束要有标识,可以用led效果来表示。

2.思路

首先,画个51单片机,粗略计算了一下好像引脚不是很够用,所以这里想用74HC138来扩展IO口。
在这里插入图片描述
74HC138B 译码器可接受三位二进制加权地址输入(A0,A1,A2)并在使能时,提供8 位低电平有效、互斥的输出(Y0 到 Y7)。至于具体输出高还是低,要根据下面的真值表来看(请注意实物中的E3其实是仿真图中的E1,要看引脚编号。)不懂的小伙伴可以看下这个74HC138译码器
在这里插入图片描述
报警方式依旧选用蜂鸣器
在这里插入图片描述

显示方式,这里选用6位数码管和4位数码管分开显示。一个是显示比赛时间和进攻时间。一个是显示A队和B对的比分。
在这里插入图片描述

最后是一个LED来表示比赛开始和比赛结束,打算开始就长亮,一直到比赛结束使其闪烁或者熄灭。用开关或者按键来切换是A队还是B队,4个按键来刷新进攻时间和增加比分(一分、两分、三分)
在这里插入图片描述

3.仿真图

3.1 未仿真时

在这里插入图片描述

3.2 仿真开始

比赛总时间为10分钟,每次进攻时间为24s。24s倒计时为0,蜂鸣器会响进行提示,需要手动按下进攻时间来重置24s。
在这里插入图片描述

3.3 A队进分

A队投进3分球,记3分,当前比分3比0。
在这里插入图片描述

3.4 B队进分

B队投进2分球,记2分,当前比分3比2。
在这里插入图片描述

3.5 比赛结束

比赛时间归零,蜂鸣器长鸣,灯光熄灭。这时候比分为39比34,A队获得此次比赛的胜利。
在这里插入图片描述

4.仿真程序

4.1 主函数

//主函数
void main()
{
  Time0_init();//定时器初始化
  LED=1;//比赛开始
	while(1)
	{
	    time_display();//总时间显示和倒计时显示
	    score_display();//比分显示
	    keyscan();//按键扫描
	    speak();//警报
	}
} 

4.2 时间显示

//总时间显示和倒计时显示(六位数码管)
void time_display()
{
    uchar secshi,secge,minshi,minge,attge,attshi;
    secge=sec%10;//秒钟个位
    secshi=sec/10;//秒钟个位
    minge=min%10;//分钟个位
    minshi=min/10;//分钟十位
    attge=att%10;//倒计时个位
    attshi=att/10;//倒计时十位

    HLA=0;HLB=0;HLC=0; //第1位
    P0=table0[minshi];
    delayms(1);

    HLA=1;HLB=0;HLC=0;  //第2位
    P0=table0[minge];
    delayms(1);

    HLA=0;HLB=1;HLC=0;  //第3位
    P0=table0[secshi];
    delayms(1);

    HLA=1;HLB=1;HLC=0;  //第4位
    P0=table0[secge];
    delayms(1);

    HLA=0;HLB=0;HLC=1;  //第5位
    P0=table0[attshi];
    delayms(1);

    HLA=1;HLB=0;HLC=1;  //第6位
    P0=table0[attge];
    delayms(1);
    P0=0x00;          //消影
}

4.3 比分显示

//比分显示(4位数码管)
void score_display()
{
    uchar A_scorege,A_scoreshi,B_scorege,B_scoreshi;
    A_scorege=A_score%10;
    A_scoreshi=A_score/10;
    B_scorege=B_score%10;
    B_scoreshi=B_score/10;

    HHA=0;HHB=0;HHC=0; //第1位
    P3=table0[A_scoreshi];
    delayms(1);

    HHA=1;HHB=0;HHC=0;  //第2位
    P3=table0[A_scorege];
    delayms(1);

    HHA=0;HHB=1;HHC=0;  //第3位
    P3=table0[B_scoreshi];
    delayms(1);

    HHA=1;HHB=1;HHC=0;  //第4位
    P3=table0[B_scorege];
    delayms(1);
    P0=0x00;
}

4.4 按键扫描

//按键扫描
void keyscan()
{
    if (key_att==0)
    {
        delayms(1);
        if(key_att==0)
        att=24;//重置倒计时24s
        while(!key_att);
    }
    if (Change==1)//A队
    {
        if (score_1==0)//比分加1
        {
            delayms(1);
            if (score_1==0)
            A_score+=1;
            while(!score_1);
        }
        if (score_2==0)//比分加2
        {
            delayms(1);
            if (score_2==0)
            A_score+=2;
            while(!score_2);

        }
        if (score_3==0)//比分加3
        {
            delayms(1);
            if (score_3==0)
            A_score+=3;
            while(!score_3);
        }
    }
    else//B队
    {
        if (score_1==0)//比分加1
        {
            delayms(5);
            if (score_1==0)
            B_score+=1;
            while(!score_1);
        }
        if (score_2==0)//比分加2
        {
            delayms(5);
            if (score_2==0)
            B_score+=2;
            while(!score_2);

        }
        if (score_3==0)//比分加3
        {
            delayms(5);
            if (score_3==0)
            B_score+=3;
            while(!score_3);
        }
    }
}

二、总结

今天主要讲了基于51单片机的篮球计时器Proteus仿真。

感谢你的观看!

在这里插入图片描述