STM32项目分享:车辆防盗报警系统
目录一、前言二、项目简介1.功能详解2.主要器件三、原理图设计四、PCB硬件设计PCB图五、程序设计六、实验效果七、包含内容项目分享一、前言项目成品图片哔哩哔哩视频链接https://www.bilibili.com/video/BV1zJk7BQEpX/?spm_id_from333.337.search-card.all.clickvd_sourcea90461cae133c0c360a3780433efae62资料分享见文末二、项目简介1.功能详解基于STM32的车辆防盗报警系统功能如下环境采集采集车辆发动机温度、是否受到撞击、是否有人闯入、GPS经纬度信息。显示功能环境数据显示在OLED屏幕上模式切换通过按键可以切换手动模式和自动模式自动模式当温度超过阈值时蜂鸣器报警提醒当防盗模式开启且光电红外传感器检测到有人闯入并且时扬声器播报“警告有人闯入”当震动传感器检测到车辆发生碰撞时扬声器播报“发生碰撞请注意安全”手动模式可以通过按键控制指示灯、蜂鸣器的开关阈值调节通过按键可设置温度阈值、和防盗模式是否打开APP通过WIFI连接手机APP可以接收车辆环境信息数据可切换模式和控制指令下发2.主要器件STM32F103C8T6最小系统板OLED显示屏4针IIC协议DS18B20温度传感器震动传感器GPS模块光电红外传感器ESP8266-01SWIFI模块JR6001语音模块蜂鸣器LED灯三、原理图设计四、PCB硬件设计PCB图五、程序设计#include stm32f10x.h #include led.h #include beep.h #include usart.h #include delay.h #include oled.h #include key.h #include Modules.h #include adcx.h #include flash.h #include usart2.h #include usart3.h #include timer.h #include TIM2.h #include GPS.h #include HW.h #include vibrative.h #include ds18b20.h #include esp8266.h /****************异方辰电子工作室****************** STM32 *文件 STM32车辆防盗报警系统 *版本 V1.0 *日期 2026.1.17 *MCU STM32F103C8T6 *接口 见代码 *BILIBILI 异方辰电子 *小红书 异方辰电子 *CSDN 异方辰电子 *授权IP 辰哥单片机设计、异方辰、YFC电子、北海单片机设计 **********************BEGIN***********************/ #define KEY_Long1 11 #define KEY_1 1 #define KEY_2 2 #define KEY_3 3 #define KEY_4 4 #define FLASH_START_ADDR 0x0801f000 //写入的起始地址 SensorModules sensorData; //声明传感器数据结构体变量 SensorThresholdValue Sensorthreshold; //声明传感器阈值结构体变量 DriveModules driveData; //声明驱动器状态结构体变量 uint8_t mode 1; //系统模式 1自动 2手动 3设置 u8 dakai;//串口3使用的传递变量 u8 Flag_dakai;//串口3接收标志位 uint8_t is_secondary_menu 0; // 0一级菜单1二级菜单 uint8_t secondary_pos 1; // 二级菜单光标位置1-3对应时/分/秒 uint8_t secondary_type 0; // 二级菜单类型0RTC时间1定时开启2定时关闭 uint8_t send_data[] A7:00001;//语音播放曲目1 uint8_t send_data1[] A7:00002;//语音播放曲目2 extern unsigned char p[16]; short temperature 0; //系统静态变量 //static uint8_t count_a 1; //自动模式按键数 uint8_t count_m 1; //手动模式按键数 static uint8_t count_s 1; //设置模式按键数 //static uint8_t last_mode 0; // 记录上一次的模式 //static uint8_t last_count_s 0; // 记录设置模式内上一次的页面 uint8_t auto_page 1; // 静态变量标记是否首次进入自动模式GPS页面 static uint8_t first_enter_auto_page2 0; extern uint8_t vib_valid_trigger; // 新增ESP8266发送频率控制 static uint32_t last_esp8266_send_time 0; // 上次发送数据的时间戳 #define ESP8266_SEND_INTERVAL 1000 // 发送间隔1000ms1秒1次 void ESP8266_SendAutoModeData(void); /** * brief 显示菜单内容 * param 无 * retval 无 */ enum { AUTO_MODE 1, MANUAL_MODE, SETTINGS_MODE }MODE_PAGES; int main(void) { SystemInit();//配置系统时钟为72M delay_init(72); // 系统时钟72MHz ADCX_Init(); LED_Init(); BEEP_Init(); BEEP_OFF; USART1_Config();//串口1初始化PC uart2_Init(115200); uart3_init(9600); Key_Init(); GPS_Init(); OLED_Init(); HW_Init(); Vibrative_Init(); OLED_Clear();//清屏 ESP8266_Init(); //flash读取 delay_ms(100); FLASH_ReadThreshold(); // 添加的状态管理变量 static uint8_t last_mode 0; // 记录上一次模式 static uint32_t last_sensor_time 0; // 传感器扫描时间控制 static uint32_t last_display_time 0; // 显示刷新时间控制 //超过以下值恢复默认阈值 if (Sensorthreshold.tempValue 40 || driveData.Safe_Flag 1 ) { FLASH_W(FLASH_START_ADDR, 30, 0); FLASH_ReadThreshold(); } TIM2_Init(72-1,1000-1); // 2ms定时中断 printf(Start \n); USART3_SendString(AF:30); //音量调到最大 delay_ms(300); USART3_SendString(A7:00001); //欢迎使用 while (1) { ESP8266_GetIPD(1); // 非阻塞方式检查命令 ESP8266_ProcessCommands(); // 获取当前系统时间 uint32_t current_time delay_get_tick(); // 使用系统滴答计数 // 优化传感器扫描频率 if(current_time - last_sensor_time 100) // 每200ms扫描一次传感器 (100 * 2ms 200ms) { SensorScan(); //获取传感器数据 last_sensor_time current_time; } // 立即处理按键 uint8_t current_key_num KeyNum; // 保存当前按键值 // 模式切换按键立即处理 if(current_key_num ! 0) { switch(mode) { case AUTO_MODE: if(current_key_num KEY_1) { mode MANUAL_MODE; count_m 1; // 切换到手动模式时关闭灯和蜂鸣器 driveData.LED_Flag 0; driveData.BEEP_Flag 0; KeyNum 0; // 立即清除按键 } else if(current_key_num KEY_Long1) { mode SETTINGS_MODE; count_s 1; KeyNum 0; // 立即清除按键 } break; case MANUAL_MODE: if(current_key_num KEY_1) { mode AUTO_MODE; auto_page 1; KeyNum 0; // 立即清除按键 } break; case SETTINGS_MODE: // 设置模式内部按键在各自模式中处理 break; } } // 模式切换优化 if(last_mode ! mode) { OLED_Clear(); last_mode mode; // 立即绘制新模式的固定内容 switch(mode) { case AUTO_MODE: OLED_autoPage1(); break; case MANUAL_MODE: OLED_manualPage1(); break; case SETTINGS_MODE: OLED_settingsPage1(); break; } OLED_Refresh(); // 立即刷新显示 } // 模式处理 switch(mode) { case AUTO_MODE: // 自动模式 { // 获取当前自动模式页面处理KEY2切换 uint8_t curr_auto_page SetAuto(); if(curr_auto_page 1) { SensorDataDisplay1(); // 显示传感器数据蓝牙发送 } else { SensorDataDisplay2(); // 显示GPS数据蓝牙发送 } AutoControl(); // 执行自动控制逻辑LED/蜂鸣器 Control_Manager(); // 执行硬件设备控制 // 新增定时发送数据到手机1秒1次 if(current_time - last_esp8266_send_time ESP8266_SEND_INTERVAL) { ESP8266_SendAutoModeData(); // 发送自动模式数据到手机 last_esp8266_send_time current_time; // 更新发送时间戳 } break; } case MANUAL_MODE: { static uint8_t manual_page_initialized 0; static uint8_t last_manual_count 0; static uint8_t last_LED_Flag 0; static uint8_t last_BEEP_Flag 0; static uint8_t force_refresh 0; // 强制刷新标志 // 模式切换时重新初始化 if(last_mode ! mode) { manual_page_initialized 0; last_manual_count 0; last_LED_Flag driveData.LED_Flag; last_BEEP_Flag driveData.BEEP_Flag; force_refresh 1; // 设置强制刷新标志 // 确保光标指向灯光 count_m 1; // 确保设备状态为关 driveData.LED_Flag 0; driveData.BEEP_Flag 0; } uint8_t current_manual_count SetManual(); // 检查设备状态是否改变如果改变则强制刷新显示 uint8_t need_refresh 0; if(driveData.LED_Flag ! last_LED_Flag || driveData.BEEP_Flag ! last_BEEP_Flag) { need_refresh 1; last_LED_Flag driveData.LED_Flag; last_BEEP_Flag driveData.BEEP_Flag; } // 确保页面已初始化或光标位置改变或设备状态改变或强制刷新时重新绘制 if(!manual_page_initialized || current_manual_count ! last_manual_count || need_refresh || force_refresh) { OLED_manualPage1(); // 固定文字 OLED_manualOption(current_manual_count); // 光标 ManualSettingsDisplay1(); // 状态 manual_page_initialized 1; last_manual_count current_manual_count; force_refresh 0; // 清除强制刷新标志 OLED_Refresh(); // 强制刷新显示 } // 立即处理手动模式按键 if(current_key_num ! 0) { ManualControl(current_manual_count); OLED_manualPage1(); // 重新绘制固定文字 OLED_manualOption(current_manual_count); // 光标 ManualSettingsDisplay1(); // 状态 OLED_Refresh(); // 按键操作后立即刷新 KeyNum 0; // 立即清除按键标志 } // 确保显示内容始终正确 OLED_manualPage1(); // 固定文字 OLED_manualOption(current_manual_count); // 光标 ManualSettingsDisplay1(); // 状态 Control_Manager(); break; } case SETTINGS_MODE: { // 优化设置模式响应速度 static uint8_t is_threshold_page_inited 0; uint8_t curr_count_s SetSelection(); // 立即处理设置模式内的按键 if(current_key_num ! 0) { if (is_secondary_menu 1) { // 二级菜单按键立即处理 if (current_key_num KEY_2 || current_key_num KEY_3 || current_key_num KEY_4) { // 这里根据你的二级菜单逻辑处理 // 处理完后立即刷新 OLED_Refresh(); KeyNum 0; } else if (current_key_num KEY_1) { is_secondary_menu 0; secondary_pos 1; OLED_Clear(); OLED_settingsPage1(); SettingsThresholdDisplay1(); OLED_settingsOption(curr_count_s); OLED_Refresh(); KeyNum 0; } } else { // 一级菜单按键立即处理 if (current_key_num KEY_3 || current_key_num KEY_4) { ThresholdSettings(curr_count_s); SettingsThresholdDisplay1(); OLED_Refresh(); KeyNum 0; } else if (current_key_num KEY_1) { mode AUTO_MODE; is_threshold_page_inited 0; FLASH_W(FLASH_START_ADDR, Sensorthreshold.tempValue, driveData.Safe_Flag ); KeyNum 0; } } } // 正常显示逻辑 if (is_secondary_menu 1) { } else { // 一级菜单显示 if (curr_count_s 1 curr_count_s 4) { if (is_threshold_page_inited 0) { OLED_settingsPage1(); is_threshold_page_inited 1; } } OLED_settingsOption(curr_count_s); SettingsThresholdDisplay1(); } break; } } // 限制显示刷新频率 if(current_time - last_display_time 25) // 每50ms刷新一次显示 (25 * 2ms 50ms) { // 所有模式都需要刷新显示 OLED_Refresh(); last_display_time current_time; } } }六、实验效果七、包含内容项目分享

相关新闻

解锁AI写专著的神技!专业工具助力,让学术创作更轻松

解锁AI写专著的神技!专业工具助力,让学术创作更轻松

对于首次尝试写作学术专著的研究者而言,整个过程如同在“摸石头过河”,充满了未知的挑战。主题的选择让人感到困惑,如何在“有价值”和“可操作”之间找到合适的平衡,常常让研究者左右为难,要么主题过于宽泛&#xff0…

2026/7/6 8:20:13 阅读更多 →
python超级超大型号无人救援智能化核动力飞机研究开发重要性智能化系统化武器多样化太阳能利用回收利用可再生能源

python超级超大型号无人救援智能化核动力飞机研究开发重要性智能化系统化武器多样化太阳能利用回收利用可再生能源

你提到的“Python超级超大型号无人救援智能化核动力飞机”听起来像是一个融合了前沿科技与编程的宏大构想。虽然目前现实中尚未有完全符合这一描述的成熟项目,但我们可以基于你提到的关键词,为你梳理一下相关的技术逻辑、应用场景以及Python在其中扮演的…

2026/7/5 10:38:09 阅读更多 →
Linux iptables 四表五链:新手友好版解释

Linux iptables 四表五链:新手友好版解释

iptables 四表五链:新手友好版解释 一、核心概念类比 简单理解:iptables就像快递分拣中心 四表 不同的分拣规则手册 五链 快递流水线上的5个检查点 规则 具体的分拣指令(比如:来自上海的包裹发往1号货架)二、五链&a…

2026/7/4 14:36:03 阅读更多 →

最新新闻

3天掌握YOLO目标检测:从环境搭建到实战训练全流程指南

3天掌握YOLO目标检测:从环境搭建到实战训练全流程指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. 先搞清楚“3天学透YOLO”到底在说什么 看到“3天学透YOLO全系列”这种标题,第一反应往往是怀疑。YOLO从v1到v13&#…

2026/7/6 8:19:47 阅读更多 →
java017期_java小程序+大后台web商城源码

java017期_java小程序+大后台web商城源码

java小程序大后台web商城源码 基于ssm的一款电子商城,系统采用maven的父子结构, 1、后台web商城包含的模块有: 会员管理、商城配置、编辑商品、订单管理、推广管理、系统管理等大模块, 每个大模块包含至少6个子模块,功…

2026/7/6 8:19:47 阅读更多 →
Windows右键菜单深度解析:从杂乱到有序的工作流重构实践

Windows右键菜单深度解析:从杂乱到有序的工作流重构实践

Windows右键菜单深度解析:从杂乱到有序的工作流重构实践 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 作为Windows用户,你是否经历过这…

2026/7/6 8:17:47 阅读更多 →
SQL集合运算符深度解析:UNION、INTERSECT、EXCEPT原理与避坑指南

SQL集合运算符深度解析:UNION、INTERSECT、EXCEPT原理与避坑指南

1. 为什么我坚持把 SQL 集合运算符讲透——不是为了炫技,而是因为90%的日常数据清洗都卡在这一步 你有没有遇到过这样的场景:老板甩来两份Excel表格,一份是上季度新注册用户,一份是本月完成首单的用户,让你“快速拉个名…

2026/7/6 8:17:47 阅读更多 →
Dify低代码AI应用开发实战:30+项目手把手教学,一周掌握企业级应用搭建

Dify低代码AI应用开发实战:30+项目手把手教学,一周掌握企业级应用搭建

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看一个面向 AI 应用开发的实战教程资源。这个资源的核心不是某个单一的模型或工具,而是一套系统化的视频课程&a…

2026/7/6 8:15:25 阅读更多 →
笨阶乘C++解法详解(力扣1006)

笨阶乘C++解法详解(力扣1006)

问题解析:LeetCode 1006 “笨阶乘”要求对正整数 N 按递减顺序依次使用乘 *、除 /、加 、减 - 四个运算符循环计算,即 clumsy(N) N * (N-1) / (N-2) (N-3) - (N-4) * (N-5) / (N-6) ...,需返回计算结果。核心在于处理运算符优先级&#xf…

2026/7/6 8:13:24 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻