感应关盖垃圾桶项目

news2024/12/26 23:16:19

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; //保持低四位不变,高四位为0
	TMOD |= 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/us
		dis = 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为0
    sg90_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次,经过了20ms
							cnt = 0;  //当100次表示1s,重新让cnt从0开始,计算下一次的1s
							sg90_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;

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/us
		return (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;
	cnt = 0;
	beep = 0;
	for(n = 0;n<2;n++)
			Delay150ms();
	beep = 1;
	Delay2000ms();
}

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.coloradmin.cn/o/1655284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java项目之校园失物招领系统(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园失物招领系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 校园失物招领系统的主要…

springcloud -nacos实战

一、nacos 功能简介 1.1.什么是Nacos&#xff1f; 官方简介&#xff1a;一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 Nacos的关键特性包括&#xff1a; 服务发现和服务健康监测动态配置服务动态DNS服务服务及其元数…

【青龙面板教程】保姆级拉库 Faker库 以及依赖安装教程

青龙面板最新版拉库教程 新版青龙&#xff08;订阅&#xff09;拉库教程 拉库前请打开青龙面板-配置文件 第18行 GithubProxyUrl"" 双引号中的内容清空复制以下拉库命令即可。Faker2 助力池版【安全本地sign防CK泄漏】使用助力池请在群里发"助力池" 机器…

【翻译】Processing系列|(四)用 Android Studio 从 0 到 1 进行 Processing 安卓开发

原文链接&#xff1a;Processing for Android Developing with Android Studio 朋友跟我说官方教程里也写了该怎么用 Android Studio 开发&#xff0c;并且亲测可行。这种方式确实能开发出结构更加清晰、额外组件更加少的程序&#xff0c;比上一篇文章中直接克隆 Processing-An…

5G NR 吞吐量计算 and 4G LTE 吞吐量计算

5G NR Throughput References • 3GPP TS 38.306 V15.2.0 (2018-06) ➤J : number of aggregated component carriers in a band or band combination ➤Rmax : 948/1024 • For the j-th CC, Vlayers(j) is the maximum number of layers ➤Qm(j) : Maximum modulation orde…

韩顺平0基础学Java——第6天

p87-p109 运算符&#xff08;第四章&#xff09; 四种进制 二进制用0b或0B开头 十进制略 八进制用0开头 十六进制0x或0X开头&#xff0c;其中的A—F不区分大小写 10转2&#xff1a;将这个数不断除以2&#xff0c;直到商为0&#xff0c;然后把每步得到的余数倒过来&#…

【大数据】分布式数据库HBase下载安装教程

目录 1.下载安装 2.配置 2.1.启动hadoop 2.2.单机模式 2.3.伪分布式集群 1.下载安装 HBase和Hadoop之间有版本对应关系&#xff0c;之前用的hadoop是3.1.3&#xff0c;选择的HBase的版本是2.2.X。 下载地址&#xff1a; Index of /dist/hbase 配置环境变量&#xff1a…

虹科Pico汽车示波器 | 免拆诊断案例 | 2010款凯迪拉克SRX车发动机无法起动

故障现象 一辆2010款凯迪拉克SRX车&#xff0c;搭载LF1发动机&#xff0c;累计行驶里程约为14.3万km。该车因正时链条断裂导致气门顶弯&#xff0c;大修发动机后试车&#xff0c;起动机运转有力&#xff0c;但发动机没有着机迹象&#xff1b;多起动几次&#xff0c;火花塞会变…

《铁路出行更便捷:火车票预定审批系统的设计与应用》

在现代化的铁路交通管理中&#xff0c;火车票预定审批系统扮演着至关重要的角色。它不仅能够有效管理员工出差、培训等需要乘坐火车的行程&#xff0c;还能够提高审批效率&#xff0c;减少人力成本&#xff0c;确保出行安全。本文将探讨火车票预定审批系统的设计原则和应用场景…

如何使用Python下载哔哩哔哩(Bilibili)视频字幕

在本文中&#xff0c;我将向大家展示如何使用Python下载哔哩哔哩&#xff08;Bilibili&#xff09;视频的字幕。通过这个方法&#xff0c;你可以轻松地获取你喜欢的视频的字幕文件&#xff0c;方便学习和交流。 准备工作 在开始之前&#xff0c;我们需要安装一些必要的库&…

idea配置hive

idea配置hive 今天才知道&#xff0c;idea居然可以配置hive&#xff0c;步骤如下: view -> Tool Windows -> Database Database出来了之后&#xff0c;直接配置即可

Python爬虫获取豆瓣电影Top100

大家好&#xff0c;我是秋意零。 今天分析一篇&#xff0c;Python爬虫获取豆瓣电影Top100。 在此之前&#xff0c;我没有学习过爬虫&#xff0c;只有一丢丢的Python基础。下面效果的实现源码几乎没经过我&#xff0c;而是AI百老师。我主要负责了对应的调试以及根据我想要的功…

Spring Cloud Kubernetes 本地开发环境调试

一、Spring Cloud Kubernetes 本地开发环境调试 上面文章使用 Spring Cloud Kubernetes 在 k8s 环境中实现了服务注册发现、服务动态配置&#xff0c;但是需要放在 k8s 环境中才能正常使用&#xff0c;在本地开发环境中可能没有 k8s 环境&#xff0c;如何本地开发调试呢&#…

Logfire-Python可观测平台快速上手

我最近在优化之前的FastAPI接入可观测性平台&#xff0c;正好分享一下Pydantic团队推出的logfire&#xff0c;希望对大家的Python工程化有帮助。 Github: https://github.com/pydantic/logfire 官网链接: Pydantic Logfire Documentation Logfire是Pydantic团队推出的可观测…

免费思维13招之三:赠品型思维

免费思维13招之三:赠品型思维 这节来学习一下免费模式中的三个子思维——赠品型思维、主副型思维和分级型思维。这三个思维有一个共同的名字又叫——产品型思维。 什么是产品型思维?顾名思义,就是在产品上的商业思维。也就是说,通过某一产品的免费来吸引客户,而后进行其…

node.js对数据库mysql的连接与操作(增、删、改、查、五种SQL语法)

前提&#xff1a;先在vscode终端下载安装mysql&#xff1a;npm install mysql -save 步骤总结&#xff1a; (1)建立与数据库的连接 (2)做出请求&#xff1a; 实际上就是操作mysql里的数据。增删改查 insert、delete、updata、select (3)通过回调函数获取结果 一、什么是SQ…

嵌入式Linux的QT项目CMake工程模板分享及使用指南

在嵌入式linux开发板上跑QT应用&#xff0c;不同于PC上的开发过程。最大的区别就是需要交叉编译&#xff0c;才能在板子上运行。 这里总结下嵌入式linux环境下使用CMake&#xff0c;嵌入式QT的CMake工程模板配置及如何使用&#xff0c;分享给有需要的小伙伴&#xff0c;有用到的…

多角度解析动态住宅IP的多元化应用

动态住宅IP指的是在住宅网络中使用的、能够随时间或用户需求配置的IP地址&#xff0c;能够根据网络状况自动调整&#xff0c;为用户提供更加灵活、高效的上网体验。这种IP地址不是固定不变的&#xff0c;而是会定期自动更换&#xff0c;这种IP地址也让使用者的安全得以保障。 作…

从0开始学习python(六)

目录 前言 1、循环结构 1.1 遍历循环结构for 1.2 无限循环结构while 总结 前言 上一篇文章我们讲到了python的顺序结构和分支结构。这一章继续往下讲。 1、循环结构 在python中&#xff0c;循环结构分为两类&#xff0c;一类是遍历循环结构for&#xff0c;一类是无限循环结…

docker 部署etcd集群

docker 部署etcd集群 往期内容 ETCD 简介 前言 上期我们对于分布式kv存储中间件有了简单的认识&#xff0c;本期简单介绍docker-compose 部署etcd集群以及可视化工具 etcd Keeper 1-etcd docker 部署 看了很多网上部署的教程&#xff0c;要么超级简陋&#xff0c;要么搞一堆…