目录1.传感器准备工作2.redme3.实验项目核心部分3.1 模式菜单(自动模式-常亮模式-常灭模式)3.2 模式循环切换3.3 RD03雷达处理函数3.4 按键切换状态3.5 反射传感器切换模式1.传感器准备工作2.redme/********************************************************************************************/【】程序简介-工程名称 综合实验二 感应灯具RD03雷达-实验平台 野火 STM32F103C8T6-STM32开发板【 】功能简介1-RD03雷达模块定期自动发送数据给开发板开发板接收数据后进行处理再把处理结果返回给上位机2-感应灯部分工作模式(按键/反射传感器切换)1自动模式1.设备上电后为“自动模式“ 核心板绿灯长亮其他板载指示灯灭2.当雷达触发LED4亮否则灭2常亮模式1.设备切换为“常亮模式“ 核心板蓝灯长亮其他板载指示灯灭2.LED4进入亮3常灭模式1.设备切换为“常灭模式“ 核心板红灯长亮其他板载指示灯灭2.LED4进入灭3模式切换按KEY1或者使用手遮挡反射传感器一段固定时间约一秒多程序可自定义可来回循环切换“自动模式”、“常亮模式”、“常灭模式”。【 】实验操作1.保证开发板相关硬件连接正确用USB线连接开发板的USB转串口跟电脑 2.在电脑端打开串口调试助手并配置好相关参数115200 8-N-1 3.编译并下载程序到开发板即可观察现象。 4.复位开发板RD03雷达模块定期自动发送数据给开发板开发板接收数据后进行处理再把处理结果返回给上位机 5-感应灯部分 工作模式(按键/反射传感器切换) 1自动模式 1.设备上电后为“自动模式“ 核心板绿灯长亮其他板载指示灯灭 2.当雷达触发LED4亮否则灭 2常亮模式 1.设备切换为“常亮模式“ 核心板蓝灯长亮其他板载指示灯灭 2.LED4进入亮 3常灭模式 1.设备切换为“常灭模式“ 核心板红灯长亮其他板载指示灯灭 2.LED4进入灭 3模式切换按KEY1或者使用手遮挡反射传感器一段固定时间约一秒多程序可自定义可来回循环切换“自动模式”、“常亮模式”、“常灭模式”。/*********************************************************************************************/【*】 引脚分配KEY1-PA0 按键按下为高电平 核心板板载默认下拉且硬件有消抖NRST-NRST 按键按下为低电平 核心板板载默认上拉且硬件有消抖LED_R-LED1-PA1 核心板板载LED灯低电平亮LED_G-LED2-PA2 核心板板载LED灯低电平亮LED_B-LED3-PA3 核心板板载LED灯低电平亮LED4-PB5 用户自定义LED灯低电平亮DEBUG_TX-USART1_TXD-PA9 PA9作为USART1的TXD 核心板默认使用 PA9 做 DEBUG_TXDEBUG_RX-USART1_RXD-PA10 PA10作为USART1的RXD 核心板默认使用 PA10 做 DEBUG_RXRD03_TX-USART3_TXD-PB10 PB10作为USART3的TXD RD03雷达模块串口_TXRD03_RX-USART3_RXD-PB11 PB11作为USART3的RXD RD03雷达模块串口_RX热敏模块AO —不接TRACK_DO —PA11循迹传感器达不到阈值的时候D0是高电平达到阈值的时候D0是低电平VDD —3V3GND —GND/*********************************************************************************************/3.实验项目核心部分3.1 模式菜单(自动模式-常亮模式-常灭模式)由于需要三种模式所以定义一个枚举模式枚举/* 模式切换 */typedefenum{Sensor_Light_Mode_Auto0,//自动模式Sensor_Light_Mode_AlwaysOn1,//常亮模式Sensor_Light_Mode_AlwaysOff2,//常灭模式Sensor_Light_Mode_NUM3,//用来统计枚举数量作为临界点判断}Sensor_Light_Mode_Type;再定义一个结构体用来封装感应灯信息/*感应灯/反射传感器 模式状态信息*/typedefstruct{Sensor_Light_Mode_Type mode;ReflectSensor_StateType last_state;uint32_ttime;}Sensor_Light_Mode_State_Info;各个模式处理的功能函数模块/** * brief 感应灯具 模式配置(指定模式配置) * param mode感应灯模式 * retval 无 */voidSensor_Light_Set_Mode(Sensor_Light_Mode_Type mode){switch(mode){//自动模式caseSensor_Light_Mode_Auto:{/* 绿灯常亮(G) 其他灯灭(R、B、LED4) */LED_GPIO_OFF(R_LED1_GPIO_PORT,R_LED1_GPIO_PIN,LED_LOW_TRIGGER);LED_GPIO_ON(G_LED2_GPIO_PORT,G_LED2_GPIO_PIN,LED_LOW_TRIGGER);LED_GPIO_OFF(B_LED3_GPIO_PORT,B_LED3_GPIO_PIN,LED_LOW_TRIGGER);LED_GPIO_OFF(LED4_GPIO_PORT,LED4_GPIO_PIN,LED_LOW_TRIGGER);printf(Sensor_Light_Mode_Auto\n);/* 保存当前模式状态(自动模式) */Sensor_Light_ModeState.modeSensor_Light_Mode_Auto;break;}//常亮模式caseSensor_Light_Mode_AlwaysOn:{/* 蓝灯、LED4常亮(B、LED4) 其他灯灭(R、G) */LED_GPIO_OFF(R_LED1_GPIO_PORT,R_LED1_GPIO_PIN,LED_LOW_TRIGGER);LED_GPIO_OFF(G_LED2_GPIO_PORT,G_LED2_GPIO_PIN,LED_LOW_TRIGGER);LED_GPIO_ON(B_LED3_GPIO_PORT,B_LED3_GPIO_PIN,LED_LOW_TRIGGER);LED_GPIO_ON(LED4_GPIO_PORT,LED4_GPIO_PIN,LED_LOW_TRIGGER);printf(Sensor_Light_Mode_AlwaysOn\n);/* 保存当前模式状态(常亮模式) */Sensor_Light_ModeState.modeSensor_Light_Mode_AlwaysOn;break;}//常灭模式caseSensor_Light_Mode_AlwaysOff:{/* 红灯常亮(R) 其他灯灭(G、B、LED4) */LED_GPIO_ON(R_LED1_GPIO_PORT,R_LED1_GPIO_PIN,LED_LOW_TRIGGER);LED_GPIO_OFF(G_LED2_GPIO_PORT,G_LED2_GPIO_PIN,LED_LOW_TRIGGER);LED_GPIO_OFF(B_LED3_GPIO_PORT,B_LED3_GPIO_PIN,LED_LOW_TRIGGER);LED_GPIO_OFF(LED4_GPIO_PORT,LED4_GPIO_PIN,LED_LOW_TRIGGER);printf(Sensor_Light_Mode_AlwaysOff\n);/* 保存当前模式状态(常灭模式) */Sensor_Light_ModeState.modeSensor_Light_Mode_AlwaysOff;break;}default:break;}}自动模式绿灯亮红灯、蓝灯灭LED4受到雷达影响常亮模式蓝灯亮绿灯红灯灭LED4亮常灭模式红灯亮绿灯蓝灯灭LED4灭初始化是自动模式所以可以在初始化部分调用该函数传递模式是自动模式3.2 模式循环切换枚举定义结构体封装/* 模式切换 */typedefenum{Sensor_Light_Mode_Auto0,//自动模式Sensor_Light_Mode_AlwaysOn1,//常亮模式Sensor_Light_Mode_AlwaysOff2,//常灭模式Sensor_Light_Mode_NUM3,//用来统计枚举数量作为临界点判断}Sensor_Light_Mode_Type;/*感应灯/反射传感器 模式状态信息*/typedefstruct{Sensor_Light_Mode_Type mode;ReflectSensor_StateType last_state;uint32_ttime;}Sensor_Light_Mode_State_Info;模式循环切换函数模块/** * brief 感应灯具 模式配置(循环切换[自动-常亮-常灭]) * param 无 * retval 无 */voidSensor_Light_SwitchMode(void){Sensor_Light_Mode_Type mode_temp(Sensor_Light_Mode_Type)(Sensor_Light_ModeState.mode1);if(mode_tempSensor_Light_Mode_NUM){mode_tempSensor_Light_Mode_Auto;}Sensor_Light_Set_Mode(mode_temp);}每一次调用这个函数当前模式枚举的值1当如果达到3就切换到自动模式同时还需要调用设置模式函数3.3 RD03雷达处理函数当检测到有人LED4亮无人LED4灭同时是只能在自动模式才能处理。思路在RD03应用层定义RD03枚举枚举有人和无人然后用结构体封装在RD03应用层中将检测的有人和无人状态保存在结构体封装的枚举里面由于该结构体变量设置的作用域是static只能被自己的源文件夹访问不可以被其他源文件访问所以我还需要写一个对外扩展的函数接口返回被封装的雷达检测状态结构体变量。在雷达处理函数中1.判断当前是不是自动模式如果是才有以下操作2.通过雷达状态对外扩展的函数接口获取雷达检测状态有人/无人3.判断当前有人LED4亮4.判断当前无人LED4灭RD03状态枚举以及结构体封装// 雷达目标检测状态枚举typedefenum{RD03_STATUS_NONE0,// 无人RD03_STATUS_DETECTED1,// 有人}Rd03_StatusTypeDef;typedefstruct{Rd03_StatusTypeDef human_status;// 枚举有人/无人状态uint16_tdistance;// 检测距离}Rd03_ResultInfo;对外扩展雷达结构体检测信息staticRd03_ResultInfo Rd03_Result{RD03_STATUS_NONE,0};/** * brief RD03串口 目标信息获取 * param 无 * retval 无 */Rd03_ResultInfoRD03_GetResult(void){//获取人状态: 有人/无人 距离returnRd03_Result;}感应灯具雷达处理函数/** * brief 感应灯具 RD03雷达数据处理函数 * param 无 * retval 无 */voidSensor_Light_Rd03_DataHandle(void){//自动模式if(Sensor_Light_ModeState.modeSensor_Light_Mode_Auto){//获取雷达检测结果: 有人/无人/距离Rd03_ResultInfo resultRD03_GetResult();//有人 LED4点亮if(result.human_statusRD03_STATUS_DETECTED){LED_GPIO_ON(LED4_GPIO_PORT,LED4_GPIO_PIN,LED_LOW_TRIGGER);}//无人 LED4灭elseif(result.human_statusRD03_STATUS_NONE){LED_GPIO_OFF(LED4_GPIO_PORT,LED4_GPIO_PIN,LED_LOW_TRIGGER);}}}3.4 按键切换状态只需要在按键任务处理函数里面去调用循环切换函数即可/** * brief 按键 任务 * param 无 * retval 无 */voidKey_Task(void){if(key_task.flag1){KEY_Evnet current_event;current_eventKEY_SystickScan(key1_info);/* 短按*/if(current_eventEVENT_SHORT_RELEASE){//模式切换(自动-常亮-常灭)Sensor_Light_SwitchMode();}Key_TaskReset();}}3.5 反射传感器切换模式反射传感器有两种状态遮挡/无遮挡所以需要定义一个枚举接着将反射传感器枚举状态变量封装在结构体里面。还需要在结构体里面定义一个保存时间的。思路定义一个临时枚举变量用来获取当前反射传感器检测到有遮挡还是无遮挡。定义一个静态结构体变量这个变量封装了反射传感器两种状态的变量以及还有一个时间变量初始化反射传感器状态是无遮挡时间是0通过分支判断分支1.初始化是无遮挡当前检测状态是有遮挡结构体反射传感器有无遮挡状态设置遮挡状态并且时间变量记录当前起始时间这个时间通过配置定时器每1ms中断一次定义了一个变量每次值1通过返回该变量的值获取时间。分支2 变量结构体保存的状态是遮挡状态当前状态是无遮挡每隔20ms轮询一次检测意思是上一次检测的状态是遮挡状态保存起来了当前反射传感器检测状态是无遮挡就是在遮挡小于1s范围内取消遮挡了。结构体反射传感器有无遮挡状态设置无遮挡状态分支3 变量结构体保存的状态是遮挡状态当前状态是遮遮挡定义一个时间临时变量判断当前的时间 与第一次分支1记录的时间做差值结果大于1200而这个1200可以用一个宏定义封装起来当结果大于1200说明时间到了调用循环切换函数结构体保存的时间不是初始化0.时间到了切换状态保存时间初始话0的后果假设时间初始化0当我手一直遮挡就算1200到了我还是在遮挡也就是分支3还在进去的临时时间变量值- 0 肯定大于1200的就会瞬间又切换模式了也就是说我第一次遮挡了模式切换了然后瞬间20ms轮询给人感觉瞬间秒切换下一个模式了。正确做法是保存的时间保存通过获取当前的时间函数的时间值。就算下一次20ms轮询继续进去结构体时间变量记录上一次模式切换的时间。时间临时变量保存下一次20ms轮询的时间做差值只是20ms并不会大于1200不会出现瞬间切换下一根模式这种问题。遮挡枚举结构体定义// 反射式红外传感器状态枚举typedefenum{Sensor_Light_TRACK_NO_BLOCK0,// 无遮挡收到反射光Sensor_Light_TRACK_BLOCKED1// 有遮挡挡住没有反射}ReflectSensor_StateType;/*感应灯/反射传感器 模式状态信息*/typedefstruct{Sensor_Light_Mode_Type mode;ReflectSensor_StateType last_state;uint32_ttime;}Sensor_Light_Mode_State_Info;遮挡模式切换处理函数/** * brief 感应灯具 反射传感器 数据处理函数 * param 无 * retval 无 */voidSensor_Light_Track_DataHandle(void){ReflectSensor_StateType curr_state;//Bit_SET(没有检测到物体)、Bit_RESET(检测到物体)if(TRACK_Scan(TRACK_GPIO_PORT,TRACK_GPIO_PIN)Bit_RESET){curr_stateSensor_Light_TRACK_BLOCKED;}else{curr_stateSensor_Light_TRACK_NO_BLOCK;}//上一次检测状态是初始化当前检测状态是有遮挡if(Sensor_Light_ModeState.last_stateSensor_Light_TRACK_NO_BLOCKcurr_stateSensor_Light_TRACK_BLOCKED){Sensor_Light_ModeState.last_stateSensor_Light_TRACK_BLOCKED;Sensor_Light_ModeState.timeSysTick_GetCount();}//上一次检测状态是遮挡当前检测状态是无遮挡elseif(Sensor_Light_ModeState.last_stateSensor_Light_TRACK_BLOCKEDcurr_stateSensor_Light_TRACK_NO_BLOCK){Sensor_Light_ModeState.last_stateSensor_Light_TRACK_NO_BLOCK;Sensor_Light_ModeState.time0;}//上一次检测状态和当前状态都是遮挡状态elseif(Sensor_Light_ModeState.last_stateSensor_Light_TRACK_BLOCKEDcurr_stateSensor_Light_TRACK_BLOCKED){int32_tcurr_timeSysTick_GetCount();//获取当前的时间if(curr_time-Sensor_Light_ModeState.timeSWITCH_HOLD_MS){Sensor_Light_SwitchMode();Sensor_Light_ModeState.timeSysTick_GetCount();}}}
企业数字化 ERP 产品动态
相关推荐
【AI应用】认识机器学习与深度学习 文章目录一、人工智能1.1 介绍1.2 机器学习1. 介绍1.3 深度学习一、人工智能
1.1 介绍
人工智能(Artificial Intelligence,简称 AI)通常指让机器在通常需要人类智能才能完成的任务上表现出智能行为的一类技术。这里的"智能"是功能… · 2026/11/15 14:52:26
880 第 5 章 二重积分 无- 性质中值二重极限求和转化为二重积分三个维度:指标上下限耦合(非矩形区域);圆形/椭圆约束区域(必须转极坐标)。指标上下限耦合(非矩形区域)圆形/椭圆约束区域(必须转极坐… · 2026/11/11 2:12:15
UE5 入门系列(三):核心框架类全解析 系列导读
经过前两篇,你已经装好了引擎、创建了项目,也熟悉了编辑器的基本操作。理解 UE 的框架类是入门开发的重中之重,后续写蓝图、写 C,本质上都是在与这些类打交道。第一次打开 UE 的文档或源码,很容易被一堆名字吓… · 2026/11/5 16:24:59
深圳电工证年审培训考前押题怎么准备?学历不高怕报不上名? 深圳电工证年审培训考前押题怎么准备?学历不高怕报不上名? 你是不是也像我一样,学历不高,担心在深圳报考电工证年审培训,连报名都过不了?其实我以前就是个普通的技校毕业生,从河南许昌转岗到深圳,一步步走过来,才发现 考前押题… · 2026/11/15 14:52:23
组织中级电工证考证证怎么转异地 中级电工证考证怎么转异地?官方回应来了! 之前考的证在外省能不能转过来?你不是一个人!很多人在外地工作多年,考了电工证却因为换了城市、换了个工地,想要把证“带”过去,却发现流程不清、信息不对。 官方回应… · 2026/11/15 14:52:23
拿电工证适合的工作怎么考?全国通用证书过期了别慌 拿电工证适合的工作怎么考?全国通用证书过期了别慌 证书过期了不知道怎么复审延期?你不是一个人。全国通用的电工证一旦过期,不仅影响日常工作,还可能面临企业辞退或罚款风险。特别是在河南郑州,很多持证人因为不了解复审流程,导致证书失效后陷入被动局… · 2026/11/15 14:52:23
学校能报名电工证么多少钱怎么算 学校能报名电工证么多少钱怎么算 之前考的证在外省能不能转过来?这几乎是每个想考电工证的人都问过的问题。现在你可能又在想,学校能报名电工证么?多少钱?别急,下面我从政策、流程、费用和常见问题四个方面,给你一个清晰的解答。… · 2026/11/15 14:51:23
长春初级电工证怎么考?通过率揭秘全在这里 长春初级电工证怎么考?通过率揭秘全在这里 之前考的证在外省能不能转过来?这几乎是每个想从事电工工作的人都会问的问题。特别是那些在外地打拼多年、手里握着一张“外地电工证”的人,到了长春想继续干这一行,第一反应就是“我的证能用吗?”。今天我们就… · 2026/11/15 0:00:50
国内电工证报考条件与考试时间 低压电工证怎么考?学历不高也能报名,官方报名入口全在这 你是不是经常听说“电工证是入行门槛”,但又担心自己学历不够、经验不足,根本报不了名?别急,今天就带你从零了解【国内电工证】的报考流程、考试内容,还有怎么在 官方报名入口… · 2026/11/15 0:00:50
电工作业时如何断电?电子证书到底能不能全国通用? 电工作业时如何断电?电子证书到底能不能全国通用? 实操考试心里没底怕挂科,特别是电工作业时如何断电这一操作,不仅关系到你能不能拿到证书,更关系到以后能不能顺利上岗。很多人觉得这不过就是“断个电”,但其实这里面的门道可不少,稍有不慎就可能出错… · 2026/11/15 0:00:50
长春初级电工证怎么考?通过率揭秘全在这里 长春初级电工证怎么考?通过率揭秘全在这里 之前考的证在外省能不能转过来?这几乎是每个想从事电工工作的人都会问的问题。特别是那些在外地打拼多年、手里握着一张“外地电工证”的人,到了长春想继续干这一行,第一反应就是“我的证能用吗?”。今天我们就… · 2026/11/15 0:00:50
国内电工证报考条件与考试时间 低压电工证怎么考?学历不高也能报名,官方报名入口全在这 你是不是经常听说“电工证是入行门槛”,但又担心自己学历不够、经验不足,根本报不了名?别急,今天就带你从零了解【国内电工证】的报考流程、考试内容,还有怎么在 官方报名入口… · 2026/11/15 0:00:50
电工作业时如何断电?电子证书到底能不能全国通用? 电工作业时如何断电?电子证书到底能不能全国通用? 实操考试心里没底怕挂科,特别是电工作业时如何断电这一操作,不仅关系到你能不能拿到证书,更关系到以后能不能顺利上岗。很多人觉得这不过就是“断个电”,但其实这里面的门道可不少,稍有不慎就可能出错… · 2026/11/15 0:00:50
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 1:51:20
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 4:02:19
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 3:02:05