课程设计题八:篮球比赛计分器

要求:

1、两队各三位显示,共计六位数码显示;

2、设A、B队加、减分按键,复位键;

3、加减分实现1分、2分、3分加减。

升级:

1、两队各三位显示,共计六位数码显示;

2、设A、B队加、减分按键、复位按键;

3、计时开始/暂停按键、归零按键、归12按键;

4、分钟加1按键、交换场地按键;

获取该 程序+protues 的方式:

1、CSDN下载:

https://download.csdn.net/download/qq_38351824/11338585

2、关注微信公众号下载:

     ① 关注微信公众号:Tech云  

     ②

3、可以关注点赞并在下方评论,我给你邮箱发过去。

一、Protues仿真图:

二、程序源码:

因为注释非常的全,这里就不再进行讲解了。

----------------------控制分数部分-------------------------

/*******************************************************************************
================================================================================
【平    台】STC89C51_sumjess平台
【编    写】sumjess
【E-mail  】1371129880@qq.com
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网    站】
           https://blog.csdn.net/qq_38351824
           http://www.51hei.com/bbs/mcu-2-1.html
---------------------------------------------------------------------------------
【dev.env.】MDK4.02及以上版本
【Target  】STC89C51
第一次修订:2019/05/09
第二次修订:2019/05/21
第三次修订:2019/06/10
【problem 】
    (1)库内补充的不全面;
    (2)库内解释部分不全面;
    (3)库内还存在一定的bug;
【direction】
      下一步的目标就是把库继续集成!
【explain 】
      为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!
【warning】
      目前程序中暂无错误 !   
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/	

/控制分数单片机/
#include <reg51.h>

#define LDUAN  P0		 //段选
#define LWEI   P2		 //位选
#define RDUAN  P1		 //段选
#define RWEI   P2		 //位选

#define uchar unsigned char
#define uint  unsigned int
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
						  //  0    1    2    3    4    5    6    7    8    9    a    b    c    d    e   f
sbit key1=P3^0;   //左边加分
sbit key2=P3^1;	  //左边减分
sbit key3=P3^2;	  //右边加分
sbit key4=P3^3;	  //右边减分
sbit key5=P3^6;	  //交换场地
sbit led1=P3^4;	  //左边 LED
sbit led2=P3^5;	  //右边 LED

uchar lnum,rnum,a;//左方分数计数、右方分数计数、中间变量

void delay(unsigned int num)     //延时函数
{
	unsigned i,j;
	for(i=num;i>0;i--)
	for(j=120;j>0;j--);
}



void main()
{
	led1=0;	   //关闭LED
	led2=0;	   //关闭LED
 while(1)
 {
/数码管显示/
	P2=0xff;		      
	LWEI=0xfb;
	LDUAN=table[lnum%100/10];
	delay(5);
	P2=0xff;
	LWEI=0xf7;
	LDUAN=table[lnum%100%10];
	delay(5);
	LWEI=0xfd;
	LDUAN=table[lnum/100];
	delay(5);

	P2=0xff;		      
	RWEI=0xbf;
	RDUAN=table[rnum%100/10];
	delay(5);
	P2=0xff;
	RWEI=0x7f;
	RDUAN=table[rnum%10];
	delay(5);
	RWEI=0xdf;
	RDUAN=table[rnum/100];
	delay(5);

/左边加分/
if(!key1)	   
{
 delay(10);		  //延时消抖
 if(!key1)
 {
	lnum++;		  //分数加1
	led1=1;		  //LED亮
	delay(500);	  //延时
	led1=0;		  //LED灭
	while(!key1); //等待按键释放
  }
}
/左边减分/
if(!key2)	   
{
 delay(10);		  //延时消抖
 if(!key2)
 {
	lnum--;		  //分数减1
	led1=1;		  //LED亮
	delay(500);	  //延时
	led1=0;		  //LED灭
	while(!key2); //等待按键释放
  }
}
/右边加分/
if(!key3)	   
{
 delay(10);		  //延时消抖
 if(!key3)
 {
	rnum++;		  //分数加1
	led2=1;		  //LED亮
	delay(500);	  //延时
	led2=0;		  //LED灭
	while(!key3); //等待按键释放
  }
}
/右边减分/
if(!key4)	   
{
 delay(10);		   //延时消抖
 if(!key4)
 {
	rnum--;			   //分数减1
	led2=1;			   //LED亮
	delay(500);		   //延时
	led2=0;			   //LED灭
	while(!key4);	   //等待按键释放
  }
}
/左右分数交换/

if(!key5)	   
{
 delay(10);		   //延时消抖
 if(!key5)
 {
	a=rnum;			   //右边分数赋值给中间变量
	rnum=lnum;		   //左右分数交换
	lnum=a;			   //左右分数交换
	while(!key5);	   //等待按键释放
  }
}
//
  }
}

----------------------------------控制时间部分-------------------------------

/*******************************************************************************
================================================================================
【平    台】STC89C51_sumjess平台
【编    写】sumjess
【E-mail  】1371129880@qq.com
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网    站】
           https://blog.csdn.net/qq_38351824
           http://www.51hei.com/bbs/mcu-2-1.html
---------------------------------------------------------------------------------
【dev.env.】MDK4.02及以上版本
【Target  】STC89C51
第一次修订:2019/05/09
第二次修订:2019/05/21
第三次修订:2019/06/10
【problem 】
    (1)库内补充的不全面;
    (2)库内解释部分不全面;
    (3)库内还存在一定的bug;
【direction】
      下一步的目标就是把库继续集成!
【explain 】
      为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!
【warning】
      目前程序中暂无错误 !   
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/	

/控制时间单片机/
#include <reg51.h>
#define DUAN P0		 //段选
#define WEI  P2		 //位选

#define uchar unsigned char
#define uint  unsigned int

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
						   //  0   1   2     3    4    5    6    7    8    9	a    b	  c	   d	e	 f
sbit key0=P3^0; //归零
sbit key1=P3^1;	//归12
sbit key2=P3^2;	//分钟加一
sbit key3=P3^3;	//暂停/开始
sbit beep=P3^7;	//蜂鸣器

uint addnum;			//加一分钟
uchar miaonum,fennum;	//秒数,分数	 			
uchar b;

void delay(unsigned int num)     //延时函数
{
	unsigned i,j;
	for(i=num;i>0;i--)
	for(j=120;j>0;j--);
}

/*
  当用定时器的方式2时,设机器周期为Tcy,定时器产生一次中断的时间为t,
  那么需要计数的个数N=t/Tcy,
  装入THX和TLX中的数分别为THX=256-N,TLX=256-N
  256 ---因为计数器是8位,所以最大装载值256 = 2^8						   
*/
void Init_TIMER0_2(void)        //使用定时器0  ---  11.0592M晶振  1次中断为271.275μs,3686次为1s
{
  	TMOD=0x02;					//设置定时器0为工作方式2(M1M0为10)
	TH0=256-250;		     	//装初值11.0592M晶振定时271.275μs数为250
	TL0=256-250;
	EA=1;						//开总中断
	ET0=1;						//开定时器0中断
	TR0=1;						//启动定时器0
 }


void main()
{
	Init_TIMER0_2();//定时器初始化	
	beep=0;			//关闭蜂鸣器
	b=10;			//延时---蜂鸣器使用	
	fennum=12;		//分钟初始化
	miaonum=0;		//秒钟初始化

  while(1)
  {
/数码管显示/
	P2=0xff;		      
	WEI=0xef;
	DUAN=table[miaonum/10];
	delay(5);
	P2=0xff;
	WEI=0xdf;
	DUAN=table[miaonum%10];
	delay(5);
		
	P2=0xff;
	WEI=0Xf7;
	DUAN=0X40;
	delay(5);
		
	P2=0xff;
	WEI=0xfd;
	DUAN=table[fennum/10];
	delay(5);
	P2=0xff;
	WEI=0xfb;
	DUAN=table[fennum%10];
	delay(5);
/按键---清零/
	if(!key0)		 //清零
	{
	 delay(10);		 //延时消抖
	 if(!key0)
	 {
		fennum=0;	 //分钟赋值为0
		miaonum=0;	 //秒钟赋值为0
	  }
	 while(!key0);	 //等待按键释放
	  }
/按键---分钟归12/		
	if(!key1)		 //分钟归12
	{
	 delay(10);		 //延时消抖
	 if(!key1) 
	 {
	  fennum=12;     //分钟赋值为12
	  miaonum=0;     //秒钟赋值为0
	  }
	 while(!key1);	 //等待按键释放
	}
/按键---分钟加1/		
	if(!key2)		 //分钟加1
	{
	 delay(10);		 //延时消抖
	 if(!key2) fennum++; //分钟加1
	 while(!key2);	 //等待按键释放
	 }
/按键---暂停/开始/		
	if(!key3)	   //暂停/开始
	{
	 delay(10);	   //延时消抖
	 if(!key3)
	 {
	  TR0=~TR0;	   //定时器开关
	  while(!key3);//等待按键释放
	  }
	 }

   }
 }
	
	





void timer0() interrupt 1
{

addnum++;
if(addnum==400)
{
if(fennum!=0)
{
if(miaonum==0)

miaonum=59,fennum--,addnum=0;
else
miaonum--;
addnum=0;
}

if(fennum==0)
{
if(miaonum==0)

miaonum=0;

else
miaonum--;
addnum=0;
}

if(fennum==0)
{
if(miaonum==0)
{

if(b==0)

beep=0;
else
	beep=1,b--;

}
}

}
}

 

  • 74
    点赞
  • 238
    收藏
    觉得还不错? 一键收藏
  • 73
    评论
评论 73
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值