找回密码
 立即注册

QQ登录

只需一步,快速开始

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

篮球赛电子计时记分牌单片机课程设计说明书下载(word格式)

[复制链接]
跳转到指定楼层
楼主
ID:303769 发表于 2018-4-9 20:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
篮球赛电子记分牌
摘要:篮球赛电子计时记分牌是根据篮球比赛特点设计的独立的信息采集、分配、评判和显示的系统,能实现比赛时间和分数的实时、准确、快捷处理和呈现。本设计原理简单,主要采用AT89C51单片机作为微控制器,集合控制器、lCD液晶显示和报警,控制器控制记分牌的工作状态,通过lCD液晶显示和报警来反馈信息。本设计在充分考虑了篮球比赛的实际情况基础上设计,具有友好的人机交互接口,并且可以防止人为误操作造成的不良后果,具有一定的实用性。
目录
1绪论
1.1课题背景及研究意义
1.2设计任务与要求
1.3 单片机在体育赛事计分的应用
1.4方案设计说明
2系统概述
2.1显示模块
2.2 按键控制模块
2.3 报警模式
2.4 总体硬件组成框图
3系统硬件设计
3.1 主控电路设计
3.2  LCD1602显示模块的硬件设计
3.2 按键控制模块
3.3 蜂鸣器报警模块的硬件设计
4 软件控制系统
4.1主程序设计
4.2仿真结果
5 结论
参考文献
附录1:
附录2:
1绪论1.1课题背景及研究意义
目前球场记分牌在传统操作模式下,采用记分员手动翻动记分牌记分,工作方式单一。由于种种弊端,电子记分板已经开始在一些大型的体育场流行起来,不仅发展速度迅猛并会逐渐取代传统的电子记分牌。电子记分板根据篮球比赛的特点,采用单片机为核心控制LED数码管,具有亮度高、可视性好、功耗小、使用寿命长等优点;具有性能稳定,尺寸适中,运输安装方式灵活,物美价廉等特点,特别适用于小型篮球体育馆和露天运动场。
1.2设计任务与要求
 设计题目:篮球赛电子记分牌  
   设计要求:  
(1)分别设计篮球比赛甲乙两个队的记分牌;
(2)能实现两张记分牌的切换;
(3)能按照篮球赛记分规则记分并显示;
(4)将原有的一个指示灯基础上进一步改进为两个指示灯,作分别指示。
1.3 单片机在体育赛事计分的应用
传统的篮球比赛计分是由工作人员人工翻动记分牌实现的,而比赛的时间则由工作人员计表控制。由于人为因素,人工操作的比赛计分板难免会出现误差。而作为微型控制系统的单片机具有集成度高,功能强,通用性好,特别是它具有体积小,重量轻,能耗低,价格便宜,可靠性高,抗干扰能力强和使用方便等独特的优点,使单片机迅速得到了推广应用,目前已经成为测量控制应用系统中的
优选机种和新电子产品的关键部位。]
3[因此单片机在体育比赛记分牌的应用也成
为了一种不可避免的趋势。
1.4方案设计说明
设计方案之前,得先分解设计任务。本次的设计任务是篮球记分牌,据常识,篮球记分牌应有分别给两队加分,暂停,显示屏既要显示时间又要显示分数。在进行设计之前,应自己提出几个问题,待问题回答之后。基本功、的设计方案就出来了。在设计之前我提出了一下几个问题:
a:硬件部分如何控制给A对B对加分,如何控制时间与分数的显示?场地交换的时候又是如何实现分数显示交换的?应该如何连接硬件,在硬件上设置控制端,控制端与单片机各引脚之间的连,如何选择?
  b:单片机只有一个CPU,如何实现即要扫描按键,又要显示比分,显示时间。数码管工作的本质是将要显示的数据的字型码送给他,如何采集到变化的分数和时间并送给数码管。用查表吗?
c:分数时间显示都应该有对应的液晶显示,如何控制液晶显示,使时间和分数都显示在相对应的液晶显示屏上?加分与倒计时在程序中最本质的东西是什么,如何用程序来说明这样的事件,各事件之间又是如何联系的。
虽然这些问题看似很普通,似乎在设计过程中都要面对这样的问题,何不事先就解决这些问题呢,在逐一回答这些问题的同时,该任务的设计方案已见雏形。以下就是该方案的详细内容以及我问题的答案。
  
2系统概述
本系统采用单片机AT89C51为控制核心,系统主要包括显示模块、按键控制模块、报警模块等;
2.1显示模块
方案一:采用七段码数码管显示。数码管是指将所有发光二极管的一极接到一起形成公共极,因此数码管有共阴共阳之分。以共阳数码管为例,共阳数码管在应用时应将公共极接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。因此每个数码管有9个接口。数码管的驱动方式有静态扫描和动态扫描两种形式。静态扫描编程简单,但电路复杂;动态扫描变成复杂,而且还需要使用其他芯片。
方案二:采用1602液晶显示。液晶的物理特性是:当通电时导通,排列变得有秩序,是光线容易通过,不通电时排列混乱,阻止光线通过。相比于数码管,LCD1602不仅可以显示的图形符号更丰富,而且具有轻薄、无辐射等优点。
比较以上两种方案,系统设计中采用方案二。

2.2 按键控制模块
方案一:采用矩阵键盘。矩阵键盘的长各分接口分别于单片机的I/O口连接,可以通过连接数量较少的I/O口,扩展出多个按键。但其缺点是电路更复杂,编程更麻烦。
方案二:采用独立按键。每个独立按键与单片机I/O连接,虽然不能节省I/O口,但电路简单、编程容易
比较以上两种方案,由于本系统只需要4个按键,因此选者方案二。
2.3 报警模式
   报警模块中,信号由单片机输出经PNP型三极管放大后进入蜂鸣器发出声响进行比赛时间的提示功能。
2.4 总体硬件组成框图
图1-1 系统基本方框图
3系统硬件设计3.1 主控电路设计
AT89S51为 ATMEL 所生产的一种低功耗、高性能CMOS8位微控制器,在本系统中,AT89S51单片机内部的功能单元已经能够满足系统设计需要,不需要系统扩展。
AT89S51具有以下的特点:
  • CPU与MCS-51 兼容
  • 1000写/擦循环
  • 8K字节可编程FLASH存储器
  • 全静态工作:0--33MHz
  • 三级加密程序存储器
  • 256*8位内部RAM
  • 32个可编程I/O线
  • 三个16位定时器/计数器
  • 8个中断源
  • 可编程串行通道
3.2  LCD1602显示模块的硬件设计
1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块
图1-2液晶显示模块电路
其中A代表的是甲队记分牌、B代表乙队记分牌
3.2 按键控制模块
    按键控制模块采用4个独立按键,K1、K2、K3、K4分别于单片机的P1^0、P1^1
P1^2、P1^3连接,每个按键的另一端直接与地相连接,因此是低电平有效。其中K1、K2、K3、K4表示暂停、刷新24秒、A加1分、B加1分
图1-3按键控制模块电路图
3.3 蜂鸣器报警模块的硬件设计
蜂鸣器报警模块由一个蜂鸣器和一个PNP型的三极管组成,接单片机的P2^7
图1-4报警模块模块电路图
4 软件控制系统4.1主程序设计
本系统中单片机的主要功能就是利用内部的定时器计时,并随时接受控制模块的信息,将比赛的得分和剩余时间显示在1602液晶上。
程序流程图:
图1-5程序流程图
4.2仿真结果
1.如图4-3所示。点击K3表示给A加分
按下K4表示给B加分
5 结论
这一次的课程设计,我的课题是《篮球赛电子计时记分牌》。由于这一系统包含单片机基础、数码管动态显示、矩阵键盘扫描、定时器和中断等知识体系,涉及面较广,通过这一课程设计,可以更好地检测和巩固学到的知识,加深自己对电子世界的认识。
在本次的设计中,针对每一个模块都曾有好几个方案,在反复比较论证之后,才得出最佳方案并应用于系统。在各个模块的设计中,我除了得到了正确的结果之外,更多的是面对错误和失败,而这些错误大多数是由于自己对该部分电路原理掌握的不够透彻而造成的。通过查阅资料,连接、调试电路和程序,我得出了一下几条心得体会,以后在设计过程中可以借鉴:
在Proteus里,电路状态不正常且不易发现问题时,使用电流计和电压计可直观检测电路动态变化,这也是Proteus里非常好用的一个功能;


附录1:
仿真效果图
PBC效果
三维效果图
附录2:

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3.   #define uint unsigned int
  4.    uchar code tab1[]="A :";
  5.     uchar code tab2[]="B";
  6.               uchar code tab3[]="   GAME  OVER   ";  //比赛结束时显示
  7.                 uchar code tab4[]="   A     B      ";  //比赛结束时显示
  8.                  sbit lcden=P2^2;
  9.                   sbit lcdrw=P2^1;   //1602液晶的3个端口
  10.                             sbit lcdrs=P2^0;
  11.                             sbit key1=P1^0;   
  12.                             sbit key2=P1^1;       //四个按键
  13.                             sbit key3=P1^2;
  14.                             sbit key4=P1^3;
  15.                             sbit Bell=P2^7;   //蜂鸣器
  16.                             uint keyflag,flag;       //标志位
  17.                             uchar i,num,count;
  18.                               uchar sec,min,miao;
  19.                                uchar Ascore,Bscore;     //两队得分
  20.                                 /*******************液晶函数****************************/
  21.                                           void delay(uint z)       //液晶延时函数
  22.                                           {  uint x,y;
  23.                                           for(x=z;x>0;x--)
  24.                                             for(y=110;y>0;y--);
  25.                                              }
  26.                                              void write_com(uchar com)     //命令子函数
  27.                                                {  lcdrs=0;                 //接受指令
  28.                                                            P0=com;                //给P0口送指令码
  29.                                                            delay(5);
  30.                                                             lcden=1;                //E变为高电平
  31.                                                                       delay(5);                //在此延迟期间,将指令送入
  32.                                                                          lcden=0;                //E变为低电平,高脉冲结束
  33.                                                                          }
  34.                                           void write_dat(uchar date)  //数据子函数data
  35.                                                                                        {
  36.                                                                                        lcdrs=1;                //接受数据
  37.                                                                                         P0=date;                //给P0口送数据
  38.                                                                                                   delay(5);
  39.                                                                                                   lcden=1;                //E变为高电平
  40.                                                                                                   delay(5);                //在此延迟期间,将数据送入
  41.                                                                                                     lcden=0;                //E变为低电平,高脉冲结束
  42.                                                                                                      }
  43. void write_time(uchar add,uchar date)    //写入时间函数
  44. {
  45. uchar shi,ge;
  46. shi=date/10;
  47. ge=date%10;
  48. write_com(0x80+add);
  49.    write_dat(0x30+shi);
  50.      write_dat(0x30+ge);
  51.                 }
  52. void write_miao(uchar add,uchar date)    //写入24秒函数
  53. {
  54. uchar shi,ge;
  55. shi=date/10;
  56. ge=date%10;
  57.   write_com(0x80+0x40+add);
  58.     write_dat(0x30+shi);
  59.               write_dat(0x30+ge);
  60.               }
  61. void write_Ascore(uchar add,uchar date)    //写入A队得分函数
  62. {
  63. uchar bai,shi,ge;
  64.   bai=date/100;
  65.    shi=date/10%10;
  66.     ge=date%10;
  67.               write_com(0x80+add);
  68.                 write_dat(0x30+bai);
  69.                 write_dat(0x30+shi);
  70.                  write_dat(0x30+ge);
  71.                  }
  72.                  void write_Bscore(uchar add,uchar date)    //写入B队得分函数
  73.                   {
  74.                             uchar bai,shi,ge;
  75.                               bai=date/100;
  76.                                shi=date/10%10;
  77.                                ge=date%10;
  78.                                 write_com(0x80+0x40+add);
  79.                                           write_dat(0x30+bai);
  80.                                           write_dat(0x30+shi);
  81.                                             write_dat(0x30+ge);
  82.                                              }
  83. void write_score(uchar add,uchar date)    //比赛结束写入得分函数
  84. {  uchar bai,shi,ge;
  85. bai=date/100;
  86. shi=date/10%10;
  87. ge=date%10;
  88.   write_com(0x80+0x40+add);
  89.    write_dat(0x30+bai);
  90.     write_dat(0x30+shi);
  91.               write_dat(0x30+ge);
  92.               }
  93.               void delay_Bell(uint z)   //蜂鸣器延时函数
  94.               {
  95.               uint x,y;  for(x=z;x>0;x--)  for(y=255;y>0;y--);
  96.               }
  97.               void init() //初始化函数
  98.                 {
  99.                  Bell=1;
  100.                   keyflag=0;
  101.                             flag=0;
  102.                             min=12;
  103.                             sec=0;
  104.                             miao=25;
  105.                               Ascore=0;
  106.                               Bscore=0;
  107.                               lcdrw=0;
  108.                                lcden=0;       //E的初始值为低电平,后面的程序给高电平从而满足E为高脉冲
  109.                                 write_com(0x38);    //写入显示模式指令
  110.                                           write_com(0x0e);    //显示是否打开以及光标的设置
  111.                                           write_com(0x06);    //地址指针的加减和整屏是否移动
  112.                                             write_com(0x01);    //清屏指令
  113.                                              write_com(0x80+0x00);      //显示字符的初始位置
  114.                                               for(num=0;num<16;num++)
  115.                                                         { write_dat(tab1[num]); }
  116.                                                           write_com(0x80+0x40);      //起始地址为53,将字符调到了第二行
  117.                                                           for(num=0;num<2;num++)
  118.                                                           { write_dat(tab2[num]); }
  119.                                                            write_Ascore(2,Ascore);
  120.                                                            write_Bscore(2,Bscore);
  121.                                                             TMOD=0x01;
  122.                                                                       TH0=(65536-50000)/256;
  123.                                                                         TL0=(65536-50000)%256;
  124.                                                                          EA=1; ET0=1;
  125.                                                                            TR0=1;  //开定时器
  126.                                                                                       }
  127. void keyscan()   //按键函数
  128. {  if(key1==0)  
  129. {   delay(10);
  130.    if(key1==0)  
  131.    { keyflag++;   //键一按下,标志位加一
  132.      while(!key1);  
  133.                 if(keyflag==1)     
  134.                  { TR0=0; }  //关中断     
  135.                   if(keyflag==2)   
  136.                             { TR0=1; keyflag=0;
  137.                             }  
  138.                               }
  139.                                }
  140.                                 if(key2==0)    //刷新24秒
  141.                                           {   delay(5);
  142.                                           if(key2==0)
  143.                                             { while(!key2);
  144.                                             miao=25;
  145.                                             }
  146.                                              }
  147.                                               if(key3==0)
  148.                                                         {   delay(5);
  149.                                                           if(key3==0)  
  150.                                                           { while(!key3);  
  151.                                                             Ascore++; write_Ascore(2,Ascore);
  152.                                                                       } //写入A队得分  
  153.                                                                       }
  154.                                                                         if(key4==0)  
  155.                                                                         {   delay(5);
  156.                                                                           if(key4==0)
  157.                                                                                     {
  158.                                                                                     while(!key4);  
  159.                                                                                       Bscore++; write_Bscore(2,Bscore);
  160.                                                                                         } //写入B队得分
  161.                                                                                        }
  162.                                                                                        }
  163. void main()
  164. {
  165. init();
  166. while(1)
  167. {
  168.   keyscan();
  169.    if(flag==0)
  170.      {
  171.                  write_com(0x80+0x40+7);  //写入第一节 FIR
  172.                     write_dat('F');
  173.                                 write_dat('I');
  174.                                              write_dat('R');
  175.                                                }
  176.               if(flag==1)
  177.               {
  178.                  write_com(0x80+0x40+7);  //写入第二节 SEC  
  179.                   write_dat('S');   
  180.                               write_dat('E');  
  181.                                write_dat('C');
  182.                                  }

  183. if(flag==2)
  184. {  
  185.   write_com(0x80+0x40+7);  //写入第三节 THR
  186.     write_dat('T');  
  187.               write_dat('H');  
  188.                 write_dat('R');
  189.                    }
  190. if(flag==3)
  191. {  
  192.   write_com(0x80+0x40+7);  //写入第四节 FOU
  193.      write_dat('F');  
  194.                 write_dat('O');
  195.                    write_dat('U');
  196.                               }
  197. if(flag==4)  //比赛结束显示”GAME OVER“和两队比分
  198. {   

  199.   TR0=0;
  200.     write_com(0x80);
  201.                 for(i=0;i<16;i++)
  202.                   {   
  203.                             write_dat(tab3[i]);  //"GAME OVER"字符串数组
  204.                                 }
  205.                                             write_com(0x80+0x40);  //起始地址为53,将字符调到了第二行
  206.                                               for(i=0;i<16;i++)  
  207.                                                         {  
  208.                                                            write_dat(tab4[i]);
  209.                                                                  }

  210. write_score(5,Ascore);   //比赛结束写入两队比分
  211.    write_score(11,Bscore);  
  212.     }   
  213.               if(miao>=4&&miao<=5)  //若只剩5秒,蜂鸣器响1秒
  214.               { Bell=0; delay_Bell(510);
  215.               Bell=1; delay_Bell(510);
  216.               }
  217.               }
  218.                 }
  219.                  void timer0() interrupt 1     //定时器
  220.                  {
  221.                  TH0=(65536-50000)/256;
  222. ……………………

  223. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整的Word格式文档51黑下载地址:
电子记分牌说明书.doc (563.37 KB, 下载次数: 21)



评分

参与人数 2黑币 +55 收起 理由
轩轩 + 5 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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