篮球比分计时器课程设计.docx
《篮球比分计时器课程设计.docx》由会员分享,可在线阅读,更多相关《篮球比分计时器课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
篮球比分计时器课程设计
课程设计
题目篮球赛计时计分器
二级学院电子信息与自动化
专业电气工程及其自动化
班级
学生姓名学号
指导教师
考核项目
设计50分
平时成绩20分
答辩30分
设计质量20分
创新设计15分
报告质量15分
熟练程度20分
个人素质10分
得分
总分
考核等级
教师签名
摘要
此次设计隶属于计算机控制技术弱电课程设计,主要通过基于单片机AT89S51芯片作为本的核心控制元件,利用1602aLCD作为显示器件,键盘输入电路等相关的软件的有机结合以及喇叭等辅助器件,构成了一个满足基本设计要求的篮球计分器。
本系统可满足倒计时方式显示单节比赛剩余时间,可暂停,显示双方得分,按键输入可修改分值,如有错误可进行分值的相应修改。
整场比赛结束时有声音提示。
系统符合一般篮球计时器的工作要求。
才采用液晶显示器1602aLCD,因为其微功耗、小体积、使用灵活等诸多优点在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用,而且有利于硬件实物的成功。
设计的主要方法主要是先通过仿真确定方案的可行性,然后在进行局部测试看实物是否满足仿真的设计要求,最后把整体电路搭建完成做最后的测试和调试。
关键词:
AT89S51按键输入:
点阵字符型液晶模块1602A,计数器计时器
1概述
1.1设计意义
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械了。
因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
通过此次基于单片机设计的篮球计时计分系统,我们可以更清楚详细的了解单片机程序设计的基本指令功能、编程步骤和技巧来讲述单片机编程,并对AT89S51单片机的结构和原理进行讲述,以及基于单片机开发应用的相关芯片的工作原理,和相关外围电路的设计和调试过程进一步了解,有助于今后的工作和学习生活。
本次设计用由AT89S51编程控制LCD作显示的球赛计时计分系统。
该系统具有赛程时间暂停,及时刷新甲、乙双方的成绩等功能。
它具有价格低廉,性能稳定,操作方便并且易于携带等特点。
广泛适合各类学校或者小型团体作为赛程计时计分。
1.2系统的主要功能及本人所做工作
本系统有三项主要主要功能:
一.是倒计时方式显示单节比赛剩余时间,可暂停,二.显示双方得分,按键输入可修改分值,设置三个按键分别加分1,2,3。
如有错误可进行分值的相应修改设置一个按键每次减1分。
三.24秒倒计时显示时间结束喇叭响,且显示每一个节次,比赛结束时有喇叭声音提示。
本人在这次课程设计过程中主要负责前期的资料查找及中期的LCD显示程序测试和后期的外围电路设计调试测试。
在我们的团队中,每个人分工明确,认真负责,因此我们再保证课程质量的前提下完成了该次课程设计。
2硬件方案设计及描述
2.1方案选择及设计思想
通过分析之后我们觉得此次设计主要是两大模块,一是系统显示模块,二是单片机设计模块,在显示模块的设计中,开始想到了常用的LED显示,但是考虑的后续硬件实现的复杂性(超过10以上的LED实物连接将十分复杂),于是选取了方便但是没有接触过的LCD显示,因此也导致了一定程度的难度,在选取单片机方面,我们选取了课堂上讲授的51单片机,对于简单的输入和输出控制,51机显然最合适,51单片机是8位的,采用总线结构,但是具有变成控制简便,接口简单,工作可靠,价格经济,能耗少,容易实现系统小型化等特点。
因为篮球计分系统电路结构比较简单,只有按键控制和数码显示两个部分,P0口接6个开关,分别作为比分的加一,加二,加三,减一,设置节次,暂停的按键控制。
P2口和P3口控制LCD的比分及时间显示。
该系统包括AT89S51,时钟及复位电路,按键电路,及LCD显示器。
该电路控制简单,清晰明了,用LCD液晶显示,避免了用LED的复杂接线,便于实体硬件电路的焊接。
2.2原理框图
1602aLCD
时
钟
电
路
按键电路
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μ的电容。
按键电路
本设计共有9个设置按键,分别为+1,+2,+3,-1,暂停,设置节次按键。
按键与P0口相接。
2.4元件清单
三极管9012×2
单片机AT89S51×1
按钮×10
电阻10K×6
电阻1K×2
液晶显示屏LCD1602a×1
电容22μ×1
电容30p×2
2.5电路图
3软件设计流程及描述
3.1系统模块层次结构图
读忙信号判断函数
3.2程序流程图
开始
定时器0,LCD初始化
显示当前时间
读取P0口的值
是否有按键按下
N
Y
哪个按键按下
暂停
减一
加三
加二
节次
加一
待按键释放
将时间,分数,节次经P2,P3口输出显示
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;//11101111
KEY_IO=0x0f;
keytemp=(~KEY_IO)&0x0e;
if(keytemp!
=0)//00000000;00001000;00000100;00000010;00000001;
{
Delay(20);
for(i=0;i<3;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*3+i;break;
case0x02:
key=2*3+i;break;
default:
break;
}
switch(key)
{
case0:
{d++;j=1;if(d>=99){Write_Comm(0x84);Write_Data('1');d=0;}b=0;}break;
case1:
{d++;d++;j=1;if(d>=99){Write_Comm(0x84);Write_Data('1');d=0;}b=0;}break;
case2:
{d++;d++;d++;if(d>=99){Write_Comm(0x84);Write_Data('1');d=0;}j=1;b=0;}break;
case3:
{c++;if(c>=99){Write_Comm(0x80+0x44);Write_Data('1');c=0;};b=1;j=0;}break;
case4:
{c++;c++;if(c>=99){Write_Comm(0x80+0x44);Write_Data('1');c=0;}b=1;j=0;}break;
case5:
{c++;c++;c++;if(c>=99){Write_Comm(0x80+0x44);Write_Data('1');c=0;}b=1;j=0;}break;
case6:
{if(j==1){d--;if(d==0)d=0;};if(b==1)c--;}break;
case7:
if(k==1)hour=24;EA=~EA;speaker=1;L=0;k=0;break;
case8:
e++;if(e==5)e=1;Write_Comm(0x80+0x0d);Write_Char(e%10);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_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(':
');
while
(1)
{Show_Time();//显示时间
keyscan();}
}
4测试
仿真阶段:
首先确定实现语言,在参考了很多写成的程序之后,发现用C语言相对而言更加方便,在仿真软件keil上进行程序测试,protues上进行实物测试,其中程序阶段对LCD的控制原理是靠一定的原有程序以及实验方法获得的,在仿真通过老师检验之后我们就开始了实物焊接。
实物阶段:
仿真成功之后,我们便进行实物的焊接。
但是我们犯了一个什么大的错误,实物与仿真还是有一定的差别的,制作实物时,应该分阶段一步步的测试局部功能然后再进行整体焊接和最后调试,我们一开始就将板子全部焊接完成,导致最后调试花了很多力气。
在板子焊好后,考入程序,接好电路,发现LCD常亮,并不显示数字与字符,经过我们用示波器反复检查单片机的引脚,晶振,置位端接法正确,并无错误。
仿真时可以正确显示,证明程序是正确的。
经过我们查阅相关资料及老师的点拨,我们发现,EA端出现了问题。
EA=0时,访问外部ROM,EA=1时,CPU访问内部存储器或访问地址超过存储容量时自动执行外部程序存储器的程序。
一般EA直接接高电平。
之后我们把EA端接高电平,显示结果变正常,功能与预期功能完全一样。
实验成功。
5总结
通过本次本次课程设计的实践,发现了自己的很多不足,首先是自己知识掌握很多都一知半解,实践经验及动手能力比较薄弱,不管是程序设计阶段还是实际调试阶段都或多或少的出现了很多低级错误。
在为期两周的在设计过程中,我们团队经历了很多,有因为设计方案不定而犹豫争吵的时候,也有一起讨论问题热情澎湃的时候,对于程序的改写一筹莫展的时候也有,对于仿真成功的欣喜也有,我想生活就是这样,汗水预示着结果页见证着成功。
程设计是我们专业课程知识综合应用的实践训练,这是我们迈向社会,从事职业工作前一个必不少的过程。
“实践出真知”,通过这次课程设计,我认识到只有理论联系实践才可以把