电子科技大学信息科技学院单片机原理及应用实训报告题目篮球计分牌学号0951100228姓名锎指导老师桂明锟志鹏2011 年9 月23 日1.系统设计1.1设计要求1.1.1.基本要求1 设计一个基于单片机的篮球计分牌,实现两队的计分功能与24秒计时功能2 结合硬件能够正常计分3 能够正常显示分值。
4 能够正常修改工作模式(计分与24秒)5 能够24秒的误差不小于1秒1.1.2.发挥部分1 12分钟倒计时2 能够两队球员犯规次数计数3 重置24秒表4 倒计时结束报警5 12分钟倒计时结束红灯全部亮1.2设计原理1.2.1 框图设计1.2.2 程序流程1.2.2.1加分程序流程1.2.2.2犯规程序流程1.2.2.3 选择显示程序流程1.3方案比较1.3.1 方案1:是通过按不同的键来切换不同的输入,使用不同的LED灯的亮灭来显示不同的队加分。
电路图:1.3.2 方案2:通过一个键来切换分数,24s倒计时,12分钟倒计时和犯规次数,通过LED灯的亮来判断是那个队加分,那个队犯规,12分钟倒计时结束。
另外,给a队b队加分和加犯规次数。
通过按键,选择哪种显示方式,暂停/开始24s倒计时,重置24s;电路图:1.4方案论证1.4.1总体思路7个按键实现对应功能:P1^6对应a队加分,第一个红灯亮;P1^0对应b队加分,第二个红灯亮;P1^1对应显示切换,切换有四类显示方式,第一类是a队跟b队的比分显示,且各两个数码管显示。
第二类是24s倒计时的显示。
第三类是12分钟倒计时的显示。
第四类是a队跟b队的犯规次数显示;P1^2对应24秒倒计时暂停/开始;P1^3对应重置24s倒计时,同时24s倒计时暂停;P1^4对应a队加犯规次数,同时第三个红灯亮;P1^5对应b队加犯规次数,同时第四个红灯亮;外加复位键,按下则清零;24秒倒数为0时蜂鸣器响起警报,重新倒数时蜂鸣器关闭。
12分钟倒计时结束时,蜂鸣器响起警报,红灯全亮。
1.4.2设计方案使用了延时子程序(delay)用来按键消抖,还有定时中断程序来显示数码管,启止24s倒计时,12分钟倒计时,使用了P0口作为数码管的段选和P2口的位选,使用P1口作为按键作为输入,P3口的发光二极管作为判断a队和b队的选择和作为模式的选择部分和蜂鸣器作为倒计时24秒的计时的时间到;在主程序里面有各按键的功能,a队加分,b队加分,切换功能,重置24s功能,a队加犯规,b队加犯规;2、模块电路的设计2.1 AT89S51单片机芯片在本设计中P3.7~P3.4口接LED灯,P2.7口(28脚)接蜂鸣器电路,P1.0~P1.6(1~7脚)口接7个按键,RST(9脚)接复位电路,,P2.0~P2.4(21~24脚)接四位数码管的位选脚,P0.0~P0.7(32~39脚)接四位数码管段位脚,18、19脚接晶振电路,20脚接GND,31脚、40脚接VCC。
2.2 四位共阴数码管电路2.3 复位电路2.4 振荡电路(时钟电路)2.5 蜂鸣器电路2.6 下载口电路2.7 二极管显示电路3、开发软件及编程语言简介3.1 Keil C编程软件3.1.1 系统概述Keil C51是德国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows 界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
3.1.2. Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。
开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。
然后分别由C51及A51编译器编译生成目标文件(.OBJ)。
目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。
ABS文件由OH51转换成标准的Hex 文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
3.2 Keil开发工具--uVision3uVision3集成开发环境是一个基于Window的开发平台,包括一个全功能的源代码编辑器,一个项目管理器和一个MAKE工具。
利用源代码编辑器可以高效地编辑源程序。
利用项目管理器可以很方便地创建和维护项目,利用MAKE工具可以汇编,编译和连接。
4、制作与调试过程4.1制作过程:4.1.1编程时用C语言编写并需要结合电路原理图编写;4.1.2在使用proteus软件仿真时,要找到元器件相应的符号及其使用方法;4.1.3在制作电路板时,由于使用万用板,在焊接元器件的管脚时需要注意焊锡的使用量,用量过多会导致该焊锡与其它的铜孔相连,有可能导致电路的某条支路短路;4.1.4在焊接按键时,需要分清楚其的管脚,可以用万用表测试管脚的导通,则可以区分管脚;4.1.5在焊接数码管的管脚时,应该注意其管脚的分布;4.1.6在焊接AT89S52的管脚时,需要注意分清各个管脚;4.1.7在焊接晶振的管脚时需要注意将其尽量靠近该芯片的XTAL1,XLAL2的两端;4.1.8在焊接下载端口的管脚时需要注意各管脚与芯片的管脚对应。
4.2调试过程:4.2.1初步调试程序时并下载到芯片上时,通过操作验证“暂停部分的程序”在比赛结束后再按暂停按键时,可以实现倒计时,但是当t=0时,开始出现乱码,针对该问题,需要在其暂停部分的程序加以“break”到相应的程序中,经调试,下载可以实现将程序跳出“死循环”。
4.2.2在调试电路板时不能将程序下载到芯片的情况,经分析得出晶振接触不良。
4.2.3 硬件搭建好后,发现程序下载不了,经检查发现,下载端口接反,下载口连接正确后,程序依然下载失败。
经常长时间电路检查依然为发现问题。
后面通过仔细查看单片机最小系统,最终发现单片机的EA端没接vcc导致单片机无法读取片ROM。
4.2.4 下载成功后,然后再补充了LED灯跟功能对应的显示。
5、心得体会通过本次实训,发现自身在电子制作,程序编写方便有着非常大的不足。
对以往学习过的编程知识没有好好掌握,特别是编程这方便的知识较薄弱。
学习过的知识在实际应用中仿佛是冰山一角,完全不够用,需要通过查阅很多资料才能解决到碰到的相关问题。
而且实训中出现的问题都是实际应用出比较典型的问题。
发现问题解决问题,通过不断的了解,对《单片机原理及应用》这门课有了更深刻的了解掌握。
单片机技术在当今各方面领域有着极高的应用率,是一门动手能力非常强的技术。
其中的程序和模块化元件看起来很简单,但是真正要自己设计有代表性出来是很难的,需要有扎实的知识基础,和较强的逻辑分析能力。
这些条件我们都可以通过平时的努力来积累。
碰到问题,先自己思考解决,再请教老师。
这次实训还让我深刻的体会了结构化程序设计的优势,让我懂得当我们要进行一个复杂的程序设计时应该先将其分解为多个不同的功能模块再分别编程实现,这样做不仅降低了编程的难度,也容易让编程者思路更加清晰,避免出现不必要的错误。
在做仿真时,仿真图正确也不一定就是说明一定正确。
做实物时,不仅要做到电路正确,也要尽可能做到布局合理、焊接到位,否则很有可能电路原理图正确、仿真图正确但是任然调试不出结果。
另外,焊接的时候不能分心,否则极易出错。
6、参考文献【1】喻宗泉.单片机原理与应用技术.:电子科技大学。
2006【2】光飞.单片机课程设计实例指导.:航空航天大学。
2004【3】欣.单片机原理与C51程序设计基础教程.:清华大学。
20107、附录7.2.1 电路原理图7.2.2 PCB7.2.3 硬件正面图7.2.4 硬件反面图7.2.5元件清单:7.2.6 程序#include<reg52.h>//*************************数码管段代码表**************************// unsigned charTab[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,0xDF,0xD7,0x20}; unsigned char a=0,//a队分数b=0,//b队分数afg=0,//a队犯规次数bfg=0;// b队犯规次数unsigned char t=24, //倒计时24秒k=0,//倒计时暂停/开始状态h=0,//显示转换状态miao=0,//秒钟fen=12;//12分钟倒计时分钟int bittime=0; //循环次数int bitdisplay=0;//显示sbit P16=P1^6;//a队加分sbit P10=P1^0;//b队加分sbit P11=P1^1;//显示状态切换sbit P12=P1^2;//倒计时暂停/开始sbit P13=P1^3;//24s倒计时重置sbit P14=P1^4;//a队犯规加次数sbit P15=P1^5;//b队犯规加次数sbit fmq=P2^7;//蜂鸣器///***************定时中断服务程序***********************//void timer0 (void) interrupt 1 using 0{TH0=0Xf8;TL0=0x30;//定时器赋初值switch (bitdisplay){case 0:P2=0xfe;if(h==0){P0=Tab[a/10];}//a队分数十位显示if(h==1){P0=Tab[t/10];}//倒计时十位显示if(h==2){P0=Tab[fen/10];}//每节比赛12分钟,分钟十位显示if(h==3){P0=Tab[afg/10];}//犯规的十位显示break;case 1:P2=0xfd;if(h==0){P0=Tab[a%10];}//a队分数个位显示if(h==1){P0=Tab[t%10];} //倒计时个位显示if(h==2){P0=Tab[fen%10];}//分钟的个位显示if(h==3){P0=Tab[afg%10];}//a犯规的个位显示break;case 2:P2=0xfb;if(h==0){P0=Tab[b/10];}if(h==1){P0=0x00;}if(h==2){P0=Tab[miao/10];}if(h==3){P0=Tab[bfg/10];}break;case 3:P2=0xf7;if(h==0){P0=Tab[b%10];}if(h==1){P0=0x00;}if(h==2){P0=Tab[miao%10];}if(h==3){P0=Tab[bfg%10];}break;}bitdisplay++;bittime++;if(bitdisplay==4) {bitdisplay=0;}//数码管扫描返回if(bittime==500){bittime=0;if(k){ if(t--==0) {k=0;t=24;fmq=1;}else {fmq=0;}if(miao--==0){if(fen==0){P3=0x0f;fen=12;miao=0;k=0;}fen--;miao=59;} //12分钟结束,4个灯全亮}}}//**延时程序***//void delay (unsigned int t){unsigned int aaa,bbb;for(aaa=0;aaa<100;aaa++)for(bbb=0;bbb<t;bbb++);}//**************主程序*********************//void main(void){TMOD=0x01;TH0=0xf8;TL0=0x30;//定时2msEA=1;ET0=1;TR0=1; //开启定时器while(1){if(!P16)//按键1{delay(100);if(!P16){a++;P3=0xef;if(a==100) a=0;}//a队加分}if(!P10)//按键2{delay(100);if(!P10){b++;P3=0xdf;if(b==100) b=0;}//b队加分}if(!P11)//按键3{delay(100);if(!P11){if(++h>=4)h=0;} //显示切换}if(!P12)//按键4{delay(100);if(!P12){if(k++==2)k=0;} //倒计时}if(!P13)//按键5{delay(100);if(!P13){t=24;k=0;fmq=1;}//重置24s倒计时}if(!P14)//按键6{delay(100);if(!P14){afg++;k=0;P3=0xbf;if(afg==60) afg=0;}//a队犯规}if(!P15)//按键7{delay(100);if(!P15){bfg++;k=0;P3=0x7f;if(bfg==60) bfg=0;}//b队犯规}}}。