基于AT89S52的篮球足球比赛计时计分器仿真及实物制作Word文档下载推荐.docx
《基于AT89S52的篮球足球比赛计时计分器仿真及实物制作Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于AT89S52的篮球足球比赛计时计分器仿真及实物制作Word文档下载推荐.docx(31页珍藏版)》请在冰豆网上搜索。
按键模块通过P1口输入数据。
总体实现功能如下:
(1)能为比赛提供计时功能,并能任意修改所要计量的时间,以此来满足足球篮球比赛的不同赛制。
(2)能为比赛提供记录比分功能,随时刷新甲、乙两队在整个比赛过程中的比分,出现错误也能重新修改比分。
(3)比赛结束时,能发出报警声,并能随时关闭报警声。
(4)比赛期间可随时接受暂停请求,计时停止。
2、系统硬件模块设计:
(1)设计框图及原理图
(2)单片机芯片AT89S52模块
AT89S52的主要特性如下:
·
与AT89C51,C52,STC89RC52兼容
·
8K字节可编程闪烁存储器
128*8位内部RAM
32可编程I/O线
三个16位定时器/计数器
6个中断源
可编程串行通道
片内振荡器和时钟电路
(3)时钟模块
采用12MHZ的晶振,另有两个30pF的瓷片电容
(4)复位电路
5
(5)报警电路
采用蜂鸣器加100Ω的限流电阻接P1口
(6)按键控制模块
共有9个设置按键,P1口有7个:
add1、add2是加分键(add1按一次加一分,add2按一次加二分),minus1是减分键(按一下减一分),,bstop是关蜂鸣器键,start是开始计时键,stopagain是时间暂停键,turn是切换键(用于加分方的切换),P3口有2个中断:
timeadd1是时间计时加1分钟,timeadd10是时间计时加10分钟。
(7)时间显示模块
采用一个四位共阴七段数码管显示分秒。
段选口接P0口,P0口接一个1kΩ的排阻,起上拉电平作用。
位选口接P2,采用动态扫描。
(8)比分显示模块
采用两个两位共阴七段数码管显示甲队乙队分数。
三、系统软件模块设计
(1)C语言程序流程图
中断函数按否
初始化显示
开始
修改计时时间
N
start按否
时间是否为0
按键函数
计时函数
显示函数
复位函数
报警函数
(2)源程序代码:
#include<
reg52.h>
#include<
intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable1[]={
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef};
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchardisbuffer[8]={0};
ucharminute=0,second=0;
ucharAscore=0,Bscore=0,temp=0;
ucharflage1=0;
ucharflage=0;
uintcount,z;
sbitbizz=P1^7;
//定义按键对应的端口
sbitadd1=P1^0;
sbitadd2=P1^1;
sbitminus1=P1^2;
sbitbstop=P1^4;
sbitstart=P1^5;
sbitstopagain=P1^6;
sbitturn=P1^3;
sbittimeadd1=P3^2;
sbittimeadd10=P3^3;
voidininterrupt()interrupt1//定时器T0计时函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
if(second==0&
&
minute==0)
{
ET0=0;
}
elseif(second==0&
minute!
=0)
second=59;
minute--;
elseif(second!
=0)
second--;
}
}
voiddelay()//显示延时函数
uintx,y;
for(x=10;
x>
0;
x--)
for(y=10;
y>
y--);
voiddelay1()//延时消抖函数16ms
for(y=360;
y--)
;
}
voiddisplay1()
uchari,j;
uchartemp;
disbuffer[3]=second%10;
disbuffer[2]=second/10;
disbuffer[1]=minute%10;
disbuffer[0]=minute/10;
disbuffer[5]=Ascore%10;
disbuffer[4]=Ascore/10;
disbuffer[7]=Bscore%10;
disbuffer[6]=Bscore/10;
temp=0xfe;
//采用动态扫描
P2=temp;
for(i=0;
i<
8;
i++)
j=disbuffer[i];
P0=table1[j];
delay();
temp=_crol_(temp,1);
//temp的最低位0左移,依次选通各个数码管
P2=temp;
}
voiddisplay()//显示函数
P0=table[j];
}
voidbizzer()//报警函数
while(minute==0&
second==0)
bizz=0;
delay1();
display1();
if(!
bstop==1)
{
delay1();
if(!
while(!
bstop==1);
while
(1)
{
bizz=1;
display();
}
}
}
voidexinterrupt()interrupt0//外部中断0,增加1分钟计时
timeadd1)
while(!
timeadd1);
minute++;
voidexinterrupt1()interrupt2//外部中断1,增加10分钟计时
timeadd10)
timeadd10);
minute+=10;
voidbutton()//按键控制函数
if(!
turn)
turn);
flage+=1;
if(flage%2==0)
add1)//分数加1分
add1)
add1);
Ascore+=1;
add2)//分数加2分
add2)
add2);
Ascore+=2;
minus1)//减分
minus1)
minus1);
Ascore-=1;
else
Bscore+=1;
Bscore+=2;
delay1();
if(!
while(!
Bscore-=1;
stopagain)//时间暂停
stopagain)
stopagain);
flage1+=1;
if(flage1%2==1)
TR0=0;
else
TR0=1;
voidmain()
while
(1)
TH0=(65536-