感应关盖垃圾桶项目

1.功能描述

        检测靠近时,垃圾桶自动开盖并伴随滴一声,2秒后关盖

        发生震动时,垃圾桶自动开盖并伴随滴一声,2秒后关盖

        按下按键时,垃圾桶自动开盖并伴随滴一声,2秒后关盖

2.硬件说明

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

接线说明

        舵机控制口 P1.1;超声波Trig接 P1.5 ,Echo接 P1.6 ;

        蜂鸣器接 P2.0 口; 震动传感器接 P3.2`口(外部中断0)

3.开发步骤:

3.1. 舵机和超声波代码整合

        舵机用定时器0

        超声波用定时器1

        实现物体靠近后,自动开盖,2秒后关盖

3.2. 查询的方式添加按键控制

        3.3. 查询的方式添加震动控制

        3.4. 使用外部中断0配合震动控制

4.烧录代码时,先检查每一个模块的功能是否完整

        4.1超声波模块改为定时器1代码

#include "reg52.h"
#include <intrins.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);
}void Delay200ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 2;j = 103;k = 147;do{do{while (--k);} while (--j);} while (--i);
}void Time1Init()
{TMOD &= 0x0F; //保持低四位不变,高四位为0TMOD |= 0x10; //低四位保持不变, 把M1和M0改为 0 1 TH1 = 0;TL1 = 0;//
}void StartHC()
{Trig = 0;Trig = 1;Delay10us();Trig = 0;
}void main()
{double time;double dis;Time1Init();//while(1){Delay200ms();StartHC();//while(Echo == 0); ////TR1 = 1;//while(Echo == 1); ////TR1 = 0;//time = (TH1 * 256 + TL1 )*1.085;//340m/s == 34000cm/s == 34cm/ms = 0.034cm/usdis = time * 0.017;if(dis < 10){D5 = 0;D6 = 1;}else{D5 = 1;D6 = 0;}//¶¨Ê±Æ÷Êý¾ÝÇåÁã¡£ÒÔ±ãÏÂÒ»´Î²â¾àTH1 = 0;TL1 = 0;}
}

        4.2舵机模块代码

#include "reg52.h"
#include <intrins.h>sbit sg90_con = P1^1;  //P1^1
int cnt = 0;
int jd;void Time0Init()
{//1.		配置定时器0工作模式位16位计时TMOD = 0x01;//2.		给初值,定一个0.5出来TL0 = 0x33;TH0 = 0xFE;//3.		开始计时TR0 = 1; // 允许计时TF0 = 0; // 溢出中断标志,溢出置1//4.        打开定时器0中断ET0 = 1;//5.        打开总中断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 Delay500ms()		//@11.0592MHz
{unsigned char i, j, k;i = 4;j = 129;k = 119;do{do{while (--k);} while (--j);} while (--i);
}void main()
{Delay500ms(); //让硬件稳定一下Time0Init();jd = 1;        //初始角度是0度,0.5ms,溢出1就是0.5ms,高电平cnt = 0; //角度变了初始化cnt为0sg90_con = 1;//一开始从高电平开始//每隔两秒切换一次角度while(1){jd = 4;     //135度 2ms高电平cnt = 0;Delay2000ms();jd = 1;    //0度cnt = 0;Delay2000ms();}
}//定时器0的中断函数
void Time0Handler() interrupt 1
{cnt++;  //统计爆表的次数. cnt=1的时候,报表了1//重新给初值TL0 = 0x33;TH0 = 0xFE;//控制PWM波if(cnt < jd){   sg90_con = 1;}else{sg90_con = 0;}//20ms的周期if(cnt == 40){//爆表40次,经过了20mscnt = 0;  //当100次表示1s,重新让cnt从0开始,计算下一次的1ssg90_con = 1;}
}

4.3.1

        用外部中断来控制震动传感器模块,因为我们用查询的方式,电平的传递是非常的急促的,不稳定,导致CPU在数数的时候检测不到震动传感器模块;我们可以选择利用外部中断,一旦外部发生震动,外部震动函数立马标记1;查到标记为1,开盖;然后恢复标记为0

4.3.2

        打开外部中断

        外部中断0中断允许位。EX0 = 1,允许中断,EX0 = 0禁止中断

代码:

#include "reg52.h"
#include <intrins.h>sbit D5   		= P3^7;//
sbit D6   		= P3^6;
sbit SW1      = P2^1;
sbit Trig 		= P1^5;
sbit Echo 		= P1^6;
sbit sg90_con = P1^1;  //
sbit vibrate  = P3^2;
sbit beep     = P2^0;char cnt = 0;
char jd;
char mark_vibrate = 0;
int jd_back;void Delay10us()		//@11.0592MHz
{unsigned char i;i = 2;while (--i);
}void Delay150ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 2;j = 13;k = 237;do{do{while (--k);} while (--j);} while (--i);
}void Delay200ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();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 Time0Init()
{//1.		TMOD &= 0xF0;TMOD |= 0x01;//2.		TL0 = 0x33;TH0 = 0xFE;//3.		TR0 = 1; // TF0 = 0; // //4.´ò¿ª¶¨Ê±Æ÷0ÖжÏET0 = 1;EA = 1;
}void Time1Init()
{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;Delay200ms();StartHC();//while(Echo == 0); ////TR1 = 1;//while(Echo == 1); ////TR1 = 0;//time = (TH1 * 256 + TL1 )*1.085;//340m/s == 34000cm/s == 34cm/ms = 0.034cm/usreturn (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_back != jd){cnt = 0;beep = 0;for(n = 0;n<2;n++)Delay150ms();beep = 1;Delay2000ms();}jd_back = jd;
}void Closedusbin()
{jd = 1;cnt = 0;Delay150ms();
}void EX0_Init()
{//EX0 = 1;//IT0 = 0;
}void main()
{double dis;Time0Init();Time1Init();EX0_Init();initSG90_0();//while(1){//³¬Éù²¨²â¾àdis = get_distance(); if(dis < 10 || SW1 == 0 || mark_vibrate == 1){/OpenstatusLight();Opendusbin();mark_vibrate = 0;}else{/ClosestatusLight();Closedusbin();}}
}void Time0Handler() interrupt 1
{cnt++;   TL0 = 0x33;TH0 = 0xFE;if(cnt < jd){   sg90_con = 1;}else{sg90_con = 0;}//if(cnt == 40){ //cnt = 0;  //sg90_con = 1;}
}void EX0_Handler() interrupt 0  //
{mark_vibrate = 1;
}

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

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

相关文章

英语学习笔记12——名词所有格的运用

Whose is this … ? This is my/your/his/her … 这……是谁的&#xff1f;这是我的 / 你的 / 他的 / 她的…… Whose is that … ? That is my/your/his/her … 那……是谁的&#xff1f;那是我的 / 你的 / 他的 / 她的…… 词汇 Vocabulary father n. 爸爸 口语&#xf…

算法题解记录25+++验证二叉搜索树(百日筑基)

题目描述&#xff1a; 难度&#xff1a;中等 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必…

十二种网络威胁防护方案

一、SQL注入 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服务器执行非授权的任…

基于网络的无人海洋船舶控制

书籍&#xff1a;Network-Based Control of Unmanned Marine Vehicles 作者&#xff1a;Yu-Long Wang&#xff0c;Qing-Long Han&#xff0c;Chen Peng&#xff0c;Lang Ma 出版&#xff1a;Springer 书籍下载-《基于网络的无人海洋船舶控制》控制系统中的通信网络可能引起延…

解决在Outlook中预定Teams会议不显示入会链接的问题

今天遇到一个很蛋疼的teams问题&#xff0c;花了点时间才解决。本来以为是很简单的问题&#xff0c;随便网上冲浪一下就能找到答案的&#xff0c;结果根本就没有好的解决方案&#xff0c;所以我分享出来希望后来的老哥少走点弯路。 问题描述 简单来说&#xff0c;就是在Outlo…

Star CCM+衍生零部件的创建

前言 在一个仿真计算项目中&#xff0c;分配零部件至区域、划分网格后。下一步可以先将需要监测的点、面建立出来&#xff0c;方便后续创建报告。Star中需要创建点、面是在衍生零部件下创建。衍生零部件→右键→新建&#xff08;如下图1所示&#xff09;。通过衍生零部件可以创…

15集合的应用

集合的概念 集合是一个容器&#xff0c;可以容纳其他类型的数据&#xff0c;前面所讲的数组就是一个集合。 所有的集合相关的类和接口都在java.util包下 特点 集合不能直接存储基本数据类型(但是代码上不需要体现&#xff0c;因为Java中有自动装箱)另外集合不能直接存储Java…

etcd集群恢复、单节点恢复操作手册

一、集群备份 备份方式&#xff1a;Jenkins触发每小时的定时任务&#xff0c;通过调取ansible的playbook进行etcd集群的数据备份和上传&#xff0c;默认只备份集群中的非leader成员&#xff0c;避免leader成员压力过大。将备份数据上传到对应的公有云对象存储&#xff0c;分别…

2024初会押题来了!经济法和实务,内部资料,赶快做一做!

初级会计考试考前冲刺策略 1. 核心知识点掌握 考前冲刺首先需要对核心知识点进行梳理和重点复习。《初级会计实务》和《经济法基础》是考试的两个主要科目&#xff0c;考生需要确保对其中的高频考点有深刻的理解。 2. 高效记忆技巧 对于容易遗忘的知识点&#xff0c;可以采用…

Bootloader+升级方案

随着设备的功能越来越强大&#xff0c;系统也越来越复杂&#xff0c;产品升级也成为了开发过程不可或缺的一道程序。在工程应用中&#xff0c;如何在不更改硬件的前提下通过软件的方式实现产品升级。通过Bootloader来实现固件的升级是一种极好的方式&#xff0c;Bootloader是单…

Springboot HelloWorld

新建一个maven工程 引入依赖项 <modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.11.RELEASE</version><…

ST表(静态RMQ问题)

static Range Max/Min Query ST表 利用的是动态规划的思想 状态&#xff1a; //st[i][j]-->区间长度为1<<j&#xff0c;在区间[i,i1<<j-1]上的最值 状态转移方程&#xff1a; st[i][j]max(st[i][j-1],st[i(1<<j-1)][j-1]);#include <iostream> #inc…