基于51单片机篮球计时计分器设计

基于51单片机篮球计时计分器设计

(仿真+程序+电路图+原理图+设计报告)

功能介绍

具体功能:

1.能记录整个赛程的比赛时间,可以修改、暂停比赛时间。

2.能随时刷新两队在赛程中的比分。

3.交换比赛场地时,能交换两队比分的位置。

4.比赛时间结束时,能发出报警指令。

5.有24秒倒计时功能,可通过按键随时复位24秒,如果24秒违例会启动蜂鸣器报警,同时比赛时间暂停,处理好后按一下24秒复位键,比赛继续。

#include<reg51.h>

#define LEDData P0

unsigned char code LEDCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

int minit,second,count,count1;        	//分,秒,计数器
char min=15,sec=0;

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 p24_sec=P1^5;
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 led12=P3^4;

sbit alam=P1^7;						//报警

bit  playon=0;						//比赛进行标志位,为1时表示比赛开始,计时开启
bit  timeover=0;					//比赛结束标志位,为1时表示时间已经完
bit  AorB=0;						//甲乙对交换位置标志位
bit  halfsecond=0;					//半秒标志位

unsigned int scoreA;				//甲队得分
unsigned int scoreB;				//乙队得分
char sec24=24;		

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=0x7f;
	else
		LEDData=0xff;
	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;

//-----------显示时间分--------------
	LEDData=LEDCode[sec24/10];
	led11=0;
	Delay5ms();
	led11=1;
	LEDData=LEDCode[sec24%10];
	led12=0;
	Delay5ms();
	led12=1;
}


//=========================按键检测程序================================================
void keyscan(void)
{
	if(playon==0)
	{
		if(add1==0)
		{
			display();
			if(add1==0);
			{
				if(minit<99)
					minit++;
				else
					minit=99; 
					min=minit;
			}
			do
				display();
			while(add1==0);
			
		}

		if(dec1==0)
		{
			display();
			if(dec1==0);
			{
				if(minit>0)
					minit--;
				else
					minit=0;
					min=minit;
			}
			do
				display();
			while(dec1==0);
			
		}

		if(add2==0)
		{
			display();
			if(add2==0);
			{
				if(second<59)
					second++;
				else
					second=59; 
					sec=second;
			}
			do
				display();
			while(add2==0);
			
		}

		if(dec2==0)
		{
			display();
			if(dec2==0);
			{
				if(second>0)
					second--;
				else
					second=0;  
					sec=second;
			}
			do
				display();
			while(dec2==0);
			
		}

		if(exchange==0)
		{
			display();
			if(exchange==0);
			{
				TR1=0;					//关闭T1计数器
				alam=1;					//关报警
   				AorB=~AorB;				//开启交换	
				minit=min;				//并将时间预设为15:00
				second=sec;
				sec24=24;
			}
			do
				display();
			while(exchange==0);
		}	
	}
	else
	{
		if(add1==0)
		{
			display();
			if(add1==0);
			{
				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);
			{
				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);
			{
				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);
			{
				if(AorB==1)
				{
					if(scoreA>0)
						scoreA--;
					else
						scoreA=0;
				}
				else
				{
					if(scoreB>0)
						scoreB--;
					else
						scoreB=0;
				}
			}
			do
				display();
			while(dec2==0);
		}
		if(p24_sec==0)
		{
			display();
			if(p24_sec==0)
			{
				sec24=24;
				TR0=1;
				alam=1;
				while(p24_sec==0) display();
			}
		}
	}
}

硬件设计

使用元器件:

单片机:STC89C51;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

万用板9*15;40脚IC座;

0.36四位一体共阳数码管;

0.36三位一体共阳数码管*2;

0.36两位一体共阳数码管;

10K排阻(103);2.2K电阻*13;

10K电阻;10uF电容;

按键*7;12M晶振;

30P电容 *2;9012三极管*13;

蜂鸣器;DC电源插座;

自锁开关;导线:若干;

具体功能实现:

设计资料

01 仿真图

本设计使用proteus7.8和proteus8.7两个版本设计,向下兼容,无需担心!具体如图!

02 原理图

本系统原理图采用Altium Designer19设计,具体如图!

03 程序

本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图!

04 设计报告

七千字设计报告,具体如下!

05 设计资料

全部资料包括仿真源文件 、程序(含注释)、AD原理图、电路图、参考论文等。具体内容如下,全网最全! !

下面是开源51单片机设计资料

​大家共同学习进步:

链接:https://pan.baidu.com/s/18j2D5R9OUBLKDF1PrZkypg?pwd=zbbc 
提取码:zbbc 

点赞分享,一起学习进步!一起成长。

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值