基于51单片机的篮球计时器Proteus仿真设计与实现

文章目录

  • 一、篮球计时器
  • 1.题目要求
  • 2.思路
  • 3.仿真图
  • 3.1 未仿真时
  • 3.2 仿真开始
  • 3.3 A队进分
  • 3.4 B队进分
  • 3.5 比赛结束
  • 4.仿真程序
  • 4.1 主函数
  • 4.2 时间显示
  • 4.3 比分显示
  • 4.4 按键扫描
  • 二、总结

  • 一、篮球计时器

    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仿真。

    感谢你的观看!

    作者:xiaobuding_QAQ

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于51单片机的篮球计时器Proteus仿真设计与实现

    发表回复