51超智能开关盖垃圾桶

2024-04-02 04:20
文章标签 智能 开关 51 垃圾桶

本文主要是介绍51超智能开关盖垃圾桶,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个智能开关盖垃圾桶的系统涉及到了很多 8051 微控制器的知识点,其中包括:

  1. GPIO(通用输入输出):使用 sbit 定义了系统中使用的各种输入输出引脚,如LED、舵机、超声波模块、蜂鸣器、按键、遥控信号和震动传感器等。

  2. 定时器:通过 Time0Init()Time1Init() 函数初始化了定时器0和定时器1,用于在系统中实现时间延时和控制。

  3. 外部中断:使用 EX0_init() 函数初始化了外部中断0,用于检测震动传感器信号。

  4. PWM(脉冲宽度调制):定时器1中断服务程序 Time1Handler() 中使用了定时器1来控制舵机的角度,实现了舵机的转动,即实现了简单的 PWM 控制。

  5. 中断处理:实现了外部中断0的中断处理函数 INT0_Handler() 和定时器1的中断处理函数 Time1Handler(),用于处理来自震动传感器和定时器的中断信号。

  6. 延时函数:使用了 Delay10us()Delay200ms()Delay2000ms() 函数来实现微秒级和毫秒级的延时。

  7. I/O 控制:通过对不同引脚的读写操作,实现了对LED、舵机、超声波模块、蜂鸣器、按键、遥控信号和震动传感器等外部设备的控制和监测。

通过以上知识点的运用,这个系统成功地实现了智能开关盖垃圾桶的功能。

这个系统可以自动检测靠近、震动、按键按下或遥控信号等事件,并相应地打开垃圾桶盖子,伴随一声提示音,然后在2秒后自动关闭盖子。以下是该系统的代码解析以及功能总结。

/***********************************************************智能开关盖垃圾桶功能:1.检测靠近时,垃圾桶自动开盖并伴随滴一声,2秒后关盖2.发生震动时,垃圾桶自动开盖并伴随滴一声,2秒后关盖3.按下按键时,垃圾桶自动开盖并伴随滴一声,2秒后关盖4.按下遥控时,垃圾桶自动开盖并伴随滴一声,2秒后关盖by LanZhao2024/4/1
*************************************************************/
#include "reg52.h"
#include <intrins.h>sbit led1     = P3^6;
sbit led2     = P3^7;
sbit sg90_con = P1^0;
sbit Trig     = P1^1;
sbit Echo     = P1^2;
sbit beep     = P1^3;
sbit remote   = P1^4;
sbit key1     = P2^1;
sbit vibrater = P3^2;char cnt = 0; 		//int改为char,节省内存空间
char angle;			//角度
double time; 		//时间
double distance;    //距离
char angle_bak;		//角度标记
char mark_vibrate;  //震动信号标记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 Delay2000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 15;j = 2;k = 235;do{do{while (--k);} while (--j);} while (--i);
}//定时器0初始化
void Time0Init()
{//配置定时器0工作模式为01,16位TMOD &= 0xF0;TMOD |= 0x01;//从0开始计数TH0 = 0;TL0 = 0;
}//定时器0初始化
void Time1Init()
{//配置定时器1工作模式为01,16位TMOD &= 0x0F;TMOD |= 0x10;//从FE33开始计数TL1 = 0x33;TH1 = 0xFE;ET1 = 1;		//开定时器0中断EA = 1;			//开总中断TR1 = 1;		//开始计数TF1 = 0;		//溢出位置0
}//外部中断0初始化
void EX0_init()
{EX0 = 1; //打开外部中断0IT0 = 0; //配置外部中断0为低电平触发
}void Star_HC()
{//怎么让HC_SR04发送波//Trig ,给Trig端口至少10us的高电平	Trig = 0;Trig = 1;Delay10us();Trig = 0;
}void openDusbin()
{angle = 3;if(angle_bak != angle){cnt = 0;beep = 0;Delay200ms();beep = 1;Delay2000ms();}angle_bak = angle;
}void closeDusbin()
{angle = 1;angle_bak = angle;cnt = 0;Delay200ms();
}void openStatusLight()
{led1 = 0;led2 = 1;
}void closeStatusLight()
{led1 = 1;led2 = 0;
}double getDistance()
{//重置计数器TH0 = 0;TL0 = 0;	Delay200ms();	//给测距一点启动时间Star_HC();		//开始发波//怎么知道它开始发了//Echo信号,由低电平跳转到高电平,表示开始发送波while(Echo == 0);//波发出去的那一下,开始启动定时器TR0 = 1;//怎么知道接收了返回波//Echo,由高电平跳转回低电平,表示波回来了while(Echo == 1);//怎么算时间//Echo引脚维持高电平的时间!//波回来的那一下,我们开始停止定时器,计算出中间经过多少时间TR0 = 0;time = (TH0*256+TL0)*1.085;//怎么算距离//距离 = 速度 (340m/s)* 时间/2distance = 0.034*time/2;return distance;
}void initSG90_0()
{angle = 1;cnt = 0;sg90_con = 1;
}void main()
{double dis;Time0Init();	//定时器0初始化Time1Init();	//定时器1初始化EX0_init();		//外部中断0初始化initSG90_0();	//sg90舵机初始化,一开始角度为0while(1){dis = getDistance();//获取距离if(dis < 10 || key1 == 0 || mark_vibrate == 1 || remote == 1){openStatusLight();//开状态灯openDusbin();			//开盖			mark_vibrate = 0;}else{closeStatusLight();	//开状态灯closeDusbin();			//关盖}}
}//定时器1中断服务程序,控制20ms内的占空比
void Time1Handler() interrupt 3
{//爆表了cnt++; TL1 = 0x33;TH1 = 0xFE;if(cnt < angle){sg90_con = 1;}else{sg90_con = 0;}//爆表40次,一次0.5ms,40次等于20msif(cnt == 40){	cnt = 0; //cnt从0开始,计算下一个20mssg90_con = 1;}
}//外部中断0中断服务程序
void INT0_Handler() interrupt 0
{/*因为震动传感器的低电平时间太短了,很难被检测到,所以用硬件来检测中断,直接记住有过低电平*/mark_vibrate = 1;//触发中断后标记为1
}

 

代码解析

头文件和宏定义

  • 代码开头包含了 reg52.h<intrins.h> 头文件,用于引入 8051 微控制器的寄存器定义和内联汇编指令。
  • 使用 sbit 定义了系统中使用的各种输入输出引脚,如LED、舵机、超声波模块、蜂鸣器、按键、遥控信号和震动传感器等。

函数定义

  • Delay10us()Delay200ms()Delay2000ms() 函数实现了微秒级和毫秒级延时。
  • Time0Init()Time1Init() 函数分别初始化定时器0和定时器1。
  • EX0_init() 函数初始化外部中断0,用于检测震动传感器信号。
  • Star_HC() 函数用于触发超声波模块发送测距信号。
  • openDusbin()closeDusbin()openStatusLight()closeStatusLight() 函数分别控制垃圾桶盖子的开闭以及状态灯的亮灭。
  • getDistance() 函数用于获取超声波模块返回的距离值。
  • initSG90_0() 函数初始化舵机,将其角度归零。

主函数

  • 主函数中通过调用上述函数实现了系统的主要逻辑。
  • 不断地获取距离值,并根据距离值以及按键、遥控信号和震动传感器信号的状态来控制垃圾桶的开闭以及状态灯的亮灭。

中断处理函数

  • 定时器1中断服务程序 Time1Handler() 用于控制舵机的角度,实现舵机的转动。
  • 外部中断0中断服务程序 INT0_Handler() 用于检测到震动传感器信号时的处理。

 

这篇关于51超智能开关盖垃圾桶的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868951

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(