⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 标准 八路.c

📁 亲测:基于51单片机的八路抢答器
💻 C
字号:
#include	<reg52.h>
#include	<intrins.h>
code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
						0xf8,0x80,0x90};
uchar i;
uchar	flag1,flag2,flag3,flag3_1,flag6,flag6_1,flag4,flag7,flag8,flag9; //flag1为抢答标志
								//flag2为显示标志
								//flag3为中断次数标志
								//flag4为键值标志
								//flag5为答题标志
								//flag6为中断1次数标志
uchar	miao,fen,key,key2;
uchar	fenzhi=1;
uchar	dashi=1;
uchar	qiangshi=0;
uchar	fen1,fen2,fen3,fen4,fen5,fen6,fen7,fen8;
sbit haoce=P2^7;
sbit jishice=P2^4;
sbit fenshi=P2^6;
sbit fenge=P2^5;
sbit beep=P3^6;
uchar	keyscan();
uchar	nokeyscan();
void	display(uchar);
uchar	start();
void	init0();
void	init1();
void	disshi(uchar);
void	disfen(uchar);
void	discha(uchar);
void	fenshu();
uchar	jifen();
void	chaxun();
void	disset(uchar,uchar,uchar);
void	set();
void	qiangda();
void main()
{
	while(1)
	{	
		chaxun();
		set();
		qiangda();
	}
}
void	init0()
{
 	TMOD=0X01;
 	TH0=(65536-45872)/256;//T0初值,50ms中断一次
 	TL0=(65536-45872)%256;
 	EA=1;
 	ET0=1;
	TR0=1;
}
void	init1()
{
	TMOD=0X10;
	TH1=(65536-45872)/256;//T1初值,50ms中断一次
 	TL1=(65536-45872)%256;
	EA=1;
	ET1=1;
	TR1=1;
}
void time0() interrupt 1 
{
	TR1=0;
	flag3++;
	TH0=(65536-45872)/256;//T0初值,50ms中断一次
 	TL0=(65536-45872)%256;
	if(flag3==201)		  //10秒开始倒计时
	{
		flag3_1++;
		flag3=0;
	}
	if(flag3_1==qiangshi)//qiangshi为1时是10s;
	{

		switch(flag3)	//10秒抢答时间
		{
			case	0x14:miao=9;disshi(miao);break;
			case	0x28:miao=8;disshi(miao);break;
			case	0x3c:miao=7;disshi(miao);break;
			case	0x50:miao=6;disshi(miao);break;
			case	0x64:miao=5;disshi(miao);break;
			case	0x78:miao=4;disshi(miao);break;
			case	0x8c:miao=3;disshi(miao);break;
	    	case	0xa0:miao=2;disshi(miao);break;
			case	0xb4:miao=1;disshi(miao);break;
			case	0xc8:miao=0;disshi(miao);
					for(i=20;i>0;i--)
					{
						beep=~beep;
						delay(50);
					}
					beep=1;
					flag2=1;
					TR0=0;
					jishice=1;
					break;
	}
	}	
}
void time1() interrupt 3 
{
	flag6++;
	TR0=0;
	TH1=(65536-45872)/256;//T0初值,50ms中断一次
 	TL1=(65536-45872)%256;
	if(flag6==201)		  //20秒答题时间,10秒开始倒计时
	{
		flag6_1++;
		flag6=0;
	}
	if(flag6_1==dashi)//dashi为1时是10s;
	{ 
		switch(flag6)
		{
		case	0x14:miao=9;disshi(miao);break;
		case	0x28:miao=8;disshi(miao);break;
		case	0x3c:miao=7;disshi(miao);break;
		case	0x50:miao=6;disshi(miao);break;
		case	0x64:miao=5;disshi(miao);break;
		case	0x78:miao=4;disshi(miao);break;
		case	0x8c:miao=3;disshi(miao);break;
	    case	0xa0:miao=2;disshi(miao);break;
		case	0xb4:miao=1;disshi(miao);break;
		case	0xc8:miao=0;disshi(miao);
					for(i=20;i>0;i--)
					{
						beep=~beep;
						delay(50);
					}
					beep=1;
					flag1=0;
					TR1=0;
					fenshu();
					break;
		}
	}	
}
void	qiangda()
{
  	if(start()==1)//等待抢答开始键按下
		{
			flag3=0;
			flag3_1=0;
			flag6=0;
			flag6_1=0;
			init0();
			if(flag8==1)
			{
				flag8=0;
				flag2=0;	
			}
			while(!flag2)//判断是否已有人抢答
			{
				flag4=keyscan();
				if(flag4!=0)   //有人按下才显示
				{
					display(flag4);//显示
				}
			}
		}
}
uchar	keyscan()//带消抖的键盘扫描
{
	uchar	temp;
	P1=0xfe;
	temp=P1;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
		delay(10);
		temp=P1;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
			temp=P1;
			switch(temp)
			{
				case	0xee:key=1;break;
				case	0xde:key=2;break;
				case	0xbe:key=3;break;
				case	0x7e:key=4;break;
				default:	key=0;
			}
			while(temp!=0xf0)  //等待释放
			{
				temp=P1;
				temp=temp&0xf0;		
			}
		}
	}
	P1=0xfd;
	temp=P1;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
		delay(10);
		temp=P1;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
			temp=P1;
			switch(temp)
			{
				case	0xed:key=5;break;
				case	0xdd:key=6;break;
				case	0xbd:key=7;break;
				case	0x7d:key=8;break;
				default:	key=0;
			}
			while(temp!=0xf0)  //等待释放
			{
				temp=P1;
				temp=temp&0xf0;		
			}
		}
	}
	return key;
}
uchar	nokeyscan()//无消抖的键盘扫描
{
	uchar	temp;
	P1=0xfe;
	temp=P1;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
			temp=P1;
			switch(temp)
			{
				case	0xee:key2=1;break;
				case	0xde:key2=2;break;
				case	0xbe:key2=3;break;
				case	0x7e:key2=4;break;
				default:	key2=0;
			}
		
	}
	P1=0xfd;
	temp=P1;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
			temp=P1;
			switch(temp)
			{
				case	0xed:key2=5;break;
				case	0xdd:key2=6;break;
				case	0xbd:key2=7;break;
				case	0x7d:key2=8;break;
				default:	key2=0;
			}
	}
	return key2;
}
void	display(uchar num)//显示函数
{
	TR0=0;
	flag2=1;
	while(start()!=2)//等待答题开始键按下
	{
		haoce=0;
		jishice=1;
		P0=table[num];
		delay(10);
		haoce=1;
		jishice=0;
		P0=table[10-miao];
		delay(10);
	}
	jishice=1;
	haoce=1;
	init1();
	while(start()!=3);
	TR1=0;
	fenshu();
}
void	disshi(uchar	num1)//显示倒计时
{
	jishice=0;
	P0=table[num1];
	delay(10);
}
void	disfen(uchar	num2)//显示分数
{
	while(start()!=4)
	{
		uchar	shi,ge;
		jishice=1;
		fenshi=0;
		fenge=1;
		haoce=1;
		shi=num2/10;
		ge=num2%10;
		P0=table[shi];
		delay(10);
		fenshi=1;
		fenge=0;
		haoce=1;
		P0=table[ge];
		delay(10);
		fenshi=1;
		fenge=1;
		haoce=0;
		P0=table[flag4];
		delay(10);
		if(jifen()==1)
		{
			flag7=0;
			num2=num2+fenzhi;
		}
		if(jifen()==2)
		{
			flag7=0;
			num2=num2-fenzhi;
		}
		switch(flag4)
			{
				case	1:fen1=num2;break;
				case	2:fen2=num2;break;
				case	3:fen3=num2;break;
				case	4:fen4=num2;break;
				case	5:fen5=num2;break;
				case	6:fen6=num2;break;
				case	7:fen7=num2;break;
				case	8:fen8=num2;break;
			}
	}
	haoce=1;
	jishice=1;
	fenshi=1;
	fenge=1;
	flag8=1;
	//EA=0;
	key=0;
}
void	discha(uchar	num3)//显示查询结果
{
	uchar	shi2,ge2;
	while(start()!=4)
	{
	jishice=1;
	fenshi=0;
	fenge=1;
	haoce=1;
	shi2=num3/10;
	ge2=num3%10;
	P0=table[shi2];
	delay(10);
	fenshi=1;
	fenge=0;
	haoce=1;
	P0=table[ge2];
	delay(10);
	fenshi=1;
	fenge=1;
	haoce=0;
	P0=table[key2];
	delay(10);	
	}
	haoce=1;
	fenshi=1;
	fenge=1;
	key2=0;
	flag1=0;
} 
void	fenshu()//显示每台分数
{
	switch(key)
	{
		case	1:disfen(fen1);break;
		case	2:disfen(fen2);break;
		case	3:disfen(fen3);break;
		case	4:disfen(fen4);break;
		case	5:disfen(fen5);break;	
		case	6:disfen(fen6);break;
		case	7:disfen(fen7);break;
		case	8:disfen(fen8);break;
	}
}
uchar	start()	//抢答计时键,答题计时键,记分键,重来键
{
	uchar	temp;
	P1=0xf7;
	temp=P1;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
		delay(10);
		temp=P1;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
			temp=P1;
			switch(temp)
			{
				case	0xe7:flag1=1;break;
				case	0xd7:flag1=2;break;
				case	0xb7:flag1=3;break;
				case	0x77:flag1=4;break;
				default:flag1=0;break;	
			}
		}
	}
	return(flag1);
}
uchar	jifen()
{
	uchar	temp;
	P1=0xfb;
	temp=P1;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
		delay(10);
		temp=P1;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
			temp=P1;
			switch(temp)
			{
				case	0xeb:flag7=1;break;
				case	0xdb:flag7=2;break;
				case	0xbb:flag7=3;break;
				case	0x7b:flag7=4;break;
				default:flag1=0;break;	
			}
			while(temp!=0xf0)  //等待释放
			{
				temp=P1;
				temp=temp&0xf0;		
			}
		}
	}
	return(flag7);
}
void	chaxun()
{
	switch(nokeyscan())
	{
		case	1:discha(fen1);break;
		case	2:discha(fen2);break;
		case	3:discha(fen3);break;
		case	4:discha(fen4);break;
		case	5:discha(fen5);break;
		case	6:discha(fen6);break;
		case	7:discha(fen7);break;
		case	8:discha(fen8);break;
	}
}
void	set()
{
	if(jifen()==4)
	{
		flag9++;
		flag7=0;
		switch(flag9)
		{
			case 1:disset(fenzhi,dashi,qiangshi);
				   while(jifen()!=4)
				   {
				 		if(flag7==1)
				  		{
				   			flag7=0;
				   			fenzhi++;
				  		}
				  		if(flag7==2)
				  		{
				   			flag7=0;
							fenzhi--;
				  		}
					}
					flag7=0;
				  disset(fenzhi,dashi,qiangshi);break;
			case 2:disset(fenzhi,dashi,qiangshi);
					while(jifen()!=4)
					{
						if(flag7==1)
				 		{
				   			flag7=0;
				   			dashi++;
				  		}
				  		if(flag7==2)
				  		{
				   			flag7=0;
							dashi--;
				  		}
				  	}
				  disset(fenzhi,dashi,qiangshi);break;	
			case 3:disset(fenzhi,dashi,qiangshi);
					while(jifen()!=4)
					{
						if(flag7==1)
				  		{
				   			flag7=0;
				   			qiangshi++;
				  		}
				  		if(flag7==2)
				  		{
				   			flag7=0;
							qiangshi--;
				  		}
				  	}
				  disset(fenzhi,dashi,qiangshi);break;
			case 4:disset(fenzhi,dashi,qiangshi);
					while(jifen()!=4)
					{
						if(flag7==1)
				  		{
				   			flag7=0;
				   			qiangshi++;
				  		}
				  		if(flag7==2)
				  		{
				   			flag7=0;
							qiangshi--;
				  		}
				  	}
				  disset(fenzhi,dashi,qiangshi);break;
				  flag7=0;
			case 5:flag9=0;break;
		}
	}
	haoce=1;
	fenge=1;
	fenshi=1;
}
void	disset(uchar	num4,uchar	num5,uchar	num6)
{
	while(!jifen())
	{
		haoce=0;
		fenshi=1;
		fenge=1;
		P0=table[num4];
		delay(10);
		haoce=1;
		fenge=0;
		fenshi=1;
		P0=table[num5];
		delay(10);
		haoce=1;
		fenge=1;
		fenshi=0;
		P0=table[num6];
		delay(10);	
	 }
	 haoce=1;
	 fenge=1;
	 fenshi=1;
	 P0=0xff;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -