篮球记分器的设计说明Word文件下载.docx
《篮球记分器的设计说明Word文件下载.docx》由会员分享,可在线阅读,更多相关《篮球记分器的设计说明Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
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系统的主要功能
本系统有三项主要主要功能:
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<
reg51.h>
#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;
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;
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;
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;
Lcd_Port=Lcddata[num];
Write_Data
写数据函数ok
voidWrite_Data(ucharlcddata)
Lcd_Port=lcddata;
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;
4;
KEY_IO=t;
keytemp=(~KEY_IO)&
if(keytemp!
=0&
flag_key==0)
flag_key=1;
switch(keytemp)
case0x08:
key=0*3+i;
break;
case0x04:
key=1*4+i;
case0x02:
key=2*4+i;
default:
switch(key)
case0:
{c++;
j=1;
if(c>
=99){Write_Comm(0x84);
Write_Data('
1'
);
d=0;
}b=0;
}break;
case1:
c++;
case2:
}j=1;
b=0;
case4:
{d++;
if(d>
=99){Write_Comm(0x80+0x44);
c=0;
b=1;
j=0;
case5:
d++;
}b=1;
case6:
case8:
{if(b==1){d--;
if(d==0)d=0;
if(j==1)c--;
case9:
if(k==1)hour=24;
EA=~EA;
speaker=1;
L=0;
k=0;
case10:
e++;
if(e==5)e=1;
Write_Comm(0x80+0x0d);
Write_Char(e%10);
break;
case3:
{Write_Comm(0x80);
Write_Data('
C'
B'
A'
:
'
Write_Comm(0x80+0x0d);
Write_Char(e%10);
S'
t'
Write_Comm(0x80+0x40);
N'
temp=c;
c=d;
d=temp;
}break;
case7:
t=(t<
<
1)|0x01;
elseflag_key=0;
main
主函数
voidmain(void)
Init_LCD();
//初始化LCM
Timer0Init();
//初始化定时器
Write_Comm(0x80);
Write_Data('
Write_Da