标题:
基于51单片机的篮球计分器Proteus仿真+代码设计
[打印本页]
作者:
15352536450
时间:
2018-12-25 10:03
标题:
基于51单片机的篮球计分器Proteus仿真+代码设计
单片机自20世纪70年代问世以来,以极其高的性价比受到人们的重视和关注,所以应用很广,发展很快。由于单片机的集成度高,功能强,通用性好,特别是它具有体积小、重量轻、能耗低、价格便宜、可靠性高、抗干扰能力强和使用方便等独特的优点,使单片机迅速得到了推广应用。目前已经成为测量控制应用系统中的优选机种和新电子产品的关键部位,许多用单片机做控制的球赛计时计分系统也应运而生,如:用单片机控制液晶显示(LCD)计时计分器,用单片机控制LED七段显示器计时计分器等。篮球计时计分器以单片机为核心,由计时器、计分器、综合控制器等组成。
系统采用模块化设计,主体分为计时显示模块、计分显示模块、定时报警、按键控制键盘模块。每个模块的程序结构简单、任务明确,易于编写、调试和修改。程序可读性好,对程序的修改可局部进行,其他部分可保持不变。编程后利用Keil C51软件来进行编译,再将生成的HEX文件装入芯片中,采用Proteus软件仿真,检验功能是否能够正常实现,随后可用Protel99画出硬件电路图。本设计中系统硬件电路主要由以下几个部分组成:单片机AT89C51、计时电路、计分电路、报警电路和按键开关。
本次设计用由AT89C51编程控制LED七段数码管作显示的球赛计时计分系统。该系统具有赛程定时设置、赛程时间暂停、及时刷新甲乙双方的成绩等功能。它具有价格低廉、性能稳定、操作方便并且易于携带等特点,广泛适合各类学校或者小型团体作为赛程计时计分。
篮球计分器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(20.93 KB, 下载次数: 115)
下载附件
2018-12-25 22:06 上传
单片机源程序如下:
#include<reg51.h>
#define LEDData P0
unsigned char code LEDCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char minit,second,count,count1; //分,秒,计数器
sbit add1=P1^0; //甲对加分,每按一次加1分 /在未开始比赛时为加时间分
sbit dec1=P1^1; //甲对减分,每按一次减1分 /在未开始比赛时为减时间分
sbit exchange=P1^2; //交换场地
sbit add2=P1^3; //乙对加分,每按一次加1分 /在未开始比赛时为加时间秒
sbit dec2=P1^4; //乙对减分,每按一次减1分 /在未开始比赛时为减时间秒
sbit secondpoint=P0^7; //秒闪动点
//----依次点亮数码管的位------
sbit led1=P2^7;
sbit led2=P2^6;
sbit led3=P2^5;
sbit led4=P2^4;
sbit led5=P2^3;
sbit led6=P2^2;
sbit led7=P2^1;
sbit led8=P2^0;
sbit led9=P3^7;
sbit led10=P3^6;
sbit led11=P3^5;
sbit alam=P1^7; //报警
sbit onoff=P3^2;
bit playon=0; //比赛进行标志位,为1时表示比赛开始,计时开启
bit timeover=0; //比赛结束标志位,为1时表示时间已经完
bit AorB=0; //甲乙对交换位置标志位
bit halfsecond=0; //半秒标志位
unsigned int scoreA; //甲队得分
unsigned int scoreB; //乙队得分
void Delay5ms(void)
{
unsigned int i;
for(i=100;i>0;i--);
}
void display(void)
{
//-----------显示时间分--------------
LEDData=LEDCode[minit/10];
led1=0;
Delay5ms();
led1=1;
LEDData=LEDCode[minit%10];
led2=0;
Delay5ms();
led2=1;
//-------------秒点闪动------------
if(halfsecond==1)
LEDData=0x80;
else
LEDData=0x00;
led2=0;
Delay5ms();
led2=1;
secondpoint=0;
//-----------显示时间秒------------
LEDData=LEDCode[second/10];
led3=0;
Delay5ms();
led3=1;
LEDData=LEDCode[second%10];
led4=0;
Delay5ms();
led4=1;
//-----------显示1组的分数百位-------
if(AorB==0)
LEDData=LEDCode[scoreA/100];
else
LEDData=LEDCode[scoreB/100];
led5=0;
Delay5ms();
led5=1;
//---------------显示1组分数的十位-----------
if(AorB==0)
LEDData=LEDCode[(scoreA%100)/10];
else
LEDData=LEDCode[(scoreB%100)/10];
led6=0;
Delay5ms();
led6=1;
//---------------显示1组分数的个位-----------
if(AorB==0)
LEDData=LEDCode[scoreA%10];
else
LEDData=LEDCode[scoreB%10];
led7=0;
Delay5ms();
led7=1;
//-----------显示2组分数的百位-------
if(AorB==1)
LEDData=LEDCode[scoreA/100];
else
LEDData=LEDCode[scoreB/100];
led8=0;
Delay5ms();
led8=1;
//-----------显示2组分数的十位-----------
if(AorB==1)
LEDData=LEDCode[(scoreA%100)/10];
else
LEDData=LEDCode[(scoreB%100)/10];
led9=0;
Delay5ms();
led9=1;
//-----------显示2组分数的个位-----------
if(AorB==1)
LEDData=LEDCode[scoreA%10];
else
LEDData=LEDCode[scoreB%10];
led10=0;
Delay5ms();
led10=1;
}
//=========================按键检测程序================================================
void keyscan(void)
{
if(onoff==0)
{
display();
if(onoff==0)
{
alam=0;
Delay5ms();Delay5ms();
alam=1;
TR1=0;
timeover=0;
playon=!playon; //开始标志位
TR0=playon; //开启计时
do
display();
while(onoff==0);
}
}
if(playon==0)
{
if(add1==0)
{
display();
if(add1==0);
{
alam=0;
Delay5ms();Delay5ms();
alam=1;
if(minit<99)
minit++;
else
minit=99;
}
do
display();
while(add1==0);
}
if(dec1==0)
{
display();
if(dec1==0);
{
alam=0;
Delay5ms();Delay5ms();
alam=1;
if(minit>0)
minit--;
else
minit=0;
}
do
display();
while(dec1==0);
}
if(add2==0)
{
display();
if(add2==0);
{
alam=0;
Delay5ms();Delay5ms();
alam=1;
if(second<59)
second++;
else
second=59;
}
do
display();
while(add2==0);
}
if(dec2==0)
{
display();
if(dec2==0);
{
alam=0;
Delay5ms();Delay5ms();
alam=1;
if(second>0)
second--;
else
second=0;
}
do
display();
while(dec2==0);
}
if(exchange==0)
{
display();
if(exchange==0);
{
alam=0;
Delay5ms();Delay5ms();
alam=1;
TR1=0; //关闭T1计数器
alam=1; //关报警
AorB=~AorB; //开启交换
minit=15; //并将时间预设为15:00
second=0;
}
do
display();
while(exchange==0);
}
}
else
{
if(add1==0)
{
display();
if(add1==0);
{
alam=0;
Delay5ms();Delay5ms();
alam=1;
if(AorB==0)
{
if(scoreA<999)
scoreA++;
else
scoreA=999;
}
else
{
if(scoreB<999)
scoreB++;
else
scoreB=999;
}
}
do
display();
while(add1==0);
}
if(dec1==0)
{
display();
if(dec1==0);
{
alam=0;
Delay5ms();Delay5ms();
alam=1;
if(AorB==0)
{
if(scoreA>0)
scoreA--;
else
scoreA=0;
}
else
{
if(scoreB>0)
scoreB--;
else
scoreB=0;
}
}
do
display();
while(dec1==0);
}
if(add2==0)
{
display();
if(add2==0);
{
alam=0;
Delay5ms();Delay5ms();
alam=1;
if(AorB==1)
{
if(scoreA<999)
scoreA++;
else
scoreA=999;
}
else
{
if(scoreB<999)
scoreB++;
else
scoreB=999;
}
}
do
display();
while(add2==0);
}
if(dec2==0)
{
display();
if(dec2==0);
{
alam=0;
Delay5ms();Delay5ms();
alam=1;
if(AorB==1)
{
if(scoreA>0)
scoreA--;
else
scoreA=0;
}
else
{
if(scoreB>0)
scoreB--;
else
scoreB=0;
}
}
do
display();
while(dec2==0);
}
}
}
//******************************主函数*************************************************
void main(void)
{
TMOD=0x11;
TL0=0xb0;
TH0=0x3c;
TL1=0xb0;
TH1=0x3c;
minit=12; //初始值为12:00
second=0;
EA=1;
ET0=1;
ET1=1;
TR0=0;
TR1=0;
P1=0xFF;
P3=0xFF;
while(1)
{
keyscan();
display();
}
}
//*********************************中断服务函数**************************************
void time0_int(void) interrupt 1
{
TL0=0xb0;
TH0=0x3c;
TR0=1;
count++;
if(count==10)
{
halfsecond=0;
}
if(count==20)
{
count=0;
halfsecond=1;
if(second==0)
{
if(minit>0)
{
second=59;
minit--;
}
else
{
timeover=1;
playon=0;
TR0=0;
TR1=1;
}
}
else
second--;
}
}
//*********************************中断服务函数**************************************
void time1_int(void) interrupt 3
{
TL1=0xb0;
TH1=0x3c;
TR1=1;
count1++;
if(count1==10)
{
alam=0;
}
if(count1==20)
{
count1=0;
alam=1;
}
}
复制代码
0.png
(41.07 KB, 下载次数: 77)
下载附件
2018-12-25 22:06 上传
所有资料51hei提供下载:
基于51单片机的篮球计分器设计.zip
(67.99 KB, 下载次数: 346)
2018-12-25 10:02 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
Ranyuhang
时间:
2019-4-26 14:29
有没有人根据楼主的资料画个原理图pcb啊?
作者:
榆林上校
时间:
2019-4-29 19:58
嗯,收藏了,参考备用
作者:
韩小剑
时间:
2019-5-11 14:04
LEDData=LEDCode[minit/10];这句提示错误,,,,warning C275: expression with possibly no effect
作者:
沙师弟的泪
时间:
2019-6-11 16:18
有没有篮球计分器的程序流程图啊?
作者:
mont123
时间:
2019-6-18 18:28
非常感谢,收藏了
作者:
萁哥
时间:
2019-11-28 13:08
我下载了但是在哪里看
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1