锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

基于51的简易感应开关垃圾桶

时间:2022-08-17 16:30:02 442感应开关传感器感应开关11ea开关传感器

  •   超声波的Echa接口P10,Trig口接P11.舵机信号线接入P12 
  •   接入振动传感器P蜂鸣器的接入P14。 
  •   按下按钮或检测振动,或超声波测量距离小于5cm是的,舵机旋转180度,2度s然后恢复。此时蜂鸣器响2s。 
  •   使用舵机SG90.超声波模块使用HC-SR04.有源蜂鸣器采用低电平触发,振动传感器为SW-1801P 
#include  #include "intrins.h" sbit echa=P1^0; sbit trig=P1^1; sbit pwm=P1^2; sbit vibrate=P1^3; sbit been=P1^4; sbit keyOne=P2^1; int count_f=1; unsigned int time; unsigned int distance; int count_1; int SGTemp=0; /** *函数名称:Delay2000ms *函数功能:延迟2s,用于后续舵机和蜂鸣器2s的操作 *备 注: */ void Delay2000ms()  //@11.0592MHz { 
         unsigned char i, j, k;   _nop_();  i = 15;  j = 2;  k = 235;  do  { 
          do   { 
           while (--k);   } while (--j);  } while (--i); }  /** *函数名称:Delay10ms *函数功能:延迟10ms,用于按键抖动 *备 注: */ void Delay10ms()		//@11.0592MHz
{ 
       
	unsigned char i, j;

	i = 18;
	j = 235;
	do
	{ 
       
		while (--j);
	} while (--i);
}
/** *函数名称:Delay10us *函数功能:延时10us,用于后续的启动超声波模块 *备 注: */
void Delay10us()		//@11.0592MHz
{ 
       
	unsigned char i;

	i = 2;
	while (--i);
}
/** *函数名称:Timer0Init *函数功能:中断零的初始化,用于舵机 *备 注: */
void Timer0Init(void)		//500微秒@11.0592MHz
{ 
       
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x33;		//设置定时初始值
	TH0 = 0xFE;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
}
/** *函数名称:timer0Service *函数功能:中断0的服务函数,用于舵机的pwm的调整 *备 注: */
void timer0Service() interrupt 1
{ 
       
	TL0 = 0x33;		//设置定时初始值
	TH0 = 0xFE;		//设置定时初始值
	count_1++;
	if(count_1<=count_f)
	{ 
       
		pwm=1;
	}
	else
	{ 
       
		pwm=0;
	}
	if(count_1>40)
	{ 
       
		count_1=0;
	}
}
/** *函数名称:Timer1Init *函数功能:中断1的初始化 *备 注:选择16位,12T */
void Timer1Init(void)		//100微秒@11.0592MHz
{ 
       
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x10;
	TL1 = 0x00;		//设置定时初始值
	TH1 = 0x00;		//设置定时初始值
	TF1 = 0;		//清除TF1标志
	TR1 = 0;		//定时器1开始计时
	ET1=1;
	EA=1;
}
/** *函数名称:startHC *函数功能:启动超声波模块 *备 注: */
void startHC()
{ 
       
	trig=0;
	trig=1;
	Delay10us();
	trig=0;
}
/** *函数名称:getDistance *函数功能:通过超声波模块获得距离 *备 注: */
void getDistance()
{ 
       
	startHC();
	while(echa==0);
	TR1=1;
	while(echa==1);
	TR1=0;
	if(TF1==0)
	{ 
       
		time=TH1;
		time=(time<<8)|TL1;
		time=time*1.085;
		distance=time*0.0017;
	}
	else
	{ 
       
		TF1=0;
		distance=999;
	}
	TH1=TL1=0x00;
}
/** *函数名称:keyBoard *函数功能:按键模块,当检测到按键1按下时,触发一次舵机的旋转 *备 注: */
void keyBoard()
{ 
       
	if(keyOne==0)
	{ 
       
		Delay10ms();
		if(keyOne==0)
		{ 
       
			SGTemp=1;
		}
		while(!keyOne);
	}
}
/** *函数名称:distanceWork *函数功能:当距离小于5cm时,触发一次舵机的旋转 *备 注: */
void distanceWork()
{ 
       
	if(distance<=5)
	{ 
       
		SGTemp=1;
	}
}	
/** *函数名称:vibrateWork *函数功能:当检测到振动的时候,触发一次舵机的旋转 *备 注: */
void vibrateWork()
{ 
       
	if(vibrate==0)
	{ 
       
		SGTemp=1;
	}
}
/** *函数名称:steeringWork *函数功能:舵机旋转模块,当受到触发的时候,旋转180度,并且蜂鸣器打开,两秒后复位 *备 注: */
void steeringWork()
{ 
       
	if(SGTemp==1)
	{ 
       
		been=0;
		SGTemp=0;
		count_f=5;		
		Delay2000ms();
		been=1;
	}
	if(SGTemp==0)
	{ 
       
		count_f=1;
	}
}
/** *函数名称:main *函数功能:主函数 *备 注: */
void main()
{ 
       
	Timer1Init();
	Timer0Init();
	while(1)
	{ 
       
		keyBoard();
		getDistance();
		steeringWork();
		vibrateWork();
		distanceWork();
	}
}
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章