《单片机实践项目》之《电子DIY》之基于51单片机+震动开关的模拟地雷设计

程序:

//视频讲解:B站:搜索:“逗比小憨憨”
/**********************************************
*  名称:基于51单片机的模拟地雷设计
*  功能:
	1,使用震动开关进行相应的地雷触发
	2,当触发后,数码管进行60秒定时	(即,60秒排雷时间)
	3,当定时时间到后,地雷爆炸(即,蜂鸣器报警,LED闪烁)
	4,当在排雷期间,若再次触发震动开关则地雷直接爆炸
注意:
	踩到雷后,脚上发力前后两次不同并且受力差值(灵敏度)达到一定程度时则会触发地雷爆炸,震动开关可以通过点位器调节灵敏度

**************************************************/

#include

#define uchar unsigned char
#define uint unsigned  int

sbit dula=P2^6;
sbit wela=P2^7;
sbit fm=P2^3;
sbit ctr=P3^2;

uchar flag=0;
uchar j,k,c1,c0,m,n=255;
uchar pp;
int k1=0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(uint i)
{
  for(j=i;j>0;j--)
    for(k=118;k>0;k--);
}

void display(uchar a,uchar b)
{
   P0=table[a];
   dula=1;
   dula=0;
   
   P0=0xef;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[b];
   dula=1;
   dula=0;
   
   P0=0xdf;
   wela=1;
   wela=0;
   delay(5);
}

void main(void)
{
	int k=0;
	TMOD|=0x01;		 
	TR0=0;			 
	IT0=1;
	EX0=1;
	TH0=(65536-46080)/256;
	TL0=(65536-46080)%256;
	ET0=1;			 //开定时器0中断
	fm=1;
	P1=0XFF;
	EA=1;			 //开总中断
	while(1)
	{
		if(flag==1)
		{
			if(pp==20)
			{	
				pp=0;
				m++;
				if(m==60)
				{
					TR0=0;
					ET0=0;
					flag=0;
					m=0;	   //若到了60s,则归零
					for(k=0;k<20;k++)
					{
						P1=~P1;
						fm=!fm;
						delay(500);
					}
					fm=1;
				}
			}
			c0=m%10;		  //取出当前描述的个位与十位
			c1=m/10;
			display(c1,c0);	   //显示
		}
		else
			display(8,8);
	}
}


void int0(void) interrupt 0
{
	delay(10);
	if(ctr==0)
	{
		flag++;
		//while(ctr==0);
	}
	if(flag==1)
	{
		TR0=1;
		pp=0;
		m=0;
		fm=1;
		ET0=1;
		TH0=(65536-46080)/256;
		TL0=(65536-46080)%256;
	}
	else if(flag==2)
	{
		display(8,8);
		ET0=flag=0;
		TR0=0;
		fm=0;
		pp=0;
		m=0;
		for(k1=0;k1<20;k1++)
		{
			P1=~P1;
			delay(500);
		}
		TH0=(65536-46080)/256;
		TL0=(65536-46080)%256;		
	}
}

void time0(void) interrupt 1
{
	TH0=(65536-46080)/256;
	TL0=(65536-46080)%256;
	pp++;
}

你可能感兴趣的:(电子DIY)