当前位置: 首页 > news >正文

【51单片机】【protues仿真】基于51单片机篮球计时计分器数码管系统

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

1、数码管显示
1、比赛时间为15:00,甲乙队比分默认000,通过按键修改
3、比赛运行的状态下,按开始暂停键,比赛暂停,计时暂停。
4、在比赛进行的状态下按通过按键来对甲乙两队进行加减分
5、在一节比赛时间结束后,按下交换键,比赛时间重新预置为15:00,
同时左右两边数码管的比分交换显示。此时按下启动键可以开始新一节的比赛。
6、报警提示:在一节比赛时间倒计时到00:00时,蜂鸣器发出报警提示。
7、比赛时,24秒会以1秒的速度减,可随时按下24秒复位键重置24秒。

二、使用步骤

51单片机篮球计时计分器是51单片机项目中常用的显示设备,通过控制数码管来显示不同数据,通过按键来改变数码管显示的值。

三、硬件资源

1、51单片机核心模块
2、按键模块
3、蜂鸣器模块
4、数码管显示模块

四、软件设计

#include<reg51.h>
#define LEDData P0

unsigned char code LEDCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

int minit,second,count,count1;            //分,秒,计数器
char min=15,sec=0;

sbit add1=P1^0;                        //甲对加分,每按一次加1分   /在未开始比赛时为加时间分
sbit dec1=P1^1;                        //甲对减分,每按一次减1分    /在未开始比赛时为减时间分
sbit exchange=P1^2;                    //交换场地
sbit add2=P1^3;                        //乙对加分,每按一次加1分    /在未开始比赛时为加时间秒
sbit dec2=P1^4;                        //乙对减分,每按一次减1分    /在未开始比赛时为减时间秒
sbit p24_sec=P1^5;
sbit secondpoint=P0^7;                //秒闪动点
//----依次点亮数码管的位------
sbit led1=P2^7;
sbit led2=P2^6;
sbit led3=P2^5;
sbit led4=P2^4;
sbit led5=P2^3;
sbit led6=P2^2;
sbit led7=P2^1;
sbit led8=P2^0;
sbit led9=P3^7;
sbit led10=P3^6;
sbit led11=P3^5;
sbit led12=P3^4;

sbit alam=P1^7;                        //报警

bit  playon=0;                        //比赛进行标志位,为1时表示比赛开始,计时开启
bit  timeover=0;                    //比赛结束标志位,为1时表示时间已经完
bit  AorB=0;                        //甲乙对交换位置标志位
bit  halfsecond=0;                    //半秒标志位

unsigned int scoreA;                //甲队得分
unsigned int scoreB;                //乙队得分
char sec24=24;        

void Delay5ms(void)
{
    unsigned int i;
    for(i=100;i>0;i--);
}


void display(void)
{
//-----------显示时间分--------------
    LEDData=LEDCode[minit/10];
    led1=1;
    Delay5ms();
    led1=0;
    LEDData=LEDCode[minit%10];
    led2=1;
    Delay5ms();
    led2=0;
//-------------秒点闪动------------
    if(halfsecond==1)
        LEDData=0x7f;
    else
        LEDData=0xff;
    led2=1;
    Delay5ms();
    led2=0;
    secondpoint=0;
//-----------显示时间秒------------
    LEDData=LEDCode[second/10];
    led3=1;
    Delay5ms();
    led3=0;
    LEDData=LEDCode[second%10];
    led4=1;
    Delay5ms();
    led4=0;
//-----------显示1组的分数百位-------
    if(AorB==0)
        LEDData=LEDCode[scoreA/100];
    else
        LEDData=LEDCode[scoreB/100];
    led5=1;
    Delay5ms();
    led5=0;
//---------------显示1组分数的十位-----------
    if(AorB==0)
        LEDData=LEDCode[(scoreA%100)/10];
    else
        LEDData=LEDCode[(scoreB%100)/10];
    led6=1;
    Delay5ms();
    led6=0;

//---------------显示1组分数的个位-----------
    if(AorB==0)
        LEDData=LEDCode[scoreA%10];
    else
        LEDData=LEDCode[scoreB%10];
    led7=1;
    Delay5ms();
    led7=0;

//-----------显示2组分数的百位-------
    if(AorB==1)
        LEDData=LEDCode[scoreA/100];
    else
        LEDData=LEDCode[scoreB/100];
    led8=1;
    Delay5ms();
    led8=0;
//-----------显示2组分数的十位-----------
    if(AorB==1)
        LEDData=LEDCode[(scoreA%100)/10];
    else
        LEDData=LEDCode[(scoreB%100)/10];
    led9=1;
    Delay5ms();
    led9=0;

//-----------显示2组分数的个位-----------
    if(AorB==1)
        LEDData=LEDCode[scoreA%10];
    else
        LEDData=LEDCode[scoreB%10];
    led10=1;
    Delay5ms();
    led10=0;

//-----------显示时间分--------------
    LEDData=LEDCode[sec24/10];
    led11=1;
    Delay5ms();
    led11=0;
    LEDData=LEDCode[sec24%10];
    led12=1;
    Delay5ms();
    led12=0;
}

//******************************主函数*************************************************
void main(void)
{
    TMOD=0x11;
     TL0=0xb0;
     TH0=0x3c;
     TL1=0xb0;
     TH1=0x3c;
    minit=min;                
    second=sec;
     EA=1;
    ET0=1;
    ET1=1;
     TR0=0;
    TR1=0;
    EX0=1;
    IT0=1;
    IT1=1;
//    EX1=1;
    PX0=1;
//    PX1=1;
    PT0=0;
    P1=0xFF;
    P3=0xFF;
    alam=1;
     while(1)
     {
        keyscan();
        display();            
    }
}

void PxInt0(void) interrupt 0
{
    Delay5ms();
    EX0=0;
    alam=1;
    TR1=0;
    if(timeover==1)
    {
        timeover=0;
    }

    if(playon==0)
    {
        playon=1;                //开始标志位
        TR0=1;                    //开启计时
        
        if((minit+second)==0)
        {
            sec24=24;
            minit=min;            
            second=sec;
        }
    }
    else
    {
        playon=0;                //开始标志位清零,表示暂停
        TR0=0;                    //暂时计时
    }    
    EX0=1;                        //开中断    
}

五、实验现象

演示视频:

http://www.dtcms.com/a/353858.html

相关文章:

  • 什么是代理ip?代理ip的运作机制
  • C++ 中 ::(作用域解析运算符)的用途
  • 大小鼠糖水偏爱实验系统 糖水偏好实验系统 小鼠糖水偏好实验系统 大鼠糖水偏好实验系统
  • 【半导体制造流程概述】
  • 优化IDEA卡顿的问题
  • 使用CCProxy搭建http/https代理服务器
  • AWS OpenSearch 可观测最佳实践
  • Maya绑定:人物绑定详细案例
  • 数据结构之 【红黑树的简介与插入问题的实现】
  • 数值分析离散积分近似求值
  • 【数据分析】微生物群落网络构建与模块划分的比较研究:SparCC、Spearman-RAW与Spearman-CLR方法的性能评估
  • Shell编程-随机密码生成
  • volitale伪共享问题及解决方案
  • SoC如何实现线程安全?
  • 【进阶篇第五弹】《详解存储过程》从0掌握MySQL中的存储过程以及存储函数
  • TypeScript:Interface接口
  • 如何启动一个分支网络改造试点?三步走
  • 【链表 - LeetCode】25. K 个一组翻转链表
  • 干眼症护理学注意事项
  • linux下的网络编程(2)
  • 技术分析 | Parasoft C/C++test如何突破单元测试的隔离难题
  • 亚马逊关键词策略全解析:类型、工具与多账号运营优化指南
  • AT_abc406_f [ABC406F] Compare Tree Weights
  • Windows/Linux 环境下 Jmeter 性能测试的安装与使用
  • 基于SpringBoot的宠物领养服务系统【2026最新】
  • MySQL 面试题系列(五)
  • Unity自定义Inspector面板之使用多选框模拟单选框
  • 前端技术演进录:从 AI 革命到架构新生
  • 【Linux】常用命令 拥有者和权限(四)
  • Python随机选择完全指南:从基础到高级工程实践