基于单片机的篮球计时计分器设计(C语言编程、含proteus仿真图)

摘要

单片机,亦称单片微电脑或单片微型计算机。它是把中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。

本设计是基于AT89S52单片机的篮球计时计分器,利用7段共阴LED作为显示器件。在此设计中共接入了1个四位一体7段共阴LED显示器,2个两位一体7段共阴LED显示器,前者用来记录赛程时间,其中2位用于显示分钟,2位用于显示秒钟,后者用于记录甲乙队的分数,每队2个LED显示器显示范围可达到0~99分。赛程计时采用倒计时方式,比赛开始时启动计时,直至计时到零为止。

其次,为了配合计时器和计分器校正调整时间和比分,我们特定在本设计中设立了7个按键,用于设置,调整时间,启动,调整分数和暂停等功能。采用单片机控制是这个系统按键操作使用简洁,LED显示,安装方便。

主控芯片采用AT89S52单片机,采用C语言进行编程,编程后利用Keil uVision3来进行编译,再生成的HEX文件装入芯片中,采用proteus软件来仿真,检验功能是否能够正常实现。仿真成功后,焊接硬件电路,通过ISP下载器将hex文件烧制到单片机。

目录

1. 概述 ............................................................................................................................................. 2

1.1 背景知识介绍 ................................................................................................................. 2 1.2 设计内容 ......................................................................................................................... 2 1.3计任务和要求 .................................................................................................................... 3 1.4 设计意义 ....................................................................................................................... 3 2.系统总体方案及硬件设计 ............................................................................................................ 4

2.1 系统总体方案设计 ........................................................................................................... 4 2.2 硬件电路设计 ................................................................................................................. 5

2.2.1时钟电路模块 ........................................................................................................ 6 2.2.2 复位电路模块 ....................................................................................................... 6 2.2.3显示模块 ................................................................................................................ 7 2.2.4 报警模块 ............................................................................................................... 8 2.2.5总硬件电路设计 .................................................................................................... 9

3 软件设计..................................................................................................................................... 10

3.1 软件总体设计方案 ......................................................................................................... 10 3.2 软件设计具体过程 ......................................................................................................... 11

3.2.1延时模块设计 ........................................................................................................ 12 3.2.2 数码管动态刷新显示程序 ................................................................................... 12 3.2.3 T0中断程序 .......................................................................................................... 14 3.2.4 加分子程序 ....................................................................................................... 15 3.2.5减分子程序 .......................................................................................................... 15 3.2.6 调整时间子程序 ................................................................................................. 16 3.2.7 半场交换比分子程序 ....................................................................................... 18 3.2.8 比赛暂停子程序 ............................................................................................... 19 3.2.9 中场指示灯程序 ........................................................................................... 20 3.2.10 主程序 ............................................................................................................... 21

4 . PROTEUS仿真 ......................................................................................................................... 23

4.1 PROTEUS简介 .................................................................................................................. 23 4.2仿真过程 .......................................................................................................................... 23 5. 硬件焊接与调试 ....................................................................................................................... 26 6.课程设计体会 ............................................................................................................................. 27 参考文献......................................................................................................................................... 28 附1 源程序 .................................................................................................................................. 29 附2 系统原理图 ............................................................................................ 错误!未定义书签。

1

1. 概述

1.1 背景知识介绍

体育比赛计时计分系统是对体育比赛过程中所产生的时间,比分等数据进行快速采集记录,加工处理,传递利用的信息系统。根据不同运动项目的不同比赛规则要求,体育比赛的计时计分系统包括测量类,评分类,命中类,制胜类得分类等多种类型。

篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统。篮球比赛的计时计分系统由计时器,计分器等多种电子设备组成,同时,根据目前高水平篮球比赛要求,完善的篮球比赛计时计分系统设备应能够与现场成绩处理,现场大屏幕,电视转播车等多种设备相联,以便实现高比赛现场感,表演娱乐观众等功能目标。 由于单片机的集成度高,功能强,通用性好,特别是它具有体积小,重量轻,能耗低,价格便宜,可靠性高,抗干扰能力强和使用方便等独特的优点,使单片机迅速得到了推广应用,目前已经成为测量控制应用系统中的优选机种和新电子产品的关键部位。世界各大电气厂家,测控技术企业,机电行业,竞相把单片机应用于产品更新,作为实现数字化,智能化的核心部件。篮球计时计分器就是以单片机为核心的计时计分系统,由计时器,计分器,综合控制器和24秒控制器等组成。 1.2 设计内容

本设计是基于AT89S52单片机的篮球计时计分器,利用7段共阴LED作为显示器件。在此设计中共接入了1个四位一体7段共阴LED显示器,2个两位一体7段共阴LED显示器,前者用来记录赛程时间,其中2位用于显示分钟,2位用于显示秒钟,后者用于记录甲乙队的分数,每队2个LED显示器显示范围可达到0~99分。赛程计时采用倒计时方式,比赛开始时启动计时,直至计时到零为止。

2

其次,为了配合计时器和计分器校正调整时间和比分,我们特定在本设计中设立了7个按键,用于设置,调整时间,启动,调整分数和暂停等功能。采用单片机控制是这个系统按键操作使用简洁,LED显示,安装方便。 1.3计任务和要求

任务: 设计一个用于赛场的篮球计时计分器。

要求: 1、能记录整个赛程的比赛时间,并能随时实现暂停。

2、能随时刷新甲、乙两队在整个过程中的比分。

3、中场交换比赛场地时,能自动交换甲、乙两队比分的位置。 4、比赛中场和结束时,能发出报警声。 5、通过指示灯指示上下半场。

6、当比赛时间需要回倒时,能通过按键实现回表。 7、加分有误时可通过按键实现减分调整。

1.4 设计意义

课程设计使我们进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤,掌握了单片机仿真软件Proteus的使用方法,键盘和显示器在的单片机控制系统中的应用以及撰写课程设计报告的方法。此次设计很好的将书本上的理论知识和实践有机的联系了起来,是我们对理论知识有了更进一步的掌握,锻炼了我们的动手能力,同时也让我们懂得了理论与实际相结合的意义。为以后的工作和学习提供了宝贵的经验。

3

2.系统总体方案及硬件设计

2.1 系统总体方案设计

篮球计时计分器主要包括单片机控制系统、计时显示模块、计分显示模块、定时报警,按键控制键盘模块。通过这几个模块的协调工作就可以完成相应的计时计分控制和显示功能。这四个模块的相互连接如下图(图1)所示:

本设计是基于AT89S52单片机的篮球计时计分器,利用7段共阴LED作为显示器件。在此设计中共接入了1个四位一体7段共阴LED显示器,2个两位一体7段共阴LED显示器,前者用来记录赛程时间,其中2位用于显示分钟,2位用于显示秒钟,后者用于记录甲乙队的分数,每队2个LED显示器显示范围可达到0~99分。赛程计时采用倒计时方式,比赛开始时启动计时,直至计时到零为止。

4

2.2 硬件电路设计 单片机AT89S52简介

AT89S52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。

AT89S52(如图2)具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器.

3130291819XTAL1876543219EAALEPSENP1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0RSTXTAL2U1AT89C5P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXD171615141312111028272625242322213233343536373839P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0P2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8

图 2 AT89S52单片机引脚图

此模块电路包括时钟电路模块,复位电路模块及报警显示模块。

5

2.2.1时钟电路模块

时钟电路在单片机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟是保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢。为达到振荡周期是12MHZ的要求,这里要采用12MHZ的晶振,另外有两个22P的电容,两晶振引脚分别连到XTAL1和XTAL2振荡脉冲输入引脚。具体连接图如 图3所示:

C133p19U1X2XTAL1CRYSTAL18P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A103938373635343332212223C533pXTAL29RST 图 3 晶振电路 2.2.2 复位电路模块 复位是单片微机的初始化操作,其主要功能是把PC初始化为0000H,使单片微机从0000H单元开始执行程序。除进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,可以按复位键以重新启动,也可以通过监视定时器来强迫复位。RST引脚是复位信号的输入端。复位电路在这里采用的是上电+按钮复位电路形式,具体连接电路如图4

6

R6200R22p18XTAL2K59RSTC110u 图 4 复位电路 2930PSEN 2.2.3显示模块 本设计采用共阴极数码显示器,通常,共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为高电平时,该端所连接的字符导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。同样,要求段驱动电路能提供额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。本次设计在显示模块用到的是一个4位一体和2个两位一体共阴极数码管,共有8个代码输入口和8个位选输入口,采用排阻提供上拉电流数码管,以保证有足够大的电流点亮数码管,采用动态驱动,使各位数码管逐个轮流受控显示,这就是动态驱动,由于扫描速度极快,显示效果与静态驱动相同,其具体图形如下图5图6所示

图5

7

图6 2.2.4 报警模块 蜂鸣器通过一NPN三极管进行驱动,如图触发信号有基极引入。(图7) R30R1Q2NPNLS1SPEAKER 图7

8

2.2.5总硬件电路设计

图8

9

3 软件设计

在设计程序之前,我们首先要对单片机应用系统预完成的任务进行深入的分析,明确系统的设计任务、功能要求和技术指标。其次,要对系统的硬件资源和工作环境进行分析。这是单片机应用系统程序设计的基础和条件。 3.1 软件总体设计方案

本次单片机课程设计软件设计部分采用模块化程序设计,程序部分由主程序、T0中断程序、扫描显示子程序、计时加(减)1秒的子程序、暂停子程序、快表和回表子程序、延时子程序等组成.其程序流程图如图9图10。

图9 主程序流程图

10

图10扫描刷新显示子程序流程图

3.2 软件设计具体过程

软件设计部分采用模块化程序设计,用C语言编写。Keil是美国Keil

Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51

11

生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

程序部分由主程序、T0中断程序、扫描显示子程序、计时加(减)1秒的子程序、暂停子程序、快表和回表子程序、延时子程序等组成。 3.2.1延时模块设计

void delay(int t) 调用该子程序能实现延时功能 { 通过参数t,可以调成延时时间 while(t--) {

unsigned int i; 设置变量i的变化范围,能调整延时的单位时间 for(i=0;i<200;i++); 长度,i越小,延时的单位时间越短,精度越高 } }

3.2.2 数码管动态刷新显示程序

void display(int i,int j,int x,int y) 变量i,j,x,y分别为分,秒,A分数,B分数 {

if(jie==1&&bujin!=2) 当中间变量jie==1时,为上半场,此时对P1赋值

P1=0xbf; 使P1=0xbf, 即P1=1011 1111B,上半场指示灯对应点亮

P2=0xfe;

数码管动态刷新显示程序 P2=1111 1110, i为分钟

P0=seg[i0/10]; P2=0xfe,所以刷新显示时间的分钟十位,调用延时程序, delay(1); 延时数码管的点亮 P2=0xff; P0=0;

P2=0xfd; 同理,动态刷新时分钟个位并延时点亮 P0=seg[i]; delay(1); P2=0xff; P0=0;

12

P2=0xfb; 同理,动态刷新时秒钟十位并延时点亮 P0=seg[j0/10]; delay(1); P0=0; P2=0xff;

P2=0xf7; P0=seg[j]; delay(1); P0=0; P2=0xff;

P2=0xef;

P0=seg[x0/10]; delay(1); P2=0xff; P0=0;

P2=0xdf; P0=seg[x]; delay(1); P2=0xff; P0=0;

P2=0xbf;

P0=seg[y0/10];

delay(1); P0=0; P2=0xff;

同理,动态刷新时秒钟个位并延时点亮 同理,动态刷新A分数十位并延时点亮

同理,动态刷新A分数个位并延时点亮 同理,动态刷新B分数十位并延时点亮 13

P2=0x7f; 同理,动态刷新B分数十位并延时点亮

P0=seg[y]; delay(1); P0=0; P2=0xff; }

本设计中各个数码管采用动态驱动,使各位数码管逐个轮流受控显示,由于扫描速度极快(本实验中大约每20毫秒刷新一次),所以显示效果与静态驱动相同。

3.2.3 T0中断程序

void t0(void) interrupt 1 {

TH0=0xb1; 对定时器T0送入计数初值,由于TH0=0xb; TL0=0x10; TL0=0x10 故定时器定时为20毫秒,即每 if(n==0)

20毫秒调用一次void t0(void) interrupt 1

本设计调用定时器T0,计时单位为一秒

{ n=60;

m--; } i++; if(i==50)

{ 令i值为50 50*20毫秒=1秒,来实现计时 n--; 单位为一秒 i=0; }

display(m,n-1,x,y); 调用动态刷新显示程序,即每20毫秒刷新一 } 次数码管

14

3.2.4 加分子程序 void keyjiafen1()

{ 当检测到RXD按键按下时,调用延时子程序 if(RXD==0) 实现消除按键抖动功能,即,当 delay(1);,

{ 检测到按键按下时候,延时,按键仍按下,说明 if(RXD==0) { while(RXD==0); x++;

}

}

if(TXD==0) {

delay(1); if(TXD==0) {

while(TXD==0); y++;

}

} }

3.2.5减分子程序 void keyjianfen1()

{ if(WR==0) {

按键确实按下,非抖动,A对应加分 检测TXD加分按键时候按下,B加分

减分按键检测子程序,其基本算法及功能与加分

相同 15

delay(1); if(WR==0) {

while(WR==0); x--; }

} if(RD==0) { delay(1); if(RD==0)

{

while(RD==0); y--; }

} }

3.2.6 调整时间子程序

调整时间子程序,使时间快速倒退或快进,实现回表功能,同时回表之后能自动暂停

void key2() {

if(INT0==0) {

delay(10);

if(INT0==0) 回表子程序,检测到INT0按下时,使时间回倒

{

chuzanting==0; chuzanting==0; zanting=1;为附加变量,当回表按键

16

zanting=1; 松开时,表暂停,这两个变量用来调用暂停

n++;

if(n==60)

{

m++; n=1; }

} }

if(INT1==0) 快表子程序,检测到INT1按下时,使倒计加快, { 通常情况下与回表子程序配合使用,即当回表 回过的时候,按此键调整时间 delay(10); chuzanting==0; zanting=1;作用同上 if(INT1==0)

{

chuzanting==0; zanting=1; n--; }

} }

void shijian() 该程序使回表和快表按键松开时候能自动暂停 {

if(zanting==1&&INT0==1&&INT1==1&&chuzanting==0 ) {

EA=0; zanting==1&&INT0==1&&INT1==1&&chuzanting==0作用为 zanting=0; 当按键松开的时候,调用暂停程序条件

huzanting=0; zanting=0;chuzanting=0,初始化,以便下次回表和快表

while(1) 按键松开时候仍能调用暂停程序

{

17

display(m,n,x,y);

if(P1_0==0) 当检测暂停键按下,开中断,跳出暂停 {

delay(1); if(P1_0==0) {

while(P1_0==0); EA=1;

break; } } } } }

3.2.7 半场交换比分子程序 void key3() {

int temp; 定义中间变量temp,检测到有按键按下时候 if(zidong==1&&jie==1) 通过temp交换甲队,乙队两队比赛分数 {

temp=x; zidong==1&&jie==1是判断半场的条件 y=temp;

display(m,n,x,y); 刷新数码管 zidong=0;

bujin=0;

} }

18

3.2.8 比赛暂停子程序

void key4() {

if(P1_0==0) 检测到暂停按键按下时候,令EA=0关闭中断 {

delay(1); 同通过死循环程序while(1),不断刷新数码管 if(P1_0==0) 当暂停键再次按下时候,开中断,以使比赛时间 { 继续倒计时,由于在暂停的时候,程序处于死循 while(P1_0==0);

EA=0; 无法回到主程序,暂停时,除了暂停键 while(1) 其他按键按下均无效

{

display(m,n,x,y); if(P1_0==0)

{ 当暂停键再次按下时候,EA=1开中断,计时数码管 delay(1); 继续倒计时,同时通过break语句,跳出死循环 if(P1_0==0) {

while(P1_0==0); EA=1; break; } } } } } }

19

3.2.9 中场指示灯程序 void over() {

if((m==0)&&(n==0)) 当m,n均为0的时候,通过变量jie的值判断比赛 { 是否结束 if(jie>1)

如果jie>1,说明半场到了,比赛没有结束,

{ 令m=2,n=0,关中断,再次按下暂停键时候继续倒计时

m=2; 同是T1=1;delay(400) ; delay(400);,是蜂鸣器 n=0; 发声报警 EA=0;

T1=1; delay(400); T1=0;

while(1)

if(P1_0==0)

{

display(m,n,x,y); 刷新数码管,等待暂停减再次按下,跳出暂停

{

delay(1); if(P1_0==0) {

while(P1_0==0); EA=1; break; } }

}

20

jie--;

}

if(jie==1&&bujin==2) 如果jie==1&&bujin==2,说明比赛结束了, { 关闭中断,比赛秒表不再走动,同时不短刷新数码管,

EA=0; m=0;

n=0;

T1=1; 全场比赛结束蜂鸣器开始报警

delay(400); T1=0;

P1=0x3f; P1=0x3f上下半场指示灯同时点亮,比赛结束 while(1) }

3.2.10 主程序 void main()

display(m,n,x,y); 同时应当不断刷新数码管 } }

{ TMOD=0x01; 首先设置定时器工作方式 EA=1; ET0=1;

TH0=0xb1; 定时器送计数初值,EA=1,开中断,P3口电平拉高 TL0=0x10; P1=0x7f, 上半场指示灯点亮 TR0=1; TR0=1启动定时器 P3=0xff; P1=0x7f;

T1=0;

while(1) 主程序通过 while(1),反复调用循环体内的子程序 { 来执行相应的功能

keyjiafen1();

21

keyjianfen1();

key2(); if(zidong==1) zidong==1为key3()执行条件 key3(); key3()半场交换场地时自动交换双方 if(n==18&&bujin==0) 比赛分数子程序,所以仅当中场时调用 {

bujin=2;

} shijian();

key4();

over(); }

}

修改变量bujin的值,目的是设定over() 中第二个if语句的执行条件

22

4 . PROTEUS仿真

4.1 PROTEUS简介

Proteus 是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:

①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。

②支持主流单片机系统的仿真。目前支持的单片机类型有:ARM7(LPC21xx)、 8051/52系列、AVR系列、PIC10/12/16/18系列、HC11系列以及多种外围芯片。 ③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2、MPLAB等软件。

④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。 4.2仿真过程

接通电源,计时显示即开始倒计时工作,上半场指示灯亮,计时初始设计为2分钟,按下A+1键实现对A的加分,每按下一次加1分,如图11.

23

RP1RESPACK-81C1191nFU1XTAL123456789X1C21nF18CRYSTALXTAL29RSTP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617计时显示R11kC3291uF3031R210k12345678PSENALEEAA+1B+1P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C52回表按键时间快进A-1B-1暂停/启动GNDD1LED-REDD2LED-REDR30R1Q2NPNLS1SPEAKER 图11

同样可实现A和B的加减分,按下暂停/启动键可实现暂停和启动。

RP1RESPACK-8123456789计时显示A+1B+1回表按键时间快进A-1B-1暂停/启动GND 图12 24

图13

上半场结束后,停止计时,蜂鸣器报警,按下暂停\\启动按键启动下半场计时,同时可实现甲队和乙队交换分数,下半场指示灯亮。

25

5. 硬件焊接与调试

对照原理图进行焊接工作,把硬件先依次正确插到相应的位置,然后再次检查器件是否都正确,确定无误后进行焊接.在焊接的过程中要注意不要将相临的两个引脚焊接在一起,防止短路影响使用。

硬件连接好以后,通过ISP下载线向单片机内烧制HEX程序,观察各部分工作情况。硬件连接如图

.

26

6.课程设计体会

通过这几天的单片机的实训,我在理论的基础上更深刻的掌握了单片机的深层内容及实际生活中的应用,实训锻炼了自己动手能力和思维能力,还有在软件方面的编程能力,让我受益匪浅,同时也暴露出一些平时学习上的问题,让我深刻反思。这些问题的发现将为我以后的学习和工作找明道路,查漏补缺为进一步学习作好准备。

通过实训,让我更熟悉掌握了Keil uVision3, proteus ISIS这些应用程序的运用,让我懂得了如何编写一些简单的程序,学会了如何制作单片机应用程序,还有焊接和程序下载,。但在中间暴露出很多问题:对平时上课讲的理论知识没有完全掌握消化,到了实际操作中还得请教同学,在焊接中焊接的基本工夫掌握不到家,手上工夫还是很欠缺的,使得电路板不是很美观。

这些问题的发现,有助于提高我在以后的工作和学习中对此类问题的认识,确保不在同一问题上再次犯错。严谨求实、踏实务实,是我这次实训的深刻总结。 做课程设计的这几天翻阅了很多书,也上了很多网站去寻找自己需要的资料。这种寻找有很强的目的性,只是为了自己选定的课题内容而查阅,所以除了自己课题以外的其他方面几乎还是一无所知。这让我深刻的认识到了自己专业知识的贫乏。为我对自己大四生活的规划敲响了警钟。我对单片机的学习不会因为课程设计的结束而结束,在接触的众多资料里,做设计只是走马观花般的点到。 通过单片机课程设计,我加深了对单片机理论的理解,学回了怎样将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的不畏困难的挑战精神,从而不断地战胜自己,超越自己,我在这一设计过程中,学会了坚持不懈,不轻易言弃。设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。

27

参考文献

【1】余发山,单片机原理及应用技术:中国矿业大学出社,2003 【2】 河南理工大学电气学院:单片机实验报告指导册,2008 【3】刘法治,常用电子器件及典型芯片应用技术:机械工业出版社,2007 【4】何立民,MSC--51系列单片机应用系统设计:北京航空航天大学出版社,1993

28

附1 源程序

#include //#include 为头文件P1口各位分别用P1_0等表示 code unsigned seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//其中{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} //分别对应数码管显示的字形0到9

int m=1,n=60,x=0,y=0,i=0,jie=2,zidong=1,bujin=1,zanting=0,chuzanting=0;

//定义全局变量m,n,x,y,i,jie,zidong,bujin,zanting,chuzanting //并初始化,其中m,n分别表示分钟与秒计时,x,y分别表示甲乙//两队的分数,其余中间变量

void delay(int t) {

while(t--) {

unsigned int i; for(i=0;i<200;i++); } }

void display(int i,int j,int x,int y) // 数码管动态刷新显示程序 {

if(jie==1&&bujin!=2) //中间变量jie==1时,为上半场,对P1赋值

P1=0xbf; //P1=0xbf, 即P1=1011 1111B,点亮对应上半场指示灯

// 延时子程序 通过参数t,可以调整暂停时间

P2=0xfe;

//数码管动态刷新显示程序 P2=1111 1110,i为分钟

P0=seg[i0/10]; //刷新显示时间显示分钟十位,调用延时程序, delay(1); //延时数码管的点亮 P2=0xff; P0=0;

29

P2=0xfd; //同理,动态刷新时分钟个位并延时点亮 P0=seg[i]; delay(1); P2|=0xff; P0=0;

P2=0xfb; P0=seg[j0/10]; delay(1); P0=0; P2=0xff;

P2=0xf7; P0=seg[j]; delay(1); P0=0; P2=0xff;

P2=0xef;

P0=seg[x0/10]; delay(1); P2=0xff; P0=0;

P2=0xdf; P0=seg[x]; delay(1); P2=0xff; P0=0;

P2=0xbf; //同理,动态刷新时秒钟十位并延时点亮 //同理,动态刷新时秒钟个位并延时点亮 //同理,动态刷新甲队分数十位并延时点亮//同理,动态刷新甲队分数个位并延时点亮 / /同理,动态刷新乙队分数十位并延时点亮

30

P0=seg[y0/10];

delay(1); P0=0; P2=0xff;

P2=0x7f; //同理,动态刷新乙队分数十位并延时点亮

P0=seg[y]; delay(1); P0=0; P2=0xff; }

void t0(void) interrupt 1

{ TH0=0xb1; TL0=0x10; if(n==0)

{ n=60;m--; } i++; if(i==50)

{ n--; i=0; }

display(m,n-1,x,y); }

void keyjiafen1()

{ if(RXD==0)

//调用定时器T0 基本计时单位秒

//利用定时器T0,送入计数初值TH0=0xb1; TL0=0x10; //定时器定时单位为20毫秒 //分钟与秒时间调整 当秒减到0以后分钟减1 //利用中间变量i 令i值为50 50*20毫秒=1秒 //以实现一秒计时 //调用动态刷新显示程序 //加分按键子程序,在主程序中不断调用该子程序 //当检测到甲队加分按键按下时,对应加分 31

{ //调用延时子程序 实现消除按键抖动功能,即,当 delay(1); //检测到按键按下时候,延时,按键仍按下,说明按键 if(RXD==0) //确实按下,非抖动,甲队对应加分 { while(RXD==0); x++;

}

}

if(TXD==0) { delay(1); if(TXD==0) {

while(TXD==0); y++;

}

} }

void keyjianfen1()

if(WR==0) { delay(1); if(WR==0) { while(WR==0); x--;

}

} if(RD==0) { delay(1);

//同理,检测乙队加分按键时候按下,并加分 //减分按键检测子程序,其基本算法及功能与加{

//相同 32

if(RD==0) {

while(RD==0); y--;

}

} }

void key2()

{

if(INT0==0)

{ delay(10);

if(INT0==0) { chuzanting==0; zanting=1; n++;

if(n==60)

{ m++; n=1;

}

} } if(INT1==0) { delay(10); if(INT1==0) {

chuzanting==0;

//显示时间调整程序,即回表和快表

//在比赛中有时经常需要回表,故写此程序 //回表子程序,检测到INT0按下时,使时间回倒// chuzanting==0; zanting=1;为附加变量,当回表按键 //松开时,表暂停,这两个变量用来调用暂停 //快表子程序,检测到INT1按下时,使倒计加快, //通常情况下与回表子程序配合使用,即当回表 //回过的时候,按此键调整时间 // chuzanting==0; zanting=1;作用同上 33

zanting=1; n--; }

} }

void shijian() / /该程序使回表和快表按键松开时候能自动暂停 {

if(zanting==1&&INT0==1&&INT1==1&&chuzanting==0 ) {

EA=0; // zanting==1&&INT0==1&&INT1==1&&chuzanting==0作用为

zanting=0; //当按键松开的时候,调用暂停程序条件

chuzanting=0; //zanting=0;chuzanting=0,初始化,以便下次回表和快表

while(1) //按键松开时候仍能调用暂停程序

{

display(m,n,x,y);

if(P1_0==0) //检测暂停键按下,开中断,跳出暂停 {

delay(1); if(P1_0==0) {

while(P1_0==0); EA=1; break; } } } } }

void key3()

//半场交换场地时自动交换双方比赛分数子程序{

int temp; //定义中间变量temp,检测到有按键按下时候 if(zidong==1&&jie==1) //交换甲队,乙队比赛分数

34

{

temp=x; // zidong==1&&jie==1是判断半场的条件 // y=temp; display(m,n,x,y); zidong=0;

bujin=0;

} }

void key4() //比赛暂停子程序 {

if(P1_0==0) //检测到暂停按键按下时候,令EA=0关闭中断 {

delay(1); //同通过死循环程序while(1),不断刷新数码管 if(P1_0==0) //当暂停键再次按下时候,开中断,以使比赛时间 { //继续倒计时,由于在暂停的时候,程序处于死循 while(P1_0==0);

EA=0; //无法回到主程序,故主程序中检测按键按下的 while(1) //无法回到主程序,即实现了暂停时,除了暂停键

{ //其他按键按下均无效

display(m,n,x,y); if(P1_0==0)

{ //当暂停键再次按下时候,EA=1开中断,计时数码管 delay(1); //继续倒计时,同时通过break语句,跳出死循环 if(P1_0==0) {

while(P1_0==0); EA=1; break; } }

35

}

} } } void over() {

if((m==0)&&(n==0)) //当m,n均为0的时候,通过变量jie的值判断比赛 { //是否结束 if(jie>1)

//如果jie>1,说明半场到了,比赛没有结束, {

//比赛结束及及点亮下半场指示灯程序

{ //jie--,关中断,再次按下暂停键时候继续倒计时

m=2; n=0; EA=0;

T1=1; delay(400); T1=0;

while(1)

if(P1_0==0)

{ display(m,n,x,y);

{ delay(1); if(P1_0==0) {

while(P1_0==0); EA=1; break; }

36

} } jie--;

}

if(jie==1&&bujin==2) //如果jie==1&&bujin==2,说明比赛结束了,令EA=0, { //比关闭中断,比赛秒表不再走动,同时不短刷新数码管, EA=0;

//全场比赛结束蜂鸣器开始报警

m=0; n=0; T1=1;

delay(400); T1=0; }

void main()

// 主程序

P1=0x3f; // P1=0x3f上下半场指示灯同时点亮,比赛结束

while(1)

display(m,n,x,y); //不断刷新数码管 } }

{ TMOD=0x01; //设置定时器工作方式 EA=1; ET0=1;

TH0=0xb1; //定时器送计数初值,EA=1,开中断,P3口电平拉高 TL0=0x10; // P1=0x7f, 上半场指示灯点亮 TR0=1; P3=0xff; P1=0x7f;

T1=0;

while(1)

{ //通过 while(1),反复调用循环体内的子程序

37

keyjiafen1(); //执行相应的功能

keyjianfen1();

key2(); if(zidong==1) //zidong==1为key3()执行条件,仅当半场结束时候执行 key3();

if(n==18&&bujin==0) {

bujin=2;

}

shijian();

key4();

over(); }

}

//修改变量bujin的值,设定over()中第二个if语句的执行条件38

联系客服:779662525#qq.com(#替换为@)