【毕业设计】便携式STM32的红外信号分析仪 - 单片机 物联网 嵌入式

本文主要是介绍【毕业设计】便携式STM32的红外信号分析仪 - 单片机 物联网 嵌入式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 0 前言
  • 1 简介
  • 2 主要器件
  • 3 实现效果
  • 4 设计原理
  • 5 部分核心代码
  • 5 最后


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 便携式STM32的红外信号分析仪

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:5分

🧿 选题指导, 项目分享:

https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md


1 简介

由STM32F411CEU6作为主控芯片的带有姿态感应,红外输入,红外输出,可根据任意录入的红外信号进行存储,然后发出红外线控制各种电器设备, 并具有测电流,电压,电阻,电容能力的手表,是对于电子工程师来说具有较强实用性的小工具。

2 主要器件

  • STM32F411CEU6主控芯片
  • ACS712电流传感器芯片
  • TC单片机

3 实现效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4 设计原理

硬件

  • 电压检测电路,主要是将外部-15v15v的电压通过几个限压电阻根据KCL和KVL转化成03.3v,再由ADC芯片采集;
  • 电阻检测电路,根据简单的分压原理,将待测电阻通过模拟开关分别与1k和1M欧高精度电阻串联测得分压,从而实现精确测量较大范围内的电阻阻值;
  • 电容检测电路,根据电容的一阶零状态响应,算出时间常数,再根据串联的电阻计算出接入电容的电容值;
  • )红外接收发射电路,采用外加一块STC单片机(一个模块~~~~),里面预先烧录红外解码程序,再通过串口与STM32通讯,实现对外部输入红外信号的解码和调制发射;

软件

  • 姿态解算算法,实现步数计算,抬手感应,翻腕感应,LCD虚拟触屏;
  • 针对不同红外信号的解码和发射算法,红外信号存储算法等;
  • 电阻,电容测量算法;
  • 自制定时器系统任务调度算法。

主要原理图
在这里插入图片描述

5 部分核心代码

#include "main.h"/********************变量声明区_START********************/
u8 flag_Power_On = 1, flag_MPU_Refresh = 0;
bool LCD_Already_Updated = false;
uint8_t RTC_hour = 23, RTC_minute = 14, RTC_second = 10;
u8 IR_flag = 0, IR_Channel = 0x01, flag_BEEP = 0, flag_ADS_readC = 0, flag_ADS_readR = 0;u8 Arm_Position = -1;short aacx, aacy, aacz;		//加速度传感器原始数据bool Raised_Flag = false;
bool Reversed_Flag = false;u8 flag_of_STATE = 0;
uint16_t Menu_Pointer[7] = {1, 35, 69, 103, 137, 171, 205};
u8 Fill_IR_Code[4] = {0, 0, 0, 0};		//显示红外码存储区是否为空:0-空 1-有
uint16_t time_set_Pos[4] = {54, 102, 150, 2};
uint16_t clock_set_Pos[3] = {5, 135, 1};/*** @brief 决定系统状态的选择* @param 菜单;红外收发模式;红外通道选择模式;陀螺仪模式;模拟量测试模式;*/
enum STATUS {MENU = 0,TIMERUN,TIME_SET,CLOCK_SET,IR_REMOTE,IR_CHANNEL_CHOOSE,MPU6050,AD_VAL,
} STATE;#define  PUT_UP     1
#define  LAY_DOWN   2//mpu6050
short cnt_up = 0;
short cnt_down = 0;
short cnt_reverse = 0;
short cnt_raising = 0;short Stale_aacx_Data = NULL;
short Stale_aacy_Data = NULL;short Reverse_status = 0;
/********************变量声明区_END********************//********************API声明区_START********************/
static  void  Proc2msTask(void);    //处理2ms任务
static  void  Proc50msTask(void);   //处理50ms任务
static  void  InitSoftware(void);
static  void  InitHardware(void);void ST7789_SHOW(void);
void KEY_Process(void);static  void  Get_Arm_Position(short* aacx, short* aacy, short* aacz, u8* Arm_Position, bool* Raised_Flag);
static  bool  Judge_Wrist_Reverse(short* aacx, short* aacy, short* aacz, u8* Arm_Position);
void MPU6050_Process(void);static  void  Page0_Menu(void);
static  void  Page1_TimeRunning(void);
static  void  Page2_Timeset(void);
//static  void  Page3_Clockset1(void);
static  void  Page4_Clockset2(void);
static  void  Page5_IR_Remote(void);
static  void  Page7_AD_VAL(void);
/********************API声明区_END********************//*********************************************************************************************************
* 函    数: main
* 注    意: 作者为了让main看起来更漂亮,整了些花里胡哨的API QWQ
*********************************************************************************************************/
int main(void) {InitSoftware();InitHardware();STATE = MENU;ST7789_Fill_Color(WHITE);while(1) {if(flag_Power_On)Proc2msTask();if(flag_MPU_Refresh == 1) {flag_MPU_Refresh = 0;ST7789_Fill_Color(BLACK);if(flag_Power_On){LCD_Already_Updated = false;ST7789_Fill_Color(WHITE);}}Proc50msTask();delay_ms(10);}
}/*********************************************************************************************************
*                                              内部函数实现
*********************************************************************************************************/
/*********************************************************************************************************
* 函数名称: Proc2msTask
* 函数功能: 处理2ms任务
* 输入参数: void
* 输出参数: void
* 返 回 值: void
* 注    意:
*********************************************************************************************************/
static void Proc2msTask(void) {if(Get2msFlag()) {static u8 tmp_t = 0;if(!LCD_Already_Updated) {ST7789_SHOW();}if(flag_BEEP == 1) {BEEP();flag_BEEP = 0;} else if (flag_BEEP == 2) {for(int i = 0; i < 5; i++) {BEEP();}flag_BEEP = 0;}if(tmp_t == 5) {KEY_Process();tmp_t = 0;}tmp_t++;Clr2msFlag();}
}/*********************************************************************************************************
* 函数名称: Proc50msTask
* 函数功能: 处理50ms任务
* 输入参数: void
* 输出参数: void
* 返 回 值: void
* 注    意:
*********************************************************************************************************/
static  void  Proc50msTask(void) {if(Get50msFlag()) {MPU6050_Process();Clr50msFlag();}
}static  void  InitSoftware(void) {}static  void  InitHardware(void) {SystemInit();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(104);  			//初始化延时函数uart_init(115200);			//初始化串口InitTimer();				//初始化任务调度定时器GPIO_ALLInit();				//初始化蜂鸣器,LED,KEY外设five_keys_exti_config();	//初始化五向按键ST7789_Init();				//初始化LCD-ST7789MPU_Init();					//初始化MPU6050My_RTC_Init();RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits, 0);		//配置WAKE UP中断,1秒钟中断一次while(mpu_dmp_init()) {printf("MPU6050 Init Error!\r\n");delay_ms(200);}printf("Init OK\r\n");
}void ST7789_SHOW(void) {switch(STATE) {case MENU: {SPI_ChangeConfig(LCD);Page0_Menu();LCD_Already_Updated = true;break;}case TIMERUN: {SPI_ChangeConfig(LCD);Page1_TimeRunning();LCD_Already_Updated = true;break;}case TIME_SET: {SPI_ChangeConfig(LCD);Page2_Timeset();LCD_Already_Updated = true;break;}case CLOCK_SET: {SPI_ChangeConfig(LCD);Page4_Clockset2();LCD_Already_Updated = true;break;}case IR_REMOTE: {SPI_ChangeConfig(LCD);Page5_IR_Remote();LCD_Already_Updated = true;break;}case IR_CHANNEL_CHOOSE: {SPI_ChangeConfig(LCD);ST7789_DrawImage(0, 0, 240, 240, (uint16_t *)IR_ChannelChoosing);LCD_Already_Updated = true;break;}case AD_VAL: {SPI_ChangeConfig(ADS);cin_get_cap_init();ADS1118GPIOInit();ADS1118_Init(ADS1118_SS_NONE, ADS1118_MODE_LX, ADS1118_DR_128, ADS1118_PULL_UP_EN_E, ADS1118_NOP_W);SPI_ChangeConfig(LCD);Page7_AD_VAL();break;}default : {LCD_Already_Updated = true;break;}}
}void KEY_Process(void) {u8 key = 0;key = KEY_Scan(0);//得到键值if(key) {switch(key) {case KEY1_PRES://红外选择通道:1/2/3/4if(STATE == IR_CHANNEL_CHOOSE) {IR_Channel = 0x01;STATE = MENU;LCD_Already_Updated = false;ST7789_Fill_Color(WHITE);}//红外收发模式else if(STATE == IR_REMOTE) {IR_flag = !IR_flag;if(IR_flag) {LED2 = 0;memset(USART_RX_BUF, 0, sizeof(USART_RX_BUF));USART1_Tx_Puts(cmd_stor_buffer1, IR_Channel);} else {LED2 = 1;if(flag_USART_Get) {Fill_IR_Code[IR_Channel - 1] = 1;LCD_Already_Updated = false;flag_USART_Get = 0;} else {Fill_IR_Code[IR_Channel - 1] = 0;LCD_Already_Updated = false;flag_USART_Get = 1;}//print_buffer;}} else if(STATE == AD_VAL) {flag_ADS_readC = 1;LCD_Already_Updated = false;} else BEEP();break;case KEY2_PRES://红外选择通道:1/2/3/4if(STATE == IR_CHANNEL_CHOOSE) {IR_Channel = 0x02;STATE = MENU;LCD_Already_Updated = false;ST7789_Fill_Color(WHITE);}//红外收发模式else if(STATE == IR_REMOTE) {USART1_Tx_Puts(cmd_send_buffer1, IR_Channel);} else if(STATE == AD_VAL) {flag_ADS_readR = 1;LCD_Already_Updated = false;} else BEEP();break;case KEY3_PRES://红外选择通道:1/2/3/4if(STATE == IR_CHANNEL_CHOOSE) {IR_Channel = 0x03;STATE = MENU;LCD_Already_Updated = false;ST7789_Fill_Color(WHITE);} else if(STATE == TIME_SET) {ST7789_DrawRectangle(time_set_Pos[time_set_Pos[3]], 110,time_set_Pos[time_set_Pos[3]] + 36, 148, WHITE);time_set_Pos[3] = (time_set_Pos[3] == 0) ? 2 : (time_set_Pos[3] - 1);LCD_Already_Updated = false;} else if(STATE == CLOCK_SET) {ST7789_DrawRectangle(clock_set_Pos[clock_set_Pos[2]], 50,clock_set_Pos[clock_set_Pos[2]] + 100, 150, WHITE);clock_set_Pos[2] = (clock_set_Pos[2] == 0) ? 1 : 0;LCD_Already_Updated = false;} else BEEP();break;case KEY4_PRES://红外选择通道:1/2/3/4if(STATE == IR_CHANNEL_CHOOSE) {IR_Channel = 0x04;STATE = MENU;LCD_Already_Updated = false;ST7789_Fill_Color(WHITE);} else if(STATE == TIME_SET) {if(time_set_Pos[3] == 2) {RTC_second = (RTC_second == 59) ? 0 : RTC_second + 1;} else if(time_set_Pos[3] == 1) {RTC_minute = (RTC_minute == 59) ? 0 : RTC_minute + 1;} else {RTC_hour = (RTC_hour == 23) ? 0 : RTC_hour + 1;}LCD_Already_Updated = false;} else if(STATE == CLOCK_SET) {if(clock_set_Pos[2] == 1) {RTC_minute = (RTC_minute == 59) ? 0 : RTC_minute + 1;} else {RTC_hour = (RTC_hour == 23) ? 0 : RTC_hour + 1;}LCD_Already_Updated = false;} else BEEP();break;}LCD_Already_Updated = false;} //else delay_ms(10);
}

5 最后

这篇关于【毕业设计】便携式STM32的红外信号分析仪 - 单片机 物联网 嵌入式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/296872

相关文章

便携式气象仪器的主要特点

TH-BQX9】便携式气象仪器,也称为便携式气象仪或便携式自动气象站,是一款高度集成、低功耗、可快速安装、便于野外监测使用的高精度自动气象观测设备。以下是关于便携式气象仪器的详细介绍:   主要特点   高精度与多功能:便携式气象仪器能够采集多种气象参数,包括但不限于风速、风向、温度、湿度、气压等,部分高级型号还能监测雨量和辐射等。数据采集与存储:配备微电脑气象数据采集仪,具有实时时钟、数据存

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,