篮球记分器的设计说明.docx
《篮球记分器的设计说明.docx》由会员分享,可在线阅读,更多相关《篮球记分器的设计说明.docx(23页珍藏版)》请在冰豆网上搜索。
篮球记分器的设计说明
中北大学
课程设计任务书
学生:
学号:
学院:
信息与通信工程学院
专业:
电子信息工程
题目:
专业综合实践之单片机系统部分:
篮球计分器设计
指导教师:
王伟职称:
副教授
2015年12月28日
中北大学
课程设计任务书
2015/2016学年第一学期
学院:
信息与通信工程学院
专业:
电子信息工程
学生姓名:
学号:
学生姓名:
学号:
学生姓名:
学号:
题目:
专业综合实践之单片机系统部分:
篮球计分器设计
起迄日期:
12月28日~1月8日
课程设计地点:
中北大学
指导教师:
王伟敏娟
系主任:
王浩全
下达任务书日期:
2015年12月28日
课程设计任务书
1.设计目的:
在学习专业基础课和专业课的基础上,主要在电子仪器、微机综合设计与实践、单片机与A/D和D/A和光、计、电综合应用等几个方面开展实践活动,巩固所学知识、培养动手能力。
2.设计容和要求(包括原始数据、技术参数、条件、设计要求等):
1.设计一款能够显示篮球比分的记分牌。
2.通过加分按钮可以给A队,或B队加分。
3.设计对调功能,更换场地后,AB队分数互换。
4.增加局数比分功能。
5.增加比赛时间倒计时功能。
6.其他功能。
3.设计工作任务及工作量的要求〔包括课程设计计算说明书(论文)、图纸、实物样品等〕:
1)设计说明书符合要求;
2)相应器件的工作原理及应用;
3)系统工作原理图;
4)参考文献原文不少于3篇。
课程设计任务书
4.主要参考文献:
[1]万文略编著.单片机原理及应用[M].:
大学,2004.
[2]德文编著.微型计算机技术[M].北京:
高等教育,2005.
[3]建勋编著.C语言程序设计教程[M].北京:
清华大学,2008.
[4]于海生编著.计算机控制技术[M].北京:
机械工业,2007.
[5]唐俊翟编著.单片机原理及应用[M].北京:
冶金工业,2003.
[6]彭为编著.单片机典型系统应用设计实例精讲[M].北京:
电子工业,2006.
5.设计成果形式及要求:
设计说明书及相关电路图
6.工作计划及进度:
12月28日~12月31日:
查阅资料;
1月1日~1月5日:
方案设计、实验验证;
1月6日~1月7日:
完成课程设计说明书;
1月8日:
答辩。
系主任审查意见:
签字:
年月日
1概述
1.1设计意义
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械了。
因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
通过此次基于单片机设计的篮球计时计分系统,我们可以更清楚详细的了解单片机程序设计的基本指令功能、编程步骤和技巧来讲述单片机编程,并对AT89S51单片机的结构和原理进行讲述,以及基于单片机开发应用的相关芯片的工作原理,和相关外围电路的设计和调试过程进一步了解,有助于今后的工作和学习生活。
本次设计用由AT89S51编程控制LCD作显示的球赛计时计分系统。
该系统具有赛程时间暂停,及时刷新甲、乙双方的成绩等功能。
它具有价格低廉,性能稳定,操作方便并且易于携带等特点。
广泛适合各类学校或者小型团体作为赛程计时计分。
1.2系统的主要功能
本系统有三项主要主要功能:
1.设计一款能够显示篮球比分的记分牌。
2.通过加分按钮可以给A队,或B队加分。
3.设计对调功能,更换场地后,AB队分数互换。
4.增加局数比分功能。
5.增加比赛时间倒计时功能。
2硬件方案设计及描述
2.1方案选择及设计思想
通过分析之后我们觉得此次设计主要是两大模块,一是系统显示模块,二是单片机设计模块,在显示模块的设计中,开始想到了常用的LED显示,但是考虑的后续硬件实现的复杂性(超过10以上的LED实物连接将十分复杂),于是选取了方便但是没有接触过的LCD显示,因此也导致了一定程度的难度,在选取单片机方面,我们选取了课堂上讲授的51单片机,对于简单的输入和输出控制,51机显然最合适,51单片机是8位的,采用总线结构,但是具有变成控制简便,接口简单,工作可靠,价格经济,能耗少,容易实现系统小型化等特点。
因为篮球计分系统电路结构比较简单,只有按键控制和数码显示两个部分,P0口接12个开关,分别作为比分的加一,加二,加三,减一,设置节次,暂停,交换场地的按键控制。
P2口和P3口控制LCD的比分及时间显示。
该系统包括AT89S51,时钟及复位电路,按键电路,及LCD显示器。
该电路控制简单,清晰明了,用LCD液晶显示,避免了用LED的复杂接线,便于实体硬件电路的焊接。
2.2原理框图
1602aLCD
图1.1原理图
2.3工作原理
LCD显示器
该显示器的RS,RW,E端与P2相连,引脚的作用分别是:
RS=0输入指令,RS=1输入数据,RW=0向LCD写入指令或数据,RW=1从LCD读取信息,E是使能信号。
D0~D7与P3相连是数据总线。
时钟电路
时钟电路在单片机系统中起着非常重要的作用,是为保证系统正常工作的基础,在一个单片机系统中,时钟是保障系统正常工作的基准震荡定时信号,主要有晶振和外围电路组成,晶振频率大小决定单片机的快慢,我们这里采用的是12MHZ,另外有2个30P的电容。
复位电路
单片机系统的复位电路我们采用的是上电加按钮的复位电路形式,电阻采用220欧的阻值,采用22μ的电容。
按键电路
本设计共有12个设置按键,分别为+1,+2,+3,-1,暂停,设置节次按键和交换场次按键。
2.4电路图
3软件设计流程及描述
3.1系统模块层次结构图
3.2程序流程图
N
Y
3.3源程序代码
#include
#include"intrins.h"//_nop_();延时函数用
#defineucharunsignedchar
#defineuintunsignedint
#defineLcd_PortP3//定义数据端口
#defineKEY_IOP0//键盘接口
sbitRS=P2^1;//定义和LCM的连接端口
sbitRW=P2^2;
sbitE=P2^5;
sbitBusy=P3^7;
sbitspeaker=P1^0;
uchardatakeytemp,key;
ucharL=0;
uchark=0;
ucharc=0;
ucharb=0;
ucharj=0;
uchare=1;
uchard=0;
ucharhour=24;
ucharhour1=0;
ucharmin=11;
ucharsec=59;//赋初值
uchardataflag=0x00;
bitflag_key=0;
ucharcodeLcddata[]={"0123456789:
"};
//ucharcodeLcddata[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
/******************************************************************************************
*函数名称:
Timer0Init
*功能描述:
定时器0初始化
******************************************************************************************/
voidTimer0Init(void)
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=-10300/256;
TL1=-10300%256;//25MS定时初值(T1计时用)
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
/******************************************************************************************
*函数名称:
IsrTimer0
*功能描述:
T050mS中断程序
******************************************************************************************/
voidIsrTimer0(void)interrupt1using1//T050mS中断程序
{
staticucharcount=0;
TH0=0x3c;
TL0=0xb0;
count++;
if(count==20)//定时1s时间到
{
count=0;
sec--;
if(sec==0)//1分钟时间到
{
if(min==0)//1小时时间到
{
min=0;
EA=0;
speaker=~speaker;
}
else
{
sec=59;
min--;
}
}
}
}
voidIsrTimer1(void)interrupt3using3//T150mS中断程序
{uchari=0,m=0,a=0;
staticucharta20ms=0;
TH1=-10300/256;
TL1=-10300%256;
ta20ms++;
if(ta20ms==1)//定时1s时间到
{
ta20ms=0;
hour1--;
if(hour1==-1)//1分钟时间到
{
hour--;hour1=99;
if(hour==0)
{
hour=24;hour1=0;
k=1;
//EA=0;
L=1;
speaker=~speaker;
while(a<=2){
while(m<=225){for(i=0;i<=225;i++)
a++;m++;}}
speaker=1;}
}
}
}
/******************************************************************************************
*函数名称:
Delay
*功能描述:
延时子程序,延时(1MS*t)S
******************************************************************************************/
voidDelay(uchart)
{
uchara;
while(t--!
=0)
{
for(a=0;a<125;a++);
}
}
/******************************************************************************************
*函数名称:
Read_Busy
*功能描述:
读忙信号判断
******************************************************************************************/
voidRead_Busy(void)
{
uchari=50;
Lcd_Port=0xff;
RS=0;
RW=1;
E=1;
while((i--)&&Busy);
E=0;
}
/******************************************************************************************
*函数名称:
Write_Comm
*功能描述:
写指令函数ok
******************************************************************************************/
voidWrite_Comm(ucharlcdcomm)
{
Read_Busy();
RS=0;
RW=0;
E=1;
Lcd_Port=lcdcomm;
E=0;
}
/******************************************************************************************
*函数名称:
Write_Char
*功能描述:
写字符函数ok
******************************************************************************************/
voidWrite_Char(uintnum)//写字符函数
{
Read_Busy();
RS=1;
RW=0;
E=1;
Lcd_Port=Lcddata[num];
E=0;
}
/******************************************************************************************
*函数名称:
Write_Data
*功能描述:
写数据函数ok
******************************************************************************************/
voidWrite_Data(ucharlcddata)
{
Read_Busy();
RS=1;
RW=0;
E=1;
Lcd_Port=lcddata;
E=0;
}
/******************************************************************************************
*函数名称:
Init_LCD
*功能描述:
初始化LCD
******************************************************************************************/
voidInit_LCD(void)
{
//Delay(400);//稍微延时,等待LCM进入工作状态
Write_Comm(0x38);//8位2行5*8
Write_Comm(0x0c);//显示开/关,光标开闪烁开
Write_Comm(0x01);//清显示
Write_Comm(0x06);//文字不动,光标右移
Write_Comm(0x02);//光标归位
}
/******************************************************************************************
*函数名称:
Show_Time
*功能描述:
LCD上显示当前时间
******************************************************************************************/
voidShow_Time(void)
{
Write_Comm(0x80+0x08);//显示首地址
Write_Char(hour/10);//显示小时
Write_Char(hour%10);
Write_Char(10);//显示:
Write_Char(hour1/10);//显示小时
Write_Char(hour1%10);
Write_Comm(0x80+0x4b);
Write_Char(min/10);//显示分钟
Write_Char(min%10);
Write_Char(10);//显示:
Write_Char(sec/10);//显示秒
Write_Char(sec%10);
Write_Comm(0x80+0x45);
Write_Char(c/10);
Write_Char(c%10);
Write_Comm(0x85);
Write_Char(d/10);
Write_Char(d%10);
}
//***************按键扫描函数/*************
voidkeyscan()
{
uchari,t=0xef,temp=0;//11101111
KEY_IO=0x0f;
keytemp=(~KEY_IO)&0x0e;
if(keytemp!
=0)//00000000;00001000;00000100;00000010;00000001;
{
Delay(20);
for(i=0;i<4;i++)
{
KEY_IO=t;
keytemp=(~KEY_IO)&0x0e;
if(keytemp!
=0&flag_key==0)
{
flag_key=1;
switch(keytemp)
{
case0x08:
key=0*3+i;break;
case0x04:
key=1*4+i;break;
case0x02:
key=2*4+i;break;
default:
break;
}
switch(key)
{
case0:
{c++;j=1;if(c>=99){Write_Comm(0x84);Write_Data('1');d=0;}b=0;}break;
case1:
{c++;c++;j=1;if(c>=99){Write_Comm(0x84);Write_Data('1');d=0;}b=0;}break;
case2:
{c++;c++;c++;if(c>=99){Write_Comm(0x84);Write_Data('1');d=0;}j=1;b=0;}break;
case4:
{d++;if(d>=99){Write_Comm(0x80+0x44);Write_Data('1');c=0;};b=1;j=0;}break;
case5:
{d++;d++;if(d>=99){Write_Comm(0x80+0x44);Write_Data('1');c=0;}b=1;j=0;}break;
case6:
{d++;d++;d++;if(d>=99){Write_Comm(0x80+0x44);Write_Data('1');c=0;}b=1;j=0;}break;
case8:
{if(b==1){d--;if(d==0)d=0;};if(j==1)c--;}break;
case9:
if(k==1)hour=24;EA=~EA;speaker=1;L=0;k=0;break;
case10:
e++;if(e==5)e=1;Write_Comm(0x80+0x0d);Write_Char(e%10);break;
case3:
{Write_Comm(0x80);
Write_Data('C');
Write_Data('B');
Write_Data('A');
Write_Data(':
');
Write_Comm(0x80+0x0d);
Write_Char(e%10);
Write_Data('S');
Write_Data('t');
Write_Comm(0x80+0x40);
Write_Data('N');
Write_Data('B');
Write_Data('A');
Write_Data(':
');
temp=c;
c=d;
d=temp;
}break;
case7:
{Write_Comm(0x80);
Write_Data('N');
Write_Data('B');
Write_Data('A');
Write_Data(':
');
Write_Comm(0x80+0x0d);
Write_Char(e%10);
Write_Data('S');
Write_Data('t');
Write_Comm(0x80+0x40);
Write_Data('C');
Write_Data('B');
Write_Data('A');
Write_Data(':
');
temp=c;
c=d;
d=temp;}break;
default:
break;
}
}
t=(t<<1)|0x01;
}
}
elseflag_key=0;
}
/******************************************************************************************
*函数名称:
main
*功能描述:
主函数
******************************************************************************************/
voidmain(void)
{
Init_LCD();//初始化LCM
Timer0Init();//初始化定时器
Write_Comm(0x80);
Write_Data('N');
Write_Data('B');
Write_Da