资源描述
学号:
本科毕业设计
学 院
专 业
年 级
姓 名
论文题目 篮球比赛计分器设计
指导教师 职称
年 月 日
目 录
摘要 1
Abstract 1
1绪论 2
1.1篮球比赛计分器设计的研究的背景 2
1.2研究内容 2
1.3设计目标 3
2方案选择与论证 3
2.1方案一 3
2.2方案二 4
2.3方案三 5
2.4方案选择 5
3单元电路设计 6
3.1单片机简述 6
3.2振荡电路 6
3.3控制按键电路 7
3.4复位电路 7
3.5报警时钟电路 8
3.6数码管显示电路 8
4软件设计 10
4.1 主流程图 10
4.2 源程序代码 11
5调试结果及分析 11
6 结论 12
参考文献 13
篮球比赛计分器设计
摘要:篮球比赛计分器主要由计分器、计时器等多种电子器件组成。篮球比赛计分器主要实现的基本功能有:开始和暂停、比赛时间倒计时、24秒倒计时、加分操作、蜂鸣报警、时间和比分显示的基本功能。本设计具备比赛过程中数据显示的稳定性及准确性;在比赛进入倒计时24秒之后,该系统会有报警声,即该场比赛结束。随着单片机在各个领域的应用,篮球比赛积分器系统也应用单片机为主要芯片。在用单片机控制的LED七段显示器计时计分以便于在比赛中提高稳定性和准确性。本设计是基于单片机AT89C51的篮球比赛计分系统。利用三个四位8段数码管作为显示器件,有时间显示,每一次进攻24秒显示,每一节分钟倒计时显示,双方比分显示。
关键词:篮球比赛;计分器;24秒倒计时
The design of basketball game scoring device
Abstract:Basketball game scoring devices mainly includes scoring devices, calculagraph, and other electronic devices. The basic functions of a basketball game
are: start and pause, the game countdown, a 24-second countdown, adding scores, buzzing alarm, displaying time and scores. This design is stable and accurate. When the game is 24 seconds left, the alarm will ring. Then it means game is over. With the application of SCM in various fields, the basketball game system also adopts SCM as the main chip. By using the LED seven-segment display controlled by SCM, it will be more stable and accurate in the game. This design is mainly talking about the scoring system which is based on SCM AT89c51. Using three four eight-segment as display devices, it shows time, every 24 seconds, every minute countdown, scores between two sides.
Key words: Basketball game, scoring device, 24 seconds countdown
1绪论
1.1篮球比赛计分器设计的研究的背景
篮球比赛是根据队员在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计分系统是一种得分类型的系统。篮球比赛的计分系统由计时器、积分器等多种电子设备组成,同时,根据现在篮球比赛要求,完善的篮球比赛计分系统设备应能够与赛场得分处理,赛场大屏幕,电视转播车等多种设备相联,以便于是比赛更容易让观众处于现场的感觉。同时,随着单片机在各个领域的广泛应用,利用单片机为主要芯片来设计篮球比赛计分系统。
由于单片机的高集成度,控制功能强,电压低,特别是它具有体积不大,质量轻,能量消耗低,价格低廉,高可靠性,容易扩展,便于生产便携式产品等多种优点,使单片机迅速得到了广泛应用,目前已经成为测量控制应用系统中的首选和新电子产品的重要部位[1]。由于单片机的性能极高,单片机已广泛应用于各大电子产品产业。篮球比赛计分器就是以单片机为核心的计分系统。
1.2研究内容
本设计是基于单片机AT89C51的篮球比赛计分系统。利用三个四位8段数码管作为显示器件。本设计是简单模拟篮球比赛计时计分器的设计,有时间显示,每一次进攻24秒显示,每一节分钟倒计时显示,双方比分显示。
12个共阳数码管分别是:前六位为当前时间显示,第七八位是进攻24秒时间显示,第九到十二位是每节比赛倒计时显示,时间精确到秒。本设计有四种显示模式,00.00.00.24计时模式,000-000计分模式,H000-000给前一个球队加分模式,000-H000给后一个球队加分模式;接通电源后,进入00.00.00.24,12.00模式,等待比赛开始,第三个键按下进入比赛倒计时模式,按第二次进入计分显示模式,按第三次又进入计时等待模式,等待下一轮开始;简单一点说就是:依次按第三个键分别是:等待-开始-计分-等待三种模式循环。在000--000计分模式下,第一个键按下进入H000-000模式,第二个键加分,第三个键减分,再按第一个键进入正常计分模式000-000;在000-000计分模式下, 第二个键按下进入000-H000模式,第一个键加分,第三个键减分,再按第二个键进入正常计分模式000-000;24秒定时时间到,报警3秒停,24秒倒计时复位,进入等待状态。
1.3设计目标
(1)能够准确记录整个比赛过程中的分数;
(2)能够准确记录整个比赛过程中的时间;
(3)在比赛结束时,能够发出警报声。
2方案选择与论证
篮球比赛主要实现的基本功能有:开始、比赛时间倒计时、24秒倒计时、加分操作、减分操作、蜂鸣报警、时间和比分显示的基本功能。因此,必须要有相关的输入模块、控制模块和显示模块等。
对于输入模块,有独立按键输入和矩阵式按键输入。但是两者相比较而言,矩阵式按键输入的组建模式灵活,可用于输入更多的控制对象。
对于控制模块,可以利用数字芯片进行控制,也可以利用单片机进行控制,显然,单片机控制方式是很高效的。
对于显示模块,有LED数码管显示和LCD液晶显示,与LED数码管相比,LCD体积大,能耗大,并且价格高昂,不太适合学生选择使用,所以选择使用LED数码管。
2.1方案一
用石英晶体振荡器或555定时器产生稳定的校时信号,555定时芯片是一种中规模集成电路,可以构成多谐振荡器脉冲产生与整形电路,在自动控制、定时、防盗报警器有着广泛的应用,并且操作简单,所以选用555定时器来完成报警电路和1秒脉冲[2]。运用了74LS157,74LS190,74LS00,74LS20及555定时器基本元件。此类元件性价比合适,使用不难,大部分基本功能都可以实现,是工程中的基本元件。其系统框图如图1所示:
图1 系统框图
2.2方案二
利用8255A对AT89C51单片机的P0端口扩展来实现。PA口为计时和计分的段控,PB口为计分的位控,PC口为计时显示的位控、报警、暂停和刷新,单片机的P3口为控制位,控制着开始,P1口为键盘输入端口[3]。
该设计使用8255A经P0口扩展为三个可用的8位端口,经8255A扩展后,可用的端口增多,起到了更好的扩展功能,利用74LS373对段和位分别进行锁存,增强了系统的稳定性,本方案的设计的具体电路如下图2所示:
图2 8255A扩展电路图
2.3方案三
该方案以单片机为核心,作为控制模块,并以LED数码管作为显示模块,通过单片机自带的时钟电路和相应的定时器来实现计时[4]。由单片机的P0口接显示器件,P1口接键盘,P2口接译码电路,P3口接中断处理电路,报警电路接在未用的I/O口线上[5]。基于单片机AT89C51篮球比赛计分器设计的系统结构图如图3:
图3 AT89C51设计系统框图
2.4方案选择
方案一的实现要用到多块数字芯片,数字电路的一个大的缺点就是电路随着信号的改变会产生冲击电流,稳定性相对而言比较差。方案二对于电路焊接比较麻烦,对于学生来讲不太容易实现。方案三设计简单,容易操作。综上所述,三种方案中,方案三对于学生更容易实现,所以选择方案三。
本系统利用单片机AT89C51为该设计的主要芯片。利用12个7段共阳LED作为显示器件,12个共阳数码管分别是:前六位当前时间显示,第七八位是进攻24秒时间显示,第九到十二位是每节比赛倒计时显示,时间精确到秒[6]。进入倒计时24秒之后,蜂鸣器会发出警报声,以表示比赛结束。其次,为了配合计时器和计分器同时运用恰当,设置了三个按键,根据案件的特定次数来显示相应的得分情况以及比赛时间[7]。
3单元电路设计
3.1单片机简述
图4 是AT89C51的引脚图,引脚说明如下
图4 51单片机系列引脚图
VCC:AT89C51电源正极输入,接+5V电压。
GND:电源接地端。
XTAL1:接外部晶振的一个引脚。在单片机内部,它是一反相放大器输入端,这个放大器构成了片内振荡器。它采用外部振荡器时,些引脚应接地[8]。
XTAL2: 接外部晶振的一个引脚。在片内接至振荡器的反相放大器输出端和内部时钟发生器输入端[9]。当采用外部振荡器时,则此引脚接外部振荡信号的输入。
3.2振荡电路
本次设计要使用到AT89C51单片机的时钟振荡功能。AT89C51中有一个用于构成内部震荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入和输出端[10]。这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自激振荡器。AT89C51的时钟主要分为两种方式:第一种是片内时钟振荡,另一种是外部时钟方式。本次设计采用的是第一种片内时钟振荡方式,通过在18和19端口外接石英晶体和振荡电容组成,这样既可产生本设计所需的时钟[11]。振荡电路如下图5所示:
图5 振荡电路
3.3控制按键电路
控制按键电路如下图6所示, 键S3按下进入比赛倒计时模式,按第二次进入计分显示模式,按第三次又进入计时等待模式,等待下一轮开始;简单一点说就是:依次按键S3分别是:等待--开始--计分--等待三种模式循环。在000-000计分模式下,S1按下进入H000-000模式,S2加分,S3减分,再按S1键进入正常计分模式000-000;在000-000计分模式下, S2键按下进入000-H000模式,S1键加分,S3键减分,再按S2键进入正常计分模式000-000;24秒定时时间到,报警3秒停,24秒倒计时复位,进入等待状态。
图6 控制按键电路
3.4复位电路
本系统采用的复位电路是上电加按钮电平复位,在系统刚接通电路时,可令单片机自动复位;在系统运行中,可以通过开关使单片机复位[12]。复位电路如下图7所示:
图7 复位电路
3.5报警时钟电路
报警时钟电路如下图8所示,当一次进攻在进入24秒倒计时之后,蜂鸣器会发出警报声,扬声器的时间为3秒钟,表示比赛时间结束。报警时钟电路如下图8所示:
图8 报警时钟电路
3.6数码管显示电路
(1) 数码管显示原理
数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。我们分别把他命名为A,B,C,D,E,F,G,H。
图9 数码管内部结构图
假设我们要显示一个数字2, 那么 A、B、G、E、D这5个段的发光管亮就可以了,C、F、H不亮,同时由于接法为共阳接法,那么为低电平是亮,高电平是灭。从高往低排列, P0.7-P0.0写成二进制为10100010, 把他转化为16进制则为A2H[13]。
数码管的接口有静态接口和动态接口两种。静态接口为固定显示方式,无闪烁,其电路可采用一个并行口接一个数码管,数码管的公共端按共阳接电源,本次课程设计由于所需数码管不多,故可用些种方法接线。这种接法占用接口多,仅能接少量数码管[14]。
动态接口采用各数码管循环轮流显示的方法,当循环显示的频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出,另一接口完成各数码管的轮流点亮[15]。
多位一体的数码管原理和单个的差不多。下表为数码管显示数字的表格:
表1 共阳极数码管显示
显示
P0.7
小数点
P0.6
G
P0.5
F
P0.4
E
P0.3
D
P0.2
C
P0.1
B
P0.0
A
16进制代码
0
1
1
0
0
0
0
0
0
COH
1
1
1
1
1
1
0
0
1
F9H
2
1
0
1
0
0
1
1
0
A2H
3
1
0
1
1
0
0
0
0
B0H
4
1
0
0
1
1
0
0
1
99H
5
1
0
0
1
0
0
1
0
92H
6
1
0
0
0
0
0
1
0
82H
7
1
1
1
1
1
0
0
0
F8H
8
1
0
0
0
0
0
0
0
80H
9
1
0
0
1
0
0
0
0
90H
(2)12个共阳数码管分别是:前六位为当前时间显示,第七八位是进攻24秒时间显示,第九到十二位是每节比赛倒计时显示,时间精确到秒。有四种显示模式,00.00.00.24计时模式,000-000计分模式,H000-000给前一个球队加分模式,000-H000给后一个球队加分模式。
图10 数码管电路连接图
4软件设计
4.1 主流程图
图11 系统流程图
4.2 源程序代码
见附录1
5调试结果及分析
硬件电路图:
图12 系统硬件电路图
生成PCB图:
图13 系统PCB图
本设计主要实现的基本功能有:开始和暂停、比赛时间倒计时、24秒倒计时、加减分操作、蜂鸣报警、时间和比分显示的基本功能。基于理论上,上电之后,LED显示00.00.00.24,12.00模式;等待比赛开始,按下第三个键进入比赛倒计时模式,按第二次进入计分显示模式,按第三次又进入计时等待模式,等待下一轮开始;依次按第三个键分别是:等待--开始--计分--等待三种模式循环。在000--000计分模式下,第一个键按下进入H000-000模式,即给A队计分,按下第二个键给A队加分,按下第三个键给A队减分;再按第一个键进入正常计分模式000-000;在000-000计分模式下, 第二个键按下进入000-H000模式,即给B队计分,按下第一个键给B队加分,按下第三个键给B队减分,再按第二个键进入正常计分模式000-000;24秒定时时间到,报警3秒停,24秒倒计时复位,进入等待状态。在调试过程中,可能由于线路的连接问题 或者是程序没有设置好,导致LED数字显示不是特别准确,但是在本设计中要求的基本功能:开始、两队加分减分、比赛时间倒计时、24秒倒计时、蜂鸣报警基本上都可以实现,所以还是基本上达到设计要求的。
6 结论
从本次设计中,主要使用AT89C51芯片作为核心元件,结合外部的显示电路及键盘控制电路,构成了一个篮球比赛计分器。整体电路主要由AT89C51芯片、键盘控制、计分显示器和计时显示器四部分组成。设计中主要使用keil软件和proteus软件。Keil软件主要用来对C语言程序进行编译。Proteus软件主要用来对硬件电路进行仿真。整个设计可以实现计分显示、计时显示和比赛结束报警等功能。此次设计也使我对单片机工作原理、功能有了宏观的了解,并对单片机汇编程序的应用有了新的进一步认识。在本次设计之前,觉得这个设计是个比较简单的设计,但是在设计过程中发现自己有很多不足,动手能力过差,主要原因是我们没有经常动手设计过电路。由于设计的计划没有安排好,设计的时间较为仓促,尤其是在硬件的调试过程出现了很大问题。但是,经过我的不懈努力,结果还是很可观的,篮球比赛计分器的基本功能都可以实现。
对于篮球比赛计分器设计,还有一点改进之处,就是在单节比赛时间小于1分钟时,倒计时显示可以精确到0.1秒,这样可以更直观的看到比赛最后阶段的时间变化,也能使比赛更激烈,分秒必争。
17
参考文献
[1]王福瑞.单片微机测控系统设计大全[M].北京:北京航空航天大学出版社,2004:89-95.
[2]阎石.数字电子技术基础(第五版)[M].北京:高等教育出版社,2005:477--495.
[3]Mt Prospect.MCS-51 Family of Microcontrollers Architectural Overview,September 1993:26-45.
[4]Jonshon. high-speed digital design[M].Prentice Hall,1993:178-192.
[5] Chengying Hua. Microelectronics Circuit Analysis and Dessign (Third Edition)[M].Tsinghua University press,2007:185-204.
[6]吴飞青.单片机原理与应用实践指导[M].北京:机械工业出版社,2009:123-134.
[7]罗会昌.电工电子技术实验与课程设计[M].合肥:中国科学技术大学出版社,1995:156-178.
[8]董凤锦.毕业设计指导(电类)[M].西安:西安电子科技大学出版社,2005:65-73.
[9]赵淑范,王宪伟等.电子技术实验与课程设计[M].北京:清华大学出版社,2006:201-234.
[10] 董少明.单片机原理与应用技术[M].北京:北京理工大学出版社,2009:56-63.
[11]梅丽凤,王艳秋.单片机原理与接口技术[M].北京:清华大学出版社,2006:83-103.
[12]谢宜仁.单片机硬件接口电路及实例解析[M].北京:电子工业出版社,2009:147-153.
[13]李东生.Protel99 SE电路设计技术入门与应用[M].第一版.北京:电子工业出版社,2002:179-192.
[14]谢宜仁.单片机硬件接口电路及实例解析[M].北京:电子工业出版社,2009:69-81.
[15]周航慈.单片机应用程序设计技术[M].北京:北京航空航天大学出版社,2002:56-68.
附录1
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit P3_4=P3^4;//改分钟
sbit P3_5=P3^5;//改小时
sbit P3_6=P3^6;//时间暂停
sbit P3_7=P3^7;//报警
sbit P3_0=P3^0;//条件信号
sbit P3_1=P3^1;//条件信号
sbit P3_2=P3^2;//条件信号
sbit P3_3=P3^3;//条件信号
uchar a=0,b=0,c=0,d=0,e=12,f=0,g=0,h=0,k=0,s24=24;
uchar disp[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//定义12个显示单元
uchar dispbit[]={0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xfe,0xfd,0xfb,0xf7};//P1、P2口扫描代码
uchar dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x89};//共阳数码管显示代码
uchar dispcode1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
////////////////////////////////////////////////////////////////
void display1(void){
uchar i,j;
disp[5]=b/10;
disp[4]=b%10;
disp[3]=a/10;
disp[2]=a%10;
disp[1]=s24/10;
disp[0]=s24%10;
disp[7]=d/10;
disp[6]=d%10;
disp[11]=e/10;
disp[10]=e%10;
disp[9]=k/10;
disp[8]=k%10;
for(i=0;i<12;i++){
if(i==2|i==4|i==6|i==10)P0=dispcode1[disp[i]];
else P0=dispcode[disp[i]];
if(i<8){P1=0xff;P2=dispbit[i];}///////费事可是不少,第一次这样写if(i<8)P2=dispbit[i];elseP1=dispbit[i];得出一个结论,开另一扫描时关掉现用的扫描
else {P2=0xff;P1=dispbit[i];}
for(j=0;j<255;j++);
}
}
//////////////////////////////////////////////////////////////////
void display2(void){
uchar i,j;
disp[7]=f/100;//计分百位
disp[6]=f%100/10;//计分十位
disp[5]=f%100%10;//计分个位
disp[3]=10;//显示为"-"
disp[4]=10;//显示为"-"
disp[2]=g/100;//计分百位
disp[1]=g%100/10;//计分十位
disp[0]=g%100%10;//计分个位
disp[11]=e/10;
disp[10]=e%10;
disp[9]=k/10;
disp[8]=k%10;
for(i=0;i<12;i++){
if(i==10)P0=dispcode1[disp[i]];//个位带小数点显示
else P0=dispcode[disp[i]];
if(i<8){P1=0xff;P2=dispbit[i];}
else {P2=0xff;P1=dispbit[i];}
for(j=0;j<255;j++);
}
}
//////////////////////////////////////////////////////////////////
void display3(void){
uchar i,j;
disp[7]=f/100;//计分百位
disp[6]=f%100/10;//计分十位
disp[5]=f%100%10;//计分个位
disp[3]=11;//显示为"H"
disp[4]=10;//显示为"-"
disp[2]=g/100;//计分百位
disp[1]=g%100/10;//计分十位
disp[0]=g%100%10;//计分个位
disp[11]=e/10;
disp[10]=e%10;
disp[9]=k/10;
disp[8]=k%10;
for(i=0;i<12;i++){
if(i==10)P0=dispcode1[disp[i]];//个位带小数点显示
else P0=dispcode[disp[i]];
if(i<8){P1=0xff;P2=dispbit[i];}
else {P2=0xff;P1=dispbit[i];}
for(j=0;j<255;j++);
}
}
//////////////////////////////////////////////////////////////////
void display4(void){
uchar i,j;
disp[7]=f/100;//计分百位
disp[6]=f%100/10;//计分十位
disp[5]=f%100%10;//计分个位
disp[3]=10;//显示为"-"
disp[4]=11;//显示为"H"
disp[2]=g/100;//计分百位
disp[1]=g%100/10;//计分十位
disp[0]=g%100%10;//计分个位
disp[11]=e/10;
disp[10]=e%10;
disp[9]=k/10;
disp[8]=k%10;
for(i=0;i<12;i++){
if(i==10)P0=dispcode1[disp[i]];//个位带小数点显示
else P0=dispcode[disp[i]];
if(i<8){P1=0xff;P2=dispbit[i];}
else {P2=0xff;P1=dispbit[i];}
for(j=0;j<255;j++);
}
}
//////////////////////////////////////////////////////////////////
void t0(void) interrupt 1 using 1//定是50ms
{c++;
TH0=0x3c;
TL0=0xb0;
}
//////////////////////////////////////////////////////////////////
void t1(void) interrupt 3 using 1//定时50ms
{h++;
TH1=0x3c;
TL1=0xb0;
}
//////////////////////////////////////////////////////////////////
void main(void)
{ uint l,m;
uchar tj=0;
TMOD=0x11;//用定时器0,1定时50MS
TH0=0x3c;
TL0=0xb0;
TH1=0x3c;
TL1=0xb0;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
EA=1;
P3_7=P3_0=P3_2=P3_3=1;//初始化置1
while(1){
if(P3_6==0){P3_7=0;while(P3_6==0);P3_7=1;h=0;tj++;if(tj==3)tj=0;}
if(P3_5==0){P3_0=~P3_0;while(P3_5==0);TR1=1;h=0;}
if(P3_4==0){P3_3=~P3_3;while(P3_4==0);TR1=1;h=0;}
if(tj==2){
if(c==20){c=0;a++;}//累计时间继续走
if(a==60){a=0;b++;}
if(b==60){b=0;d++;}
if(d==24)d=0;
if(b==60)b=0;
display2();
s24=24;
while(P3_0==0){display3();
if(c==20){c=0;a++;}//累计时间继续走
if(a==60){a=0;b++;}
if(P3_4==0){while(P3_4==0);h=0;f++;}
if(P3_5==0){while(P3_5==0);P3_0=1;h=0;}
if(P3_6==0){while(P3_6==0);h=0;f--;}}
while(P3_3==0){display4();
if(c==20){c=0;a++;}//累计时间继续走
if(a==60){a=0;b++;}
if(P3_4==0){while(P3_4==0);P3_3=1;h=0;}
if(P3_5==0){while(P3_5==0);h=0;g++;}
if(P3_6==0){while(P3_6==0);h=0;g--;}}
}
if(tj==0||tj==1){//
display1();
if(h==20){h=0;s24--;k--;
if(k==255){k=59;
if(e==0){e=12;P3_7=0;for(l=0;l<20;l++)for(m=0;m<10000;m++);P3_7=1;}e--;
}}
if(c==20){c=0;a++;}
if(s24==0){TR1=0;P3_7=0;for(l=0;l<20;l++)for(m=0;m<10000;m++);P3_7=1;tj=0;s24=24;h=0;}
if(a==60){a=0;b++;}
if(b==60){b=0;d++;}
if(d==24)d=0;
if(b==60)b=0;
if(P3_4==0){while(P3_4==0);d++;}
if(P3_5==0){while(P3_5==0);b++;}
}
}}
展开阅读全文