51单片机篮球计分器


前言

随手写的一个小程序,经过了验证,主要实现功能就是通过按键控制AB两队的分数,适合初学者进行学习。


一、软件设计思路

首先明确设计需求。篮球计分器需要在计分板上显示AB两队的分数,博主是在普中科技的51单片机开发板上进行设计的,用到的资源有四个独立按键,分别控制A队分数加减和B队分数加减。还需用到数码管的资源进行显示。通过对数码管片选信号的选取,使得A队的分数显示在左边四位数码管上,B队的分数显示在右边四位数码管上。固定的A字符和B字符通过特定键值赋值。

二、代码

明确了设计思路以后,接下来直接上代码

开头定义了几个按键对应的变量,另外还有数码管的三个片选信号。定义了两个u8变量data1和data2,分别代表A队和B队的分数(相信很难有篮球能打到255分以上的)。smgduan函数里面分别代表显示0-F的字符所对应的数码管信号,此处要对照自己的数码管型号进行判断,共阴和共阳为不同的显示方式。

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义u16
typedef unsigned char u8;   //对数据类型进行声明定义u8

sbit LSA=P2^2;              //控制数码管片选的LSA
sbit LSB=P2^3;              //控制数码管片选的LSB
sbit LSC=P2^4;              //控制数码管片选的LSB
sbit k1=P3^0;	              //定义P30口是k1
sbit k2=P3^1;               //定义P31口是k2
sbit k3=P3^2;               //定义P32口是k3
sbit k4=P3^3;               //定义P33口是k4
u8 data1=0;                 //定义B口的计数值
u8 data2=0;                 //定义B口的计数值
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

延时函数和按键处理的函数也很简单,都是在例程的基础上修改的来。在按键处理的例程之中,通过判断按键对应的电平为高电平或者低电平,从而对A和B显示的分数进行加或者减的操作。delay(1000)此处是为了消抖,因为机械按键都会存在着一瞬间的抖动才能够稳定下来状态。

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}
/*******************************************************************************
* 函 数 名         : keypros
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void keypros()
{
	if(k1==0)		  //检测按键K1是否按下
	{	
		delay(1000);   //消除抖动 一般大约10ms
		if(k1==0)	 //再次判断按键是否按下
		{
			data1+=1;//B的计数值加1
		}
		while(!k1);	 //检测按键是否松开
	}	
	else if(k2==0)		  //检测按键K2是否按下
	{	
		delay(1000);   //消除抖动 一般大约10ms
		if(k2==0)	 //再次判断按键是否按下
		{
			data1-=1;//B的计数值减1
		}
		while(!k2);	 //检测按键是否松开
	}
	else if(k3==0)		  //检测按键K3是否按下
	{	
		delay(1000);   //消除抖动 一般大约10ms
		if(k3==0)	 //再次判断按键是否按下
		{
			data2+=1;//A的计数值加1
		}
		while(!k3);	 //检测按键是否松开
	}
	else if(k4==0)		  //检测按键K4是否按下
	{	
		delay(1000);   //消除抖动 一般大约10ms
		if(k4==0)	 //再次判断按键是否按下
		{
			data2-=1;//A的计数值减1
		}
		while(!k4);	 //检测按键是否松开
	}			
}

数码管扫描这一块儿需要学会其中的含义,那么你就能自由的去设置其显示的内容。因为数码管会存在着显影的效果,就是哪怕其灯光熄灭,在人的眼睛里面都会短暂的出现视觉残留的效果。所以通过在短时间之内进行快速的切换,在人的眼睛之中就会存在同时发光的现象。switch语句的判断条件i是通过for循环感觉数值的,从0-7分别对应不同的数码管显示单元,LSA,LSB,LSC其实就是其通道的显示口,这已经由数码管内部的芯片设计好了,只需要选择不同的接口,就能够得到不同数码管的显示。由于数码管的显示输入单元对应的是单片机上的P0口,因此通过对P0上的IO口进行不同的赋值,即可得到不同的显示情况。那么在之前的smgduan的数组内,已经设定好对应的码值,直接调用即可。比如smgduan[0]对应的就是显示0,依次类推。

/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能		   : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0;P0=smgduan[data1%100%10];break;//发送段码,第一个数码管显示B口的计数个位值
			case(1):
				LSA=1;LSB=0;LSC=0;P0=smgduan[data1/10%10];break;//发送段码,第二个数码管显示B口的计数十位值
			case(2):
				LSA=0;LSB=1;LSC=0;P0=smgduan[data1/100];break;//发送段码,第三个数码管显示B口的计数个位值
			case(3):
				LSA=1;LSB=1;LSC=0;P0=smgduan[11];break;//发送段码,显示B字母
			case(4):
				LSA=0;LSB=0;LSC=1;P0=smgduan[data2%100%10];break;//发送段码,第五个数码管显示A口的计数个位值
			case(5):            
				LSA=1;LSB=0;LSC=1;P0=smgduan[data2/10%10];break;//发送段码,第六个数码管显示A口的计数十位值
			case(6):            
				LSA=0;LSB=1;LSC=1;P0=smgduan[data2/100];break;//发送段码,第七个数码管显示A口的计数百位值
			case(7):            
				LSA=1;LSB=1;LSC=1;P0=smgduan[10];break;//发送段码,显示A字母
		}		
		delay(100); //间隔一段时间扫描	
		P0=0x00;//消隐
	}
}

最终在main函数内调用即可

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	while(1)
	{	
		DigDisplay();  //数码管显示函数
    keypros();	   //按键数码显示函数	
	}		
}

总结

千里之行,始于足下,多动手写代码是提升自己实力最踏实的方式,要明白自己在做什么,需要怎么样解决这个问题,以足够的专注力着眼于项目本身。加油,也是对我自己的鞭策。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c51单片机篮球计分是一种使用C51单片机来设计和实现的篮球比赛计分设备。它主要由显示计分按钮、计分芯片等组成。 首先,显示计分最重要的部件之一,它可以用来显示比赛双方的得分。通过连接到C51单片机上的显示控制芯片,我们可以将计分设计得更加灵活和智能化。比如,显示可以显示比赛进行的时间、得分统计等信息,方便裁判和观众随时了解比赛的进展。 其次,计分按钮是用来记录比赛双方得分的关键部件。它们分别安装在比赛场地两端,由双方球队在进球时使用。按下按钮后,它会发送信号给C51单片机,然后单片机会根据信号来计算每个球队的得分,并实时更新到显示上。 最后,计分芯片是C51单片机内部的一个重要组件,它负责接收和处理计分按钮发送的信号,并将得分信息传输给单片机进行计算。计分芯片是实现计分功能的核心部件之一,它可以帮助单片机实时地获取比赛双方得分信息,并将其更新到显示上。 总之,c51单片机篮球计分是一种方便、灵活、智能化的比赛计分设备。它通过使用C51单片机以及相关的显示计分按钮和计分芯片等部件,能够实时地记录比赛双方的得分,并将其显示在屏幕上。这种计分的使用可以提高篮球比赛的公正性和效率,方便裁判和观众了解比赛进展,是一种非常实用的设备。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值