文章目录

  • 前期准备:
  • 超声波模块
  • SG90舵机
  • 1、概念
  • 舵机代码
  • 震动检测模块
  • 蜂鸣器
  • 定时器和中断
  • 项目实物
  • 项目代码:

前期准备:

超声波模块

简介:
超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。

硬件
电路板上有4个引脚:

VCC(正级)
Trig(触发)
Echo(回应)
GND(接地-负极)

主要参数:

工作电压与电流:5V、15mA
感测距离:2~400cm
感测角度:不大于15°
被测物体的面积:不要小于50cm²,且尽量平整
具备温度补偿电路
在超声波模块的触发脚位输入10微秒以上的高电位,即可发射超声波,发射超声波之后,与接收到传回的超声波之前,“响应”脚位呈现高电位。因此,程序可以从“响应”脚位的高位脉冲持续时间,换算出被测物的距离。
超声波模块工作原理
超声波时序图

T(发波)

R(接受)

先给 Trig 引脚发送一个 10uS(微秒)的 TTL(高电平)

T就可以发波了

发出的是循环 8 个 40KHz 的脉冲

波发出去后,Echo 引脚就会一直维持高电平,也就是说波在空中传播的过程是一直维持高电平

那么就可以根据Echo 引脚的高电平维持时间,超声波在空气中的物理性质的传输速度,就可以算出障碍物跟发波点的距离

即超声波能在空气中1秒能跑多远,那么就可以通过Echo 引脚的高电平维持时间,换算距离了

代码测试(D5D6灯亮灭):

#include "reg52.h"sbit D5 = P3^7;
sbit D6 = P3^6;
sbit Trig = P1^5;
sbit Echo = P1^6;void Delay10us()      //@11.0592MHz
{unsigned char i;i = 2;while (--i);
}//配置定时器1
void Timer1Init(void)
{TMOD &= 0xF0;TMOD |= 0x10;TH1 = 0;TL1 = 0;
}void startHc()
{Trig = 0;Trig = 1;Delay10us();Trig = 0;
}double get_distance()
{double time;//定时器数据清零,以便下一次测距TH1 = 0;TL1 = 0;//1.Trig,给Trig端口至少10us的高电平startHc();//2.echo由低电平跳转到高电平,表示开始发送波while(Echo == 0);//波发出去的那一下,开启定时器TR1 = 1;//3.由高电平跳转回店店铺,表示波回来了while(Echo == 1);//波回来的那一下,我们开始停止定时器TR1 = 0;//4.计算出中间经过多少时间time=(TH1 *256 +TL1)*1.085;//us为单位//5.距离=速度(340m/s)*时间/2return (time*0.017);}void openStatusLight()
{D5 = 0;D6 = 1;}void closeStatusLight()
{D5 = 1;D6 = 0;}void main()
{double dis;Timer1Init();while(1){dis = get_distance();if(dis < 10){openStatusLight();}else{closeStatusLight();}}}

SG90舵机


接线方法:
红-------------------------VCC
棕色----------------------GND
橙色----------------------信号线

1、概念

PWM 全称是 Pulse WidthModulation,也就是脉冲宽度调制

2、PWM信号图

3、频率
频率就是开关速度,把一次开关算作一个周期,那么频率就是 1 秒内进行了多少次开关

4、占空比
占空比就是一个周期内高电平时间和低电平时间的比例,一个周期内高电平时间越长占空比就越大,反之占空比就越小。占空比用百分之表示,如果一个周期内全是低电平那么占空比就是 0%,如果一个周期内全是高电平那么占空比就是100%。

舵机代码

#include "reg52.h"sbit sg90_con = P1^1;
int jd;
int cnt = 0;void Timer0Init(void)      //500微秒@11.0592MHz
{//定时器时钟1T模式TMOD = 0x01;       //设置定时器模式TL0 = 0x33;       //设置定时初值TH0 = 0xFE;    //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时ET0   = 1;   //打开定时器0中断EA = 1;      //打开总中断
}void Delay2000ms()     //@11.0592MHz
{unsigned char i, j, k;i = 15;j = 2;k = 235;do{do{while (--k);} while (--j);} while (--i);
}void Delay300ms()      //@11.0592MHz
{unsigned char i, j, k;i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i);
}void main()
{Delay300ms();//让硬件稳定一下Timer0Init(); //初始化定时器cnt = 0;jd = 1;sg90_con = 1;//每隔两秒切换一次角度while(1){jd = 3;  //90度 1.5ms高电平cnt = 0;Delay2000ms();jd = 1; //0度cnt = 0;Delay2000ms();}}void TimeOHandler() interrupt 1
{cnt++;//统计爆表的次数//重新给初值TL0 = 0x33;       //设置定时初值TH0 = 0xFE;if(cnt < jd){sg90_con = 1;}else{sg90_con = 0;}if(cnt == 40){//爆表40次,经过了20mscnt = 0;sg90_con = 1;}}

震动检测模块

型号:SW-18010P

产品特点
1、采用本公司生产的高灵敏度震动开关,默认用SW-18010P震动传感器

2、比较器输出,信号干净,波形好,驱动能力强,超过15mA

3、工作电压3.3V-5V

4、输出形式:数字开关量输出(0和1)

5、设有固定螺栓孔,方便安装

6、小板PCB尺寸:3.2cm x 1.4cm

7、使用宽电压LM393比较器

接线
1、VCC:接电源正极

2、GND:接电源负极

3、DO:数字量信号输出

4、AO:用此震动传感器此功能无效

注意:电源极性不能反接、否则有可能将芯片烧坏、开关信号指示灯亮时输出低电平、不亮输出高电平、信号输出的电平接近于电源电压

使用方法
1、产品不震动时,震动开关呈断开状态,输出端DO输出高电平,绿色指示灯不亮;

2、产品震动时,震动开关瞬间导通,输出端DO输出低电平,绿色指示灯亮;

3、输出端可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境是否有震动,起到报警作用

片机直接相连,通过单片机来检测高低电平,由此来检测环境是否有震动,起到报警作用

4、电位器可以调整模块的检测灵敏度

蜂鸣器

定时器和中断

定时器和中断

项目实物

项目代码:

#include "reg52.h"sbit D5       = P3^7;
sbit D6       = P3^6;
sbit Trig     = P1^5;
sbit Echo     = P1^6;
sbit sg90_con = P1^1;
sbit SW1      = P2^1;
sbit vibrate  = P3^2;
sbit beep     = P2^0;char mark_vibrate = 0;
char jd;
char cnt = 0;
char jd_bak;void Delay150ms()       //@11.0592MHz
{unsigned char i, j, k;i = 2;j = 13;k = 237;do{do{while (--k);} while (--j);} while (--i);
}void Delay2000ms()     //@11.0592MHz
{unsigned char i, j, k;i = 15;j = 2;k = 235;do{do{while (--k);} while (--j);} while (--i);
}void Delay10us()       //@11.0592MHz
{unsigned char i;i = 2;while (--i);
}
//配置定时器0
void Timer0Init(void)
{//定时器时钟1T模式TMOD &= 0xF0;TMOD |= 0x01;        //设置定时器模式TL0 = 0x33;       //设置定时初值TH0 = 0xFE;    //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时ET0   = 1;   //打开定时器0中断EA = 1;      //打开总中断
}//配置定时器1
void Timer1Init(void)
{TMOD &= 0x0F;TMOD |= 0x10;TH1 = 0;TL1 = 0;
}void startHc()
{Trig = 0;Trig = 1;Delay10us();Trig = 0;
}double get_distance()
{double time;//定时器数据清零,以便下一次测距TH1 = 0;TL1 = 0;//1.Trig,给Trig端口至少10us的高电平startHc();//2.echo由低电平跳转到高电平,表示开始发送波while(Echo == 0);//波发出去的那一下,开启定时器TR1 = 1;//3.由高电平跳转回店店铺,表示波回来了while(Echo == 1);//波回来的那一下,我们开始停止定时器TR1 = 0;//4.计算出中间经过多少时间time=(TH1 *256 +TL1)*1.085;//us为单位//5.距离=速度(340m/s)*时间/2return (time*0.017);}void openStatusLight()
{D5 = 0;D6 = 1;}void closeStatusLight()
{D5 = 1;D6 = 0;}void initSG90_0()
{jd = 1;cnt = 0;sg90_con = 1;
}void openDusbin()
{//开盖char n;jd = 3;if(jd_bak != jd){cnt = 0;beep = 0;for(n=0;n<2;n++)Delay150ms();beep = 1;Delay2000ms();}jd_bak = jd;}void closeDusbin()
{//关盖jd = 1;//0度jd_bak = jd;cnt = 0;Delay150ms();}void EX0_Init()
{EX0 = 1;IT0 = 0;
}void main()
{double dis;Timer0Init();Timer1Init();EX0_Init();initSG90_0();while(1){//超声波测距dis = get_distance();if(dis < 10 || SW1 == 0 || mark_vibrate == 1){//开盖,灯状态,D5亮openStatusLight();openDusbin();mark_vibrate = 0;}else{//关盖,灯状态,D5灭closeStatusLight();closeDusbin();}}}void TimeOHandler() interrupt 1
{cnt++;//统计爆表的次数//重新给初值TL0 = 0x33;       //设置定时初值TH0 = 0xFE;if(cnt < jd){sg90_con = 1;}else{sg90_con = 0;}if(cnt == 40){//爆表40次,经过了20mscnt = 0;sg90_con = 1;}}void Ex0_Handler() interrupt 0 //设置外部中断
{mark_vibrate = 1;
}

C51之智能感应垃圾桶相关推荐

  1. 【毕业设计】基于单片机的智能感应垃圾桶设计与实现 - 物联网 stm32 嵌入式

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 系统设计 3.1 系统架构 3.2 硬件部分 3.2.1 传感器模块 3.2.2 语音模块 3.2.3 电机及其驱动模块 3.2.4 稳压模块 ...

  2. 51单片机实现智能感应垃圾桶

    智能感应垃圾桶 功能描述 检测靠近时,垃圾桶自动开盖并伴随滴一声,2秒后关盖 发生震动时,垃圾桶自动开盖并伴随滴一声,2秒后关盖 按下按键时,垃圾桶自动开盖并伴随滴一声,2秒后关盖 硬件说明 SG90 ...

  3. 基于wemos的智能感应垃圾桶

    一:开发环境 Arduino 上电后不断执行loop函数中的代码,我们核心控制代码写入loop setup函数只调用一次,一般用于硬件相关的初始化,比如IO口,串口,wifi等 void setup( ...

  4. 建筑智能信息网络系统计算机网络系统检检测指导书,04智能建筑检验批划分作业指导书.doc...

    附件4:<智能建筑分部工程检验批划分指导意见> 智能建筑分部工程检验批划分指导意见 分部工程名称 子分部 工 程 名 称 分项工程 检验批表名称 划分说明 (供参考) 报验附件资料 名称( ...

  5. Java:抽象方法和抽象类,抽象类应用模板方法模式,接口及使用

    一.抽象类概念和作用 抽象类                 Java中可以定义没有方法体的方法,该方法由子类来具体实现.                 该没有方法体的方法我们称之为抽象方法,含有抽 ...

  6. 基于wemos D1的无线遥控灯(433m无线模块)

    参考:基于wemos D1的无线遥控灯(433m无线模块) 作者:一只小阿大:) 发布时间: 2021-04-16 09:25:53 网址:https://blog.csdn.net/qq_44610 ...

  7. 垃圾分类创业的大风口下 有哪些创业机会不容忽视?

    自算命先生的"你算什么".配钥匙师傅的"你配吗".食堂阿姨的"你要饭吗"之后,上海人民迎来了社区大妈"你是什么垃圾"的灵 ...

  8. 学习笔记3 Linux定时器和sg90舵机的综合应用

    今天学习了Linux的定时器功能,并复刻了学习51单片机时玩的智能感应垃圾桶项目.总体感觉难度不大. 先捏软柿子,sg90舵机,应该是市面上能能买到的最便宜的舵机了吧(我瞎说的,如果不是可以发链接给我 ...

  9. 基于51单片机的智能自动感应垃圾桶

    资料编号:142  下面是相关功能视频演示: 142-基于51单片机的智能自动感应垃圾桶(源程序+原理图+PCB+全套毕设资料) 设计要求: 题目:基于51单片机的自动感应垃圾桶 基本功能要求: 1. ...

最新文章

  1. Vue开源项目库汇总
  2. 错误笔记(1)——关于克隆虚拟机引发的后续问题
  3. Flash 缓存问题的解决(转)
  4. eclipse的workset项目重复显示解决方案
  5. compizconfignbsp;nbsp;中的方框…
  6. server多笔记录拼接字符串 sql_前台传入多个参数(数组格式),拼接成字符串中间用逗号隔开,传入到sql中用in查询....
  7. 三万字详解SpringClould高可用流量防护组件Sentinel哨兵(含源码例子)
  8. 移动终端WAPI证书快速下载并自动连接解决方案
  9. java保留字详解_java复习基础知识——java保留字
  10. 对接微信支付退款证书之坑
  11. BSOJ 2923:藤原妹红 MST+树型DP
  12. Java必背基础词汇
  13. pytorch入门篇1 创建tensor
  14. javascript制作钟表
  15. 第11章 菜单及其它资源
  16. penGL入门学习(六)
  17. 干货丨李睿:新时代的医学影像及心脑血管成像的应用
  18. github博客自动同步到gitee(保姆级教程)
  19. 水池蓄水问题(Trapping Rain Water)
  20. U盘显示打开设备和打印机--Linux系统(Ubuntu18.04)解决方案

热门文章

  1. android togglebutton 自定义,Android 自定义ToggleButton
  2. 基于Java语言的OpenCV使用
  3. yarn和npm设置修改源
  4. python调用exe程序
  5. TypeScript 基础学习之泛型和 extends 关键字
  6. 【Turtle合集】火遍抖音的五款魔法阵终于被我找到了(初代萌王,童年的小樱回来了)
  7. GIS最佳路径的分析和制作
  8. TCP/IP四层模型各层主要协议详述
  9. Oracle数据库恢复表和表数据
  10. VB.NET学习笔记:ADO.NET操作ACCESS数据库——使用OleDbDataReader对象