单片机篮球计时计分器课设.doc
课程设计任务书学 院信息学院专 业计算机科学与技术学生姓名班级学号 课程设计题目篮球计时计分器设计实践教学要求与任务:篮球计时计分器设计: 要求:利用51单片机+7SEG-MPX2-CA-BLUE +晶振电路+复位电路+放大器电路等设计篮球计时计分器系统;完成以下设计环节: 1)使用PROTEUS仿真软件,设计仿真硬件原理图。 2)使用Uvision2(Keil C)开发平台,采用C语言设计软件程序。 3)利用1),2)完成系统仿真。工作计划与进度安排: 第18周:布置课程设计任务,查阅资料,硬件软件设计,实验室组装与调试。 第20周:调试,验收,答辩,编写课程设计报告。指导教师:年 月 日专业负责人: 年 月 日学院教学副院长: 年 月 日目录1. 系统功能概述12. 开发平台简介22.1系统仿真平台Proteus22.2软件开发平台KeilC23. 系统硬件结构设计33.1总体设计33.2各模块设计34. 软件设计64.1主函数模块设计64.2各子函数模块设计105. 系统仿真运行结果126. 结论147. 参考文献141.系统功能概述随着微电子技术的不断发展与进步,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器计数电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。我们利用一些与单片机相关的硬器件设计一个关于篮球计时计分器对的设计,其中最主要设计俩部分:一是数码管显示器的显示部分,二是按键处理的判断。 1)使用PROTEUS仿真软件,设计篮球计时计分器仿真硬件原理图,使得界面简洁,清晰,易懂,易操作。 2)使用Uvision2(Keil C)开发平台,采用C语言设计软件程序,实现倒计时功能,甲队乙队计分功能和设置加赛时间等功能。 3)利用1),2)完成系统仿真。2.开发平台简介 2.1系统仿真平台Proteus单片机是现代电子技术的新兴领域,它的出现极大地推动了电子工业的发展,已成为电子系统设计中最为普遍的应用手段。近年来单片机技术得到了突飞猛进的发展,各种单片机开发工具层出不穷。虚拟仿真就是近年来兴起的一种新型应用技术,采用虚拟仿真技术,在原理图设计阶段就可以对单片机应用设计进行评估,验证所设计电路是否达到所要求的技术指标,还可以通过改变元器件参数使整个电路性能达到最优化。这样就无须多次购买元器件及制作印刷电路板,节省了设计时间与经费,提高了设计效率与质量。英国Labcenter公司推出的Proteus软件是一款极好的单片机应用开发平台,它以其特有的虚拟仿真技术很好地解决了单片机及其外围电路的设计和协同仿真问题,可以在没有单片机实际硬件的条件下,利用PC以虚拟仿真方式实现单片机系统的软、硬件同步仿真调试,使单片机应用系统设计变得简单容易。Proteus软件涵盖了PIC、AVR、MCS8051、68HC11、ARM等微处理器模型,以及多种常用电子元器件,包括74系列、CMOS 4000系列集成电路、A/D和D/A转换器、键盘、LCD显示器、LED显示器,还提供示波器、逻辑分析仪、通信终端、电压/电流表、I2C/SPI终端等各种虚拟仪表,这些都可以直接用于仿真设计,极大地提高了设计效率和设计水平。Proteus软件已有20多年的历史,在国外应用较为普遍,尤其在教育界的口碑极佳。近年来Proteus软件被引入国内,在多所高等工科院校中得到成功应用。在单片机教学中采用Proteus软件,使单片机的学习过程变得直观形象,可以直接在基于原理图的虚拟模型上进行编程,并实现源码级的程序仿真调试,如有显示及输出,还能看到程序运行后的输出效果,配合各种虚拟仪表来展现整个单片机系统的运行过程,很好地解决了长期以来困扰单片机教学过程中软件和硬件无法很好结合的难题。采用PC进行虚拟仿真实验要比采用单片机实验箱更为有效,因为用户可以根据需要随时对原理电路图进行修改,并立即获得仿真结果。由于在PC上修改原理电路图要比在实验箱上修改硬件电路容易得多,而且还可以根据设计要求采用不同元器件,或者修改元器件参数以获得不同输出结果,在成功进行虚拟仿真并获得期望结果的条件下,再制作实际硬件进行在线调试,可以获得事半功倍的效果。学生普遍反映,在Proteus软件平台上学习单片机知识,比以往单纯学习书本知识更易于接受,以原理图虚拟模型进行程序仿真调试,更易于提高单片机编程能力,还可以通过绘制和修改原理电路图增加很多实践经验。Proteus组合了高级原理布图、混合模式SPICE仿真,PCB设计以及自动布线来实现一个完整的电子设计系统。此系统受益于15年来的持续开发,被电子世界在其对PCB设计系统的比较文章中评为最好产品“The Route to PCB CAD”。Proteus 产品系列也包含了我们革命性的VSM技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。其功能模块:个易用而又功能强大的ISIS原理布图工具;PROSPICE混合模型SPICE仿真; ARES PCB设计。PROSPICE 仿真器的一个扩展PROTEUS VSM:便于包括所有相关的器件的基于微处理器设计的协同仿真。此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LEDs甚至LCD显示CPU模型.支持许多通用的微控制器,如PIC,AVR,HC11以及8051; 交互的装置模型包括:LED和LCD显示,RS232终端,通用键盘;强大的调试工具;包括寄存器和存储器,断点和单步模式;IAR C-SPY 和Keil uVision2等开发工具的源层调试;应用特殊模型的DLL界面-提供有关元件库的全部文件。2.2软件开发平台Keil CKeil uVision2是德国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,使用接近于传统C语言的语法来开发,与汇编相比,C语言在功能上结构性、可读性、可维护性上有明显的优势,因而易学易用,而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。KEILC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强, 使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision2 IDE可为它们提供单一而灵活的开发环境。 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,使您能在很短的时间内就能学会使用keil c51来开发您的单片机应用程序,另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。3.系统硬件结构设计3.1总体设计如图3-1图3-13.2各模块设计3.2.1 7SEG-MPX2-CA-BLUE介绍 7SEG-MPX2-CA-BLUE是共阳极数码管显示器,它左侧的ABCDEFG DP是LED数码管显示器的I/O接口,是段选信号,右侧下面的12是它的位选信号。此次课设中用该数码管显示器4次,分别作计时器分钟、秒钟和甲乙俩队的计分器;如图3-2图3-23.2.2 AT89C51单片机介绍 AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案;如图3-2图3-23.2.3按键处理设计 按键处理设计使用了BUTTON按钮,形成了4*4按键。其中第一行按键设置成甲队加一分,俩分,三分和减一分;第二行按键设置成乙队加一分,俩分,三分和减一分;第三行按键设置成比分清零,比分切换,时间加一分钟,减一分钟;第四行按键设置成比赛开始,比赛暂停,时间复位等;如图3-3图3-33.2.4 晶振电路与复位电路利用单片机引脚XTAL1,XTAL2引入晶振电路,晶振电路为内部时钟提供稳定的时钟信号,其中用到了俩CAP、一个10K的RES和一个CRYSTAL,俩电容起到稳定振荡频率,快速起振的功能。此次我选择按钮复位电路,即当时钟电路工作以后,按下复位键,使得RST端出现俩个机器周期以上的高电平,实现复位操作;且用到了一个RES、一个CAP-ELEC和一个BUTTON;其中极性电容C3的大小直接影响单片机的复位时间,一般采用1030uF,51单片机最小系统容值越大需要的复位时间越短。如图3-4上部分为晶振电路,下部分为按键复位电路,右侧是单片机用到的引脚。图3-43-2-5 NPN起到放大器功能 由于单片机输出口的输出电压不够大,利用三极管对其进行放大,再加到LED显示器位选信号上,对其进行选择并输出。用到了1K的电阻。如图3-5图3-54软件设计4.1 主函数模块设计4.1.1 流程图开始显示单元初始化T0设置成16字节方式即TMOD=0x01允许T0中断调用数码管显示子程序是否按下键?进入功能区是否4.1.2代码程序就是从主程序开始执行的,在主程序里可以调用子程序,调用完成后还要返回主程序继续执行。我们在主程序里对各个模块进行初始化,用一个while循环不断地循环执行各个子程序,例如按键扫描程序在这里可以一次一次地扫描按键,这样实现简单易行。主函数程序为:#include<reg51.h>#define unchar unsigned charchar code dis110=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /共阳极字段显示char code scan8=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80; /位选择码char data dis28=0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; char data timedata4=0x00,0x0a,0x00,0x00;unchar ms; sbit P3_0=P30;sbit P3_1=P31;sbit P3_2=P32;sbit P3_3=P33;sbit P3_4=P34;sbit P3_5=P35;sbit P3_6=P36;sbit P3_7=P37;void delay(int t) /延时处理int i,j;for(i=0;i<t;i+)for(j=0;j<120;j+) ;void scanled() / 数码管显示char k;dis20=timedata0%10;dis21=timedata0/10;dis22=timedata1%10;dis23=timedata1/10;dis24=timedata2%10;dis25=timedata2/10;dis26=timedata3%10;dis27=timedata3/10;for(k=0;k<8;k+)P2=scank;P0=dis1dis2k;delay(1);unchar checkkey()P3_4=0;P3_5=0;P3_6=0;P3_7=0;if(P3_0=1&&P3_1=1&&P3_2=1&&P3_3=1) return(0);else return(0xff);void keyscan() /按键处理if(checkkey()=0xff) char i; delay(10); if(checkkey()=0xff) /有键按下 P3_4=0; P3_5=1;P3_6=1;P3_7=1; if(P3_0=0) while(P3_0=0);timedata2+; if(P3_1=0)while(P3_1=0);timedata3+; if(P3_2=0)while(P3_2=0);timedata2=0; timedata3=0; if(P3_3=0) TR0=1; P3_4=1;P3_5=0;P3_6=1;P3_7=1; if(P3_0=0) while(P3_0=0);timedata2=timedata2+2; if(P3_1=0)while(P3_1=0);timedata3=timedata3+2; if(P3_2=0)while(P3_2=0);i=timedata2;timedata2=timedata3;timedata3=i; if(P3_3=0) TR0=0; P3_4=1;P3_5=1;P3_6=0;P3_7=1; if(P3_0=0) while(P3_0=0);timedata2=timedata2+3; if(P3_1=0)while(P3_1=0);timedata3=timedata3+3; if(P3_2=0)while(P3_2=0);timedata1=timedata1+1;/加一分 if(P3_3=0) while(P3_3=0);timedata0=0;timedata1=0; P3_4=1;P3_5=1;P3_6=1;P3_7=0; if(P3_0=0) while(P3_0=0);timedata2=timedata2-1; if(P3_1=0)while(P3_1=0);timedata3=timedata3-1; if(P3_2=0)while(P3_2=0);timedata1=timedata1-1; void main()TH0=0X3c;TL0=0xb0; TMOD=0x01; ET0=1; EA=1; while(1)scanled(); /数码管显示keyscan(); /按键处理 void time_intt0(void) interrupt 1 /定时器T0中断处理服务函数ET0=0; TR0=0; TH0=0X3c;TL0=0xb0; TR0=1; ms+; if(ms=20) ms=0x00; timedata0-;if(timedata0=-1)timedata0=59;timedata1-; if(timedata1=-1) TR0=0;ET0=1;4.2各子函数模块设计4.2.1 延时子程序此次程序中单独设立了一个带有参数传输的延时子程序,以供其他程序块的调用,且延时可以通过参数方便的控制,使程序更加的简洁。 延时子程序如下:void delay(int t) /延时处理int i,j;for(i=0;i<t;i+)for(j=0;j<120;j+) ;4.2.2 中断服务子程序当T0中断发生时转入执行中断服务子程序,本程序主要用于提供一个精确的时钟实现定时。另外还用对数码管的循环扫描显示,每中断一次就对数码管进行扫描一次,从而提供一个稳定的显示输出,不受其他程序的延时影响。代码如下;void time_intt0(void) interrupt 1 /定时器T0中断处理服务函数ET0=0;TR0=0; TH0=0X3c;TL0=0xb0;TR0=1; ms+; if(ms=20) ms=0x00; timedata0-;if(timedata0=-1)timedata0=59;timedata1-; if(timedata1=-1) TR0=0;ET0=1; 中断流程图:开始现场保护,重置初值,启动下一个50ms50ms计数器加1秒单元加1,50ms计数器清050ms计数器=20?秒单元=60?分单元减1,秒单元清0分单元=10?返回中断时间清0是是是否否否4.2.3 数码管显示子程序数码管显示采用动态显示方式,这样占用I/O口资源比较少,且易于实现。在运行中可以随时修改显示分数及时间。 其中倒计时的分钟显示程序块如下:char code dis110=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /共阳极字段显示sbit P3_0=P30;sbit P3_1=P31;sbit P3_2=P32;sbit P3_3=P33;sbit P3_4=P34;sbit P3_5=P35;sbit P3_6=P36;sbit P3_7=P37;void delay(int t) /延时处理int i,j;for(i=0;i<t;i+)for(j=0;j<120;j+) ;void scanled() / 数码管显示char k;dis20=timedata0%10;dis21=timedata0/10;dis22=timedata1%10;dis23=timedata1/10;dis24=timedata2%10;dis25=timedata2/10;dis26=timedata3%10;dis27=timedata3/10;for(k=0;k<8;k+)P2=scank;P0=dis1dis2k;delay(1);4.2.4 按键处理模块按键识别及处理程序主要由键盘识别和键值处理组成。其中键盘识别子程序不断地对键盘进行判断是否有键按下。当有键按下时则转到相应按键进行相应处理,即可实现对甲、乙两队总分的计算与处理和对比赛时间的相应操作。 键盘识别即依次判断第一列、第二列、第三列、第四列是否有键按下。如果有键按下,先得出列,再反向赋值得出行,最后得出所在行和列的位置。程序如下:char data dis28=0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; char data timedata4=0x00,0x0a,0x00,0x00; char code scan8=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80; /高电平有效的位选信号unchar checkkey()/按键处理初始化P3_4=0;P3_5=0;P3_6=0;P3_7=0;if(P3_0=1&&P3_1=1&&P3_2=1&&P3_3=1) return(0);else return(0xff);void keyscan() /按键处理if(checkkey()=0xff) char i; delay(10); if(checkkey()=0xff) /有键按下 P3_4=0; P3_5=1;P3_6=1;P3_7=1; if(P3_0=0) while(P3_0=0);timedata2+; if(P3_1=0)while(P3_1=0);timedata3+; if(P3_2=0)while(P3_2=0);timedata2=0; timedata3=0; if(P3_3=0) TR0=1; P3_4=1;P3_5=0;P3_6=1;P3_7=1; if(P3_0=0) while(P3_0=0);timedata2=timedata2+2; if(P3_1=0)while(P3_1=0);timedata3=timedata3+2; if(P3_2=0)while(P3_2=0);i=timedata2;timedata2=timedata3;timedata3=i; if(P3_3=0) TR0=0; P3_4=1;P3_5=1;P3_6=0;P3_7=1; if(P3_0=0) while(P3_0=0);timedata2=timedata2+3; if(P3_1=0)while(P3_1=0);timedata3=timedata3+3; if(P3_2=0)while(P3_2=0);timedata1=timedata1+1; if(P3_3=0) while(P3_3=0);timedata0=0;timedata1=0; P3_4=1;P3_5=1;P3_6=1;P3_7=0; if(P3_0=0) while(P3_0=0);timedata2=timedata2-1; if(P3_1=0)while(P3_1=0);timedata3=timedata3-1; if(P3_2=0)while(P3_2=0);timedata1=timedata1-1; 5系统仿真运行结果6结论这次课程设计虽然只有短短的两周时间,但是这使得我对单片机这门科学有了进一步的了解。无论是在硬件连接方面还是在软件编程方面。虽然上课让我对51单片机等器件有了一定的了解,由于没有实际动手操作的缺陷,增加了课设的难度,本次我的设计采用了AT89C51单片机芯片,与以往的单片机相比增加了许多新的功能,使其功能更为完善,应用领域也更为广泛。在这次设计中困难最大的就是调试,收获最多的也是调试。不管是硬件图还是软件编程都让我从中学到了实用的知识和技巧。这次单片机的设计和仿真,基本上达到了设计的功能要求。在以后的实践中,我将继续努力学习单片机设计方面的理论知识,并理论联系实际,争取在电路设计方面能有所提升。 7.参考资料新编单片机原理与应用 潘勇雄 编著单片机原理与应用级C51程序设计 谢维成 杨加国 编著51单片机应用开发案例精选 王为青 邱文勋 编著附录代码#include<reg51.h>#define unchar unsigned charchar code dis110=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /共阳极字段显示char code scan8=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80; char data dis28=0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; char data timedata4=0x00,0x0a,0x00,0x00; unchar ms; sbit P3_0=P30;sbit P3_1=P31;sbit P3_2=P32;sbit P3_3=P33;sbit P3_4=P34;sbit P3_5=P35;sbit P3_6=P36;sbit P3_7=P37;/对应的 输出接口void delay(int t) /延时处理int i,j;for(i=0;i<t;i+)for(j=0;j<120;j+) ;void scanled() / 数码管显示char k;dis20=timedata0%10;dis21=timedata0/10;dis22=timedata1%10;dis23=timedata1/10;dis24=timedata2%10;dis25=timedata2/10;dis26=timedata3%10;dis27=timedata3/10;for(k=0;k<8;k+)P2=scank;P0=dis1dis2k;delay(1);unchar checkkey()/将列置为低电平P3_4=0;P3_5=0;P3_6=0;P3_7=0;if(P3_0=1&&P3_1=1&&P3_2=1&&P3_3=1) return(0);else return(0xff);void keyscan() /按键处理if(checkkey()=0xff) char i; delay(10); if(checkkey()=0xff) /有键按下 P3_4=0; P3_5=1;P3_6=1;P3_7=1; if(P3_0=0) while(P3_0=0);timedata2+; if(P3_1=0)while(P3_1=0);timedata3+; if(P3_2=0)while(P3_2=0);timedata2=0; timedata3=0; if(P3_3=0) TR0=1; P3_4=1;P3_5=0;P3_6=1;P3_7=1; if(P3_0=0) while(P3_0=0);timedata2=timedata2+2; if(P3_1=0)while(P3_1=0);timedata3=timedata3+2; if(P3_2=0)while(P3_2=0);i=timedata2;timedata2=timedata3;timedata3=i; if(P3_3=0) TR0=0; P3_4=1;P3_5=1;P3_6=0;P3_7=1; if(P3_0=0) while(P3_0=0);timedata2=timedata2+3; if(P3_1=0)while(P3_1=0);timedata3=timedata3+3; if(P3_2=0)while(P3_2=0);timedata1=timedata1+1;/加一分 if(P3_3=0) while(P3_3=0);timedata0=0;timedata1=0; P3_4=1;P3_5=1;P3_6=1;P3_7=0; if(P3_0=0) while(P3_0=0);timedata2=timedata2-1; if(P3_1=0)while(P3_1=0);timedata3=timedata3-1; if(P3_2=0)while(P3_2=0);timedata1=timedata1-1; void main()TH0=0X3c;TL0=0xb0; TMOD=0x01;TMOD=0x01; ET0=1; EA=1; TR0=1; while(1)scanled(); /数码管显示keyscan(); /按键处理 void time_intt0(void) interrupt 1 ET0=0;TR0=0; TH0=0X3c;TL0=0xb0;TR0=1; ms+; if(ms=20) ms=0x00; timedata0-;if(timedata0=-1)timedata0=59;timedata1-; if(timedata1=-1) TR0=0;ET0=1;