《单片机实训-篮球记分牌(共11页).docx》由会员分享,可在线阅读,更多相关《单片机实训-篮球记分牌(共11页).docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上桂林电子科技大学信息科技学院单片机原理及应用实训报告学 号 9527 姓 名 唐伯虎 指导教师:小行星 2015 年 9 月 27 日(请核对时间)专心-专注-专业实训题目:篮球记分牌1 系统设计1.1 设计要求1.1.1 设计任务设计一个基于单片机的篮球计分牌,实现两队的计分功能与24秒计时功能。1.1.2 性能指标要求基本要求(1) 按照题目要求独立设计系统所需电路,并完成硬件电路的制作及调试。(40分)(2)结合硬件能够正常计分(1,2,3)。(10分) (3)能够正常显示分值。(10分) (4)能够正常修改工作模式(计分与24秒)。(10分) (5)能够24秒
2、的误差不小于1秒。(15分)2、发挥部分 能够两队球员犯规次数计数。(15分)1.2 设计思路及设计框图1.2.1设计思路在制作之前首先明确器件所要实现的功能,篮球记分牌顾名思义就是要记录篮球比赛中双方的比分(1分,2分,3分),进攻时间24s,双方的犯规次数等,明确功能之后便是分析与设计电路图,而此次的实训设计将分为两个部分,一个是硬件部分,另一个是软件部分;首先是在硬件部分,通过按下各种按键实现比分分数的录入,犯规暂停及显示切换,然后输出至数码管显示相应的内容;在软件程序方面,通过去定义不同的按键,编写判断语句,当其被按下时要实现怎样的功能效果,是计分,切换,还是暂停,尤其是显示进攻24s
3、的时间可以通过调用中断函数来实现;程序部分需要注意的几个地方就是中断内初值的设置,八段共阴数码管的位选和段选代码,这些地方设置如果不对会出现显示错误或者达不到预期;1.2.2总体设计框图 在本题目中用到的参考原理图如下:基本框图:C51单片机显示模块键盘2 各个模块程序的设计对于此次单片机实训来说,软件就像是人的大脑,而硬件就像是人的身体,硬件是个实体,软件则是灵魂;这次实训的软件,我将其划分为五个部分的内容,分别是中断部分,延时部分,显示部分,按键部分以及主函数;其中的中断函数void timer0 (void) interrupt 1 using 0承担了进攻24s倒计时,双方比分,犯规次
4、数的显示,用到的是定时器T0中断,12MHz的晶振,为了能使计时时间的误差小于1s,在设置初始值时用到了此前实验课中使用的0x3CB0,这在12MHz的晶振中刚好是50ms的计时时间,定义一个变量,让其循环累加20次,则刚好是1秒钟的时间,每经过一秒就让24s减1,并输出至数码管显示;此外,还对双方比分,犯规次数进行了扫描显示,通过在主函数中改变变量的值,在中断中判断相应值的变化用来切换不同的显示内容;延时函数void delay (uint t)在程序中的作用主要是作为按键的消抖,如果少了这个延时,则在按下按键时可能会出现错误,这个在硬件中的表现就是按键的灵敏性,如果延时不够(灵敏性高),按
5、一次可能会加很多分;反之就是按键迟钝,所以适当的延时很重要。显示函数void display(),因为功能中有一个暂停的功能,而要实现暂停就要关闭中断,从而会导致当暂停键按下后数码管不显示数值(全黑),所以另外写了个显示函数嵌套在暂停中,其内容基本和中断内的显示切换一致。按键函数button(),是整个程序的核心,也是实现硬件电路的基础,这次实训的八个按键,要灵活运用,尽量用较少的按键实现最多的功能;基于篮球记分牌的计分功能,我将加3分的按键改为了减1分,因为加3分可以先按一次加1分再按一次加2分,这样就可以多出一个按键用来减分,这里有个好处就是防止按错计分的键而无法修改;此外再定义一个按键用
6、来切换两支队的输入状态,并用不同LED灯的加以标注,当切换到A队时某一盏灯亮起,这时可以对其进行计分的操作,当然还有专门记录犯规的按键,切换显示模式的按键,暂停的按键,这八个按键就构成的可操作模块;主函数里则是对中断进行初始化,调用显示函数,按键函数;3 调试过程对于一个器件的硬件和软件刚设计出来以后,还不能马上用于实际,需要通过各种测试验证,对于出现的各种错误还得进行反复修改,硬件的修改,软件的修改,而这如果顺利的话是很快的,但往往不是这样,就比如这次我所做的单片机实训,虽然东西是做出来了,但在烧入程序进行验证时还是出现了很多问题;这些问题的出现6有很多不确定性,可能是电路的某一个地方焊得不
7、好,或者是程序中的某个变量不合理,所以,在进行调试之前务必确保硬件电路的正确,将会节省很多时间;很幸运,因为篮球记分牌所用到的元器件并不算多,所以电路板很好检查,刚开始我就把蜂鸣器错接在了三极管的发射极,应该是集电极才对。将所有器件焊接完成后用万用表的蜂鸣档对电路进行短路检测,没有发现问题。用usb ISP 下载线连接计算机与下载口,将程序的.hex文件烧录到AT89S52这枚芯片中,发现数码管的位选出现了错误,如24s的十位应该显示在右边,个位显示在左边,但数码管现实却颠倒了,此外还有LED灯的位置也没有设置正确,蜂鸣器一直在叫,这些都不是什么大问题,通过修改芯片P2口的位选后数码管的数值显
8、示正确了,LED灯的功能显示也正确了,唯独那个蜂鸣器的问题没有解决,这应该和电路原理图中蜂鸣器的摆放位置有关,或者是连接三极管的电阻阻值太小;在验证过程中改动较多的除了位选码还有就是按键的延时消抖设置了,只有不断的该延时并验证才可知道合理的延时时间,因为除了按键延时还有显示延时,而这个显示延时程序我改了好久也没有能够修改成功,所以我的数码管显示的数值一直是闪烁的,这也是本次实训中一个不足和遗憾的地方,这个后面我会通过参考资料加以修正,以达到完美。4 功能测试4.1 测试仪器与设备测试仪器与设备单片机程序下载线 1条万用表 1个 PC机 1台4.2 性能指标测试能够通过按下不同的按键,实现了篮球
9、比赛双方比分,犯规,以及进攻24s的切换,实现了加1分,加2分,减1分,暂停,A,B队操作状态切换,总体上完成了此次实训的基本要求。没有实现的功能是蜂鸣器在电路中得作用。5 实训心得体会算起来这应该是大学至今第四个实训吧,不过不像之前的只是单纯的硬件电路的焊接,或者软件编程,这次是合二为一,既要做板子又要写程序,工作量是以往最大的,不过觉得自己上学期的软件部分学得还不错,要实现应该不成什么问题。这次单片机实训做的东西是篮球记分牌,也是相对较为简单的一个,我认为简单只是说明元器件少,要写的程序少,但是它的价值不亚于其他。在我选好题目以后就马上行动了,因为老师没有提供原理图和程序的参考资料,所以我
10、得去图书馆寻找相应的书籍,果不其然还真找到了,上面刚好也有篮球记分牌的知识点,十分高兴,但是不可能照搬书上的东西,再说也不可能都对应的上,唯有把它弄懂,于是我就整天抱着本厚厚的书在课余时间里畅游,程序当然是整个实训的灵魂了,我的首要目标就是要弄清楚如何编写程序去实现所要求的功能,当然程序是不能离开实际的,在脑海里大概模拟出实体物件的轮廓,比如定义一个按键变量,判断其是否按下,当按下时执行什么操作,是让分数加1还是减1,或则是切换显示,此时数码管怎样显示,断码与位选码又该如何选择,另外LED应该亮哪一盏灯将问题细化成几个部分,什么功能将写在什么函数中,什么时候去调用,每一个环节都紧扣在一起。我不
11、仅参考了图书馆的书,还将此前上理论实验课书中相应的知识也温习了一遍,因为这里边有个24s倒计时要用到了定时中断,按键消抖要用到延时,当然还有数码管的段选码和位选码,以及LED的位选,总总的这些经过了一个假期的冲刷已经忘得差不多了,所以要想读懂参考程序,还得再把这些给捡回来。虽然有参考书作为辅助,但和实际还是有很大出入的,因为程序的编写要以实际硬件为基准,不可能完全照搬,而且可能还实现不了。于是我大概清楚了软件程序的编写,在硬件电路出来之前我就已经吧程序准备好了,还在脑子里编译了一遍,应该可行。在拿到元件清单后有点惊讶,因为电路板是那种已经实现打好孔的“万能板”,也就是不需要自己去弄PCB板,腐
12、蚀等等,虽然省掉了很多步骤,但是直到开始焊接元件的时候才知道,没那么简单!想要尽量少跳线,那么排版就非常重要了,排版好的话,可以直接上焊锡将两个最近元件引脚连好,也好看,但是真正动手的时候可是让我煎熬好久,焊锡常常不听话,偏不连在一块,特别是有几个元器件的引脚比孔径还小,很难垂直焊接,常常会焊得东倒西歪,这个过程真的十分煎熬,恨不得自己做一块PCB板子,那样倒显得轻松些,孔径大小是根据实际元件而设定,并且元件排布,布线都已经印在板子上,只需要将器件焊在制定的位置上即可,不像现在,还得慢慢的找寻相连的元件引脚及其分布,可以说这是整个实训过程中最伤脑筋的。最好能一次性就出来,要不然检查起来更可怕,
13、特别是对密集恐惧症患者来说。就算检查出来了,想要改掉也是一件“浩大的工程”,一不小心就会牵连到附近的元件,这我可是深有体会。我的板子并没有一次就成功做出来,后来用万用表参照着原理图,一条条线一个个元件排除短路和漏接焊错的地方,但是有些焊点靠的太近了,稍微靠近一下就“跳槽”到另一个元件上,真是雪上加霜!难舍难分!好几次我都得用锉刀将其锉开,十分麻烦。然而万万没想到的是,更麻烦的还在后头本以为原先写好的程序没有问题的,但是烧录进单片机后效果出现了异常,数码管的位选码没搞对,十位和个位的位置颠倒了;按键的灵敏性太高,原本按一次加1分现在按一次加积分都有。还有一个更为头疼的问题是数码管一直在闪烁,虽然
14、可以看得出数值,但是闪烁的很严重,这个在后面的不断修改中断程序中显示部分的程序成为了一场持久战!就是无论怎么改动闪烁的问题还是没有能解决,眼看着实训验收已经快接近尾声了,再不出来就得明年重修了,此刻的我真是万分焦急,头脑在高速运转着,连睡觉都在想,到底是哪一个变量没设置好,哪一条语句出现问题没解决好,整个人都不好了,连上课的欲望都没有了,人比黄花瘦的感觉。无论如何,目前是暂时改不出来了,硬着头皮上吧,因为基本功能都实现了,只是显示的效果打了折扣,就算最后挂了,也无憾了,因为这是自己一心一意做的。说到这,这次实训还有一个特别有趣的现象,就是验收的最后几天里还有一大把人没有做出来,也许是做了失败的
15、,也许是压根就没有动手去做的,都在到处找人帮做,就拿此次单片机实训中的点阵来说吧,应该是此次实训中最复杂的一个了,找人帮做的话,从最初的一百元涨到了两百元,到最后的三百元,这还不带程序部分的价格,如果全包将超过三百块,而且还十分热销,各种接单各种砍价,就像炒房一样虽然只是一次单片机实训,但隐藏的东西非常多,这也是一个社会的现实,能力不足,别人说什么就是什么,觉得自己厉害的,就尽量剥削这也是此次实训一个变味的地方,没办法,这就是现实。另外这次实训有几个让我措手不及的地方,一个是软硬件都弄好了,要把程序烧录下载进去,但是没有下载线,到处去找去借,老师那里也被借得差不多了,外面也炒到了三十块一根,因
16、为没有下载线就无法验证程序的完整性,每修改一次就得下载验证,这是需要反复操作的一个地方,少了下载线,几乎就少了打开成功的钥匙,不过还好,朋友挺多,借到了,但是紧接着另一个问题就来了,就是烧录程序的软件,网上能够搜到很多,但是能用的却很少,不是驱动的问题就是计算机无法运行,程序还不知道对不对,而且还要修改,没想到就卡在这里了,又是焦急万分,好想作诗一首表达自己的哀怨!历尽了千辛万苦总算在最后的期限完成了任务,整个人顿时轻了不少,通过整个单片机实训的各种无情打压与挫折,不仅让我找到了信心与自豪感,不仅让我学到了又一新知识,结合了理论与实际,还让我学会了坚持的重要性,谁能熬到最后,胜利必将属于谁!个
17、人觉得,实训学到的东西比理论课更能深入记忆,更能得到锻炼。6 参考文献1 陈朝大、韩剑单片机原理与应用实验实训和课程设计武汉:华中科技大学出版社,20142 郑锋、王巧芝51单片机典型应用开发范例大全北京:中国铁道出版社,20113 李长俊模拟电子技术北京:科学出版社,2013附录附录1:原理图附录2:程序清单#include#define uchar unsigned char#define uint unsigned intuchar Tab=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;uchar Ascore=0,Bscore=0,
18、Afg=0,Bfg=0;uchar miao=24,sum=0,kk=0;uint count=20,bitcase=0;uint flag=0,flag1=0;sbit Start=P10; /启动sbit ATB=P16; /AB队切换sbit add1=P11; /加1分sbit add2=P12; /加2分sbit minus1=P13; /减1分sbit foul=P14; /犯规 暂停 关闭蜂鸣sbit qh=P15; /定义显示切换按键sbit fm=P24; /蜂鸣器void timer0 (void) interrupt 1 using 0TH0=0X3C;TL0=0xB0;
19、/定时器赋初值 (如果晶振是24MHz则定时时间是25ms(12MHz是50ms))if(sum=0) /实时显示双方比分 switch(kk) case 0:P2=0xF7;P0=TabAscore/10;break; case 1:P2=0xFB;P0=TabAscore%10;break; case 2:P2=0xFD;P0=TabBscore/10;break; case 3:P2=0xFE;P0=TabBscore%10;break; kk+;if(kk3)kk=0; if(sum=1) /实时显示(进攻时间)24s倒计时 switch(kk) case 0:P2=0xFB;P0=T
20、abmiao/10;break; case 1:P2=0xFD;P0=Tabmiao%10;break; kk+;if(kk1)kk=0; if(sum=2) /实时显示双方犯规次数 switch(kk) case 0:P2=0xF7;P3=0x9F;P0=TabAfg%10;break; case 3:P2=0xFE;P3=0x9F;P0=TabBfg%10;break; kk+;if(kk3)kk=0; count-; if(count=0) count=20; if(miao-=0) miao=24;P3=0x0F;fm=1; else fm=0;/24秒倒计时 void delay (
21、uint t) unsigned int i,j;for(i=0;it;i+)for(j=0;j100) Ascore=0;fm=1; if(!minus1) /减1分 delay(66); if(!minus1) Ascore-=1;P3=0xEF;if(Ascore=0) Ascore=0;fm=1; if(!foul)/累计犯规次数 P3=0x9F; delay(66); if(!foul) Afg+=1;P3=0x9F;delay(33);P3=0x9F;if(Afg=7) Afg=0;fm=1; else/切换到B队 P3=0x7F; if(!add1)/加1分 delay(66);
22、 if(!add1) Bscore+=1;P3=0x7F;if(Bscore=100) Bscore=0;fm=1; if(!add2) /加2分 delay(66); if(!add2) Bscore+=2;P3=0x7F;if(Bscore100) Bscore=0;fm=1; if(!minus1)/减1分 delay(66); if(!minus1) Bscore-=1;P3=0x7F;if(Bscore=0) Bscore=0;fm=1; if(!foul) /累计犯规次数 P3=0x9F; delay(66); if(!foul) Bfg+=1;P3=0x9F;delay(33);
23、P3=0x9F;if(Bfg=7) Bfg=0;fm=1; if(!qh) /显示切换 delay(66); if(!qh) if(sum2) sum+=1; else sum=0; if(!Start) delay(66); if(!Start) flag1+; if(flag1%2=1) P3=0x0F;TR0=0;fm=0; /暂停(比赛)计时关闭蜂鸣display(); else TR0=1;fm=0;void main(void) TMOD=0x01;TH0=0x3C;TL0=0xB0; /定时25ms EA=1;ET0=1;TR0=1; while(1) button(); /调用按键函数