《单片机和C语言的篮球计时计分器设计(16页).doc》由会员分享,可在线阅读,更多相关《单片机和C语言的篮球计时计分器设计(16页).doc(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-单片机和C语言的篮球计时计分器设计-第 14 页摘要单片机,亦称单片微电脑或单片微型计算机。它是把中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。本设计是基于AT89C52单片机的篮球计时计分器,利用7段共阴LED作为显示器件。在此设计中共接入了1个四位一体7段共阴LED显示器,2个两位一体7段共阴LED显示器,前者用来记录赛程时间,其中2位用于显示分钟,2位用于显示秒钟,后者用于记录甲乙队的分数,每队2个LED显示器显示范围可达到099分。赛程计时采用正计时方式,比赛开始时启动计时,直
2、至计时到12min为止。其次,为了配合计时器和计分器校正调整时间和比分,我们特定在本设计中设立了7个按键,用于调整时间,启动,调整分数和暂停等功能。采用单片机控制是这个系统按键操作使用简洁,LED显示,安装方便。主控芯片采用AT89C52单片机,采用C语言进行编程,编程后利用Keil uVision3来进行编译,再生成的HEX文件装入芯片中,通过STC下载器将hex文件烧制到单片机。目录1. 概述31.1 背景知识介绍31.2 设计内容31.3计任务和要求41.4 设计意义42.系统总体方案及硬件设计52.1 系统总体方案设计52.2 硬件电路设计62.2.1时钟电路模块72.2.2 复位电路
3、模块72.2.3显示模块82.2.4 报警模块92.2.5 键盘模块 103.软件设计113.1 软件总体设计方案113.2 软件设计具体过程123.2.1延时模块设计133.2.2中断程序143.2.3 键盘扫描子程序143.2.4计分子程序143.2.5 主程序164. 硬件焊接与调试175.课程设计体会18附1 源程序201. 概述1.1 背景知识介绍 体育比赛计时计分系统是对体育比赛过程中所产生的时间,比分等数据进行快速采集记录,加工处理,传递利用的信息系统。根据不同运动项目的不同比赛规则要求,体育比赛的计时计分系统包括测量类,评分类,命中类,制胜类得分类等多种类型。 篮球比赛是根据运
4、动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统。篮球比赛的计时计分系统由计时器,计分器等多种电子设备组成,同时,根据目前高水平篮球比赛要求,完善的篮球比赛计时计分系统设备应能够与现场成绩处理,现场大屏幕,电视转播车等多种设备相联,以便实现高比赛现场感,表演娱乐观众等功能目标。由于单片机的集成度高,功能强,通用性好,特别是它具有体积小,重量轻,能耗低,价格便宜,可靠性高,抗干扰能力强和使用方便等独特的优点,使单片机迅速得到了推广应用,目前已经成为测量控制应用系统中的优选机种和新电子产品的关键部位。世界各大电气厂家,测控技术企业,机电行业,竞相把单片机
5、应用于产品更新,作为实现数字化,智能化的核心部件。篮球计时计分器就是以单片机为核心的计时计分系统,由计时器,计分器,综合控制器和24秒控制器等组成。1.2 设计内容本设计是基于AT89C52单片机的篮球计时计分器,利用7段共阴LED作为显示器件。在此设计中共接入了1个四位一体7段共阴LED显示器,2个两位一体7段共阴LED显示器,前者用来记录赛程时间,其中2位用于显示分钟,2位用于显示秒钟,后者用于记录甲乙队的分数,每队2个LED显示器显示范围可达到099分。赛程计时采用倒计时方式,比赛开始时启动计时,直至计时到零为止。其次,为了配合计时器和计分器校正调整时间和比分,我们特定在本设计中设立了7
6、个按键,用于启动,暂停时间,调整分数和暂停等功能。采用单片机控制是这个系统按键操作使用简洁,LED显示,安装方便。1.3计任务和要求任务: 设计一个用于赛场的篮球计时计分器。要求: 1、能记录整个赛程的比赛时间,并能随时实现暂停,启动。 2、能随时刷新甲、乙两队在整个过程中的比分。 3、比赛中场和结束时,能发出报警声。 7、加分有误时可通过按键实现减分调整。1.4 设计意义 课程设计使我们进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤,键盘和显示器在的单片机控制系统中的应用以及撰写课程设计报告的方法。此次设计很好的将书本上的理论知识和实践有机的联系了起来
7、,是我们对理论知识有了更进一步的掌握,锻炼了我们的动手能力,同时也让我们懂得了理论与实际相结合的意义。为以后的工作和学习提供了宝贵的经验。2.系统总体方案及硬件设计2.1 系统总体方案设计篮球计时计分器主要包括单片机控制系统、计时显示模块、计分显示模块、定时报警,按键控制键盘模块。通过这几个模块的协调工作就可以完成相应的计时计分控制和显示功能。这四个模块的相互连接如下图(图1)所示:本设计是基于AT89C52单片机的篮球计时计分器,利用7段共阴LED作为显示器件。在此设计中共接入了1个四位一体7段共阴LED显示器,2个两位一体7段共阴LED显示器,前者用来记录赛程时间,其中2位用于显示分钟,2
8、位用于显示秒钟,后者用于记录甲乙队的分数,每队2个LED显示器显示范围可达到099分。赛程计时采用倒计时方式,比赛开始时启动计时,直至计时到零为止。2.2 硬件电路设计单片机AT89C52简介 AT89C52是一个低电压,高性能CMOS8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。 AT89C52(如图2)具有如下特点:AT89C52有40个
9、引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。图 2 AT89C52单片机引脚图此模块电路包括时钟电路模块,复位电路模块及报警显示模块。2.2.1时钟电路模块 时钟电路在单片机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟是保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统
10、工作的快慢。为达到振荡周期是12MHZ的要求,这里要采用12MHZ的晶振,另外有两个22P的电容,两晶振引脚分别连到XTAL1和XTAL2振荡脉冲输入引脚。具体连接图如图3所示: 图 3 晶振电路2.2.2 复位电路模块复位是单片微机的初始化操作,其主要功能是把PC初始化为0000H,使单片微机从0000H单元开始执行程序。除进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,可以按复位键以重新启动,也可以通过监视定时器来强迫复位。RST引脚是复位信号的输入端。复位电路在这里采用的是上电+按钮复位电路形式,具体连接电路如图4 图 4 复位电路2.2.3显示模
11、块本设计采用共阴极数码显示器,通常,共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为高电平时,该端所连接的字符导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。同样,要求段驱动电路能提供额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。本次设计在显示模块用到的是一个4位一体和2个两位一体共阴极数码管,共有8个代码输入口和8个位选输入口,采用排阻提供上拉电流数码管,以保证有足够大的电流点亮数码管,采用动态驱动,使各位数码管逐个轮流受控显示,这就是动态驱动,由于扫描速度极快,显示效果与静态驱动相同,其具体图形如下图5图6所示图5计时模块
12、图6计分模块2.2.4 报警模块蜂鸣器通过一NPN三极管进行驱动,如图触发信号有基极引入。(图7)图7报警器模块2.2.5 键盘模块图8键盘器模块3 软件设计在设计程序之前,我们首先要对单片机应用系统预完成的任务进行深入的分析,明确系统的设计任务、功能要求和技术指标。其次,要对系统的硬件资源和工作环境进行分析。这是单片机应用系统程序设计的基础和条件。3.1 软件总体设计方案本次单片机课程设计软件设计部分采用模块化程序设计,程序部分由主程序、T0中断程序、扫描显示子程序、计时加(减)1秒的子程序、暂停子程序、快表和回表子程序、延时子程序等组成.其程序流程图如图9图10。图9 主程序流程图图10扫
13、描刷新显示子程序流程图3.2 软件设计具体过程 软件设计部分采用模块化程序设计,用C语言编写。Keil是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。程序部分由主程序、T0中断程序、扫描显示子程序、暂停子程序、加分子
14、程序、减分子程序、延时子程序等组成。3.2.1延时模块设计 void display(uchar fen2,uchar fen1,uchar miao2,uchar miao1)/时间显示程序 dula=0; P0=tablefen2; dula=1; dula=0; wela=0; P0=0xfe; wela=1; wela=0; delay(5); P0=tablefen1|0x80; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5); P0=tablemiao2; dula=1; dula=0; P0=0xfb; wela=1; wela
15、=0; delay(5); P0=tablemiao1|0x80; dula=1; dula=0; P0=0xf7; wela=1; wela=0; delay(5);本设计中各个数码管采用动态驱动,使各位数码管逐个轮流受控显示,由于扫描速度极快(本实验中大约每20毫秒刷新一次),所以显示效果与静态驱动相同。3.2.2中断程序void time0() interrupt 1/中断程序TH0=(65536-46080)/256; /由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。TL0=(65536-46080)%256; /46080的来历,为5000
16、0*11.0592/12pp+;3.2.3 键盘扫描子程序void keyscan() / 键盘扫描程序if(lcden=0)delay(10);if(lcden=0)halt=1;if(rs=0)halt=0;3.2.4 计分子程序void jifen() / 计分模块if(A_ADD1=0) delay(10); if(A_ADD1=0) numa+; while(!A_ADD1); if(A_ADD2=0) delay(10); if(A_ADD2=0) numa=numa+2; while(!A_ADD2); if(A_DEC=0) delay(10); if(A_DEC=0)numa
17、=numa-; while(!A_DEC); if(B_ADD1=0) delay(10); if(A_ADD1=0) numb+; while(!A_ADD1); if(B_ADD2=0) delay(10); if(A_ADD2=0) numb=numb+2; while(!A_ADD2); if(B_DEC=0) delay(10); if(B_DEC=0) numb-; while(!B_DEC); 3.2.5主程序void main()TMOD=0x01;TR0=1;TH0=(65536-46080)/256;/ 由于晶振为11.0592,故所记次数应为46080,计时器每隔5000
18、0微秒发起一次中断。TL0=(65536-46080)%256;/46080的来历,为50000*11.0592/12ET0=1;EA=1;/主板初始化 因51单片机芯片开机时各个IO口输出为高电平,加上以下源代码是为了防止各种外部模块误动作 DS1302=0; /关DS1302模块,与本实验无关 SD=0;/关SD卡模块,与本实验无关 LCD1602=0;/关LCD1602模块,与本实验无关 cs88=0;/关点阵管lcden=1;rs=1;jishi(fen);4. 硬件焊接与调试4.1硬件实物图对照原理图进行焊接工作,把硬件先依次正确插到相应的位置,然后再次检查器件是否都正确,确定无误后
19、进行焊接.在焊接的过程中要注意不要将相临的两个引脚焊接在一起,防止短路影响使用。硬件连接好以后,通过ISP下载线向单片机内烧制HEX程序,观察各部分工作情况。硬件连接如图4.2调试结果经过多次参考教员给的源程序代码,我初步实现了计时模块功能,能显示、开始、暂停、报警。计分模块也实现了显示功能,但是在结合计分模块时,由于计时模块和计分模块的相互干扰,程序出现不稳定性,问题明显。此次设计重点是计时、计分和键盘,难点是其间的相互结合。5. 设计重点和难点5.1设计重点智能篮球计分器包括两个模块,计时显示模块和计分显示模块,它们都是本次设计的重点。其中,每个模块都需要定时器、数码管显示器。5.2设计难
20、点相对于实现单独模块功能而言,综合显示比较困难。因为两个子模块都需要共用一个定时器,属于实时多任务编程。技术需要涉及操作系统的知识,具体是任务管理,资源管理和定时器管理。由于单片机不可能拥有操作系统,故需要设置一个资源量resource用来代表定时器。其赋值为1,当某个模块需要占用定时器时,先检测resource是否为1,路过为1,表示资源可用,设resource=0;当使用完成后,释放资源,置resource=1。6.课程设计体会通过这几天的单片机的实训,我在理论的基础上更深刻的掌握了单片机的深层内容及实际生活中的应用,实训锻炼了自己动手能力和思维能力,还有在软件方面的编程能力,让我受益匪浅
21、,同时也暴露出一些平时学习上的问题,让我深刻反思。这些问题的发现将为我以后的学习和工作找明道路,查漏补缺为进一步学习作好准备。通过实践,让我更熟悉掌握了Keil uVision3应用程序的运用,让我懂得了如何编写一些简单的程序,学会了如何制作单片机应用程序,还有焊接和程序下载,。但在中间暴露出很多问题:对平时上课讲的理论知识没有完全掌握消化,到了实际操作中还得请教同学,在焊接中焊接的基本工夫掌握不到家,手上工夫还是很欠缺的,使得电路板不是很美观。这些问题的发现,有助于提高我在以后的工作和学习中对此类问题的认识,确保不在同一问题上再次犯错。严谨求实、踏实务实,是我这次实训的深刻总结。做课程设计的
22、这几天翻阅了很多书,也上了很多网站去寻找自己需要的资料。这种寻找有很强的目的性,只是为了自己选定的课题内容而查阅,所以除了自己课题以外的其他方面几乎还是一无所知。这让我深刻的认识到了自己专业知识的贫乏。为我对自己大四生活的规划敲响了警钟。我对单片机的学习不会因为课程设计的结束而结束,在接触的众多资料里,做设计只是走马观花般的点到。 通过单片机课程设计,我加深了对单片机理论的理解,学回了怎样将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的不畏困难的挑战精神,从而不断地战胜自己,超越自己,我在这一设计过程中,学会了坚持不懈,不轻易言弃。设计过程,也好比是我们人类成长的历程,常有一些不如
23、意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。附1 源程序/可实现计时功能,最大计时时间为12min。/支持暂停功能,按键盘中左下角的k1键,可暂停计时;按下k2,可继续计时。/注意晶振需为11.0592M。/若为其他数值晶振,请改变TH0与TL0参数值,否则计时会有很大误差 。#include#define uchar unsigned charsbit dula=P20;/段选信号的锁存器控制sbit wela=P21;/位选信号的锁存器控制sbit cs88=P22; /点阵管的锁存器控制 cs88=0;/关点阵管sbit beep=P23; /s
24、bit LCD1602=P25; /定义LCD1602使能端,用于HJ-C52实验板复位,与本实验无关sbit DS1302=P27; /定义DS1302时钟使能端,用于HJ-C52实验板复位,与本实验无关sbit SD=P26; /定义SD卡使能端,用于HJ-C52实验板复位,与本实验无关void cmg88()/关数码管,点阵函数 cmg88();/关数码管,点阵函数dula=1; P0=0x00;dula=0;cs88=0x00;P0=0x00;cs88=1;sbit lcden=P30;sbit rs=P31;sbit A_ADD1=P32; /定义按键输入端口 k3sbit A_AD
25、D2=P34; /k5sbit A_DEC=P36; /k7sbit B_ADD1=P33; /定义按键输入端口 k4sbit B_ADD2=P35; /k6sbit B_DEC=P37; /k8unsigned char halt,j,k,a0,a1,b0,b1,s,f,m,n=255,fen=12;unsigned int pp;unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void display(uchar fen2,uc
26、har fen1,uchar miao2,uchar miao1); /时间显示模块void display1(uchar A2,uchar A1,uchar B2,uchar B1); /计分显示模块void keyscan(); /键盘扫描模块void jishi(uchar max); /计时模块void delay(unsigned char i); /延时模块void jifen(); /计分模块void main()TMOD=0x01;TR0=1;TH0=(65536-46080)/256;/ 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断
27、。TL0=(65536-46080)%256;/46080的来历,为50000*11.0592/12ET0=1;EA=1;/主板初始化 因51单片机芯片开机时各个IO口输出为高电平,加上以下源代码是为了防止各种外部模块误动作 DS1302=0; /关DS1302模块,与本实验无关 SD=0;/关SD卡模块,与本实验无关 LCD1602=0;/关LCD1602模块,与本实验无关 cs88=0;/关点阵管lcden=1;rs=1;jishi(fen);void time0() interrupt 1/中断程序TH0=(65536-46080)/256;TL0=(65536-46080)%256;p
28、p+;void jishi(uchar max)/计时模块while(1)keyscan();if(halt=0)TR0=1;if(pp=20)pp=0;m+;n-;if(m=5)beep=1; /设置蜂鸣器P1=n;/闪烁灯if(m=60)m=0;f+;if(f0;j-) for(k=125;k0;k-);void display(uchar fen2,uchar fen1,uchar miao2,uchar miao1)/时间显示程序 dula=0; P0=tablefen2; dula=1; dula=0; wela=0; P0=0xfe; wela=1; wela=0; delay(5
29、); P0=tablefen1|0x80; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5); P0=tablemiao2; dula=1; dula=0; P0=0xfb; wela=1; wela=0; delay(5); P0=tablemiao1|0x80; dula=1; dula=0; P0=0xf7; wela=1; wela=0; delay(5);void display1(uchar A2,uchar A1,uchar B2,uchar B1)/计分显示程序 dula=0; P0=tableA2; dula=1; dula=
30、0; wela=0; P0=0xef; wela=1; wela=0; delay(5); P0=tableA1|0x80; dula=1; dula=0; P0=0xdf; wela=1; wela=0; delay(5); P0=tableB2; dula=1; dula=0; P0=0xbf; wela=1; wela=0; delay(5); P0=tableB1|0x80; dula=1; dula=0; P0=0x7f; wela=1; wela=0; delay(5);void jifen() / 计分模块if(A_ADD1=0) delay(10); if(A_ADD1=0)
31、numa+; while(!A_ADD1); if(A_ADD2=0) delay(10); if(A_ADD2=0) numa=numa+2; while(!A_ADD2); if(A_DEC=0) delay(10); if(A_DEC=0)numa=numa-; while(!A_DEC); if(B_ADD1=0) delay(10); if(A_ADD1=0) numb+; while(!A_ADD1); if(B_ADD2=0) delay(10); if(A_ADD2=0) numb=numb+2; while(!A_ADD2); if(B_DEC=0) delay(10); if(B_DEC=0) numb-; while(!B_DEC);