基于51单片机篮球计分器proteus仿真

(源码+原理图+PCB+仿真+报告)
仿真:proteus 7.8
程序编译器:keil 4/keil 5
编程语言:C语言
编号C0004

资料下载地址

电路采用单片机作为核心元件,利用两个供阴的三位一体数码管来显示两队的分数,一个四位一体数码管显示时间的计时。显示分数范围可达0~999分,足够赛程计分的需要。四位一体数码管中2个用于显示分钟,2个用于显示秒钟。
该系统具有赛程定时设置,赛程时间暂停,及时刷新甲、乙双方的成绩等功能。设计分为软件设计和硬件设计两部分。主控芯片采用AT89C51,使用C语言编写软件程序,主体分为计时显示模块、计分显示模块、定时报警、按键控制模块。编程后利用Keil C51软件来进行编译,再将生成的HEX文件装入芯片中,检验功能是否能够正常实现。

一、设计要求:

1、能记录整个赛程的比赛时间,并能修改时间,暂停比赛时间。
2、能随时刷新甲、乙两队在整个赛程中的比分。
3、场中交换比赛场地时,能交换甲、乙两队比分的位置。
4、比赛时间结束时,能发出报警指令。
5、有24秒倒计时功能,可通过按键随时复位24秒,如果24秒违例会启动蜂鸣器报警,同时比赛时间暂停,处理好后按一下24秒复位键,比赛继续。

二、实现功能:

1、一个四位一体数码管显示比赛时间,时间格式如:15:00,两个三位一体数码管显示甲乙两对的比分,比分格式如:008。
2、比赛时间采用倒计时方式,以一秒的频率减时,上电时默认初值为15:00,在没有开始比赛时,可以修改时间,比赛开始后不能修改。
3、甲乙队比分采用三位数,上电初值为000,最大值为999,满足常理要求,未开始比赛以及比赛结束后比分无法加减,
4、比赛未开始之前,可以通过ADD1、DEC1键对比较时间的分钟进调时,通过ADD2、DEC2键对比较时间的秒进行调时。
5、可随时暂停/启动比赛时间。
6、比赛进行时,可以通过ADD1、DEC1键对甲队比分加、减,可以通过ADD2、DEC2对乙队比分加、减。每按一次键,加/减1分。
7、当一节比赛完后,可以通过(EXCHANGE)换场键换场,换场后,比分交换显示,交换后,下一节比赛开始时,相应的比分加减键也随之交换。
8、当比赛结束时,发出报警。

三、作用说明:

1、调整比赛时间:插上电源后,系列默认比赛时间为15:00,甲乙队比分默认000,此时按下ADD1键,可以对比赛时间分钟加1,按下DEC1键,可以对比赛时间的分钟减1,按下ADD2键,可以对比赛时间秒加1,按下DEC2键,可以对比赛时间秒减1。
2、启动比赛:按下RUN/STOP键,计时开始,比赛时间以1秒的频率倒计时。
3、暂停比赛:比赛运行的状态下,按RUN/STOP键,比赛暂停,计时暂停。
4、比分加减,在比赛进行的状态下按ADD1,DEC1键,可以对甲队比分加、减1,按ADD2、DEC2键,可以对乙队比分加、减1.
5、交换场地:在一节比赛时间结束后,按下EXCHANGE键,比赛时间重新预置为15:00,同时左右两边数码管的比分交换显示。此时按下启动键可以开始新一节的比赛。
6、报警提示:在一节比赛时间倒计时到00:00时,蜂鸣器发出报警提示。
7、比赛时,24秒会以1秒的速度减,可随时按下24秒复位键重置24秒。

仿真图(提供源文件):

仿真

原理图(提供源文件):

原理图

程序(提供源文件源码):

显示函数

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;
}

main函数

//******************************主函数*************************************************
void main(void)
{
	TMOD=0x11;
 	TL0=0xb0;
 	TH0=0x3c;
 	TL1=0xb0;
 	TH1=0x3c;
	minit=min;				//初始值为15:00
	second=sec;
 	EA=1;
	ET0=1;
	ET1=1;
 	TR0=0;
	TR1=0;
	EX0=1;
	IT0=1;
	IT1=1;
//	EX1=1;
	PX0=1;
//	PX1=1;
	PT0=0;
	P1=0xFF;
	P3=0xFF;
	alam=1;
 	while(1)
 	{
		keyscan();
		display();			
    }
}


void PxInt0(void) interrupt 0
{
	Delay5ms();
	EX0=0;
	alam=1;
	TR1=0;
	if(timeover==1)
	{
		timeover=0;
	}

	if(playon==0)
	{
		playon=1;				//开始标志位
		TR0=1;					//开启计时
		
		if((minit+second)==0)
		{
			sec24=24;
			minit=min;			
			second=sec;
		}
	}
	else
	{
		playon=0;				//开始标志位清零,表示暂停
		TR0=0;					//暂时计时
	}	
	EX0=1;						//开中断	
}

源码

报告:

报告

器件清单:

器件清单

资料清单:

资料下载地址

在这里插入图片描述