单片机篮球计时计分器.docx
- 文档编号:27829338
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:31
- 大小:297.45KB
单片机篮球计时计分器.docx
《单片机篮球计时计分器.docx》由会员分享,可在线阅读,更多相关《单片机篮球计时计分器.docx(31页珍藏版)》请在冰豆网上搜索。
单片机篮球计时计分器
《单片机技术及其应用》
课程设计报告
题目:
篮球计时计分器
班级:
通信本科1班
学号:
姓名:
同组人员:
指导教师:
敏
2014年12月15日
篮球计时计分器
1概述
1.1单片机简介
单片机,全称为单片微型计算机(SingleChipMicrocomputer),即把组成微型计算机的各个功能部件如中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/0)、定时器/计数器以及串行通信接口等(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)都集成在一块芯片上,构成的一个完整的微型计算机。
由于单片机的集成度很高、功能强、通用性好、特别是它的体积小、重量轻、功耗低、价格便宜、可靠性高、抗干扰能力强和使用方便等优点、使得单片机得到了迅速推广应用、已远远超出了计算机科学的领域。
单片机自20世纪70年代问世以来,以极其高的性价比受到人们的重视和关注,所以应用很广,发展很快。
单片机以其一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统,数据采集系统、智能化仪器仪表,及通讯设备、日常消费类产品、玩具等。
并且已经深入到工业生产的各个环节以及人民生活的各层次中,如车间流水线控制、自动化系统等、智能型家用电器等。
而美国ATMEL公司开发生产了新型的8位单片机—AT89系列单片机。
它不但具有一般MCS-51单片机的所有特性,而且还拥有一些独特的优点。
此次设计中所用到的AT89S52就是其中典型的代表。
由于单片机的集成度高,功能强,通用性好,特别是它具有体积小,重量轻,能耗低,价格便宜,可靠性高,抗干扰能力强和使用方便等独特的优点,使单片机迅速得到了推广应用,目前已经成为测量控制应用系统中的优选机种和新电子产品的关键部位。
世界各大电气厂家,测控技术企业,机电行业,竞相把单片机应用于产品更新,作为实现数字化,智能化的核心部件。
篮球计时计分器就是以单片机为核心的计时计分系统,由计时器,计分器,综合控制器和24秒控制器等组成。
本次设计的篮球计时计分器就是以单片机为核心的计时计分系统,由计时器,计分器,综合控制器等组成。
1.2课程设计的意义
单片机的应用是具有高度现实意义的。
单片机极高的可靠性,微型性和智能性(我们只要编写不同的程序后就能够完成不同的控制工作),单片机已成为工业控制领域中普遍采用的智能化控制工具,已经深深地渗入到我们的日常生活当中。
通过此次基于单片机设计的篮球计时计分系统,我们可以进一步熟悉和掌握单片机的内部结构和工作原理,更清楚详细的了解单片机程序设计的基本指令功能、编程步骤和技巧。
对此次的单片机课程设计,我们可以在将来的工作和学习中加以应用。
1.3设计的任务和要求
任务:
设计一个用于赛场的篮球计时计分器。
要求:
1、能记录整个赛程的比赛时间,并能修改比赛时间。
2、能随时刷新甲、乙两队在整个过程中的比分。
3、中场交换比赛场地时,能交换甲、乙两队比分的位置。
4、比赛结束时,能发出报警声。
2系统总体方案
2.1系统总体方案设计
本设计篮球计时计分器主要包括一下五部分:
按键输入模块,单片机控制系统、计时时间显示模块、计分分数显示模块和定时报警模块。
通过单片机控制系统输出信号来控制计时显示模块、计分显示模块和定时报警模块的正常显示和工作,同时单片机还不断扫描键盘输入状态,接收键盘的输入控制信号,进而调整输出。
系统总体框图如下图(图2-1)所示。
图2-1系统总体框图
2.2单片机选择
STC89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用STC公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的STC89C52单片机可为您提供许多较复杂系统控制应用场合。
STC89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,STC89C52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
STC89C52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
3系统的硬件设计
3.1时钟电路模块
在单片机应用系统中,时钟电路提供保障系统正常工作的基准振荡定时信号。
主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢。
这里采用的是12MHz的晶振,两个电容选用的是330pF的瓷片电容,晶振的两个引脚分别连到XTAL1和XTAL2振荡脉冲输入引脚。
具体连接电路如图3-1所示。
图3-1时钟电路
3.2键盘控制模块
本设计中共设有7个按键,各个按键均有对应的功能。
仿真电路如下图所示:
图3-2按键控制电路
3.3显示模块
本设计中计时时间显示模块采用一个4位一体7段式共阴极数码管显示,计分分数显示模块采用两个两位一体7段式共阴极数码管分别显示甲乙两队得分。
并且使用74hc573芯片驱动该数码管,使数码管正常显示。
其具体电路如图3-3所示。
(a)时间显示模块
(b)甲、乙对分数显示
图3-3显示模块电路
3.4定时报警模块
报警电路模块由蜂鸣器加三极管驱动组成,不仅实现了定时报警功能,而且还可以在按下按键时发出按键声音。
具体电路如图3-4所示:
图3-4报警模块电路
4系统的软件设计
4.1软件设计总流程图
本设计软件设计部分采用模块化程序设计,程序部分由主程序、延时子程序、T0中断服务程序、按键扫描子程序、数码管显示子程序、定时设置子程序、结束报警显示子程序。
程序的总流程图如图4-1所示。
图4-1程序流程图
4.2定时初值计算
单片机的定时初值计算公式为:
定时初值=65536-定时时间/机器周期
则最大定时时间=65536us=0.065536s
本设计中采用晶振频率为f=12MHz,则机器周期=1us(1微秒)。
程序中采用的是定时器T0,工作在方式1,取定时器1次定时0.02s,50次定时为1s.定时初值=65536-20000=45536=B1E0H,那么可以对单片机定时器0赋初值为:
TH0=0xb1H;TL0=0xe0H;
4.3各部分程序功能分析
本设计程序部分由主程序、延时子程序、T0中断服务程序、按键扫描子程序、数码管显示子程序、定时设置子程序、结束报警显示子程序等几部分组成。
各个程序模块的功能如下。
4.3.1主程序模块
程序就是从主程序开始执行的,在主程序里可以调用子程序,调用完成后还要返回主程序继续执行。
我们在主程序里对各个模块进行初始化,用一个while循环不断地循环执行各个子程序,例如按键扫描程序在这里可以一次一次地扫描按键,这样实现简单易行。
本程序主函数如下:
voidmain()//主程序
{
TMOD=0x01;//设置定时器工作方式
EA=1;
ET0=1;
TH0=0xb1;//定时器送计数初值,EA=1,开中断,P3口电平拉高
TL0=0x10;
TR0=1;
P3=0xff;
P1=0x7f;//P1=0x7f,上半场指示灯点亮
T1=0;
while
(1)
{//通过while
(1),反复调用循环体内的子程序
keyjiafen1();//执行相应的功能
keyjianfen1();
key2();
if(zidong==1)//zidong==1为key3()执行条件,仅当半场结束时候执行
key3();
if(n==18&&bujin==0)
{
bujin=2;//修改变量bujin的值,设定over()中第二个if语句的执行条件
}
shijian();
key4();
over();
}
}
4.3.2延时子程序
本程序中单独设立了一个带有参数传输的延时子程序,以供其他程序块的调用,且延时可以通过参数方便的控制,使程序更加的简洁。
延时子程序如下:
voiddelay(intt)//延时程序,t为参数方便控制延时的长度
{
while(t--)//循环t次
{
unsignedinti;//定义无符号整形变量
for(i=0;i<200;i++);//循环200次空操作
}
}
4.3.3中断服务子程序
当T0中断发生时转入执行中断服务子程序,本程序主要用于提供一个精确的时钟实现定时。
另外还用对数码管的循环扫描显示,每中断一次就对数码管进行扫描一次,从而提供一个稳定的显示输出,不受其他程序的延时影响。
voidt0(void)interrupt1//T0中断服务程序
{
TH0=0xb1;//定时器初始化
TL0=0x10;
if(k1)
{
i++;
if(i==50)
{
n--;
i=0;
}//到一秒时秒显示加1
}
display(m,n,x,y);//动态显示时间和比分
if(k3)
if(n==0-1)//倒计时秒位为0时借位
{
n=n1-1;
m--;
}
}
4.3.4数码管显示子程序
数码管显示采用动态显示方式,这样占用I/O口资源比较少,且易于实现。
在运行中可以随时修改显示分数及时间,另外在比赛结束后还可以将时间显示变为显示字符串“End”来提示比赛结束,这样比较实用。
其中倒计时的分钟显示程序块如下:
P2=0xfe;//显示倒计时分钟十位
P0=seg[m%100/10];
delay
(1);//显示延时
P2=0xff;//复位
P0=0;
P2=0xfd;//显示倒计时分钟个位
P0=seg[m%10];
delay
(1);
P2=0xff;//复位
P0=0;
4.3.5按键扫描子程序
本设计中采用的是独立式按键,一个按键对应一个单片机管脚,单独扫描。
通过P3口扫描,共设有K1—K7七个按键,实现功能分别加分、调时、加速调时、开始/暂停、组合减分键等功能。
其软件设计流程图如下(见图4-2):
其中调整加分按键扫描程序如下:
voidkey1()//按键调整两队得分
{
if(P3_0==0)//若甲队加分键按下
{
delay
(1);//延时
if(P3_0==0)//若还在按下
{
P3_6=1;//蜂鸣器响
while(P3_0==0);//等待松键
x++;//甲队加一分
P3_6=0;//关蜂鸣器
}
}
if(P3_1==0)//若乙队加分键按下
{
delay
(1);//延时
if(P3_1==0)//若还在按下
{
P3_6=1;//蜂鸣器响
while(P3_1==0);//等待松键
y++;//乙队加一分
P3_6=0;//关蜂鸣器
}
}
}
图4-2主程序流程图
4.3.6结束报警显示子程序与延时子程序
报警服务子程序通过对P1_6输出高电平驱动蜂鸣器报警,另外,本报警程序实现了报警时数码管跟随闪动。
具体程序如下
voidalarm(inti)//结束时数码管闪动加声音
{
while(i--)//循环执行i次
{
intj;//定义变量j
{
P3_6=!
P3_6;//开(或者关)蜂鸣器
for(j=0;j<25;j++)//循环25次
display(m,n,x,y);//调用显示函数
P3_6=!
P3_6;//关(或者开)蜂鸣器
delay(200);//保持状态延时一定时间
}
}
}
5系统的Proteus仿真
本课程设计采用KeiluVisoin3软件将c语言源代码生产hex格式的文件,然后使用Proteus软件仿真该系统。
如图,开始仿真,时间、分数显示模块显示初始时间、分数。
按下加分按钮,分数显示模块,分数会发生对应的改变,仿真成功。
图5-1初始状态
图5-2按键加分
6总结
通过对本系统的设计,让我更熟悉掌握了KeiluVision3,proteus这些应用程序的运用,让我懂得了如何编写一些简单的程序,学会了如何制作单片机应用程序,还有焊接和程序下载,但在中间暴露出很多问题:
对平时上课讲的理论知识没有完全掌握消化,到了实际操作中还得请教同学,在焊接中焊接的基本工夫掌握不到家,手上工夫还是很欠缺的,使得电路板不是很美观。
另外,本设计虽然已经实现了时间的倒计时、回表、快进,以及两队的加分和减分,但现在篮球比赛的每一次进攻都是24秒制的,因此,这一点是一个很大的缺陷,希望在以后对此系统进行进一步完善。
同时,做设计的这几个月翻阅了很多书,也上了很多网站去寻找自己需要的资料。
这种寻找有很强的目的性,只是为了自己选定的课题内容而查阅,所以除了自己设计以外的其他方面几乎还是一无所知。
这让我深刻的认识到了自己专业知识的贫乏。
为我对自己以后生活的规划敲响了警钟。
我对单片机的学习不会因为本设计的结束而结束,在接触的众多资料里,做设计只是走马观花般的点到,希望以后能够进行更系统的学习。
这些问题的发现,有助于提高我在以后的工作和学习中对此类问题的认识,确保不在同一问题上再次犯错。
严谨求实、踏实务实,是我这次设计的深刻总结
7指导老师意见
参考书目:
[1]李群芳,肖看,《单片微型计算机与接口技术》,北京,电子工业出版社,2012年
[2]康华光,秦臻,《电子技术基础(数字部分)》,北京,高等教育出本社,2006年
[3]谭浩强,《c语言课程设计》,北京,清华大学出版社,2010年
附录C语言源程序
#include
codeunsignedseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
intm=24,n=10;//计时m为分,n为秒
intx=0,y=0;//甲乙两队得分
inti=0,j=0,jie=2,zidong=1,bujin=1,zanting=0;
intchuzanting=0;
sbitP1_0=P1^0;
sbitdula=P1^1;
/*************延时********************/
voiddelay(intt)
{
while(t--)
{
unsignedinti;
for(i=0;i<200;i++);
}
}
/**********数码管动态显示*************/
voiddisplay(inti,intj,intx,inty)
{
if(jie==1&&bujin!
=2)//中间变量jie==1时,为上半场,对P1赋值
P1=0xbd;//P1=0xbf,即P1=10111111B,点亮对应下半场指示灯
P2=0xfe;
//P0=0x7d;//数码管动态刷新显示程序P2=11111110,i为分钟
dula=1;
P0=seg[i%100/10];//刷新显示时间显示分钟十位,调用延时程序,
dula=0;
delay
(1);//延时数码管的点亮
P2=0xff;
P0=0;
P2=0xfd;
dula=1;//同理,动态刷新时分钟个位并延时点亮
P0=seg[i%10];
delay
(1);
dula=0;
P2=0xff;
P0=0;
P2=0xfb;
dula=1;//同理,动态刷新时秒钟十位并延时点亮
P0=seg[j%100/10];
delay
(1);
dula=0;
P0=0;
P2=0xff;
P2=0xf7;
dula=1;//同理,动态刷新时秒钟个位并延时点亮
P0=seg[j%10];
dula=0;
delay
(1);
P0=0;
P2=0xff;
P2=0xef;//同理,动态刷新甲队分数十位并延时点亮
dula=1;
P0=seg[x%100/10];
dula=0;
delay
(1);
P2=0xff;
P0=0;
P2=0xdf;dula=1;//同理,动态刷新甲队分数个位并延时点亮
P0=seg[x%10];
dula=0;
delay
(1);
P2=0xff;
P0=0;
P2=0xbf;//动态刷新乙队分数十位并延时点亮
dula=1;
P0=seg[y%100/10];
dula=0;
delay
(1);
P0=0;
P2=0xff;
P2=0x7f;//同理,动态刷新乙队分数十位并延时点亮
dula=1;
P0=seg[y%10];
dula=0;
delay
(1);
P0=0;
P2=0xff;
}
/******************中断程序****************************/
voidt0(void)interrupt1//调用定时器T0基本计时单位秒
{
TH0=(65536-20000)/256;//利用定时器T0,送入计数初值TH0=0xb1;TL0=0x10;
TL0=(65536-20000)%256;//定时器定时单位为20毫秒
i++;//进入中断次数
if(i==50)//利用中间变量i令i值为5050*20毫秒=1秒
{
if(n==0)
{//当秒减到0以后分钟减1
n=59;
if(m==0)
m=0;
else
m--;
}
elsen--;//秒减1
i=0;
}
display(m,n,x,y);//调用动态刷新显示程序
}
/********************加分**********************/
//RXD、TXD对应的P3.0和P3.1,为加减分键
voidkeyjiafen1()//加分按键子程序,在主程序中不断调用该子程序
{//当检测到甲队加分按键按下时,对应加分
if(RXD==0)
{//调用延时子程序实现消除按键抖动功能,即,当
delay
(1);//检测到按键按下时候,延时,按键仍按下,说明按键
if(RXD==0)//确实按下,非抖动,甲队对应加分
{
while(RXD==0);///等待松手
x++;
}
}
if(TXD==0)//同理,检测乙队加分按键时候按下,并加分
{
delay
(1);
if(TXD==0)
{
while(TXD==0);
y++;
}
}
}
/**************减分*******************/
//WR和RD对应的P3.6和P3.7
voidkeyjianfen1()//减分按键检测子程序,其基本算法及功能与加
{
if(WR==0)//相同
{
delay
(1);
if(WR==0)
{
while(WR==0);
if(x==0)
x=0;
else
x--;
}
}
if(RD==0)
{
delay
(1);
if(RD==0)
{
while(RD==0);
if(y==0)
y=0;
else
y--;
}
}
}
/*****************回表和快表**********************/
//INTOINT1对应的P3.2和P3.3
voidkey2()//显示时间调整程序,即回表和快表
{
if(INT0==0)
{//在比赛中有时经常需要回表,故写此程序
delay
(1);
if(INT0==0)//回表子程序,检测到INT0按下时,使时间回倒
{
chuzanting=0;//chuzanting==0;zanting=1;为附加变量,当回表按键
zanting=1;//松开时,表暂停,这两个变量用来调用暂停
if(m==2)
{
m=2;
n=0;
}
elseif(n==59)
{
m++;
n=0;
}
elsen++;
}
}
if(INT1==0)//快表子程序,检测到INT1按下时,使倒计加快,
{//通常情况下与回表子程序配合使用,即当回表
//回过的时候,按此键调整时间
delay(10);//chuzanting==0;zanting=1;作用同上
if(INT1==0)
{
chuzanting=0;
zanting=1;
if(n==0)
{
if(m==0)
{
m=0;
n=0;
}
else
{
m--;
n=59;
}
}
elsen--;
}
}
}
/************回表和快表按键松开时候能自动暂停**************/
voidshijian()//回表和快表按键松开时候能自动暂停
{
if(zanting==1&&INT0==1&&INT1==1&&chuzanting==0)
{
EA=0;
zanting=0;
chuzanti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 篮球 计时 计分