使用STM32 再实现电动车防盗钥匙扣

news/2024/5/12 14:33:19/文章来源:https://blog.csdn.net/mjmmm/article/details/131587813

实现目标

1. 点击遥控器 A 按键,系统进入警戒模式,一旦检测到震动(小偷偷车),则喇叭发出声响报警

2. 点击遥控器 B 按键,系统退出警戒模式,再怎么摇晃系统都不会报警

硬件介绍

1. 震动传感器

产生震动时,会输出低电平,绿色指示灯亮(开关信号指示灯)

2. 继电器模块

 (VCC 3.3V)当左侧IN输入低电平时,右侧的ON 和 COM会导通,左上的绿灯会亮

3. 遥控收发 433M

发送端按下ABCD会在接收端被芯片调制解调,最终解析成不同的信号来识别,接收端的D0, D1, D2, D3 对应A,B,C,D,收到哪个对应的信号,相应的引脚就会给出高电平。

CubeMX配置

1. 惯例配置

 

2. 由于震动传感器的DO口接到了PA4,所以将PA4配置成中断模式,且由于DO口拉低代表有震动,所以将模式改为下降沿触发

 

 3. 配置其他需要使用到的GPIO口, 433M的D0和D1都是上升沿触发无需修改

4. 在NVIC中打开中断: 

 

5. 惯例设置并生成代码

Keil5 代码实现

打开stm32f1xx_it.c --> EXTI4(9_5)_IRQHandler() --> HAL_GPIO_EXTI_IRQHandler() --> HAL_GPIO_EXTI_Callback( )

 

 HAL_GPIO_EXTI_Callback()就是中断处理程序,将他在main.c中重写

注意,如果直接在中断服务函数里调用 HAL_Delay 函数,则会造成系统卡死。 

原因:程序初始化时默认把滴答定时器的中断优先级设为最低,其它中断源很容易打断它导致卡死,也就是说当Delay函数在进行中的时候,如果又发生了震动触发了外部中断,就会又立刻执行这个中断处理程序,导致喇叭一直在响无法停下。

解决办法:

在 main 函数里使用以下函数提高滴答定时器的中断优先级(提升至0);

HAL_NVIC_SetPriority(SysTick_IRQn,0,0); //必须写在" SystemClock_Config() "后面!!!

并且在CubeMX中将 EXTI4 的中断优先级设置比滴答定时器的中断优先级高,比如 2; 将433M的 D0和D1的抢占优先级设为1

  

然后重新生成代码,Keil中此时会自动弹出这个对话框问是否要重载,选择

此时会将刚刚Cube中做出的修改反映到Keil中,并保留之前在Keil中自己写的代码!

//代码仅展示需要自己写的部分,其他自动生成的部分没有展示!
#define secure_ON 1
#define secure_OFF 0void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //外部中断的处理函数
{static int status = secure_OFF; //此处一定要加static,不然每次调用这个函数都要再赋值一遍//一根中断线上接有多个中断源,判断中断源是否来自PA4if((GPIO_Pin == GPIO_PIN_4) && (status == secure_ON)){//如果检测到PA4被拉低,且模式为警戒模式,则继电器打开,喇叭响;没有检测到则不响if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET){HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET); //继电器导通HAL_Delay(1000); //延时1秒HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); //继电器断开}else{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); //继电器断开}}if(GPIO_Pin == GPIO_PIN_6){ //D0,对应按键A,按下进入禁戒模式if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET){status = secure_ON;}}if(GPIO_Pin == GPIO_PIN_7){ //D1,对应按键B,按下退出禁戒模式if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_SET){status = secure_OFF;}}
}

实现效果

可见,在按下A键后,系统进入警戒模式,继电器会对震动有反应,当按下B键后,解除警报,继电器对震动无反应。 

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

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

相关文章

解决uniapp运行手机基座出现的问题

常见的问题:(往往在更新编辑器版本后会出现以下问题) 问题1.明明已经连接到手机,就是检测不到设备 问题2.同步资源失败,未得到同步资源的授权 解决办法汇总 问题1解决办法: 方法一:进入HBuild…

【socket编程】TCP服务器、UDP服务器、本地套接字【C语言代码实现】

目录 0. 准备知识 0.1 大小端概念 0.2 网络字节序和主机字节序的转换 0.3 点分十进制串转换(IP地址转换函数) 0.4 IPV4结构体:(man 7 ip) 0.5 IPV6套接字结构体:(man 7 ipv6) …

实现跨语言互动:如何在Python中调用Java的JavaParser库解析Java源代码

1、背景 在多语言开发环境中,我们经常需要进行跨语言的操作。有时,我们可能会在Python环境下需要使用Java的库或者功能。这个博客将展示如何在Python中调用Java的JavaParser库来解析Java源代码。 2、需求 在许多软件开发场景中,我们可能需…

【算法与数据结构】239、LeetCode滑动窗口最大值

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:这道题我们如果用暴力破解法需要 O ( n ∗ k ) O(n*k) O(n∗k)的复杂度。思索再三,我们需要…

【新版系统架构】第十九章-大数据架构设计理论与实践

大数据处理系统架构 大数据处理系统面临挑战 如何利用信息技术等手段处理非结构化和半结构化数据如何探索大数据复杂性、不确定性特征描述的刻画方法及大数据的系统建模数据异构性与决策异构性的关系对大数据知识发现与管理决策的影响 大数据处理系统架构特征 鲁棒性和容错…

【基于FPGA的芯片设计】RISC-V的20条指令CPU设计

实验板卡:xc7a100tlc sg324-2L,共20个开关 实验要求:

危机现场 | 如果给你25万美元,你会登上泰坦号吗?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 小黑 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 这是我们更名为记者下班后的第一期节目,临时把危机现场(原为死神来了&#xff09…

音视频编码实战-------pcm+yuv数据转成MP4

文章目录 1.编码流程图2.相关模块及函数2.1 编码器相关API2.2 复用器相关API2.3 重采样相关API注意点 简单的编码流程相关代码 1.编码流程图 2.相关模块及函数 2.1 编码器相关API avcodec_find_encoder: 根据编码器ID查找编码器 avcodec_alloc_context3:创建编码器上下文 avc…

【Arduino小车实践】PID应用之四驱小车

一、 PID公式 二、 PID应用的必要性 1. 四驱小车运动 左边两个驱动轮和右边两个驱动轮的速度相同直线右边轮子的速度大于左边轮子的速度左偏右边轮子的速度小于左边轮子的速度 右偏 2. 产生多种运动的原因 小车的4个电机,减速箱以及车轮在物理层面上存在误差&am…

【文章系列解读】Nerf

1. Nerf NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 2020年8月3日 (0)总结 NeRF工作的过程可以分成两部分:三维重建和渲染。(1)三维重建部分本质上是一个2D到3D的建模过程&#xff…

两种传输层协议TCP和UDP【图解TCP/IP(笔记十二)】

文章目录 两种传输层协议TCP和UDPTCP与UDP区分UDP的特点及其目的TCP的特点及其目的 两种传输层协议TCP和UDP 在TCP/IP中能够实现传输层功能的、具有代表性的协议是TCP和UDP。 ■ TCP TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排…

排序算法笔记-归并排序

归并排序 简介 通过找到中间值,然后递归分别从左区间和右区间找中间值,最终将所给的值划分为单个块,然后进行一步一步回溯,分块由两个单个分区排序后合成一个,以此类推,最后实现有序排序 时间复杂度 最…

计算机网关原理、子网掩码原理(路由器、交换机)(网关:与以太网接口关联的路由)

文章目录 网关网关的历史网关的功能网关的原理相关疑问为什么用子网掩码与IP地址进行与运算来确定一个IP地址所属的子网?网关地址是谁定的,是配置路由的人随意定的吗?(配置人员定的)如何正确设置网关地址(路…

[MySQL]MySQL内置函数

[MySQL]MySQL内置函数 文章目录 [MySQL]MySQL内置函数1. 日期函数2. 字符串函数3. 数学函数4. 其他函数 1. 日期函数 常用日期函数如下: 函数名称描述current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳now()获取当前日期时…

无法将“pip“识别为cmdlet、函数、脚本文件或可运行程序的名称。

出现问题如下: 出现问题原因: 没有添加pip对应的安装目录进入环境变量里面的系统变量。 解决方案: 1.确定python的安装路径 将python的路径添加到系统变量中 2.输入pip所在的安装路径: python路径\Lib\site-packages 3.添加…

如何执行Photoshop脚本

环境 Photoshop: CC2017 OS: Windows 10 脚本放置位置 C:\Program Files\Adobe\Adobe Photoshop CC 2015\Presets\Scripts #也就是 PS的安装目录\Presets\Scripts

程序员,到美国!赚美元!!!

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Python 和 RabbitMQ 进行消息传递和处理

一、RabbitMQ 简介 RabbitMQ 是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP)标准。它的官方客户端提供了多种编程语言的接口,包括 Python、Java 和 Ruby 等。它支持消息的持久化、多种交换机类型、消息通知机制、灵活…

Orange pi3初调试

因为树莓派沦为理财产品1年前出手殆尽后,现在唯一一个B性能不足一直没动力调试,沦为吃灰工具。 偶然之间多多给推了个orange产品预售,看了下pi3的参数,这不和赚了差价的3B一个性能吗?果断定了个预售款,在差…

2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】

🎈前言 为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理了新的内容,并对之前的版本中有些模糊的地方进行了纠正。此篇文章为Unity所有面试题模块的目录导航文章,全网最全的 Unity 面试题 都在这里了…