篮球计分器

用一个四位数码管显示两队分数(最高分为99),再用一个四位数码管时间,分钟和秒钟各占两位;
可进行按键进行计分,加1、加2和加3等,两个都可以进行加分。8个独立按键。等比赛结束后有蜂鸣器提醒。
原理图设计
仿真
对应的代码

#include<reg51.h>
#include<intrins.h>
#define uchar      unsigned char
#define duan_pin   P1
#define wei_pin    P2
#define key_pin    P0
sbit BZ=P3^7;    //蜂鸣器
long t=0,jia=0,yi=0;   //所需的变量
uchar code DATA[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //CC段码
uchar  TABLE[]={5,9,5,9,0,1,0,2};   //定义数组,以对应各个数码管
void DelayMs(int x){  //自定义延时函数
	int i;
	while(x--)	for(i=0;i<120;i++);
}
void BUZZ()    //蜂鸣器响相关操作
{
	int i;
	if(t==3600-1)
	{
		TR0=0,duan_pin=0X00,t=0;   //关掉显示
		for(i=0;i<120;i++)	BZ=!BZ,DelayMs(25);  //无源蜂鸣器
		TR0=1;    //开启显示
	}
}	
void Keyscan()   {  //按键检测的相关操作及分数的控制
	static char key_up=1;   //防止连按的变量
	uchar key_value=0; 
	if(key_up&&key_pin!=0xff)   //按键状态发生改变
	{
		_nop_(),_nop_(),_nop_(),_nop_();   //消抖
		key_value=P0;   //保存按键的状态
		key_up=0;     //清除防止连按发生
		if(key_pin!=0xff)
		{
			switch(key_value)
			{
				case 0xfe:jia=0;break;
				case 0xfd:jia+=1;break;
				case 0xfb:jia+=2;break;
				case 0xf7:jia+=3;break;
				case 0xef:yi=0;break;
				case 0xdf:yi+=1;break;
				case 0xbf:yi+=2;break;
				case 0x7f:yi+=3;break;
				default:break;
			}
			jia=jia>99?0:jia;   //变量控制
			yi= yi>99?0:yi;	
		}
	}else key_up=1;     //为了下一次可进入
}
void Dis()  {  //数码显示操作
		uchar i,a=0xfe;    //数码管显示所需要的变量
		//给要显示的数码管赋值
		TABLE[0]=t/60/10;    //时间的4个 
		TABLE[1]=t/60%10;  
		TABLE[2]=t%60/10;   
		TABLE[3]=t%60%10;   
		TABLE[4]=jia/10;    //分数的4个
		TABLE[5]=jia%10;
		TABLE[6]=yi/10;
		TABLE[7]=yi%10;	
		//消除阴影和显示
		for(i=0;i<8;i++)	duan_pin=0X00,wei_pin=_crol_(a,i),duan_pin=DATA[TABLE[i]],DelayMs(1);       
}
void main() {
	IE=0X82;  //开定时器中断
	TR0=1;  //开启定时器
	while(1)
	{
		BUZZ();    //报警操作
		Keyscan();   //按键检测
	}
}
void Time0() interrupt 1   {  //定时器0的函数相关操作
	static int tm=0;
	Dis();   //数码显示
	if(++tm%100==0) tm=0,t++;
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐