找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2059|回复: 0
打印 上一主题 下一主题
收起左侧

基于51单片机的篮球计时器程序

[复制链接]
跳转到指定楼层
楼主
ID:993066 发表于 2021-12-16 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
设计任务:设计并仿真实现一个篮球比赛计时器。系统框图如下图所示。

篮球比赛计时器框图
4.设计要求
1) 基本要求
(1)计时功能:
l  能记录整个赛程的实际比赛时间,并能修改比赛时间,计时范围:0~99分钟。
l  能扣除暂停时间、节间休息时间和罚球时间。
(2)定时功能:
l  总时间分为四节,每节时间到报警
l  节休时间到报警
(3)节休时间可人为预置。
2) 发挥部分
(1)语音播报“暂停时长到”、“节间休息时长到”。
5、备注
(1)设计内容包括:系统方案设计、电原理图设计、PCB版图设计和仿真电路设计;
(2)完成基本要求和仿真得90分;
(3)完成扩展部分并仿真加10分。

由于单片机的集成度高,功能强,通用性好,特别是它具有体积小、重量轻、能耗低、价格便宜、可靠性高、抗干扰能力强和使用方便等独特的优点,使单片机迅速得到了推广应用。目前已经成为测量控制应用系统中的优选机种和新电子产品的关键部位,许多用单片机做控制的球赛计时系统也应运而生,如:用单片机控制液晶显示(LCD)计时计时器,用单片机控制LED七段显示器计时计时器等。篮球计时器以单片机为核心,由计时器和综合控制器等组成。

本设计中系统硬件电路主要由以下几个部分组成:单片机AT89C51、计时电路及报警电路和按键开关。具体由AT89C51编程控制LED七段数码管作显示的球赛计时系统。该系统具有记录单节时间及24秒倒计时等功能。它具有价格低廉、性能稳定、操作方便并且易于携带等特点,广泛适合各类学校或者小型团体作为赛程计时计分。
                                                   
(1)设计内容包括:系统方案设计、电原理图设计、PCB版图设计和仿真电路设计;... II
(2)完成基本要求和仿真得90分;... II
摘    要... III
ABSTRACT. IV
第1章  概述... 6
1.1  选题背景、研究目的及意义... 6
1.1.1  选题背景... 6
1.2 国内外研究现状... 6
1.3  本设计主要实现内容... 7
2 系统总体设计方案... 8
2.1单片机介绍... 8
2.2 显示模块... 9
3 硬件电路... 10
3.1 数码管驱动及显示电路... 10
3.2 按键及蜂鸣器模块... 10
第4章  软件设计... 11
5 仿真测试... 12
5.1 PROTEUS仿真实现... 12
5.2仿真测试... 12
结 论... 15
参考文献... 16
附录一 硬件原理图.. 17
附录二 仿真原理图.. 18
附录三 PCB图... 19
附录四 程序... 20

第1章  概述
1.1 选题背景、研究目的及意义
随着体育活动越来越多的受到人们的重视,篮球比赛也被很多青少年所喜爱。我本人也参加过学校组织的班级间的篮球比赛,但是比赛的计分和计时的工具大多是很简陋的比分牌,十分的不方便。而且大多由于缺少24秒的倒计时,控球时间计时不是很准确。我开发的这个系统原料简单,按键功能强大,计时准确,流动性强,非常适合于学校的篮球比赛等对于计时要求比较高的地方。自从1976年Intel公司推出第一批单片机以来,80年代单片机技术进入快速发展时期,近年来,随着大规模集成电路的发展,单片机继续朝快速、高性能方向发展,从4位、8位单片机发展到16位、32位单片机。单片机主要用于控制,它的应用领域遍及各行各业,大到航天飞机,小至日常生活中的冰箱、彩电,单片机都可以大显其能。单片机将微处理器、存储器、定时/计数器、I/O接口电路等集成在一个芯片上的大规模集成电路,本身即是一个小型化的微机系统。单片机技术与传感与测量技术、信号与系统分析技术、电路设计技术、可编程逻辑应用技术、微机接口技术、数据库技术以及数据结构、计算机操作系统、汇编语言程序设计、高级语言程序设计、软件工程、数据网络通信、数字信号处理、自动控制、误差分析、仪器仪表结构设计和制造工艺等的结合,使得单片机的应用非常广泛。

1.3 本设计主要实现内容
(1)计时功能:
   能记录整个赛程的实际比赛时间,并能修改比赛时间,计时范围:0~99分钟。
   能扣除暂停时间、节间休息时间和罚球时间。
(2)定时功能:
   总时间分为四节,每节时间到报警
   节休时间到报警
(3)节休时间可人为预置。

XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
复位电路: 复位电路是单片机应用中的最基本和最重要的电路,用于处理单片机工作失灵等紧急问题。当单片机复位端口为高电平时,单片机中的代码将不会被执行。一开始上电时,电容还未充满电,复位端口为高电平,避免了直接上电就运行程序导致的程序错误等问题。当电容充满电后,复位端口变为低电平,程序开始运行。单片机最小系统如图2.1所示。
图2.1 单片机最小系统
2.2 显示模块
方案一:四位共阴数码管显示烟雾浓度值和温度值;
方案二:采用液晶显示屏LCD显示烟雾浓度值和温度值。
本系统显示采用的是四位共阴数码管。众所周知,单片机设计中一般采用LED数码管或者LCD液晶显示屏来显示数据,而LCD液晶显示屏的特点比较突出,显示的数据清晰、明了,且功耗较少。相比于LCD液晶显示,四位数码管的显示能力不如LCD液晶显示屏,但是其价格便宜,且能满足本设计的需求。因此,本设计就采用四位共阴数码管,下图2.2所示的是四位共阴数码管。
图2.2 四位数码管
3 硬件电路
3.1 数码管驱动及显示电路
数码管驱动及显示电路如图3.1所示,通过PNP三极管S9012显示数码管的驱动,并利用单片机P0口实现数据的显示。
图3.1 数码管驱动及显示电路
3.2 按键及蜂鸣器模块
按键电路如图3.2所示,由“时间分钟加键”、“时间分钟减键”、“时间秒加键”、“时间秒减键”、“计时开始/停止按键”、“24S重置按键”六个键组成。在改变分数时,按下以上的键就可以实现数值的改变。
图3.2 按键及蜂鸣器模块
第4章  软件设计
本设计中采用的处理器是STC单片机,由此可采用面向MCS-51的程序设计语言,包括ASM51汇编语言和C51高级语言,这两种语言各有特点。数学运算程序适合用C51高级语言编写,因为用高级语言编写运算程序可提高编程效率和应用程序的可靠性。本设计需要实现时间的加减以及计时提示,整体程序流程图如图4.1所示。
图4.1 主程序流程图
5 仿真测试
5.1PROTEUS仿真实现
首先,我们利用我们根据硬件电路原理图,同时结合仿真特点,利用protues8.7软件设计了如图5.1所示的仿真电路图。仿真中最小系统的复位电路与硬件原理图最小系统中复位电路有所区别,复位电路中的电容值为0.1uf,电阻值为100Ω。
图5.1 仿真原理图
根据第四章软件设计的思路,结合仿真需求,我们将仿真设计的C代码利用KEIL5编写好,并进行详细地注释。接着,我们点击“create HEX file”,并再次编译程序,这样就会生成HEX烧录文件。最后,我们打开仿真原理图,并将生产的“HEX”文件烧录到单片机芯片中,点击开始仿真,就可以实现相关仿真了,我们将在下一节中具体展示仿真的结果。
5.2仿真测试
通过按下“倒计时开始/停止”按键,开始倒计时。具体仿真测试如图5.2所示,从图中可以看出,单节时间调整为12分钟,按键按下后,数码管显示清晰、无抖动,实现了既定功能。
图5.2 时间显示
通过按下“时间分钟加键”、“时间分钟减键”、“时间秒加键”、“时间秒减键”四个按键,可以实现单节时间的调整。具体仿真测试如图5.3所示,从图中可以看出,24S时间为0,蜂鸣器响起,按键按下后,数码管显示清晰、无抖动,实现了既定功能。
图5.3 时间到报警
通过按下“24S重置”按键,可以实现24S重置。具体仿真测试如图5.4所示,从图中可以看出,24S时间为24,按键按下后,数码管显示清晰、无抖动,实现了既定功能。
图5.4 重置
结 论
结合以上设计,本设计实现了以下功能:
(1)计时功能:
 能记录整个赛程的实际比赛时间,并能修改比赛时间,计时范围:0~99分钟。
 能扣除暂停时间、节间休息时间和罚球时间。
(2)定时功能:
 总时间分为四节,每节时间到报警
 节休时间到报警
(3)节休时间可人为预置。

附录四 程序
#include<reg52.h>
#define LEDData P0
unsigned char codeLEDCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
intminit,second,count,count1;         //分,秒,计数器
char min=15,sec=0;
sbit add1=P1^0;                    //甲对加分,每按一次加1分   /在未开始比赛时为加时间分
sbit dec1=P1^1;                    //甲对减分,每按一次减1分  /在未开始比赛时为减时间分
sbit add2=P1^3;                    //乙对加分,每按一次加1分  /在未开始比赛时为加时间秒
sbit dec2=P1^4;                    //乙对减分,每按一次减1分  /在未开始比赛时为减时间秒
sbit p24_sec=P1^5;
sbitsecondpoint=P0^7;             //秒闪动点
//----依次点亮数码管的位------
sbit led1=P2^7;
sbit led2=P2^6;
sbit led3=P2^5;
sbit led4=P2^4;
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;                 //半秒标志位
char sec24=24;      
void Delay5ms(void)
{
    unsigned int i;
    for(i=100;i>0;i--);
}
void display(void)
{
//-----------显示时间分--------------
    LEDData=LEDCode[minit/10];
    led1=0;
    Delay5ms();
    led1=1;
    LEDData=LEDCode[minit%10];
    led2=0;
    Delay5ms();
    led2=1;
//-------------秒点闪动------------
    if(halfsecond==1)
       LEDData=0x7f;
    else
       LEDData=0xff;
    led2=0;
    Delay5ms();
    led2=1;
    secondpoint=0;
//-----------显示时间秒------------
    LEDData=LEDCode[second/10];
    led3=0;
    Delay5ms();
    led3=1;
    LEDData=LEDCode[second%10];
    led4=0;
    Delay5ms();
    led4=1;
//-----------显示时间分--------------
    LEDData=LEDCode[sec24/10];
    led11=0;
    Delay5ms();
    led11=1;
    LEDData=LEDCode[sec24%10];
    led12=0;
    Delay5ms();
    led12=1;
}
//=========================按键检测程序================================================
void keyscan(void)
{
    if(playon==0)
    {
       if(add1==0)
       {
           display();
           if(add1==0);
           {
              if(minit<99)
                  minit++;
              else
                  minit=99;
                  min=minit;
           }
           do
              display();
           while(add1==0);
           
       }
       if(dec1==0)
       {
           display();
           if(dec1==0);
           {
              if(minit>0)
                  minit--;
              else
                  minit=0;
                  min=minit;
           }
           do
              display();
           while(dec1==0);
           
       }
       if(add2==0)
       {
           display();
           if(add2==0);
           {
              if(second<59)
                  second++;
              else
                  second=59;
                  sec=second;
           }
           do
              display();
           while(add2==0);
           
       }
       if(dec2==0)
       {
           display();
           if(dec2==0);
           {
              if(second>0)
                  second--;
              else
                  second=0;  
                  sec=second;
           }
           do
              display();
           while(dec2==0);
           
       }
    }
    else
    {
       if(p24_sec==0)
       {
           display();
           if(p24_sec==0)
           {
              sec24=24;
              TR0=1;
              alam=1;
              while(p24_sec==0) display();
           }
       }
    }
}
//******************************主函数*************************************************
void main(void)
{
    TMOD=0x11;
    TL0=0xb0;
    TH0=0x3c;
    TL1=0xb0;
    TH1=0x3c;
    minit=min;           //初始值为15:00
    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;                   //开中断   
}
/*
void PxInt1(void)interrupt 2
{
    Delay5ms();
    EX1=0;                   //关中断
    if(timeover==1)             //比赛结束标志,必须一节结束后才可以交换,中途不能交换场地
    {
       TR1=0;               //关闭T1计数器
       alam=1;                  //关报警
       AorB=~AorB;              //开启交换
       minit=15;            //并将时间预设为15:00
       second=0;
    }
    EX1=1;                   //开中断
}
*/
//*********************************中断服务函数**************************************
void  time0_int(void) interrupt 1
{
    TL0=0xb0;
    TH0=0x3c;
    TR0=1;
    count++;
    if(count==10)
    {
       halfsecond=0;
    }
    if(count==20)
    {
       count=0;
       halfsecond=1;
//     if(second>0)
       {
           second--;
           if(second<0)
           {
              if(minit>0)
              {
                  second=59;
                  minit--;
              }
              else
              {
                  second=0;
                  timeover=1;
                  playon=0;
                  TR0=0;
                  TR1=1;
              }
           
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表