当前位置:文档之家› 单片机篮球积分器分解

单片机篮球积分器分解

湖南工程学院课程设计课程名称单片机原理与应用课题名称比赛计分器设计专自动化班级1001班学号201001020121姓名刘朝露指导教师王迎旭汪超李晓秀等2013年 6 月7 日湖南工程学院课程设计任务书课程名称单片机原理与应用课题比赛计分器设计专业班级自动化1001班学生姓名刘朝露学号201001020121指导老师王迎旭汪超李晓秀等审批李晓秀任务书下达日期2013年6 月7 日任务完成日期2013年6 月21 日目录第一章系统的概述 (1)1.1系统的功能 (1)1.2设计内容及要求 (1)1.2.1 设计内容 (1)1.2.2 设计要求 (1)1.3按钮设置 (2)第2章总体方案设计 (2)2.1总体系统框图 (3)2.2系统组成 (5)第3章系统硬件设计 (6)3.1控制电路设计 (6)3.1.1 复位电路 (4)3.1.2 矩阵按钮电路 (4)3.2数码管显示电路设计 (6)第4章软件设计 (10)4.1主程序设计 (10)4.2各子程序设计 (11)4.2.1 延时子程序 (11)4.2.2 初始化子程序 (12)4.2.3 交换按钮程序 (12)4.2.4 状态部分程序 (11)4.2.5 加减部分程序 (14)仿真图 (16)设计总结 (17)参考文献 (18)附录:源程序清单 (19)电气信息学院课程设计评分表 (37)第1章系统概述1.1系统功能设计一个甲、乙两队比赛计分器,主要用于各种体育比赛记录分数。

采用矩阵式键盘作为输入。

基于以上思路,本次设计使用80C51实现一基于单片机的电子计分器的设计,其主要具有如下功能:(1)用户可分别对两队比分进行加1、加2、加3和减1,减2,减3操作。

(2)比分通过6个8段共阴极数码管显示器进行显示,每队比分显示三位,可以交换两队的比分。

(4)具有复位功能,通过复位键实现。

(5)预置分可通过加或减分按钮实现。

(6)比赛时间倒计时及其结束后蜂鸣器自动提醒。

1.2设计内容及要求1.2.1 设计内容:(1)给甲乙两队分别设置一个分数控制按钮,此按钮有7种状态,分别为+1、+2、+3、-1、-2、-3,+10(置数)。

(2)设置一个切换状态按钮,可以分别切换每一种状态,然后每一种状态会有相应的发光二极管点亮以区别是哪种状态。

(3)设置一个复位按钮,按下实现甲、乙队总分回到初试分及显示(4)设置一个交换分按钮,用于交换甲乙比分。

1.2.2 设计要求:方案合理、正确,系统稳定、可靠。

软件设计要求尽可能精练、简短和运行可靠。

硬件电路要求简单明了,以节约成本。

1.3 按钮设置本设计的宗旨是用最少的按键实现最多的功能。

设计中一共用到了5个按钮,分别为:清零按钮、甲的加分减分按钮,乙的加分减分按钮,切换状态按钮和交换比分按钮。

每个按钮的功能如下:控制甲的按钮:实现+1、+2、+3、-1、-2、-3,+10(置数)功能;控制乙的按钮:实现+1、+2、+3、-1、-2、-3,+10(置数)功能;切换按钮:实现甲乙的各种状态的切换;减缓比分按钮:交换甲乙的比分;清零按钮:实现甲乙比分清零;第2章总体方案设计2.1 总体系统框图此次设计80C51单片机为核心,配以一定的外围电路和软件,以实现比赛计分器的功能。

利用6个8段共阴级数码管显示器.采用动态显示输出比分,用户信息输入则采用4×4矩阵式键盘,起状态切换用发光二极管的状态表示。

用一片单片机可满足本设计的输入输出。

系统设计方案的硬件电路设计框图如图2-1所示。

图2-1 硬件电路设计2.2 系统组成系统由硬件部分和软件部分组成。

硬件电路由复位按钮、80C51单片机、矩阵键盘和7个发光二极管,6个数码管等组成。

软件部分主程序主要由系统初始化段、键盘识别、键值处理、8段共阴极LED显示器扫描显示子程序组成。

软件设计主要分为四个部分:信息输入、信息处理、显示输出。

信息输入时采用矩阵式键盘来实现,所以需要检测键盘有无按键的子程序;信息处理需要对用户通过键盘输入的不同信息进行辨别并执行相应的处理;显示输出考虑到成本和电路体积,决定采用动态输出,从而达到设计的目的。

第3章系统硬件设计3.1控制电路设计3.1.1 复位电路如图3-1所示,按钮与单片机的RST引脚相连,当每次按下该按钮后,系统将通过软件实现对计分回到初始值功能。

3.1.2在的行列线就导通了,所以如果一条线上是低电平,那么按键的另一条线也是低电平。

先给第一行送一个低电平,读取列值,就可以判定第一行上是否有按键按下,如果有按键,那么列线里面就有一条线为低电平。

如果都为高电平,说明第一行上没有按键被按下,接着给第二行送低电平,重复上述步骤,就可以读取按键了。

也可以用另外一种方法:先给行线全部写“0”,然后看列线是否有为低电平的,如果有说明那一列上有键被按下,让后要确定按键所在的行的,给所有列线写“0”,读取行线的值就可以确定按键的具体位置了,让后将两次读取的值,组成一个值j就得到了键值。

图3-2 矩阵键盘的接口电路3.2数码管显示电路设计显示器采用8段共阴极数码管显示器,来实现显示器的动态扫描,八个二极管连接一个阴极的结构,只要另一段为高电平,二极管就会发光,从而形成一段。

将八段顺序排列后就成为具有一定编码的共阴显示器了。

动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。

如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED 使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。

显示电路如图4所示。

共阴极数码管显示图3-3 数码管显示电路数码管显示采用8个8段数码管显示器,来实现显示器的动态扫描显示采用动态扫描显示方法,即由显示器扫描显示子程序控制显示器逐个循环从左至右依次点亮各个显示器。

由单片机的P0口控制显示。

第4章软件设计4.1主程序设计主程序主要由系统初始化段、键盘识别、键值处理、6个8段共阴极LED显示器扫描显示子程序组成。

通过对以上各段和子程序的结合,以实现系统功能。

该系统主程序流程图如下图所示。

图4-1 系统主程序流程图图4-2扫描刷新显示子程序流程图4.2各子程序设计4.2.1 延时子程序void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}此段程序是根据实验板各硬件的参数具体设置的。

4.2.2 初始化子程序void init(){cnt=0;num=0;wela=0;dula=0;temp=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}初始化程序是用来对各定义的变量初始化的,每一次主程序执行之前都要先执行初始化程序以保证变量的值为初值。

4.2.3 交换按钮程序if(key4==0) //当交换键按下{delay(10);if(key4==0){m=bai;bai=aa;aa=m;n=shi;shi=bb;bb=n;p=ge;ge=cc;cc=p;while(!key4); //去抖delay(10);while(!key4);}}此程序就是当交换按键按下时,利用中间变量改变甲乙的每一位的数值,这样就能实现交换甲乙两队的比分,然后再给电路去抖动,就不会出现问题了。

4.2.4 状态部分程序for(i=0;i<4;i++){ if(key3==0){ if(key3==0){ num++;if(num==7)num=0;delay(5);switch(num){ case 0: cnt=-3;d7=0;d6=1;break;case 1: cnt=10;d1=0;d7=1;break;case 2: cnt=1;d2=0;d1=1;break;case 3: cnt=2;d3=0;d2=1;break;case 4: cnt=3;d4=0;d3=1;break;case 5: cnt=-1;d5=0;d4=1;break;case 6: cnt=-2;d6=0;d5=1;break; }}while(!key3);delay(10);while(!key3);}}该程序是主函数里面的部分程序,当切换分按钮按下时利用switch case 语句来实现甲乙各种状态之间的切换,并且同时控制了7个发光二极管的显示来表明当前处于什么状态。

切换到相应的状态时在执行显示扫描程序将实现切换功能。

4.2.5 加减部分程序if(key1==0) //甲控制按钮按下{ delay(10); //延时if(key1==0){ temp=temp+cnt; //实现加减运算if(temp==256)temp=0; }while(!key1); //去抖delay(10);while(!key1);bai=temp/100; //分离处百位shi=temp%100/10;ge=temp%10;}该程序是通过前段调用一个变量cnt来作为本次运算的加数,然后通过切换状态来做不同的运算。

这样就免去了很多不必要的程序,直接调用实现,简化了程序。

仿真图:设计总结这次课程设计虽然只有短短的两周时间,但我受益匪浅学会了很多东西。

刚开始拿到课题时,觉得自己无处入手,但通过老师的讲解和查询资料,开始有自己的思路,整理出了总体方案,然后设计出硬件原理图,源程序等。

在这次课程设计中,我在整个设计过程中懂得了许多东西,也培养了独立思考和设计的能力,树立了对知识应用的信心,相信会对今后的学习工作和生活有非常大的帮助,并且提高了自己的动手实践操作能力,使自己充分体会到了在设计过程中的成功喜悦。

虽然这个设计做的不是很理想,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我受益良多。

课程设计是结束了,不过学习单片机知识的过程还没有终结,探索学习的奥妙,培养学习的兴趣,养成良好的学习习惯对我们来说才是最重要的。

与此同时我感受到了老师对学生的那种悔人不卷的精神,每天的固定时间,老师都来给我们指导,使我们少走弯路,顺利完成实习任务,感谢汪老师一路以来对我们的关心与帮助。

参考文献[1]《单片机原理与应用》王迎旭编机械工业出版社[2]《51系列单片机原理与接口技术实验指导》周向红编湖南工程学院[3]《微型计算机原理及应用》许立梓编机械工业出版社 2002[4]《微型计算机接口技术及应用》刘乐善编华中理工大学出版社 2000[5]《计算机硬件技术基础试验教程》邹逢兴编高等教育出版社 2000[6]《16位微型计算机原理接口及其应用》周佩玲编中国科技大学出版社2000[7]《微型计算机原理与接口技术》吴秀清编中国科学技术出版社 2001[8]《微型计算机接口技术》邓亚平编清华大学出版社 2001[9]《单片机原理及及应用》王迎旭编机械工业出版社 2001[10]《单片机应用程序设计技术》周航慈著北京航空航天出版社2002[11]《单片机实用技术问答》谢宜仁主编人民邮电出版社 2002附录A:源程序清单#include <REGX52.H>#define uchar unsigned char#define uint unsigned int#define TH_value 0xb1#define TL_value 0xe0 //定时器工作于方式1,每20ms产生一个中断sbit speak=P3^7;sbit ext=P3^2;sbit led=P3^4;/**********BCD码字***************/uchar code bcd[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};/************0~9数字显示**************/uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar munite; //比赛剩余分位数uchar second; //比赛剩余秒位数uchar part; //当前比赛的节次uchar s24; //24秒标志uchar red_mark; //红队得分uchar blue_mark; //蓝队得分uchar key_move; //设置位移动uchar key_red_add; //红队得分增加1uchar key_red_mul; //红队得分减少1uchar key_blue_add; //蓝队得分增加1uchar key_blue_mul; //蓝队得分减少1uchar key_pause; //暂停uchar key_reset; //24秒复位及进入下一节复位uchar time_tick1,time_tick2;uchar station; //状态标志位uchar flag; //跳亮标志位uchar talk1,talk2,num,num1; //报警信号标志/*******函数声明********/void init();void init_timer();void init_extra();uchar key_scan();void scanf(uchar p,uchar tw,uchar m,uchar s,uchar r,uchar b); void scanf1(uchar p,uchar r,uchar b);void scanf2(uchar tw,uchar r,uchar b);void scanf3(uchar m,uchar r,uchar b);void scanf4(uchar s,uchar r,uchar b);void play24();void playstop1();void playstop2();/*********延时程序,t=1时,延时1ms************/void delay(uchar t){int i,j;for(j=0;j<t;j++)for(i=0;i<110;i++);}/***********主程序************/void main(){init();init_timer();init_extra(); //初始化while(1){if(station==0) //状态0:比赛状态{scanf(part,s24,munite,second,red_mark,blue_mark);if(time_tick1==50){time_tick1=0;if(second==0) //时间计数{if(munite==0){if(part>=4){talk2=1; //终场报警操作TR0=0; //关闭定时器中断0TR1=1;}else{talk2=1; //小节结束报警TR1=1;TR0=0;}}else{munite--;second=59;}}elsesecond--;if(s24==0) //24秒计数{TR0=0;}else{if(s24<2){talk2=1;TR1=1;TR0=0;key_pause=0;}else if(s24<8){talk1=1;TR1=1;}s24--; //6秒提醒}}if(second==0&&munite==0) //操作进入下一节比赛{if(key_reset==1){s24=0x18;part++;key_reset=0;if(part==10)talk2=1; //比赛太久,报警if(part<5) //判断是否为加时赛,不是,延长12分钟if(key_red_add==1) //红队得分操作加{key_red_add=0;if(red_mark<0xff)red_mark++;}if(key_red_mul==1) //红队得分操作减{key_red_mul=0;if(red_mark>0)red_mark--;}if(key_blue_add==1) //蓝队得分操作加{key_blue_add=0;if(blue_mark<0xff)blue_mark++;}if(key_blue_mul==1) //蓝队得分操作减{key_blue_mul=0;if(blue_mark>0)blue_mark--;}}if(station==1) //比赛节次操作{TR1=1;flag=0;while(station==1){if(flag==0)scanf1(part,red_mark,blue_mark);if(flag==1)scanf(part,s24,munite,second,red_mark,blue_mark);if(key_red_add==1) //比赛节次操作加{if(part<0x09)part++;}if(key_red_mul==1) //比赛节次操作减{key_red_mul=0;if(part>1)part--;}}if(station!=1){TR1=0;flag=0;}}{TR1=1;flag=0;while(station==3){if(flag==0)scanf3(munite,red_mark,blue_mark);if(flag==1)scanf(part,s24,munite,second,red_mark,blue_mark);if(key_red_add==1) //分操作加,MAX=60{if(munite<0x3c)munite++;}if(key_red_mul==1) //分操作减{key_red_mul=0;if(munite>0)munite--;}}if(station!=3){TR1=0;flag=0;}}if(station==4) //计时秒操作{TR1=1;flag=0;while(station==4){if(flag==0)scanf4(second,red_mark,blue_mark);if(flag==1)scanf(part,s24,munite,second,red_mark,blue_mark);if(key_red_add==1) //秒操作加,MAX=60{key_red_add=0;if(second<0x3c)second++;}if(key_red_mul==1) //秒操作减{key_red_mul=0;if(second>0)second--;}}if(station!=4){TR1=0;flag=0;}}}}/************初始化************/void init(){munite=0x01;second=0x00;red_mark=0x00;blue_mark=0x00;part=0x01;s24=0x18;station=0x00;key_pause=0;key_move=0x00;key_red_add=0x00;key_red_mul=0x00;key_blue_add=0x00;key_blue_mul=0x00;key_reset=0x00;flag=0x00;}/************定时器0初始化**************/void init_timer(){TMOD=0x11;TH0=TH_value;TL0=TL_value;TH1=TH_value;TL1=TL_value;ET0=1;ET1=1;time_tick1=0;time_tick2=0;}/**************外部中断源初始化****************/ void init_extra(){EX0=1;EX1=1;IT0=1;IT1=1;EA=1;}/*****************定时器0***************/ void timer0()interrupt 1{time_tick1++;TH0=TH_value;TL0=TL_value;}/*************定时器1***************/ void timer1()interrupt 3{EA=0;TH1=TH_value;TL1=TL_value;time_tick2++;if(time_tick2==50){led=~led;time_tick2=0x00;if(flag==0)flag=1; //跳亮标志位elseflag=0;}if(talk1==1){EA=0;TH1=0xFD;TL1=0xF7;EA=1;speak=~speak;num++;if(num==200){num=0;talk1=0;TR1=0;}}if(talk2==1){EA=0;TH1=0xFD;TL1=0xF7;EA=1;speak=~speak;num++;if(num==200){num1++;num=0;if(num1==4){num1=0;talk2=0;TR1=0;}}}EA=1;}/***********外部中断0************/ void extra0()interrupt 0{if(key_pause==1){key_pause=0;TR0=0;}else{if(s24==0) ;else{key_pause=1;TR0=1;}}}/***********外部中断1*****************/ void extra1()interrupt 2{uchar dtemp;dtemp=key_scan();switch(dtemp){case 0xFE:key_move=1;break;case 0xFD:key_reset=1;break;case 0xF7:key_red_add=1;break;case 0xDF:key_red_mul=1;break;case 0xEF:key_blue_add=1;break;case 0xBF:key_blue_mul=1;break;default:break;}if(key_move==1){ station++;if(station==5)station=0;key_move=0;}}/*************键盘扫描****************/ uchar key_scan(){uchar temp;P1=0xFF;temp=P1;delay(3);if(temp==P1){return temp;}}/***************数码管驱动*******************/ void scanf2(uchar tw,uchar r,uchar b){P2=bcd[0];P0=table[10];delay(1);P2=bcd[1];P0=table[tw/10];delay(1);P2=bcd[2];P0=table[tw%10];delay(1);P2=bcd[3];P0=table[10];delay(1);P2=bcd[4];P0=table[10];delay(1);P2=bcd[5];P0=table[10];delay(1);P2=bcd[6];P0=table[10];delay(1);P2=bcd[7];P0=table[r/100];delay(1);P2=bcd[8];P0=table[r/10%10];delay(1);P2=bcd[9];P0=table[r%10];delay(1);P2=bcd[10];P0=table[b/100];delay(1);P2=bcd[11];P0=table[b/10%10];delay(1);P2=bcd[12];P0=table[b%10];delay(1);}/***************数码管驱动*******************/ void scanf3(uchar m,uchar r,uchar b){P2=bcd[0];P0=table[10];delay(1);P2=bcd[1];P0=table[10]; delay(1);P2=bcd[2];P0=table[10]; delay(1);P2=bcd[3];P0=table[m/10]; delay(1);P2=bcd[4];P0=table[m%10]; delay(1);P2=bcd[5];P0=table[10]; delay(1);P2=bcd[6];P0=table[10]; delay(1);P2=bcd[7];P0=table[r/100]; delay(1);P2=bcd[8];P0=table[r/10%10]; delay(1);P2=bcd[9];P0=table[r%10]; delay(1);P2=bcd[10];P0=table[b/100];delay(1);P2=bcd[11];P0=table[b/10%10];delay(1);P2=bcd[12];P0=table[b%10];delay(1);}电气信息学院课程设计评分表指导教师签名:________________日期:________________注:①表中标*号项目是硬件制作或软件编程类课题必填内容;②此表装订在课程设计说明书的最后一页。

相关主题