02:项目二:感应开关盖垃圾桶

感应开关盖垃圾桶

  • 1、PWM开发SG90
    • 1.1、怎样通过C51单片机输出PWM波?
    • 1.2、通过定时器输出PWM波来控制SG90
  • 2、超声波测距模块的使用
  • 3、感应开关盖垃圾桶

需要材料:
1、SG90舵机模块
2、HC-SR04超声波模块
3、震动传感器
4、蜂鸣器
5、若干杜邦线

1、PWM开发SG90

  • PWM波为脉冲宽度调制,对模拟信号电平进行数字编码。通过调节占空比的变化来调节信号。
  • 占空比:高电平的时间/整个信号的周期。

1.1、怎样通过C51单片机输出PWM波?

如果芯片内部模块能集成输出,一般观察手册或者芯片IO口都会标明这个是否是PWM口
如果没有集成PWM功能,可以通过IO口软件模拟,

1.2、通过定时器输出PWM波来控制SG90

在这里插入图片描述
如图为SG90舵机模块,黄色为PWM信号控制,红色和褐色分别为VCC和GND。当输入的PWM的占空比不同的时候,舵机模块的摆头幅度不同。一般情况如下:

  • PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右
    0.5ms-------------0度; 2.5% 对应1/40,
    1.0ms------------45度; 5.0% 对应2/40
    1.5ms------------90度; 7.5% 对应3/40
    2.0ms-----------135度; 10.0% 对应4/40
    2.5ms-----------180度; 12.5% 对应5/40

接下来通过C51单片机输出PWM波控制舵机的摆头(黄线连接P1.1口)代码如下:

#include <REGX52.H>sbit sg_90 = P1^1;//黄线连接P1.1口
int cnt = 0;	//标志位
int jd;			//占空比的分子void Delay300ms()		//@11.0592MHz
{unsigned char i, j, k;i = 3;j = 26;k = 223;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 Timer0_Init(void)
{TMOD = 0x01;//配置定时器T0为16位定时器TL0 = 0x33;	//定时器计1个数为1.085us,则当舵机为0度的时候,需要0.5ms,            TH0 = 0xFE;	//则定一个0.5ms的定时器TF0 = 0;		//清除TF0标志TR0 = 1;		//定时器0开始计时ET0 = 1;EA = 1;
}void main(void)
{ Delay300ms();//给硬件准备时间Timer0_Init();jd = 1;//一上电,开始占空比为1/40,为0度cnt = 0;sg_90 = 1;//先给输出引脚一个高电平while(1){//角度由135度到0度来回摆动jd = 4;cnt = 0;Delay2000ms();jd = 1;cnt = 0;Delay2000ms();}
}void Timer0_Handler() interrupt 1//中断函数
{cnt++;TL0 = 0x33;	           TH0 = 0xFE;//控制PWM波的占空比if(cnt < jd){sg_90 = 1;}else{sg_90 = 0;}if(cnt == 40){cnt = 0;sg_90 = 1;}
}

2、超声波测距模块的使用

在这里插入图片描述

  • 怎么让它发送波
    Trig ,给Trig端口至少10us的高电平
  • 怎么知道它开始发了
    Echo信号,由低电平跳转到高电平,表示开始发送波
  • 怎么知道接收了返回波
    Echo,由高电平跳转回低电平,表示波回来了
  • 怎么算时间
    Echo引脚维持高电平的时间!
    波发出去的那一下,开始启动定时器。波回来的那一下,我们开始停止定时器,计算出中间经过多少时间。距离 = 速度 (340m/s)* 时间/2

在这里插入图片描述

/*通过超声波模块控制LED1灯的亮灭,当手靠近超声波模块时,灯亮*/
#include <REGX52.H>sbit Trig = P1^5;
sbit Echo = P1^6;
sbit LED1 = P3^7;void Delay10us()		//@11.0592MHz
{unsigned char i;i = 2;while (--i);
}void Timer0_Init(void)
{TMOD = 0x01;TL0 = 0;TH0 = 0;//设置定时器T0从0开始数数
}void Delay200ms()		//@11.0592MHz
{unsigned char i, j, k;i = 2;j = 103;k = 147;do{do{while (--k);} while (--j);} while (--i);
}void main(void)
{double time;double dis;Timer0_Init();while(1){Delay200ms();//先给单片机准备时间//1、开始发波Trig = 0;Trig = 1;Delay10us();Trig = 0;//2、检测ECHO引脚电平while(Echo == 0);TR0 = 1;													//启动定时器while(Echo == 1);TR0 = 0;													//关闭定时器//3、计算定时开到定时关的时间(计算数的个数),//2位二进制11,01。合并位1101怎么算?1101为(11*2^2)+01=13time = (TH0 * 256 + TL0) * 1.085; //us为单位//34000cm/s = 34cm/ms = 0.034cm/usdis = time * 0.017;							  //cm为单位if(dis < 10){LED1 = 0;}else{LED1 = 1;}TL0 = 0;TH0 = 0;//定时器清零,以便下次测距}
}

代码优化②:

/**优化:将定时器0改为定时器1,然后将超声波测距封装成为一个函数*/
#include <REGX52.H>sbit Trig = P1^5;
sbit Echo = P1^6;
sbit LED1 = P3^7;void Delay10us()		//@11.0592MHz
{unsigned char i;i = 2;while (--i);
}void Delay200ms()		//@11.0592MHz
{unsigned char i, j, k;i = 2;j = 103;k = 147;do{do{while (--k);} while (--j);} while (--i);
}void Timer1_Init(void)
{//使用定时器1TMOD &= 0x0F;TMOD |= 0x10;TL1 = 0;TH1 = 0;//设置定时器T1从0开始数数
}double get_distance()//超声波获得距离的函数
{double time;TL1 = 0;TH1 = 0;//定时器清零,以便下次测距//1、开始发波Trig = 0;Trig = 1;Delay10us();Trig = 0;//2、检测ECHO引脚电平while(Echo == 0);TR1 = 1;													//启动定时器while(Echo == 1);TR1 = 0;													//关闭定时器//3、计算定时开到定时关的时间(计算数的个数),//2位二进制11,01。合并位1101怎么算?1101为(11*2^2)+01=13time = (TH1 * 256 + TL1) * 1.085; //us为单位//34000cm/s = 34cm/ms = 0.034cm/usreturn (time * 0.017);							  //cm为单位;
}void main(void)
{double dis;Timer1_Init();while(1){Delay200ms();//先给单片机准备时间dis = get_distance();if(dis < 10){LED1 = 0;}else{LED1 = 1;}}
}

3、感应开关盖垃圾桶

舵机和超声波代码整合,舵机用定时器0,超声波用定时器1。
1、实现物体靠近后,自动开盖,2秒后关盖。
2、查询的方式添加按键控制
3、 查询的方式添加震动控制

#include <REGX52.H>sbit SW1   =   P2^1;//按键SW1连接的是P2.1口
sbit Trig  =   P1^5;
sbit Echo  =   P1^6;
sbit LED1  =   P3^7;
sbit sg_90 =   P1^1;//黄线连接P1.1口
sbit vibrate = P3^2;//震动传感器连接P3.2口,使用外部中断0int cnt = 0;	//标志位
int jd;			//占空比的分子
int vib_mark;   //震动传感器的标志位void Delay10us()		//@11.0592MHz
{unsigned char i;i = 2;while (--i);
}void Delay200ms()		//@11.0592MHz
{unsigned char i, j, k;i = 2;j = 103;k = 147;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 EX0_Init()//触发中断0初始化
{EX0 = 1;EA = 1;IT0 = 0;//低电平触发
}void Timer0_Init(void)//定时器T0中断初始化
{TMOD &= 0xF0;//配置定时器T0为16位定时器TMOD |= 0x01;TL0 = 0x33;	//定时器计1个数为1.085us,则当舵机为0度的时候,需要0.5ms,            TH0 = 0xFE;	//则定一个0.5ms的定时器TF0 = 0;		//清除TF0标志TR0 = 1;		//定时器0开始计时ET0 = 1;EA = 1;
}void Timer1_Init(void)//定时器T1初始化
{//使用定时器1TMOD &= 0x0F;TMOD |= 0x10;TL1 = 0;TH1 = 0;//设置定时器T1从0开始数数
}double get_distance()
{double time;TL1 = 0;TH1 = 0;//定时器清零,以便下次测距//1、开始发波Trig = 0;Trig = 1;Delay10us();Trig = 0;//2、检测ECHO引脚电平while(Echo == 0);TR1 = 1;													//启动定时器while(Echo == 1);TR1 = 0;													//关闭定时器//3、计算定时开到定时关的时间(计算数的个数),//2位二进制11,01。合并位1101怎么算?1101为(11*2^2)+01=13time = (TH1 * 256 + TL1) * 1.085; //us为单位//34000cm/s = 34cm/ms = 0.034cm/usreturn (time * 0.017);							  //cm为单位;
}void sg90_0(void)	//舵机0度
{sg_90 = 1;//先给输出引脚一个高电平jd = 1;//一上电,开始占空比为1/40,为0度cnt = 0;
}void sg90_90(void)//舵机90度
{sg_90 = 1;//先给输出引脚一个高电平jd = 3;//一上电,开始占空比为3/40,为90度cnt = 0;
}void main(void)
{double dis;Timer0_Init();Timer1_Init();EX0_Init();sg90_0();while(1){Delay200ms();//先给单片机准备时间dis = get_distance();if(dis < 10 || SW1 == 0 || vib_mark == 1){vib_mark = 0;LED1 = 0;sg90_90();Delay2000ms();}else{LED1 = 1;sg90_0();Delay200ms();}	}
}void Timer0_Handler() interrupt 1//中断函数
{cnt++;TL0 = 0x33;	           TH0 = 0xFE;//控制PWM波的占空比if(cnt < jd){sg_90 = 1;}else{sg_90 = 0;}if(cnt == 40){cnt = 0;sg_90 = 1;}
}void EX0_Handler() interrupt 0//触发中断0函数
{vib_mark = 1;
}
 为什么我们使用震动传感器控制的时候不直接if(dis < 10 || SW1 == 0 ||  vibrate== 0)喃?这样判断不是跟简单吗?原因:因为震动传感器因为震动而发出的低电平0不仅微弱,而且时间比较断。当震动传感器给出低电平的时候,而单片机还在执Delay2000ms();而当进入判断的时候,可能震动传感器发出的低电平已经消失了,已经变成高电平了。这样就会导致震动传感器不灵敏。所以,通过外部中断来改变标志位,这样就会规避这个问题。当震动时,触发中断,标志位变为1,等待判断。只有进入判断后标志位才变回0。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/377976.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】

文章目录 前言self querying 简介代码实现总结 前言 现在比较流行的 RAG 检索就是通过大模型 embedding 算法将数据嵌入向量数据库中&#xff0c;然后在将用户的查询向量化&#xff0c;从向量数据库中召回相似性数据&#xff0c;构造成 context template, 放到 LLM 中进行查询…

【香橙派AiPro】基于VGG16的火灾检测模型预测

目录 引言开发板介绍开发板使用准备工作工具文档 拨码开关镜像烧录连接开发板下载MobaXterm网线-SSH连接开发板设置WIFI连接WIFI-SSH连接开发板确定开发板IP方法 Vnc可视化WindowsiPad 开发工具安装 散热风扇基于VGG16的火灾检测模型预测数据集准备目录结构代码操作 安装宝塔最…

Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者&#xff0c;Puppeteer都是你可以使用的最强大工具之一。本完整指南将深入探讨什么是Puppeteer以及如何有效地在网页抓取中使用它。 Puppeteer简…

【Neural signal processing and analysis zero to hero】- 1

The basics of neural signal processing course from youtube: 传送地址 Possible preprocessing steps Signal artifacts (not) to worry about doing visual based artifact rejection so that means that before you start analyzing, you can identify those data epic…

有关电力电子技术的一些相关仿真和分析:⑤交-直-交全桥逆变+全波整流结构电路(MATLAB/Siumlink仿真)

全桥逆变+全波整流结构 参数:Vin=500V, Vo=200V, T=2:1:1, RL=10Ω, fs=100kHz, L=1mH, C=100uF (1)给定输入电压,输出电压和主电路参数,仿真研究电路工作原理,分析工作时序; (2)调节负载电阻,实现电流连续和断续,并仿真验证; (3)调节占空比,分析占空比与电…

微软Edge浏览器深度解析:性能、安全性与特色功能全面评测

一、引言 自Windows 10操作系统推出以来&#xff0c;微软Edge浏览器作为默认的网页浏览器&#xff0c;凭借其现代化的设计和出色的性能表现&#xff0c;逐渐获得了用户的认可。本文旨在对Edge浏览器进行深入分析&#xff0c;探讨其在多个方面的表现。 二、界面与操作体验 界面…

初识STM32:芯片基本信息

STM32简介 STM32是ST公司基于ARM公司的Cortex-M内核开发的32位微控制器。 ARM公司是全球领先的半导体知识产权&#xff08;IP&#xff09;提供商&#xff0c;全世界超过95%的智能手机和平板电脑都采用ARM架构。 ST公司于1987年由意大利的SGS微电子与法国的Thomson半导体合并…

多样化数据可视化方法的全面示例:基于Python的多样化数据可视化

文章目录 前言代码效果展示 前言 本文演示了使用Python进行温度数据的多样化可视化方法。通过导入、处理和分析气象数据&#xff0c;我们生成了多种图表&#xff0c;包括直方图、核密度估计图、箱型图、小提琴图、条形图、山脊图、经验累积分布函数图和折线图。这些图表帮助我…

Zookeeper之CAP理论及分布式一致性算法

CAP理论 CAP理论告诉我们&#xff0c;一个分布式系统不可能同时满足以下三种 一致性&#xff08;C:consistency&#xff09;可用性&#xff08;A:Available&#xff09;分区容错性&#xff08;P:Partition Tolerance&#xff09; 这三个基本要求&#xff0c;最多只能同时满足…

【Pytorch】数据集的加载和处理(一)

Pytorch torchvision 包提供了很多常用数据集 数据按照用途一般分为三组&#xff1a;训练&#xff08;train&#xff09;、验证&#xff08;validation&#xff09;和测试&#xff08;test&#xff09;。使用训练数据集来训练模型&#xff0c;使用验证数据集跟踪模型在训练期间…

c++包管理器

conan conan search&#xff0c;查看网络库 conan profile detect&#xff0c;生成缓存信息conan new cmake_exe/cmake_lib&#xff0c;创建cmakelists.txtconan install .&#xff0c;执行Conanfile.txt中的配置&#xff0c;生成相关的bat文件 项目中配置Conanfile.txt(或者…

【AIGC】二、mac本地采用GPU启动keras运算

mac本地采用GPU启动keras运算 一、问题背景二、技术背景三、实验验证本机配置安装PlaidML安装plaidml-keras配置默认显卡 运行采用 CPU运算的代码step1 先导入keras包&#xff0c;导入数据cifar10&#xff0c;这里可能涉及外网下载&#xff0c;有问题可以参考[keras使用基础问题…

linux后门教程

linux后门教程 alias 用法 系统默认别名&#xff1a;alias 设置别名&#xff1a;alias lsls -laih 删除别名&#xff1a;unalias ls **加参数&#xff1a;**alias ls‘ls -laih;pwd’ 注意 系统启动默认加载的配置文件 /etc/profile 切换用户就会执行/etc/profile /etc/bash…

正则表达式(Ⅱ)——重复匹配

简介 基本匹配是在其中选择一个进行拼装&#xff0c;而重复匹配则是去指定字符可以出现的次数 基本匹配中的字符要么不出现&#xff0c;匹配上了也只能是出现一次 重复匹配使用一些特殊字符用来指定一个字符在文本中重复的次数。它们分别是加号 、星号 * &#xff0c;问号 ?…

面试经验总结

某生物科技公司 1.代码实现删除一个 list 里面的重复元素 方法1&#xff1a;最简单容易的方法 此方法基于遍历整个列表&#xff0c;将第一个元素添加到新列表中。 # Python 3 code to demonstrate # removing duplicated from list # using naive methods # initializing …

数据结构—链式二叉树-C语言

代码位置&#xff1a;test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 在现实中搜索二叉树为常用的二叉树之一&#xff0c;今天我们就要通过链表来实现搜索二叉树。实现的操作有&#xff1a;建二叉树、前序遍历、中序遍历、后序遍历、求树的节点个数、求…

免费开源的工业物联网(IoT)解决方案

什么是 IoT&#xff1f; 物联网 (IoT) 是指由实体设备、车辆、电器和其他实体对象组成的网络&#xff0c;这些实体对象内嵌传感器、软件和网络连接&#xff0c;可以收集和共享数据。 IoT 设备&#xff08;也称为“智能对象”&#xff09;范围广泛&#xff0c;包括智能恒温器等…

FastAPI 学习之路(四十四)WebSockets

我们之前的分析都是基于http的请求&#xff0c;那么如果是websockets可以支持吗&#xff0c;答案是可以的&#xff0c;我们来看下是如何实现的。 from fastapi import WebSocket, FastAPI from fastapi.responses import HTMLResponseapp FastAPI()html """&…

架构师机器学习操作 (MLOps) 指南

MLOps 是机器学习操作的缩写&#xff0c;是一组实践和工具&#xff0c;旨在满足工程师构建模型并将其投入生产的特定需求。一些组织从一些自主开发的工具开始&#xff0c;这些工具在每次实验后对数据集进行版本控制&#xff0c;并在每个训练周期后对检查点模型进行版本控制。另…

新手-前端生态

文章目录 新手的前端生态一、概念的理解1、脚手架2、组件 二、基础知识1、HTML2、css3、JavaScript一、基础语法1、javaScript的引入2、认识输出语句3、学会处理报错 二、变量1、如何使用变量 2、变量的命名规范3、推荐的变量命名法4、变量默认值5、变量常见的错误6、变量声明提…