基于51单片机的智能垃圾桶

一、项目功能

通过51单片机控制垃圾桶,实现三种不同的开盖方式

1、通过超声波检测距离,当人体靠近垃圾桶时自动开盖,并且随着开盖声音和开盖指示灯亮起,远离自动关盖,关盖指示灯亮起。

2、用震动传感器检测垃圾桶附近是否发生震动,发生震动时自动开盖

3、通过单片机上按键对垃圾桶进行控制,当按键被按下实现开盖

二、主要模块组成

1.超声波模块:通过用51单片机的定时器1进行处理。

2.舵机模块:通过用51单片机的定时器0中断进行处理。

3.震动模块:通过用51单片机的外部中断0低电平触发控制。

二、代码实现

1.超声波部分代码

double get_distance()
{
	double time;
  TH1 = 0;  //重新给初值,方便下次超声波测距
  TL1 = 0;
	//1.给Trig引脚至少10us的高电平
	startHC();
	//2.当接受到高电平的那一下 开始计时
	while(Echo == 0);
        TR1= 1;
	//3.当高电平转低电平那一刻 结束计时
        while(Echo == 1);
        TR1= 0;
	//4.计算时间
        time = (TH1 * 256 + TL1)*1.085;//把定时器高低八位整合在一起计算时间
	return (time * 0.017);            //5.函数返回距离
}

2.舵机部分代码

void initSg90_0() //舵机初始位置函数
{
	jd=4;
	cnt=0;
	sg90_con=1;
}
void openDusbin() //开盖函数
{
	char n;
	//舵机开盖
   jd=2;
   cnt=0;
	jd_bak=jd;
	 BEEP=0;
	 for(n=0;n<2;n++)
	 Delay150ms();
	 BEEP=1;
	 Delay2000ms();
}

void closeDusbin() //关盖函数
{
	//舵机关盖
	jd=4;
	if(jd_bak !=jd){   //消除垃圾桶一直抖动bug
	cnt=0;//角度变了cnt重新开始算
	Delay150ms();
	}
	jd_bak=jd;
}
void Time0Handler() interrupt 1
{
  cnt++;
	TL0=0x33;
    TH0=0xFE;//重新赋初值
	if(cnt

3.主函数代码

void main()
{
    double dis;
    Time1Init();//定时器1初始化
	Time0_init();//定时器0初始化
	EX0_init();//外部中断0初始化
	initSg90_0();//舵机的初始位置,关盖状态
    while(1){   
			//超声波测距
        dis=get_distance();
        if(dis < 10||SW1==0||mark_vibrate==1){
					//D5亮
          openStatusLight();//开盖指示灯
      //舵机关盖	
          openDusbin();//舵机开盖
          mark_vibrate=0;//震动传感器标志位					
        }else{
					//D6亮
          closeStatusLight(); //关盖指示灯
      //舵机开盖
         	closeDusbin();//舵机开盖		
        }
				Delay150ms();
    }
}

四、项目展示

基于51单片机的智能垃圾桶_第1张图片

 

详细项目视频

见主页 基于51单片机的智能垃圾桶视频!!!!!!

你可能感兴趣的:(51单片机,嵌入式硬件)