智能垃圾桶项目【课程设计】【全套开源】

这篇具有很好参考价值的文章主要介绍了智能垃圾桶项目【课程设计】【全套开源】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

手把手带做【智能垃圾桶项目】【全套开源】

1.项目介绍

1.1 功能描述

  • 当物体接近垃圾桶时,垃圾桶自动打开,并有" 嘀"的一声;当远离垃圾桶后,自动关闭;
  • 当按下按键时,垃圾桶也可以自动打开,并有" 嘀"的一声;
  • 当感受到震动时,也自动打开,(同上)
  • 垃圾桶开时,led1 灯开,led2 灯关;当垃圾桶关时,led1 灯关,led2 灯开

1.2 所需器件

  • SG90舵机,超声波模块HC-SR04,震动传感器,蜂鸣器

模块不熟悉没关系,下面的描述和代码都很详细;

2.元器件器件描述

2.1 STC89C51/52

为了快速做出项目,我们一边介绍项目所需元器件,一边写代码,原理类的东西带过一下。

首先,基本的led1、led2,key1。

#include<reg51.h>

sbit led1 = P3^7;  //固定的口  
sbit led2 = P3^6;  //固定的口
sbit key1 = P2^1;  //固定的口

这些口请参考你使用的单片机的原理图,不同单片机不一样

比如我使用的单片机

智能垃圾桶项目【课程设计】【全套开源】,课程设计,开源,mongodb,嵌入式硬件,51单片机

大家根据自己使用的单片机原理图接对应硬件的引脚。

  • 代码块
void led1_ON()  //led1亮,led2灭
{
    led1 = 1;
    led2 = 0;
}

void led2_ON()  //led2灭,led2亮
{
    led1 = 0;
    led2 = 1;
}

这两个点灯函数之后也会用到,用来做为开关垃圾桶的标志。

1.2 超声波测距模块

我使用的是HC-SR04
智能垃圾桶项目【课程设计】【全套开源】,课程设计,开源,mongodb,嵌入式硬件,51单片机

大家在某宝或者某夕夕上面买就ok了,几块钱。

  • 接线参考:

    • 四个引脚VCC接 5/3.3V,GND 接地。

    • Trig、Echo 两个引脚随便接没有被占用的引脚,我接的是 P1.5 和 P1.6;

      sbit Trig = P1^5; //发生超声波
      sbit Echo = P1^6; //接收超声波
      
  • 超声波测距原理

    超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离.

配置好引脚后,trig 和 echo 就可以在软件成面,就是通过代码的方式进行操作。

  • 怎么发送和接收超声波呢?

    • 1、发送波的条件:给trig一个至少10us的高电平,也就是 trig = 1的状态至少10us;
    • 2、已经发送波了的标志(也就是开始计时的标志):Echo信号,自动由低电平跳到高电平,表示开始发送波了;
    • 3、当波接触到物体,波会返回过来,当波返回过来被HC-SR01接收到后,Echo信号就会跳转到低电平,表示回来了;
    • 4、我们可以利用计数器,以及Echo的信号变化来计算距离;当发出波,Echo第一次变化,启动计数器;当接收到信号,Echo第二次变化,关闭计数器;从而得出来回所需时间。
    • 通过时间,音度340m/s,距离 = (速度*时间)/ 2;

大家看着看不懂也没关系,我们有代码

  • 模块代码介绍

先获取一下延时函数
智能垃圾桶项目【课程设计】【全套开源】,课程设计,开源,mongodb,嵌入式硬件,51单片机

打开STC-ISP,按照我的操作就ok了

不会用STC-ISP也没关系,直接复制代码一样得

void Delay10us()		//@11.0592MHz  //发射超声波最短时间
{
	unsigned char i;

	i = 2;
	while (--i);
}

下面是这个器件操作的大头:利用到了定时器/计数器1

定时器/计数器如果不太明白,大家可以参考我之前写的博客:

<定时器中断&外部中断 区别联系-CSDN博客>

  • 模块参考代码介绍
sbit Trig = P1^5; //发生超声波
sbit Echo = P1^6; //接收超声波

void Timer1Init()		// @11.0592MHz 
{
    
	TMOD &= 0x0F; //设置定时器模式  //选择定时器1
    TMOD |= 0x10; //与运算,可以参考我另一篇博客(下面会介绍),看不懂也没关系,直接C、V就好
	TL1 = 0x00;		//设置定时初始值
	TH1 = 0x00;		//设置定时初始值
    //不着急开始计数,寄存器的操作在后面 getDis( )函数
}

void startHC() //发射超声波
{
    Trig = 0; //Trig 硬件层面接好后,软件 sbit 了 一个引脚后,就可以直接赋值;
    Trig = 1;
    Delay10us();  //延时10us,//前面介绍过,直接copy
    Trig = 0;
}

float getDis()  //获得距离 //这里是难点,根据Echo信号的变化来获取距离
{
    float TIME;//时间
    TL1 = 0x00;		//设置定时初始值
    TH1 = 0x00;		//设置定时初始值
    startHC(); //准备启动
    while(Echo==0); //等待高电平,跳出循环
    TR1 = 1;
    while(Echo==1);//等待低电平,跳出循环
    TR1 = 0;
    TIME = (TH1 * 256 + TL1)* 1.085;  //us
    //340m/s == 340 00cm/1000ms == 34cm/ms == 0.034cm/us == 0.017cm/us
    //计数器的计数一次最大的时间是71ms,根据公式可以知道,一次计数,超声波最远可以传播12m
    return TIME * 0.017; //最大12m来回,器件HC-SR04说明书的测量距离是 2cm-4m;
}


超声波测距模块就这么一些,在后面我们会在垃圾桶上装一共这样的模块,来检查我们的的手离垃圾桶的距离,通过距离来控制下面我们要讲的舵机,通过舵机控制垃圾桶的开关。

2.3 舵机模块

我使用的是SG90
智能垃圾桶项目【课程设计】【全套开源】,课程设计,开源,mongodb,嵌入式硬件,51单片机

网上都可以买的到的

  • 参考接线

    • 三个引脚VCC接 5V,GND 接地。舵机需要的电压大一点;

    • PWM信号脚 随便接没有被占用的引脚,我接的是 P1.1;

      sbit sg90_con = P1^1; //舵机

  • 怎么控制舵机呢?

    通过PWM信号来控制

    • PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右

      0.5ms-------------0度; 2.5% 占空比

      1.0ms------------45度; 5.0% 占空比

      1.5ms------------90度; 7.5% 占空比

      2.0ms-----------135度; 10.0% 占空比

      2.5ms-----------180度; 12.5% 占空比

占空比:占空比指的是在一个周期中,高电平状态占整个周期的百分比。

给PWM信号引脚 不同频率的脉冲,便可以调控PWM的占空比;

我们设置20ms为一个周期,0.5ms 为最小单元,定义标识符int cnt来计数,没过0.5ms,计数加一 cnt++;这样一来,我们就可以通过标识符来方便的控制舵机旋转角度;

智能垃圾桶项目【课程设计】【全套开源】,课程设计,开源,mongodb,嵌入式硬件,51单片机

  • 模块参考代码介绍

    sbit sg90_con = P1^1; //舵机
    int jd,jd_bak;  //0.5的倍数
    //用jd,和jd_bak 标识符来控制舵机旋转角度,jd指的是(角度),jd_bak指的是(之前的角度)
    //jd_bak的设置,是为了让使各各模块结合在一起后,舵机更加稳定所做出的操作;
    int cnt; //计数
    
    void Time0Init()  //定时器0来配合舵机PWM操作    @11.0592MHz
    {
        //最小时间单元0.5ms(人为设置的)
    	//1. 配置定时器0工作模式位16位计时
    	TMOD &= 0xF0; //设置定时器模式  //选择定时器1
        TMOD |= 0x01;
    	//2. 给初值,定一个0.5出来
    	TL0=0x33;
    	TH0=0xFE;
    	//3. 开始计时
    	TR0 = 1;
    	TF0 = 0;
    	//4. 打开定时器0中断
    	ET0 = 1;
    	//5. 打开总中断EA
    	EA = 1;
    }
    
    void sg90_0_Init()  //初始化舵机
    {
        jd = 1;    //初始角度是0度(使舵机恢复原始状态),0.5ms,溢出1就是0.5ms,高电平
        cnt = 0;
        sg90_con = 1;//一开始从高电平开始
    }
    
    void Time0Handler() interrupt 1  //舵机 定时器0-中断
    {
    	cnt++;  //统计爆表的次数. cnt=1的时候,报表了1
    	//重新给初值,定时器复位;
    	TL0=0x33;
    	TH0=0xFE;
    	
    	//控制PWM波
    	if(cnt < jd) //jd是全局变量,比较方便
        { 
    		sg90_con = 1;//控制舵机PWM信号的高低电平
    	}
        else
        {
            sg90_con = 0;
        }
    	
    	if(cnt == 40){//爆表40次,经过了20ms
    		cnt = 0;  //40 * 0.5ms = 20ms
    		sg90_con = 1;
    	}
    }
    

2.4 震动传感器模块

我用的是SW-18010P
智能垃圾桶项目【课程设计】【全套开源】,课程设计,开源,mongodb,嵌入式硬件,51单片机

  • 引脚介绍

    • VCC 和 GND 就不说了,当不震动时,AO 口输出高电平;当产品震动时,AO口输出低电平;DO口在这里不用;
    • 我们可以用四角螺丝刀条件传感器的灵敏度;当传感器触发后,开关信号指示灯就会亮起。
  • 参考接线

    • AO口可以,随便接没有被占用的引脚,我是将AO口接在P3.2上

      sbit vibrate = P3^2;

  • 为了使程序更加稳定,防高灵敏度误触影响程序运行,我们使用外部中断0,来对震动传感器的触发进行操作

  • 模块参考代码介绍

int make_vibrate = 0;  //震动标志位(全局)

void EX0_Init() //外部中断初始化
{   
    //EA = 1;//因为前面以及打开过	EA 中断总开关了,我们这边就把他省略
    EX0 = 1; //打开外部中断0 开关
    IT0 = 0; //IT0 = 0时 低电平触发
    //IT = 1 的话就是下降言触发
}

void Ex0_Handler() interrupt 0 //震动传感器,外部中断0
{
     make_vibrate = 1;   //震动 标志位改变,进而影响震动传感器的状态;
}

2.5 蜂鸣器模块

我使用的是低电平触发的蜂鸣器,都大差不差,随便到某宝买就行。
智能垃圾桶项目【课程设计】【全套开源】,课程设计,开源,mongodb,嵌入式硬件,51单片机

  • 接线参考

    • VCC GND就不说了,I/O口,随便接没有被占用的引脚,我将 I/O 接在了P2.3

      sbit beep = P2^3; // 蜂鸣器 开盖就响

蜂鸣器比较简单;

接下来我们把上述各种器件整合,写开盖函数,关盖函数,和main函数;

3.开关盖函数和main

3.1 开关盖函数

直接上代码

void openDustbin() //开盖
{
    jd = 3; //90度 1.5ms高电平;根据前面讲得,20ms里面,1.5ms高电平,舵机转90度
    if(jd_bak != jd)//当当前设置的角度标志位,与前一个角度标志位不一样时,执行给语句;
    //目的解决物体一直放在垃圾桶前面时,舵机抽搐的问题。
    {
        cnt = 0; //抽搐的原因
        beep = 0; //蜂鸣器响一下
        Delay150ms(); //响150ms
        beep = 1; //蜂鸣器停
        Delay1000ms(); //延时1s,开关也要时间
        jd_bak = jd;//这一次的角度,变成了下一次的上一次。
    }
}

void closeDustbin() //关盖
{
     jd = 1; //0度,归位
     cnt = 0; //计数的标志位置零
     jd_bak = jd;//这一次的角度,变成了下一次的上一次。
     Delay150ms();
}

再补几个延时函数

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 8;
	j = 1;
	k = 243;
	do{
		do{
			while (--k);
		} while (--j);
	} while (--i);
}
void Delay150ms()		//@11.0592MHz
{
	unsigned char i, j, k;
    
	i = 2;
	j = 13;
	k = 237;
	do{
		do{
			while (--k);
		} while (--j);
	} while (--i);
}

3.2 main函数

下面我们写最主要的代码,来调用前面的函数;

  • 调节距离函数
void setDis(float distance)  //设置想要的距离,物体到达传感器多长距离,触发开盖
{
    Delay150ms();//这边加一个延时,目的是怕当物体一直在超声波传感器前面时,传感器启动频繁,导致产生过载;让传感器休息一下;
    if(Dis < distance || key1 == 0 || make_vibrate == 1)//小于10cm 或者按下按键key1 开盖
    {
    
            led1_ON();//点灯led1,关灯led2,标志,开盖成功!
            openDustbin();//开盖函数
            make_vibrate = 0; //震动传感器的标志位置零,重新开始
    }
    else
    {   
            led2_ON();//点灯led2,关灯led1,标志,关盖
            closeDustbin(); //关盖函数
            //make_vibrate = 0;
    }
}
  • main()函数中调用这个函数,通过传参便捷调节触发距离;
  • main() 函数
int main()
{
	Time0Init(); //初始化定时器
    Timer1Init();
    EX0_Init();  //外部中断 震动传感器
    sg90_0_Init(); //舵机的初始化
    
    while(1)
    {
        Dis = getDis();
        setDis(10);  //设置开盖距离参数,
        
    }
}

我们用到了定时器0 控制制舵机PWM,定时器1 计算超声波传播路径,外部中断0 结合了震动传感器

4.代码整合

#include<reg51.h>

sbit led1 = P3^7;  //固定的口 
sbit led2 = P3^6;  //固定的口
sbit key1 = P2^1;  //固定的口

sbit Trig = P1^5; //发生超声波
sbit Echo = P1^6; //接收超声波
sbit sg90_con = P1^1; //舵机
sbit vibrate = P3^2;
sbit beep = P2^3;  // 蜂鸣器 开盖就响

int jd,jd_bak;  //0.5的倍数
int cnt; //计数
int make_vibrate = 0; 
float Dis;  //超声波距离

void Delay10us()		//@11.0592MHz  //发射超声波最短时间
{
	unsigned char i;

	i = 2;
	while (--i);
}

void Delay150ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 2;
	j = 13;
	k = 237;
	do{
		do{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void Timer1Init()		//10微秒  //10us 超声波  @11.0592MHz
{
    
	TMOD &= 0x0F; //设置定时器模式  //选择定时器1
    TMOD |= 0x10;
	TL1 = 0x00;		//设置定时初始值
	TH1 = 0x00;		//设置定时初始值
    //不着急开始计数
}

void Time0Init()  //舵机定时器0 0.5ms  @11.0592MHz
{
	//1. 配置定时器0工作模式位16位计时
	TMOD &= 0xF0; //设置定时器模式  //选择定时器1
    TMOD |= 0x01;
	//2. 给初值,定一个0.5出来
	TL0=0x33;
	TH0=0xFE;
	//3. 开始计时
	TR0 = 1;
	TF0 = 0;
	//4. 打开定时器0中断
	ET0 = 1;
	//5. 打开总中断EA
	EA = 1;
}

void sg90_0_Init()
{
    jd = 1;    //初始角度是0度,0.5ms,溢出1就是0.5,高电平
    cnt = 0;
    sg90_con = 1;//一开始从高电平开始
}

void EX0_Init()
{
    EX0 = 1;
    IT0 = 0; //低电平触发
    //1的话就是下降言触发
}

void startHC() //发射超声波
{
    Trig = 0;
    Trig = 1;
    Delay10us();
    Trig = 0;
}

float getDis()  //获得距离
{
    float TIME;//时间
    TL1 = 0x00;		//设置定时初始值
    TH1 = 0x00;		//设置定时初始值
    startHC(); //准备启动
    while(Echo==0); //等待高电平,跳出循环
    TR1 = 1;
    while(Echo==1);//等待低电平,跳出循环
    TR1 = 0;
    TIME = (TH1 * 256 + TL1)* 1.085;  //us
    //340m/s = 340 00cm/1000ms == 34cm/ms == 0.034cm/us == 0.017cm/us
    return TIME * 0.017;//最大12m来回,器件HC是 2cm-4m
}

void led1_ON()  //亮led1
{
    led1 = 1;
    led2 = 0;
}

void led2_ON()  //亮led2
{
    led1 = 0;
    led2 = 1;
}


void openDustbin() //开盖
{
    jd = 3; //90度 1.5ms高电平
    if(jd_bak != jd)
    {
        cnt = 0; //抽搐的原因
        beep = 0;
        Delay150ms();
        beep = 1;
        Delay1000ms();
        jd_bak = jd;
    }
}

void closeDustbin() //关盖
{
     jd = 1; //0度
     cnt = 0;
     jd_bak = jd;
     Delay150ms();
}

void setDis(float distance)  //设置距离
{
    Delay150ms();
    if(Dis < distance || key1 == 0 || make_vibrate == 1)//小于10cm 或者按下按键key1 开盖
    {
    
            led1_ON();
            openDustbin();
            make_vibrate = 0;
    }
    else
    {   
            led2_ON();
            closeDustbin();
            //make_vibrate = 0;
    }
}

int main()
{
	Time0Init(); //初始化定时器
    Timer1Init();
    EX0_Init();  //外部中断 震动传感器
    sg90_0_Init(); //舵机的初始化
    
    while(1)
    {
        Dis = getDis();
        setDis(10);  //设置开盖距离参数,
        
    }
}

void Time0Handler() interrupt 1  //舵机 _中断
{
	cnt++;  //统计爆表的次数. cnt=1的时候,报表了1
	//重新给初值
	TL0=0x33;
	TH0=0xFE;
	
	//控制PWM波
	if(cnt < jd){ 
		sg90_con = 1;
	}else
    {
        sg90_con = 0;
    }
	
	if(cnt == 40){//爆表40次,经过了20ms
		cnt = 0;  //当100次表示1s,重新让cnt从0开始,计算下一次的1s
		sg90_con = 1;
	}
}

void Ex0_Handler() interrupt 0 //震动传感器,外部中断0
{
     make_vibrate = 1;   //震动 标志位改变
}

主要还是大家要注意接线,代码模块还是比较简单的;
智能垃圾桶项目【课程设计】【全套开源】,课程设计,开源,mongodb,嵌入式硬件,51单片机文章来源地址https://www.toymoban.com/news/detail-794412.html

到了这里,关于智能垃圾桶项目【课程设计】【全套开源】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 32、基于51单片机红外智能垃圾桶系统设计

    随着现代化进程的日益推进,科技越来越发达,人们的生活水平也提高了,城市化程度越来越高,与此同时也带了许多问题,生活垃圾越来越多垃圾设施却不够完善。无论是在公共场合还是家庭厨房的垃圾大都是没有盖或者有盖但需要人用手打开的,比如夏天的家庭厨房没有

    2023年04月14日
    浏览(60)
  • 基于STM32+华为云IOT设计的智能垃圾桶

    在商业街、小吃街和景区等人流密集的场所,垃圾桶的及时清理对于提供良好的游客体验至关重要。然而,传统的垃圾桶清理方式通常是定时或定期进行,无法根据实际情况进行及时响应,导致垃圾桶溢满,影响环境卫生,给游客带来不便和不满。 为了解决这一问题,本项目

    2024年02月08日
    浏览(107)
  • 嵌入式-stm32-基于HAL库的感应开关盖垃圾桶项目(开源)

    网盘资料: 《嵌入式-stm32-基于HAL库的感应开关盖垃圾桶项目(开源)》 链接:https://pan.baidu.com/s/1kFk09nMKPDvLwIUqMT9q3w 提取码:og66 –来自百度网盘超级会员V6的分享 一:项目概述 二:材料准备 三:细节分析(重点) 四:Stm32CubeMx操作步骤以及实现细节 五:Keil5业务逻辑代码编

    2024年02月03日
    浏览(68)
  • 单片机设计_语音识别分类智能垃圾桶(STM32 ESP8266 LD3320)

    想要更多项目私wo!!!         离线语音识别识别垃圾种类并且垃圾桶自动翻盖: 说出唤醒词“垃圾桶”后,再说一句垃圾名称,语音识别模块端识别到相应,便会将结果通过串口发送到STM32端,STM32端接着会发送打开相应垃圾桶盖的指令,6s后,垃圾桶盖自动关闭。

    2024年02月06日
    浏览(53)
  • 【毕业设计】基于单片机的智能感应垃圾桶设计与实现 - 物联网 stm32 嵌入式

    Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目 基于单片机的智能感应垃圾桶设计与实现 大家可用于 课程设计 或 毕业设计 单片机-嵌入式毕设选题大全及项目分享: https://blog.csdn.net/m0_71572576/article/details/125409052 学长设计的系统主要使用 STC89C52 单片机为基础设

    2024年01月17日
    浏览(146)
  • 毕业设计 单片机语音识别分类智能垃圾桶(STM32 ESP8266 LD3320)

    离线语音识别识别垃圾种类并且垃圾桶自动翻盖: 说出唤醒词“垃圾桶”后,再说一句垃圾名称,语音识别模块端识别到相应,便会将结果通过串口发送到STM32端,STM32端接着会发送打开相应垃圾桶盖的指令,6s后,垃圾桶盖自动关闭。其中翻盖功能是通过STM32端控制舵

    2024年04月26日
    浏览(71)
  • 智能语音识别垃圾桶

    主要采用Arduino单片机与LD3320语音模块结合,实现垃圾分类。 目录 设计方案 详细设计 总结 简介:传统垃圾桶都是采用不封口,手动或者脚踩的方式打开桶盖投递垃圾,不但操作麻烦,而且对人体的卫生健康有不利的影响,对空气环境也会造成污染。针对以上存在的问题,本

    2023年04月27日
    浏览(48)
  • Arduino智能语音识别分类垃圾桶

        该功能主要是通过ASRpro语音识别模块来实现,结合舵机部分,通过天问block编程,以达到用户输入语音指令, 通过 正确 识别后 控制舵机打开相应垃圾桶盖子, 以 实现垃圾分类(可回收垃圾、其他垃圾、厨余垃圾、有害垃圾)。 该功能是 利用Arduino Uno开发板 结合 红外

    2024年02月05日
    浏览(47)
  • 智能垃圾分类垃圾桶(K210+stm32mp157)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 有需要源码参考的可以点赞在评论区留邮箱 K210识别垃圾 k210识别2 文章目录 前言 一、垃圾分类识别+舵机控制(K210) 二、语音控制(K210+ld3320)(UART通信) 三、满溢度距离传感器数据获取(STM32MP157)

    2024年02月03日
    浏览(52)
  • 智能垃圾桶丨悦享便捷生活

           垃圾桶是人们日常生活所必不可少的必需品,它让生活中所产生的垃圾有了一个正确的存放地方。随着生产技术的迅速发展,垃圾桶也得以更新换代。由最初的简单式的圆筒式垃圾桶,到现在出现的感应式垃圾桶、智能语音控制垃圾桶,垃圾桶也变得越来越智能,让

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包