51电动车报警器.md

news2024/10/7 4:30:42

1.项目接线

接线示意图和实物图

示意图:

image-20230416140422175

实物图:

image-20230416162747903

信号传输路线

路线1: 433遥控信号 ——> 433接收模块D0引脚以及D1引脚 ——> 单片机P1^2引脚以及P1^3引脚 ——> 单片机P1^1引脚 ——> 继电器IN引脚 ——> 继电器COM口和NO口 ——> 高功率喇叭(负载)所在电路

路线2:振动信号 ——> 振动传感器DO引脚 ——> 单片机P3^3引脚 ——> 单片机P1^1引脚 ——> 继电器IN引脚 ——> 继电器COM口和NO口 ——> 高功率喇叭(负载)所在电路


2.项目实现流程

基本控制逻辑

  1. 业务需求
  • 功能1:遥控器按下按键,上锁,并长响一声示意。

  • 功能2:上锁后,如果振动传感器检测到振动后(被人骑走,被人推倒),导通继电器,继电器控制高功率喇叭开始报警。

  • 功能3:遥控器按下按键,解锁,并短响一声示意,之后发生振动也不会报警。

  • 功能4:电动车被人偷走,手机app打开地图显示电动车位置(高阶功能,现在不考虑

  1. 控制逻辑: 可以看出本简易项目包含两种模式
  • 警报模式
    • 振动后报警
    • 强制解除报警
  • 解除警报模式

Debug成功,完事

代码心得:

  • 本代码使用查询法,查询法中加入警报标志位alarmFlag。(也可以不定义警报标志位)
  • I/O口连得一多(负载多的时候),我的51单片机中间那部分VCC和GND引脚如果出于连接状态好像会阻止程序烧录,所以需要停止下载,然后拔掉那部分杜邦线,等到程序烧录完成后再接回去。

可以优化的地方:

  • 假如你多次重复按下同一个按键,提示音不会继续响。
  • BUG:我们面对“警报模式中一直受到振动后无法用按键立马解除警报模式”这一问题,也就是信号丢失问题,我们以下代码的解决方法对从STC-ISP的程序延时计算器中拷贝来的延时函数进行修改,加一个判断。更好的解决方法是用中断的方法,因为一直振动导致的结果不就是程序一直在数数嘛,那么我们遇到变故后先把数数这段代码挂起,强制去执行别的代码。我们以后会学到。
  1. 思路:

    宏定义:
        #define remote_ON  1    //根据433接收模块信号表现,高电平代表接收到信号,代表按键按下
    	#define alarm_ON   1	//代表进入警报模式
    	#define alarm_OFF  0	//代表关闭警报模式
    全局变量:
    	1.sbit指令找到P3这个I/O口组的第3位,将p3.3口作为输入口,接入振动传感器的DO口,变量名vibrate
        2.sbit指令找到P1这个I/O口组的第2位,将p1.2口作为输入口,接入433接收模块的DO口,这个口对应遥控器的按键A,变量名是remote433_D0
        3.sbit指令找到P1这个I/O口组的第3位,将p1.3口作为输入口,接入433接收模块的D1口,这个口对应遥控器的按键B,变量名是remote433_D1
        4.sbit指令找到P1这个I/O口组的第1位,将P1.1口作为输出口,接上继电器的IN引脚,变量名是relay
    
    f1. 延时函数,用于进入警报模式后长响2s: void Delay2000ms();
    f2. 延时函数,用于进入警报模式后长响1s: void Delay1000ms();
    f3. 延时函数,用于警报模式下受到振动后长响5s: int Delay5000ms(); //针对BUG对其进行了修改
            
    1. while死循环,查询法,
        /* 如果按下遥控器的A按键,设定为报警模式 */
        1.1 判断是否按下按键A: 判据是 remote433_D0 == remote_ON
            1.1.1 如果是,则说明按下
            		 修改代表警报是否开启的标志位循环变量alarmFlag: alarmFlag = alarm_ON;
                	 接通继电器: relay = 0;
    				 让喇叭响两秒,作为提示音: Delay2000ms();
    				 断开继电器: relay = 1;
            1.1.2 否则,就啥也不干
        /* 如果按下遥控器的B按键,设定为关闭报警模式 */
        1.2 判断是否按下按键B: 判据是 remote433_D1 == remote_ON
            1.2.1 如果是,则说明按下
            	  	 修改代表警报是否开启的标志位循环变量alarmFlag: alarmFlag = alarm_OFF;
                	 接通继电器: relay = 0;
    				 让喇叭响一秒,作为提示音: Delay1000ms();
    				 断开继电器: relay = 1;
            1.2.2 否则,就啥也不干(不管有没有受到振动)
        /* 如果警报模式下发生振动,喇叭响 */
        1.3 通过alarmFlag判断是否处于报警状态
            1.3.1 如果是,
            	1.3.1.1 接着判断是否感应到振动: 判据是 vibrate == 0
                    1.3.1.1.1 如果是,则说明需要警报
                    	 接通继电器: relay = 0;
    					 让喇叭响五秒: Delay5000ms();
    					 让喇叭响五秒: Delay5000ms();
    				1.2.1.1.2 否则,说明没有受到振动
                         断开继电器: relay = 1;
            1.3.2 否则,就啥也不干
    
    
    
  2. 代码:

    #include "reg52.h"
    #include "intrins.h"
    
    #define remote_ON  1    //根据433接收模块信号表现,高电平代表接收到信号,代表按键按下
    #define alarm_ON   1	//代表进入警报模式
    #define alarm_OFF  0	//代表关闭警报模式
    
    sbit vibrate      = P3^3; //p3.3口作为输入口,接入振动传感器的DO口
    sbit remote433_D0 = P1^2; //P1.2口作为输入口,接入433接收模块的DO口,这个口对应遥控器的按键A
    sbit remote433_D1 = P1^3; //P1.3口作为输入口,接入433接收模块的D1口,这个口对应遥控器的按键B
    sbit relay        = P1^1; //P1.1口作为输出口,将电平信号输出给继电器(低电平触发)
    
    /* API1: 延时函数,用于进入警报模式后长响1s */
    void Delay2000ms();
    /* API2: 延时函数,用于解除警报模式后短响0.5s */
    void Delay1000ms();
    /* API3: 延时函数,用于警报模式下受到振动后长响4s */
    int Delay5000ms();
    
    int main(void)
    {
    	char alarmFlag = alarm_OFF;
        /* 查询法 */
        while(1){
    		/* 如果按下遥控器的A按键,设定为报警模式 */
            if(remote433_D0 == remote_ON){
    			alarmFlag = alarm_ON;
                relay = 0;  
    			Delay2000ms();
    			relay = 1;
            }
    		/* 如果按下遥控器的B按键,设定为关闭报警模式 */
    		if(remote433_D1 == remote_ON){
                alarmFlag = alarm_OFF;
                relay = 0;  
    			Delay1000ms();
    			relay = 1;
            }
    		/* 如果警报模式下发生振动,喇叭响 */
    		if(alarmFlag == alarm_ON){
    			if(vibrate == 0){
    				relay = 0;
    				Delay5000ms();
    				relay = 1;
    			}else{
    				relay = 1;
    			}
    		}
        }
        return 0;
    }
    
    void Delay2000ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	_nop_();
    	i = 15;
    	j = 2;
    	k = 235;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    void Delay1000ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	_nop_();
    	i = 8;
    	j = 1;
    	k = 243;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    int Delay5000ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	_nop_();
    	i = 36;
    	j = 5;
    	k = 211;
    	do
    	{
    		if(remote433_D1 == remote_ON){
    			return 0;
    		}
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    

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

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

相关文章

安全防御 --- 防火墙高可靠技术

防火墙高可靠技术(双机热备) VRRP:负责的单个接口的故障检测和流量引导。每个VRRP备份组拥有一个虚拟的IP地址,作为网络的网关地址;在VRRP主备倒换时通过发送免费的ARP来刷新对接设备的MAC地址转发表来引导流量。VGMP&…

SSVEP解码算法 - 多变量同步指数(MSI)

1 算法来源 该算法来自电子科技大学张杨松博士,针对该算法的计算在张博士的博士论文中有详细介绍,有兴趣的读者可以下载阅读,本文重点在对该方法的代码实现。Zhang, Yangsong, et al. “Multivariate synchronization index for frequency recognition of SSVEP-based brain…

Mysql 8 VS Mariadb 10.6 他们有多不一样 (声译)

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

获取List集合中的最大值和最小值

实现获取List集合中的最大值和最小值共有以下两种方式,根据自己的场景选择合适的方法。 目录 Collections 1、String、Integer、Double类型 2、对象类型 排序 1、Integer类型 2、 基本排序方式: Collections 1、String、Integer、Double类型 当…

如何使用Edge Copilot

在ChatGPT红得发紫年代,也应该了解下微软microsoft edge浏览器中的Copilot。 通过这个Copilot - 副驾驶,Edge浏览器发生了革命性变化。 借助AI副驾驶强大的功能,在Edge浏览器中可以轻松完成AI聊天、AI写作、AI网页分析,和AI绘图…

【C++要笑着学】搜索二叉树 (SBTree) | K 模型 | KV 模型

C 表情包趣味教程 👉 《C要笑着学》 💭 写在前面:半年没更 C 专栏了,上一次更新还是去年九月份,被朋友催更很久了hhh 本章倒回数据结构专栏去讲解搜索二叉树,主要原因是讲解 map 和 set 的特性需要二叉搜索…

RPC框架一,RMI远程调用实例

RPC框架一,RMI远程调用实例 网上找了好久关于RMI调用的实例,大多都是本地调用的,远程调用的示例很少,所以自己整理一版。 首先 从server端开始: 服务端############### 具体步骤: 1,写个RM…

【从零学Python基础】Python中的条件判断与循环

文章目录条件语句语法格式缩进和代码块空语句pass循环语句while循环for循环continue与break条件语句 条件语句能够表达如果...则...否则...这样的语义,这即是计算机基础中的逻辑判定,条件语句也叫分支语句 如果 我好好学习:   我一定会找到…

wav2lip:Accurately Lip-syncing Videos In The Wild

飞桨AI Studio - 人工智能学习与实训社区集开放数据、开源算法、免费算力三位一体,为开发者提供高效学习和开发环境、高价值高奖金竞赛项目,支撑高校老师轻松实现AI教学,并助力开发者学习交流,加速落地AI业务场景https://aistudio…

CUDA编程基础与Triton模型部署实践

作者:王辉 阿里智能互联工程技术团队 近年来人工智能发展迅速,模型参数量随着模型功能的增长而快速增加,对模型推理的计算性能提出了更高的要求,GPU作为一种可以执行高度并行任务的处理器,非常适用于神经网络的推理计算…

电脑有自带的录屏功能吗?电脑录屏如何录人脸

案例:所有电脑都有自带的录屏功能吗? “在网上了解到电脑有录屏功能,但是我在我的电脑上又找不到。想问问小伙伴们是所有的电脑都有自带的录屏功能吗?怎样才能找到电脑自带的录屏功能?” 在日常使用电脑时&#xff0…

在 Visual Studio 中设置指针星号的位置

作为一个完美主义者,如果写出来的代码,让自己感觉到不那么舒服,你需要好好研究研究,如何解决这个问题。 在写代码的过程中,我碰到了这样的一个小问题。 一直以来,我对指针的星号的位置比较敏感&#xff0…

为什么软件架构重要?

作者:[美]伦巴斯等第2章为什么软件架构重要如果架构是答案,那么问题是什么?本章主要从技术角度讨论为什么架构重要。我们将研究13个重要原因。你可以利用它们来推动新架构的创建,或者对已有系统架构进行分析和优化。1)架构可以抑制…

守正创新 聚力前行 助力量化行业高质量发展 | 峰会资料文末获取

4月1日下午,ACLUB 2023专题峰会在上海陆家嘴圆满举行,近80家业内领先机构逾百人参加会议,其中上海地区优秀量化私募管理人占比七成。 本届峰会主题为“守正创新 聚力前行——助力量化行业高质量发展”。监管机构、券商、行业专家、三方机构、…

耳朵总是听到嗡嗡的声音 这是为什么 该怎么办

为什么会莫名听到嗡嗡的声音,这是什么因素导致的,吃什么药能缓解? 耳鸣,是一种缺乏外部声源情况下,耳内或颅内出现的嗡嗡、嘶鸣、车笛、喇叭等不成形的异常声幻觉。这种情况可能是一种声音,也可能是多种声音…

day25—编程题

文章目录1.第一题1.1题目1.2涉及的相关知识1.3思路1.4解题2.第二题2.1题目2.2思路2.3解题1.第一题 1.1题目 描述: 星际战争开展了100年之后,NowCoder终于破译了外星人的密码!他们的密码是一串整数,通过一张表里的信息映射成最终…

在Node终端实现NewBing对话功能

目录 前言 准备工作 工作原理 功能设计 实现过程 基础概念 代理 请求 socket 控制台输入模块 配置文件 bingServer请求 bingSocket消息 子线程入口部分 主线程部分 工具函数 效果展示 写在最后 前言 ChatGPT在当下已然成为炙手可热的话题了,随着…

MAX14866 16通道高电压模拟开关(不需要高电压供电)

总体介绍 MAX14866 是一个16通道高电压模拟开关,主要用在超声应用的高压多路传输中。 每一个通道的状态可以由一个高速的SPI接口控制,最高时钟为30MHz 详细介绍 MAX14866 是一个单刀单掷开关,以下是等效电路图 MAX14866由一个带有16位串…

什么是Lambda表达式?

什么是Lambda表达式 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。 匿名:它不像普通的方法那样有一个明确的名称&#xff1…

Ae:材质选项

在 Ae 中,一个图层开启 3D 之后,会多出几何选项 Geometry Options和材质选项 Material Options两个属性组。材质用于 3D 对象的表面,而材质选项就是这些表面的属性,支配着对象与光线交互的方式。展开材质选项的快捷键:…