《基于单片机控制的篮球计分系统设计.doc》由会员分享,可在线阅读,更多相关《基于单片机控制的篮球计分系统设计.doc(22页珍藏版)》请在三一办公上搜索。
1、基于单片机控制的篮球计分系统设计Based on Microcontroller basketball scoring system design摘要当下篮球运动越来越受大众欢迎,篮球比赛也越来越多,传统记分牌不够方便,该设计基于89C51单片机设计,可满足一般篮球赛事需要,具有比赛小节计时显示、24秒计时以及比赛分数的实时显示功能,比赛小节时间计时及24秒计时都使用倒计时显示,可有裁判控制开始、暂停,比赛分数使用双方各使用三位七段数码管显示,也由裁判控制分数加减。整个系统结构简单实用,运行稳定,方便操作。关键字:记分牌、单片机、计时SummaryMoment more and more po
2、pular basketball, basketball game more and more, traditional scoreboard is not convenient enough, the design is based on 89C51 microcontroller designed to meet the general needs basketball tournament, with game time display section, 24 seconds chronograph and game scores real-time display function,
3、the game section and 24 seconds time timekeeping timing countdown display is used, the referee can control start, pause, game scores with two sides each with three seven-segment LED display, also controlled by the referee fraction addition and subtraction. The entire system is simple and practical,
4、stable, easy to operate.Keywords: Scoreboard, microcontroller, timing 目录前言3一、系统方案设计41.1 总体方案41.1.1 设计内容41.1.2 设计要求41.2 系统组成4二、硬件设计42.1 AT89C51的介绍42.2 复位电路52.3 键盘控制电路52.4 显示电路6三、软件设计73.1 主程序设计73.2 键盘识别及处理程序设计83.3 显示子程序设计9四、系统调试94.1 软件模拟调试9五、总结9附录11电路原理图:11程序源代码:12前言体育比赛记分系统是对体育比赛过程中所产生的比分等数据进行快速采集记录,
5、加工处理,传递利用的信息系统。根据不同运动项目的不同比赛规则要求,体育比赛的记分系统包括测量类,评分类,命中类,制胜类得分类等多种类型。比如篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的记分系统是一种得分类型的系统。篮球比赛的记分系统由计分器等多种电子设备组成,同时,根据目前高水平篮球比赛要求,完善的篮球比赛记分系统设备应能够与现场成绩处理,现场大屏幕,电视转播车等多种设备相联,以便实现高比赛现场感,表演娱乐观众等功能目标。由于单片机的集成度高,功能强,通用性好,特别是它具有体积小,重量轻,能耗低,价格便宜,可靠性高,抗干扰能力强和使用方便等独特的优点,使单片机迅
6、速得到了推广应用,目前已经成为测量控制应用系统中的优选机种和新电子产品的关键部位。世界各大电气厂家,测控技术企业,机电行业,竞相把单片机应用于产品更新,作为实现数字化,智能化的核心部件。篮球计时计分器就是以单片机为核心的计时计分系统,由计时器,计分器,综合控制器和24秒控制器等组成。一、系统方案设计1.1 总体方案此记分器的设计采用模块化结构,主要由以下2个组成,即键盘模块、以及显示模块。以单片机为核心,配以一定的外围电路和软件,以实现比赛计分器的功能。它由硬件部分和软件部分组成。系统设计方案的硬件电路设计方框图如图所示。硬件电路设计方框图针对该系统的设计,设计过程如下展开:(1)需求分析。了
7、解设计所需功能,并提出相应解决方法。(2)方案选定。根据需求,选择一套可行高效的方案。(3)芯片选择。根据所选的方案,选用合适的芯片、器件、编程语言等。(4)设计原理图。采用选择的方案、器材,查阅资料、绘制电路原理图。(5)程序设计。根据原理图及功能要求绘制程序流程图,并编程调试程序直至程序可满足需求。(6)电路仿真。通过proteus软件仿真电路,改进不足之处。1.1.1 设计内容(1)给甲、乙两队分别设置加分按钮,各按钮按下分别实现给甲、乙队加分。(2)给甲、乙两队分别设置减分按钮,各按钮按下分别实现给甲、乙队减分。(3)设置一个复位按钮,按下实现甲、乙队总分回到初始分及显示。(4)设置计
8、时开始/暂停按钮,实现时间的暂停/开始。(5)设置24秒倒计时启动按钮,按下启动24秒计时。1.1.2 设计要求(1)方案合理、正确,系统稳定、可靠。(2)软件设计要求尽可能精练、简短和运行可靠。(3)硬件电路要求简单明了,以节约成本。1.2 系统组成硬件电路由复位按钮、80C51单片机、键盘和两个12个共阳极数码管、蜂鸣器等组成。软件部分主程序主要由系统初始化段、键盘识别、键值处理、数码管显示、计时子程序组成。二、硬件设计2.1 AT89C51的介绍AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read
9、Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。2.2 复位电路为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电
10、复位。一般微机电路正常工作需要供电电源为5V5%,即4.755.25V。由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器稳定工作时,复位信号才被撤除,微机电路开始正常工作。目前为止,单片机复位电路主要有四种类型:(1)微分型复位电路;(2)积分型复位电路;(3)比较器型复位电路;(4)看门狗型复位电路2.3 键盘控制电路在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个
11、按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。如图所示。矩阵式键盘电路需要的键数比较多时,采用矩阵法来做键盘是合理的。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如下所述。矩阵式键盘的按键识别方法确
12、定矩阵式键盘上何键被按下介绍一种“行扫描法”。行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线
13、交叉处的按键就是闭合的按键。2.4 显示电路显示器采12个共阳极数码管,来实现显示器的动态扫描,动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。显示模块如下图所示:显示模块电路原理图三、软件设计3.1 主程序设计主程序主要由系统初始化段、开中断、键盘识别、键值处理、两个4位共阴极LED显示器扫描显示子程序和中断处理子程序等组成。通过对以上各段和子程序的结合,以实现系统功能。该系统主程序
14、流程图如下图所示。主程序流程图3.2 键盘识别及处理程序设计按键识别及处理程序主要由键盘识别和键值处理组成。其中键盘识别子程序不断地对键盘进行判断是否有键按下。当有键按下时则转到键码处理即甲、乙总分处理子程序对相应按键进行相应处理,即可实现对甲、乙两队总分的计算与处理。键盘如下图所示:键盘电路原理图在时间暂停时,自定义可调节比赛时间,计时过程中可加减两队分数,按下“启动24秒计时”,24秒计时模块开始工作,进行24秒计时,当再次按下时则重新装载24秒计时器并开始计时。按下“复位”,系统初始化至原始状态。3.3 显示子程序设计由于该系统使用的是12位共阳数码管显示,因此显示采用动态扫描显示方法,
15、即由显示器扫描显示子程序控制显示器逐个循环从左至右依次点亮各个显示器。这样虽然在任一时刻只要一个显示器点亮,但是由于人眼具有视觉残留效应,看起来与全部显示器持续点亮效果一样。四、系统调试4.1 软件模拟调试本设计主要是用proteus软件绘图以及伟福软件进行编程仿真的。调试步骤由两个部分组成:首先,确定程序中错误的确切性质和位置;然后,对程序代码进行分析,确定问题的原因,并设法改正这个错误。具体地说,由以下步骤组成:1.从错误的外部表现入手,确定程序中出错的位置;2.分析有关程序代码,找出错误的内在原因;3.修改程序代码,排除这个错误;4.重复进行暴露了这个错误的原始测试以及某些回归测试,以确
16、保该错误确实被排除且没有引入新的错误;5.如果所作的修正无效,则撤消这次改动,重复上述过程,直到找到一个有效的办法为止。五、总结在这次系统设计中,同学之间互相讨论、帮助,有什么不懂的大家在一起商量,发现我们所学的知识实在是有限,不过我们能够充分利用网络的优势去查阅资料。我们在整个设计过程中懂得了许多东西,当遇到一个解决不了的问题,跟同伴一起商量、合作,或许能收到事半功倍的效果。不管学什么,一定要打好基础,并将其学好、学精,但空有知识也不一定就能说明什么,还得能为己所用;还有更重要的是培养了独立思考和设计的能力,树立了对知识应用的信心,相信会对今后的学习工作和生活有非常大的帮助,并且提高了自己的
17、动手实践操作能力, 使自己充分体会到了在设计过程中的成功喜悦。虽然这个设计做的不是很完美,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我们终身受益。附录电路原理图:程序源代码:/*篮球记分系统设计*#include#define LEDData P0unsigned char code LEDCode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsigned char minit,second,second1,count; /分,秒,24秒,计数器sbit add1=P10; /甲对加分,每按一次加1分 时间暂停时为
18、时间分+1sbit dec1=P11;/甲对减分,每按一次减1分时间暂停时为时间分-1sbit add2=P12;/乙对加分,每按一次加1分时间暂停时为时间秒+1sbit dec2=P13;/乙对减分,每按一次减1分时间暂停时为时间秒-1sbit exch=P14; /小节结束重置时间 sbit secondpoint=P07;/秒闪动点sbit led1=P27; /数码管位控制sbit led2=P26;/数码管位控制sbit led3=P25;/数码管位控制sbit led4=P24;/数码管位控制sbit led5=P23;/数码管位控制sbit led6=P22;/数码管位控制sbi
19、t led7=P21;/数码管位控制sbit led8=P20;/数码管位控制sbit led9=P37;/数码管位控制sbit led10=P36;/数码管位控制sbit led11=P35;/数码管位控制sbit led12=P34;/数码管位控制sbit alam=P17;/报警sbit alam1=P16;/24秒报警bit playon=0;/比赛进行标志位,为1时表示比赛开始,计时开启bit timeover=0;/比赛结束标志位,为1时表示时间已经完bit AorB=0;/AB队标志位bit halfsecond=0;/半秒标志位unsigned int scoreA;/甲队得分
20、unsigned int scoreB;/乙队得分void Delay5ms(void)unsigned int i;for(i=100;i0;i-);void display(void)/*显示时间分*LEDData=LEDCodeminit/10;/十位led1=0;Delay5ms();led1=1;LEDData=LEDCodeminit%10;/个位led2=0;Delay5ms();led2=1;/*秒点闪动*if(halfsecond=1)LEDData=0x80;elseLEDData=0x00;led2=0;Delay5ms();led2=1;secondpoint=0;/*
21、显示时间秒*LEDData=LEDCodesecond/10;led3=0;Delay5ms();led3=1;LEDData=LEDCodesecond%10;led4=0;Delay5ms();led4=1;/*24秒倒计时*LEDData=LEDCodesecond1/10;led11=0;Delay5ms();led11=1;LEDData=LEDCodesecond1%10;led12=0;Delay5ms();led12=1;/*显示1组的分数百位*if(AorB=0)LEDData=LEDCodescoreA/100;elseLEDData=LEDCodescoreB/100;l
22、ed5=0;Delay5ms();led5=1;/*显示1组分数的十位*if(AorB=0)LEDData=LEDCode(scoreA%100)/10;elseLEDData=LEDCode(scoreB%100)/10;led6=0;Delay5ms();led6=1;/*显示1组分数的个位*if(AorB=0)LEDData=LEDCodescoreA%10;elseLEDData=LEDCodescoreB%10;led7=0;Delay5ms();led7=1;/*显示2组分数的百位*if(AorB=1)LEDData=LEDCodescoreA/100;elseLEDData=LE
23、DCodescoreB/100;led8=0;Delay5ms();led8=1;/*显示2组分数的十位*if(AorB=1)LEDData=LEDCode(scoreA%100)/10;elseLEDData=LEDCode(scoreB%100)/10;led9=0;Delay5ms();led9=1;/*显示2组分数的个位*if(AorB=1)LEDData=LEDCodescoreA%10;elseLEDData=LEDCodescoreB%10;led10=0;Delay5ms();led10=1;/*按键检测程序*void keyscan(void)if(playon=0)if(a
24、dd1=0)display();if(add1=0);if(minit0)minit-;elseminit=0;dodisplay();while(dec1=0);if(add2=0)display();if(add2=0);if(second0)second-;elsesecond=0;dodisplay();while(dec2=0);elseif(add1=0)display();if(add1=0);if(AorB=0)if(scoreA999)scoreA+;elsescoreA=999;elseif(scoreB0)scoreA-;elsescoreA=0;elseif(score
25、B0)scoreB-;elsescoreB=0;dodisplay();while(dec1=0);if(add2=0)display();if(add2=0);if(AorB=1)if(scoreA999)scoreA+;elsescoreA=999;elseif(scoreB0)scoreA-;elsescoreA=0;elseif(scoreB0)scoreB-;elsescoreB=0;dodisplay();while(dec2=0);if(exch=0)second1=24;/24秒计时装载alam1=1;/关闭24秒报警/*主函数*void main(void)TMOD=0x11
26、; TL0=0xb0; TH0=0x3c; TL1=0xb0; TH1=0x3c;minit=10;/时间初始值为10:00second1=24;second=0; 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; while(1) keyscan();display(); void PxInt0(void) interrupt 0Delay5ms();EX0=0;alam=1;alam1=1; /关闭报警TR1=0;if(timeover=1)timeover=0;
27、if(playon=0)playon=1;/开始标志位TR0=1;/开启计时elseplayon=0;/开始标志位清零,表示暂停TR0=0;/暂时计时EX0=1;/开中断void PxInt1(void) interrupt 2Delay5ms();EX1=0;/关中断if(timeover=1)/比赛结束标志TR1=0;/关闭T1计数器alam=1;/关报警minit=10;/并将时间预设为10:00second=0;second1=24;EX1=1;/开中断/*中断服务函数*void time0_int(void) interrupt 1 TL0=0xb0; TH0=0x3c; TR0=1
28、;alam1=1;/24秒报警关闭 count+;if(count=10)halfsecond=0; if(count=20) count=0;halfsecond=1; if(second=0) if(minit0)second=59;minit-;elsetimeover=1;playon=0;TR0=0;TR1=1;if(second1=0)second1=24;/重装24秒计时器alam1=0;/24秒报警灯亮playon=0;/开始标志位清零,表示暂停TR0=0;/暂时计时elsesecond-;second1-; /*中断服务函数*void time1_int(void) interrupt 3TL1=0xb0; TH1=0x3c; TR1=1;alam=0;/时间报警minit=10;/时间初始化second=0;second1=24;