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

您所在的位置:网站首页 智能垃圾桶简介100字 智能垃圾桶项目【课程设计】【全套开源】

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

2024-06-09 18:44| 来源: 网络整理| 查看: 265

手把手带做【智能垃圾桶项目】【全套开源】 1.项目介绍 1.1 功能描述 当物体接近垃圾桶时,垃圾桶自动打开,并有" 嘀"的一声;当远离垃圾桶后,自动关闭;当按下按键时,垃圾桶也可以自动打开,并有" 嘀"的一声;当感受到震动时,也自动打开,(同上)垃圾桶开时,led1 灯开,led2 灯关;当垃圾桶关时,led1 灯关,led2 灯开 1.2 所需器件 SG90舵机,超声波模块HC-SR04,震动传感器,蜂鸣器

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

2.元器件器件描述 2.1 STC89C51/52

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

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

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

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

比如我使用的单片机

在这里插入图片描述

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

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

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

1.2 超声波测距模块

我使用的是HC-SR04 在这里插入图片描述

大家在某宝或者某夕夕上面买就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;

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

模块代码介绍

先获取一下延时函数 在这里插入图片描述

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

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

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

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

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

模块参考代码介绍 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 在这里插入图片描述

网上都可以买的到的

参考接线

三个引脚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++;这样一来,我们就可以通过标识符来方便的控制舵机旋转角度;

在这里插入图片描述

模块参考代码介绍

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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3