51单片机 电子拔河游戏

在这里插入图片描述




#include <reg52.h>                              /* 包含单片机寄存器的头文件 */
#include <intrins.h>
#define uchar	unsigned char
#define uint	unsigned int
#define dula	P0                              /* 段选信号的锁存器控制 */



unsigned char code	table[]		= { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
					    0x07,	       0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e,0x79,0x71 };
unsigned char		BUFFER[4] = { 0, 0, 0,0 };


sbit	wei1	= P2 ^ 4;
sbit	wei2	= P2 ^ 5;
sbit	wei3	= P2 ^ 6;
sbit	wei4	= P2 ^ 7;


sbit	key_01	= P3 ^ 4;
sbit	key_02	= P3 ^ 5;
sbit	key_03	= P3 ^ 6;
sbit	key_04	= P3 ^ 7;


void delay( uint count )      /* delay */
{
	uint i;
	while ( count )
	{
		i = 200;
		while ( i > 0 )
			i--;
		count--;
	}
}



/*  ******************************************    */
/*  ********   定时器初始化函数	 用了定时器1 */
/*  ******************************************    */
void init_timer( void )
{
	TMOD	= 0x01;
	TH0	= (65536 - 4000) / 256;
	TL0	= (65536 - 4000) % 256;
	ET0	= 1;
	TR0	= 1;
	EA	= 1;
}


sbit	KEYHONG		= P3 ^ 2;       /* 红外传感器 */


sbit	BEEP		= P2 ^ 3; 

/*------------------------------------------------
 *                   主函数
 *  ------------------------------------------------*/
main()
{
	unsigned char	keyvalue	= 0;
	unsigned char key1_ifg=0,key2_ifg=0;
  unsigned char led_S=3;//使用7个灯 初始在3位置 可以拔河到0或者6的位置游戏结束
	

	while ( 1 )
	{
		/* 检测红外 */
		if ( KEYHONG == 1 )
		{
			delay( 10 );
			if ( KEYHONG == 1 )
			{
				break;
			}
		}
	}
	
	P1=~(0X01<<led_S);//小灯
	init_timer();
	
	

	while ( 1 )
	{
		//用户按键1
		//按下
		if ( key_01 == 0 )
		{
			key1_ifg=1;
		}
		//松开
		if((key1_ifg==1)&&( key_01 == 1 ))
		{
			key1_ifg=0;
			led_S--;
			P1=~(0X01<<led_S);//小灯

			
			//一局游戏结束
			if((led_S==0)||(led_S==6))
			{
				BUFFER[0]+=1;
				if(BUFFER[0]==3)
				{
					BEEP=0;
					delay(200);
					BEEP=1;
					delay(200);
					BEEP=0;
					delay(200);
					BEEP=1;
				}
				
				
				led_S=3;
				P1=~(0X01<<led_S);//小灯
			}
		}
		
		
		
		
		
		
		//用户按键2
		//按下
		if ( key_03 == 0 )
		{
			key2_ifg=1;
		}
		//松开
		if((key2_ifg==1)&&( key_03 == 1 ))
		{
			key2_ifg=0;
			led_S++;
			P1=~(0X01<<led_S);//小灯
			//一局游戏结束
			if((led_S==0)||(led_S==6))
			{
				BUFFER[3]+=1;
				
				if(BUFFER[3]==3)
				{
					BEEP=0;
					delay(200);
					BEEP=1;
					delay(200);
					BEEP=0;
					delay(200);
					BEEP=1;
				}
				
				
				led_S=3;
				P1=~(0X01<<led_S);//小灯
			}
			
			
		}
		
		
	

	



		delay( 1 );
	}
}


//数码管显示控制
char	jishua		= 0;
void T0_time()
interrupt 1
{
	TH0	= (65536 - 5000) / 256;
	TL0	= (65536 - 5000) % 256;
	jishua	= (jishua + 1) % 2;

	P0 = 0x00;
	if ( jishua == 0 )
	{
		wei1	= 1;    /* 显示分数 */
		wei2	= 0;
		wei3	= 0;
		wei4	= 0;
		P0	= table[BUFFER[0]];
	}else if ( jishua == 1 )
	{
		wei1	= 0;    /* 显示分数 */
		wei2	= 0;
		wei3	= 0;
		wei4	= 1;
		P0	= table[BUFFER[3]];
	}
	
}



猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/107367373
今日推荐