单片机篮球积分器Word下载.docx
《单片机篮球积分器Word下载.docx》由会员分享,可在线阅读,更多相关《单片机篮球积分器Word下载.docx(39页珍藏版)》请在冰豆网上搜索。
7.系统的安装调试说明
8、总结
9、参考文献
10、附录(源程序清单及硬件原理图等);
11、课程设计成绩评分表。
进度安排
设计时间为两周
第一周
星期一、上午:
布置课题任务,讲课及课题介绍
下午:
借阅有关资料,总体方案讨论
星期二、确定总体设计方案
星期三、硬件模块方案设计
星期四、软件模块方案设计
星期五、设计及调试
第二周
星期一、设计及调试
星期二、设计及调试
星期三、总调
星期四、写说明书
星期五、上午:
写说明书,整理资料下午:
交设计资料,答辩
参考文献
[1]、《微型计算机原理及应用》许立梓编机械工业出版社2002
[2]、《微型计算机接口技术及应用》刘乐善编华中理工大学出版社2000
[3]、《计算机硬件技术基础试验教程》邹逢兴编高等教育出版社2000
[4]、《16位微型计算机原理接口及其应用》周佩玲编中国科学技术大学出版社2000
[5]、《微型计算机原理与接口技术》吴秀清编中国科学技术出版社2001
[6]、《微型计算机接口技术》邓亚平编清华大学出版社2001
[7]、《单片机原理及及应用》王迎旭编机械工业出版社2001
[8]、《单片机应用程序设计技术》周航慈著北京航空航天大学出版社2002
目录
第一章系统的概述……………………………………………………1
1.1系统的功能…………………………………………………………1
1.2设计内容及要求……………………………………………………1
1.2.1设计内容…………………………………………………………1
1.2.2设计要求…………………………………………………………1
1.3按钮设置……………………………………………………………2
第2章总体方案设计…………………………………………………2
2.1总体系统框图……………………………………………………3
2.2系统组成…………………………………………………………5
第3章系统硬件设计…………………………………………………6
3.1控制电路设计……………………………………………………6
3.1.1复位电路………………………………………………………4
3.1.2矩阵按钮电路…………………………………………………4
3.2数码管显示电路设计………………………………………………………6
第4章软件设计……………………………………………………10
4.1主程序设计………………………………………………………10
4.2各子程序设计……………………………………………………11
4.2.1延时子程序……………………………………………………11
4.2.2初始化子程序…………………………………………………12
4.2.3交换按钮程序…………………………………………………12
4.2.4状态部分程序…………………………………………………11
4.2.5加减部分程序……………………………………………………………13
仿真图…………………………………………………………………………………16
设计总结…………………………………………………………………17
参考文献…………………………………………………………………18
附录:
源程序清单…………………………………………………………19
电气信息学院课程设计评分表…………………………………………37
第1章系统概述
1.1系统功能
设计一个甲、乙两队比赛计分器,主要用于各种体育比赛记录分数。
采用矩阵式键盘作为输入。
基于以上思路,本次设计使用80C51实现一基于单片机的电子计分器的设计,其主要具有如下功能:
(1)用户可分别对两队比分进行加1、加2、加3和减1,减2,减3操作。
(2)比分通过6个8段共阴极数码管显示器进行显示,每队比分显示三位,可以交换两队的比分。
(4)具有复位功能,通过复位键实现。
(5)预置分可通过加或减分按钮实现。
(6)比赛时间倒计时及其结束后蜂鸣器自动提醒。
1.2设计内容及要求
1.2.1设计内容:
(1)给甲乙两队分别设置一个分数控制按钮,此按钮有7种状态,分别为+1、+2、+3、-1、-2、-3,+10(置数)。
(2)设置一个切换状态按钮,可以分别切换每一种状态,然后每一种状态会有相应的发光二极管点亮以区别是哪种状态。
(3)设置一个复位按钮,按下实现甲、乙队总分回到初试分及显示
(4)设置一个交换分按钮,用于交换甲乙比分。
1.2.2设计要求:
方案合理、正确,系统稳定、可靠。
软件设计要求尽可能精练、简短和运行可靠。
硬件电路要求简单明了,以节约成本。
1.3按钮设置
本设计的宗旨是用最少的按键实现最多的功能。
设计中一共用到了5个按钮,分别为:
清零按钮、甲的加分减分按钮,乙的加分减分按钮,切换状态按钮和交换比分按钮。
每个按钮的功能如下:
控制甲的按钮:
实现+1、+2、+3、-1、-2、-3,+10(置数)功能;
控制乙的按钮:
切换按钮:
实现甲乙的各种状态的切换;
减缓比分按钮:
交换甲乙的比分;
清零按钮:
实现甲乙比分清零;
第2章总体方案设计
2.1总体系统框图
此次设计80C51单片机为核心,配以一定的外围电路和软件,以实现比赛计分器的功能。
利用6个8段共阴级数码管显示器.采用动态显示输出比分,用户信息输入则采用4×
4矩阵式键盘,起状态切换用发光二极管的状态表示。
用一片单片机可满足本设计的输入输出。
系统设计方案的硬件电路设计框图如图2-1所示。
图2-1硬件电路设计
2.2系统组成
系统由硬件部分和软件部分组成。
硬件电路由复位按钮、80C51单片机、矩阵键盘和7个发光二极管,6个数码管等组成。
软件部分主程序主要由系统初始化段、键盘识别、键值处理、8段共阴极LED显示器扫描显示子程序组成。
软件设计主要分为四个部分:
信息输入、信息处理、显示输出。
信息输入时采用矩阵式键盘来实现,所以需要检测键盘有无按键的子程序;
信息处理需要对用户通过键盘输入的不同信息进行辨别并执行相应的处理;
显示输出考虑到成本和电路体积,决定采用动态输出,从而达到设计的目的。
第3章系统硬件设计
3.1控制电路设计
3.1.1复位电路
如图3-1所示,按钮与单片机的RST引脚相连,当每次按下该按钮后,系统将通过软件实现对计分回到初始值功能。
图3-1复位控制接口电路
3.1.2矩阵按钮电路
键盘的读取方式:
行与列各有4条线档其中一个按键被按下后,它所在的行列线就导通了,所以如果一条线上是低电平,那么按键的另一条线也是低电平。
先给第一行送一个低电平,读取列值,就可以判定第一行上是否有按键按下,如果有按键,那么列线里面就有一条线为低电平。
如果都为高电平,说明第一行上没有按键被按下,接着给第二行送低电平,重复上述步骤,就可以读取按键了。
也可以用另外一种方法:
先给行线全部写“0”,然后看列线是否有为低电平的,如果有说明那一列上有键被按下,让后要确定按键所在的行的,给所有列线写“0”,读取行线的值就可以确定按键的具体位置了,让后将两次读取的值,组成一个值j就得到了键值。
图3-2矩阵键盘的接口电路
3.2数码管显示电路设计
显示器采用8段共阴极数码管显示器,来实现显示器的动态扫描,八个二极管连接一个阴极的结构,只要另一段为高电平,二极管就会发光,从而形成一段。
将八段顺序排列后就成为具有一定编码的共阴显示器了。
动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。
如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。
显示电路如图4所示。
共阴极数码管显示
显示
小数点
G
F
E
D
C
B
A
HE代码
0
1
1
3FH
06H
2
5BH
3
4FH
4
66H
5
7DH
6
07H
7
7FH
8
6FH
9
40H
图3-3数码管显示电路
数码管显示采用8个8段数码管显示器,来实现显示器的动态扫描显示采用动态扫描显示方法,即由显示器扫描显示子程序控制显示器逐个循环从左至右依次点亮各个显示器。
由单片机的P0口控制显示。
第4章软件设计
4.1主程序设计
主程序主要由系统初始化段、键盘识别、键值处理、6个8段共阴极LED显示器扫描显示子程序组成。
通过对以上各段和子程序的结合,以实现系统功能。
该系统主程序流程图如下图所示。
图4-1系统主程序流程图
图4-2扫描刷新显示子程序流程图
4.2各子程序设计
4.2.1延时子程序
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
此段程序是根据实验板各硬件的参数具体设置的。
4.2.2初始化子程序
voidinit()
{
cnt=0;
num=0;
wela=0;
dula=0;
temp=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
初始化程序是用来对各定义的变量初始化的,每一次主程序执行之前都要先执行初始化程序以保证变量的值为初值。
4.2.3交换按钮程序
if(key4==0)//当交换键按下
{
delay(10);
if(key4==0)
{
m=bai;
bai=aa;
aa=m;
n=shi;
shi=bb;
bb=n;
p=ge;
ge=cc;
cc=p;
while(!
key4);
//去抖
delay(10);
}
此程序就是当交换按键按下时,利用中间变量改变甲乙的每一位的数值,这样就能实现交换甲乙两队的比分,然后再给电路去抖动,就不会出现问题了。
4.2.4状态部分程序
for(i=0;
i<
4;
i++)
{if(key3==0)
{if(key3==0)
{num++;
if(num==7)
num=0;
delay(5);
switch(num)
{case0:
cnt=-3;
d7=0;
d6=1;
break;
case1:
cnt=10;
d1=0;
d7=1;
case2:
cnt=1;
d2=0;
d1=1;
case3:
cnt=2;
d3=0;
d2=1;
case4:
cnt=3;
d4=0;
d3=1;
case5:
cnt=-1;
d5=0;
d4=1;
case6:
cnt=-2;
d6=0;
d5=1;
while(!
key3);
while(!
该程序是主函数里面的部分程序,当切换分按钮按下时利用switchcase语句来实现甲乙各种状态之间的切换,并且同时控制了7个发光二极管的显示来表明当前处于什么状态。
切换到相应的状态时在执行显示扫描程序将实现切换功能。
4.2.5加减部分程序
if(key1==0)//甲控制按钮按下
{delay(10);
//延时
if(key1==0)
{temp=temp+cnt;
//实现加减运算
if(temp==256)
key1);
delay(10);
bai=temp/100;
//分离处百位
shi=temp%100/10;
ge=temp%10;
该程序是通过前段调用一个变量cnt来作为本次运算的加数,然后通过切换状态来做不同的运算。
这样就免去了很多不必要的程序,直接调用实现,简化了程序。
仿真图:
设计总结
这次课程设计虽然只有短短的两周时间,但我受益匪浅学会了很多东西。
刚开始拿到课题时,觉得自己无处入手,但通过老师的讲解和查询资料,开始有自己的思路,整理出了总体方案,然后设计出硬件原理图,源程序等。
在这次课程设计中,我在整个设计过程中懂得了许多东西,也培养了独立思考和设计的能力,树立了对知识应用的信心,相信会对今后的学习工作和生活有非常大的帮助,并且提高了自己的动手实践操作能力,使自己充分体会到了在设计过程中的成功喜悦。
虽然这个设计做的不是很理想,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我受益良多。
课程设计是结束了,不过学习单片机知识的过程还没有终结,探索学习的奥妙,培养学习的兴趣,养成良好的学习习惯对我们来说才是最重要的。
与此同时我感受到了老师对学生的那种悔人不卷的精神,每天的固定时间,老师都来给我们指导,使我们少走弯路,顺利完成实习任务,感谢汪老师一路以来对我们的关心与帮助。
参考文献
[1]《单片机原理与应用》王迎旭编机械工业出版社
[2]《51系列单片机原理与接口技术实验指导》周向红编湖南工程学院
[3]《微型计算机原理及应用》许立梓编机械工业出版社2002
[4]《微型计算机接口技术及应用》刘乐善编华中理工大学出版社2000
[5]《计算机硬件技术基础试验教程》邹逢兴编高等教育出版社2000
[6]《16位微型计算机原理接口及其应用》周佩玲编中国科技大学出版社2000
[7]《微型计算机原理与接口技术》吴秀清编中国科学技术出版社2001
[8]《微型计算机接口技术》邓亚平编清华大学出版社2001
[9]《单片机原理及及应用》王迎旭编机械工业出版社2001
[10]《单片机应用程序设计技术》周航慈著北京航空航天出版社2002
[11]《单片机实用技术问答》谢宜仁主编人民邮电出版社2002
附录A:
源程序清单
#include<
REGX52.H>
#defineucharunsignedchar
#defineuintunsignedint
#defineTH_value0xb1
#defineTL_value0xe0//定时器工作于方式1,每20ms产生一个中断
sbitspeak=P3^7;
sbitext=P3^2;
sbitled=P3^4;
/**********BCD码字***************/
ucharcodebcd[]={
0x00,0x01,0x02,0x03,
0x04,0x05,0x06,0x07,
0x08,0x09,0x0A,0x0B,
0x0C,0x0D,0x0E,0x0F
};
/************0~9数字显示**************/
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x00};
ucharmunite;
//比赛剩余分位数
ucharsecond;
//比赛剩余秒位数
ucharpart;
//当前比赛的节次
uchars24;
//24秒标志
ucharred_mark;
//红队得分
ucharblue_mark;
//蓝队得分
ucharkey_move;
//设置位移动
ucharkey_red_add;
//红队得分增加1
ucharkey_red_mul;
//红队得分减少1
ucharkey_blue_add;
//蓝队得分增加1
ucharkey_blue_mul;
//蓝队得分减少1
ucharkey_pause;
//暂停
ucharkey_reset;
//24秒复位及进入下一节复位
uchartime_tick1,time_tick2;
ucharstation;
//状态标志位
ucharflag;
//跳亮标志位
uchartalk1,talk2,num,num1;
//报警信号标志
/*******函数声明********/
voidinit();
voidinit_timer();
voidinit_extra();
ucharkey_scan();
voidscanf(ucharp,uchartw,ucharm,uchars,ucharr,ucharb);
voidscanf1(ucharp,ucharr,ucharb);
voidscanf2(uchartw,ucharr,ucharb);
voidscanf3(ucharm,ucharr,ucharb);
voidscanf4(uchars,ucharr,ucharb);
voidplay24();
voidplaystop1();
voidplaystop2();
/*********延时程序,t=1时,延时1ms************/
voiddelay(uchart)
inti,j;
for(j=0;
j<
t;
j++)
for(i=0;
110;
i++);
/***********主程序************/
voidmain()
init();
init_timer();
init_extra();
//初始化
while
(1)
{
if(station==0)//状态0:
比赛状态
scanf(part,s24,munite,second,red_mark,blue_mark);
if(time_tick1==50)
{
time_tick1=0;
if(second==0)//时间计数
{
if(munite==0)
{
if(part>
=4)
{
talk2=1;
//终场报警操作
TR0=0;
//关闭定时器中断0
TR1=1;
}
else
//小节结束报警
}
else
{
munite--;
second=59;
}
else
second--;
if(s24==0)//24秒计数
TR0=0;
}
{
if(s24<
2)
talk2=1;
TR1=1;
TR0=0;
key_pause=0;
elseif(s24<
8)
talk1=1;
s24--;
//6秒提醒
}
if(second==0&
&
munite==0)//操作进入下一节比赛
{
if(key_reset==1)
s24=0x18;
part++;
key_reset=0;
if(part==10)
//比赛太久,报警
if(part<
5)//判断是否为加时赛,不是,延长12分钟
if(key_red_add==1)//红队得分操作加
key_red_add=0;
if(red_mark<
0xff)
red_mark++;
if(key_red_mul==1)//红队得分操作减
key_red_mul=0;
if(red_mark>
0)
red_mark--;