1.项目接线

接线示意图和实物图

示意图:

实物图:

信号传输路线

路线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口,变量名vibrate2.sbit指令找到P1这个I/O口组的第2位,将p1.2口作为输入口,接入433接收模块的DO口,这个口对应遥控器的按键A,变量名是remote433_D03.sbit指令找到P1这个I/O口组的第3位,将p1.3口作为输入口,接入433接收模块的D1口,这个口对应遥控器的按键B,变量名是remote433_D14.sbit指令找到P1这个I/O口组的第1位,将P1.1口作为输出口,接上继电器的IN引脚,变量名是relayf1. 延时函数,用于进入警报模式后长响2s: void Delay2000ms();
    f2. 延时函数,用于进入警报模式后长响1s: void Delay1000ms();
    f3. 延时函数,用于警报模式下受到振动后长响5s: int Delay5000ms(); //针对BUG对其进行了修改1. while死循环,查询法,/* 如果按下遥控器的A按键,设定为报警模式 */1.1 判断是否按下按键A: 判据是 remote433_D0 == remote_ON1.1.1 如果是,则说明按下修改代表警报是否开启的标志位循环变量alarmFlag: alarmFlag = alarm_ON;接通继电器: relay = 0;让喇叭响两秒,作为提示音: Delay2000ms();断开继电器: relay = 1;1.1.2 否则,就啥也不干/* 如果按下遥控器的B按键,设定为关闭报警模式 */1.2 判断是否按下按键B: 判据是 remote433_D1 == remote_ON1.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 == 01.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);
    }
    

51电动车报警器.md相关推荐

  1. 电动车报警器实现就是这么简单(教程里面提供源码)

    前言: 上篇博客中简单写了一下初识单片机,实现了点灯入门.博文结尾谈到了将会在接下来的博客中记录用C51单片机做一些项目教程.今天就来开始一下我们的入门级项目--电动车报警器实现. 话不多说,先来看一 ...

  2. 【C51】03-简易电动车报警器

    硬件模块: 这里软件生成的延时函数nop不识别要添加头文件 #include <intrins.h> 01-震动传感器 亮灯 震动传感器讲解:DO口 不震动-输出高电平1 震动-输出低电平 ...

  3. 入门项目·电动车报警器

    文章目录 目录 前言 1.3.1 硬件清单列表 1.3.2 振动传感器控制灯 1.3.3 继电器工作逻辑 1.3.4 遥控发送接收433M 1.3.5 项目开发 二. 定时器 1.4 简介 1.5 定 ...

  4. C51_day3:入门项目电动车报警器

    1. 硬件清单列表 :振动传感器模块:继电器模块:433M无线模块: 反应出来的代码都是高低电平,跟以上学习按键,LED并没有区别但是!做出来有乐趣,好玩刺激! 2.振动传感器控制灯 振动传感器结构: ...

  5. 状态机设计模式:电动车报警器项目实战

    本章将带领大家掌握在嵌入式软件开发中,如何对新项目需求进行软件架构设计,其中包括软件概要设计,软件功能需求分解,功能流程图设计等.  点赞超过100,加速更新,点赞关注,敬请期待..

  6. 基于STM32电动车报警器

    硬件连线 IO口初始化 核心代码 #define J_OFF 0 #define J_ON 1 //重写中断服务函数,如果检测到EXTI中断请求,侧进入此函数 void HAL_GPIO_EXTI_C ...

  7. STM32电动车报警器

    目录 项目需求 项目框图 硬件清单 振动传感器介绍及实战 振动传感器介绍 振动传感器编程实现 继电器介绍及实战 继电器工作原理 433M无线发射接收模块介绍及实战 433M无线发射接收模块介绍 ​编辑 ...

  8. STM32——06-STM32电动车报警器

    项目需求 点击遥控器 A 按键,系统进入警戒模式,一旦检测到震动(小偷偷车),则喇叭发出声响报警, 吓退小偷. 点击遥控器 B 按键,系统退出警戒模式,再怎么摇晃系统都不会报警,否则系统一直发出尖叫, ...

  9. 51单片机入门项目总结:简易版防盗报警器

    好久没有更新博客了,今天开始有时间就写写博客,总结一下之前做过的项目,以及对一些技术的思考.因为目前做过的项目都是为了学习单片机的某个知识点而做的,完成程度并不完整,后面也会对这些做过的项目进行完善和 ...

最新文章

  1. 刚刚!2020世界大学学术排名正式发布:中国内地144所大学上榜!
  2. 谈Objective-C Block的实现
  3. select查询中@作用_SQL学习第四关:复杂查询
  4. 业务系统实现记住密码和自动登录功能
  5. Mysql 字符操作函数相关
  6. poll/epoll/keyed-poll/keyed-epoll的唤醒--分层次的解决方案
  7. webpack打包vue2.0项目时必现问题
  8. POJ3753 根据关键字进行字符串拷贝【文本处理】
  9. mysql systemctl开机启动_Linux 开机启动项命令:chkconfig 和 systemctl
  10. 控制理论基础(1)--控制工程概述
  11. 这一次的互联网寒冬,又会有多少人倒下?
  12. 2019年5款你必须知道的顶级ASO优化工具
  13. python安卓模拟器图像识别_Android模拟器识别检测技术
  14. 那些酷炫的网页你也可以做到——第六篇(表单标签)
  15. 如何快速找出一个数组中最大数和第二大数
  16. linux x86_64和linux aarch64如何选择
  17. WordPress数据库连接错误解决方案!
  18. python里defoults_Python Part.Compound方法代码示例
  19. Linux中ifconfig命令失效
  20. pscp上传文件至服务器

热门文章

  1. 2001太空漫游 2001: A Space Odyssey(1968)
  2. js input框只能输入大于0的正整数
  3. 【算法】约瑟夫环原理及其公式
  4. 使用setInterval遇到的陷阱
  5. php中的?= ?替换?php echo ?
  6. oracle中的split用法,oracle中split的使用
  7. office2013安装不上,错误1402。安装程序无法打开注册表项 UNKNOWN\Components\cc55ba............
  8. 无法启动计算机上的服务器,服务器不能启动的几种解决方案
  9. 速卖通店铺“潜力爆品的运营策略”有哪些?
  10. vue项目执行npm run dev 后没有自动弹出网页问题