单片机课程设计篮球计时器.docx
《单片机课程设计篮球计时器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计篮球计时器.docx(17页珍藏版)》请在冰豆网上搜索。
单片机课程设计篮球计时器
单片机课程设计-篮球计时器
绪论
篮球比赛中除了有总时间倒计时外,为了加快比赛的节奏,规则还要求进攻方在24秒内有一次投篮动作,否则视为违例。
以下为一个篮球比赛计时器,该计时器采用按键操作、数码管显示,非常实用。
此计时器也可作为其他球类比赛的计时器。
本课程设计介绍了一个基于单片机的篮球比赛计时器硬件设计,包括STC89C51,2个八段共阳数码管显示、上电复位电路、时钟发生电路等基本模块的设计。
其功能土要有:
一场篮球比赛共分四节,每节12分:
每次进攻为24秒,计时器的显示均为倒计时方式,24秒计时用两位数码管显示;所有的计时都要具有暂停、继续、复位;当球员的持球时间超过24秒时,24秒倒计时减为零且有蜂鸣器报警提示。
本次课程设计是采用单片机C语言实现倒计时24秒篮球比赛计时器。
算机系统。
单片机的存储器ROM和RAM是严格区分的。
ROM称为程序存储器,只存放程序,用户数据。
固定常数,及数据表格。
RAM则为数据存储器,为满足控制需要,单片机有更强的逻辑控制能力用作工作区及存放特别是单片机具有很强的位处理能力。
2.2.1AT89C51单片机引脚功能简介
(1)AT89C51有40个引脚,各引脚功能如下所示:
图2.1AT89C51引脚图
电源引脚Vcc和Vss
Vcc(电源端):
供电电压,为+5V。
Vss(GND):
接地端。
(2)输入/输出端口P0.P1,P2和P3
PO口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
PO能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在Flash编程时,PO口作为原码输入口,当Flash进行校验时,PO输出原码,此时PO外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在Flash编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1',时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口在Flash编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入,"1',后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
(3)振荡器特性
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
2.3功能单元模块
(1)常开型按钮开关
控制模块是由键盘输入,键盘是一组按键的集合,它是最常见的单片机输入设备,是一种常开型按钮开关。
常态时,按键的两个触点处于断开状态,如图2.3所示,键盘分为编码键盘和非编码键盘,键盘上闭合键的识别由一专门的硬件译码器实现,并产生键编号或键值的称为编码键盘,如BCD码键盘、ASCII码键盘等;靠软件识别的称为非编码键盘。
图2.2常开型按钮开关
(2)七段数码显示管
单片机中通常用7段LED构成字型“8”,另外,还有一个小数点发光一极管,以显示数字、符号及小数点。
这种显示器有共阴极和共阳极两种,此课程设计采用的是共阳极。
发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的称为共阴极显示器。
一位显示器由8个发光二极管组成,其中,7个二极管构成字型“8”的各个笔画a-g,另一个小数点为dp发光二极管。
将多个LED显示块组合在一起就构成了多位LED显示器。
每个LED显示器的段引脚称为段选线,公共端称为位选线。
段选线控制显示的字符,位选线控制该LED的亮和灭。
(3)蜂鸣器
由于蜂鸣器在使用时需要三极管来驱动,这里我们使用的是PNP型三极管,蜂鸣器接e极,再接高电平。
在基极输入高电平时,三极管不导通,蜂鸣器不响,在基极输入低电平时,三极管导通,蜂鸣器被驱动并发声。
2.3硬件设计电路
设计思路:
选用AT89C51作为主控芯片,晶振是12MHz,机械周期为1ms,所以循环20次为l秒。
PO口作为段码输出,P3.3,P3.4作为位控,高电平有效。
数码管是液晶显示,采用动态显示,两个串行口作为中断入口,高电平有效,启动TO定时器/计数器进行计数,低电平有效。
图2.4是系统硬件设计电路图
图2.4系统硬件设计电路图
时间设置完后,启动定时器TO开始定时计数。
计时采用倒计时,比如:
设置的时间为24秒钟,则在LED上显示24两位数。
定时TO计数24秒后中断返回,继续定时计数下一个24秒;同时则在2位LED显示器上显示,表示时间已经过去1秒钟,即为23要按下键,即可暂停计时秒。
这样一直持续下去。
直到变为“00”时表示赛程结束。
如果比赛中裁判叫停,则只要按下暂停按键,即可暂停计时。
3软件设计
3.1系统主程序
根据设计要求,可分析并设计图程序流程图,采用24秒倒计时,所以复位值为24秒,倒计时到0时,数码管显示为00,开始判断,并报警。
开关A1控制复位,A2控制暂停,A3控制启动。
以下是篮球计时器24秒倒计时的程序流程图:
Y
N
Y
Y
N
N
图3.1主程序流程图
3.2中断程序
定时器定时,每隔50毫秒进入中断一次。
进入20次,完成1秒计时。
数码管显示数字减1。
3.3键盘程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。
4结论
本次课程设计是我到目前为止觉得最有意义也是收获最大的一次实习,可以说是有苦也有甜。
身为电子信息工程系的学生,设计是我们将来必须的技能口而这次课程设计恰恰给我们提供了一个应用自己所学知识的平台。
从通过理论设计,到确定具体方案,再到仿真软件仿真,最后到调试电路、显示结果。
整个过程都需要我充分利用所学的知识进行思考、借鉴。
可以说,本次课程设计是针对前面所学知识进行的一次比较综合的检验。
总的来说,这次课程设计虽然很累,但非常充实。
在这次实习中,正确的思路是很重要的,只要设计思路是正确的,那么才可能成功。
因此我们在设计前必须做好充分的准备,认真查找详细的资料,为我们设计的成功打下坚实的基础。
如果说前面的电路的理论设计是多么令人头痛的事,那么安装、调试过程则是一个考验人的耐心的过程,对电路的安装、分析调试要一步一步来,不能急躁。
这次课程设计对以前学过的理论知识起到了很好的回顾作用,同时还弥补了之前对单片机知识的相关漏洞。
刚开始,我对课程设计是一无所知,就连按照硬件图来写汇编程序,都是一个很大的问题。
后来在实验室同学的耐心指导下,我终于知道了如何编写程序,焊接实物。
在设计过程中,遇到了很多疑难点,通过同学间的讨论,并在老师指导下,综合运用所学知识,最终完成基于单片机的篮球比赛计时器设计。
是一个24秒计时电路,并具有时间显示的功能。
当然,要做好本次的课程设计,熟练地掌握课本上的理论知识是前提。
而且这次的课程设计老师在验收时还要求学生进行现场操作,答辩。
这就更加促进了我们去认真的去完成这次课程设计,同时也只有这样刁一能督促学生对设计中出现的问题进行一定的分析和调试。
虽然这次课程设计过程中我们遇到了很多问题,比如说程序、流程图的仿真,我们还不能如鱼得水,还不是很熟练,经常熬夜对程序进行修改,但是我仍然非常感谢有这么一个机会,老师的耐心指导也让我们懂得了不少知识。
总体来说,这次课程设计让我受益匪浅。
在摸索改如何设计电路使之实现所需功能的过程中培养了我的设计思维,增加了实际动手能力,在让我体会到了设计电路的艰辛的同时,更让我体会到了成功的喜悦。
参考文献
[1]楼然苗单片机课程设计指导【M].北京:
北京航空航天大学出版社,出版年:
2ao}
年.
[2]何立民.单片机实验与实践教程【M].北京:
北京航空航天大学出版社,出版年:
2004
年,
[3]童诗白‘模拟电子技术基础【M].北京:
北京高等教育出版社,出版年:
2001年.
[4]李朝青.单片机原理及接口技术!
M].北京;北京航空航天大学出版社,出版年:
1999
年.
[5]张俊漠.单片机巾级教程【M]‘北京:
北京航空航天人学出版社,出版年:
1999年.
【6]余永权.Flash单片机原理及应用[M].北京:
电子工业出版社,出版年:
1997年.
附录A源程序
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitw1=P3^3;//十位位选
sbitw2=P3^4;//个位位选
sbitkey1=P3^5;
sbitkey2=P3^6;
sbitkey3=P3^7;
sbitBEEP=P1^0;//报警器控制位
sbitLED=P1^1;
sbitleft=P2^6;
sbitright=P2^7;
unitnum,num1,shi,ge;
intnum;
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,//数码管相应的段选码
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
};
voiddelay(unitz)
{
unitx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*按键扫描函数*/
voidkeyscan()
{
if(key1==0)//开始计数
{delay(10);//延时消抖
if(key1==0)
{while(!
key1);//松手检测
TR0=1;
beep=1;
led=1;
}
}
if(key2==0)//暂停计数
{delay(10);//延时消抖
if(key2==0)
{while(!
key2);//松手检测
TR0=0;
beep=1;
led=1;}
}
if(key3==0)//重新计时
{delay(10);//延时消抖
if(key3==0)
{TR0=0;
while(!
key3);//松手检测
num1=24;
TR0=1;
BEEP=1;}//关闭蜂鸣器
}
}
voidinit()
{
num1=24;
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;//定时器0的高八位
TL0=(65536-50000)%256;//定时器0的低八位
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
w1=1;
w2=1;
num=0;
}
/*数码管显示函数*/
voiddisplay(ucharshi,ucharge)
{
left=1;
right=0;
P0=table[shi];
delay
(2);
left=0;
right=1;
P0=table[ge];
delay
(2);
}
voidmain()
{
init();
while
(1)
{
keyscan();
if(num==20)
{num=0;
num1--;
if(num1=0)
{
beep=0;
led=0;}
if(num1<0)
{TR0=0;
num1=24;}
}
ge=num1%10;//个位
shi=num1/10;//十位
display(shi,ge);
}
}
voidtime1()interrupt1//定时器计数,50ms产生一次中断
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num++;
}
附录B系统原理图