蓝桥杯嵌入式2015年第六届省赛主观题解析

news2024/12/21 16:31:43

1  题目

 

 

2  解析

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "rtc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"
#include "string.h"
#include "i2c_hal.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
RTC_TimeTypeDef sTime;//直接从rtc.c中复制
RTC_DateTypeDef sDate;
char buf[20],buf1[20],buf2[20];//给LCD打印的每行内容存到一个buf里
int hour,min,second;//从串口接收到的上报电压的时间
double k=0.1;
double val;//测得的电位器电压
struct keys{
	int step;
	int state;
}key[4];//按键
int cnt1,cnt2,cnt3,cnt4;记录每个按键按下的次数
int num=1;//LCD展示的页序号
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void LED_Close()//初始时把所有LED熄灭
{
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
uint8_t EEPROM_Read(uint8_t addr)//EEPROM读写函数(固定模板)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0xa1);
	I2CWaitAck();
	uint8_t val=I2CReceiveByte();
	I2CWaitAck();
	I2CStop();
	return val;
}
void EEPROM_Write(uint8_t addr,uint8_t info)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	I2CSendByte(info);
	I2CWaitAck();
	I2CStop();
}
double getADC()//测量电位器电压
{
	HAL_ADC_Start(&hadc2);
	val=HAL_ADC_GetValue(&hadc2)*3.3/4096;
	return val;
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM8)//给RTC设定一个1s的回调函数,隔一秒打印一次(这里也可以用闹钟中断)
	{
		HAL_RTC_GetTime(&hrtc,&sTime,RTC_FORMAT_BIN);//先获取时间,再获取日期
		HAL_RTC_GetDate(&hrtc,&sDate,RTC_FORMAT_BIN);
		getADC();//测量电压需要时间,先测量出电压
		if(num==1)
		{
			LCD_ClearLine(Line2);
			LCD_ClearLine(Line6);
			LCD_DisplayStringLine(Line6,(uint8_t*)buf2);
			sprintf(buf,"   T:%02d-%02d-%02d",sTime.Hours,sTime.Minutes,sTime.Seconds);
			LCD_ClearLine(Line7);
			LCD_DisplayStringLine(Line7,(uint8_t*)buf);//打印RTC时间
			sprintf(buf,"   V1:%.2lfV",val);
			LCD_ClearLine(Line4);
			LCD_DisplayStringLine(Line4,(uint8_t*)buf);//打印电压值
			sprintf(buf,"   k:%.1lf",k);
			LCD_ClearLine(Line5);
			LCD_DisplayStringLine(Line5,(uint8_t*)buf);//打印k值
		}
		if(hour==sTime.Hours&&min==sTime.Minutes&&second==sTime.Seconds)//如果RTC时间和设定上报电压时间相同,则按照格式上报电压
		{
			sprintf(buf,"%.2lf+%.1lf+%02d%02d%02d\r\n",val,(double)EEPROM_Read(0x10)/10,hour,min,second);
			HAL_UART_Transmit_DMA(&huart1,(uint8_t*)buf,strlen(buf));//串口发送
		}
	}
	if(htim->Instance==TIM1)//间隔0.2s切换LED电平(电压满足条件+监测处于ON状态)
	{
		if(val>(double)EEPROM_Read(0x10)/10*3.3&&buf2[8]=='N')
		{
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
	}
	if(htim->Instance==TIM3)//给按键设定一个10ms中断回调函数
	{
		key[0].state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		key[1].state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		key[2].state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		key[3].state=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
		for(int i=0;i<4;i++)
		{
			switch(key[i].step)
			{
				case 0:
				{
					if(key[i].state==GPIO_PIN_RESET)
					{
						key[i].step=1;
					}
				}
				break;
				case 1:
				{
					if(key[i].state==GPIO_PIN_RESET)
					{
						if(i==0)
						{
							if(++cnt1%2==0)//cnt1是偶数,监测ON(默认监测打开);cnt1是奇数,监测OFF
							{
								sprintf(buf2,"   LED:ON");
								if(num==1)//这是在页面1显示的内容
								{
									LCD_ClearLine(Line6);
									LCD_DisplayStringLine(Line6,(uint8_t*)buf2);
								}
							}
							else
							{
								/*HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
								HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
								HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);*/
								sprintf(buf2,"   LED:OFF");
								if(num==1)
								{
									LCD_ClearLine(Line6);
									LCD_DisplayStringLine(Line6,(uint8_t*)buf2);
								}
							}
						}
						if(i==1)
						{
							if(++cnt2%2==1)//设定上报时间的页面是页面2
							{
								num=2;
								LCD_Clear(White);
								LCD_DisplayStringLine(Line2,(uint8_t*)"      Setting      ");
								sprintf(buf,"    %02d-%02d-%02d    ",hour,min,second);
								LCD_DisplayStringLine(Line5,(uint8_t*)buf);
							}
							else
							{
								num=1;
							}
							cnt3=0;
						}
						if(i==2&&num==2)//只有在页面2时按键PB3才计入,抗干扰
						{
							cnt3++;
						}
						if(i==3&&num==2)//只有在页面2时按键PA0才计入,抗干扰
						{
							if(cnt3%3==0)//进入Setting页面默认调整时
							{
								hour++;
								if(hour==24) hour=0;
								LCD_ClearLine(Line5);
								sprintf(buf,"    %02d-%02d-%02d    ",hour,min,second);
								LCD_DisplayStringLine(Line5,(uint8_t*)buf);
							}
							if(cnt3%3==1)//按一次为分
							{
								min++;
								if(min==60) min=0;
								LCD_ClearLine(Line5);
								sprintf(buf,"    %02d-%02d-%02d    ",hour,min,second);
								LCD_DisplayStringLine(Line5,(uint8_t*)buf);
							}
							if(cnt3%3==2)//按两次为秒
							{
								second++;
								if(second==60) second=0;
								LCD_ClearLine(Line5);
								sprintf(buf,"    %02d-%02d-%02d    ",hour,min,second);
								LCD_DisplayStringLine(Line5,(uint8_t*)buf);
							}
						}
						key[i].step=2;
					}
					else
					{
						key[i].step=0;
					}
				}
				break;
				case 2:
				{
					if(key[i].state==GPIO_PIN_SET)
					{
						key[i].step=0;
					}
				}
				break;
			}
		}
	}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)//串口中断回调函数,接收到一次上报电压的数据就回复一次ok
	{
		sscanf(buf1,"k%lf\r\n",&k);
		EEPROM_Write(0x10,(uint8_t)(10*k));
		HAL_UART_Transmit_DMA(&huart1,(uint8_t*)"ok\r\n",4);
		HAL_UART_Receive_DMA(&huart1,(uint8_t*)buf1,6);
	}
}
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_RTC_Init();
  MX_TIM1_Init();
  MX_TIM8_Init();
  MX_USART1_UART_Init();
  MX_ADC2_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
	I2CInit();
	HAL_TIM_Base_Start_IT(&htim8);
	HAL_TIM_Base_Start_IT(&htim1);
	HAL_TIM_Base_Start_IT(&htim3);
	LCD_Init();
	LED_Close();
	LCD_Clear(White);
	LCD_SetBackColor(White);
	LCD_SetTextColor(Black);
	
	if(EEPROM_Read(0x99)!=2)//监测板子是不是第一次上电
	{
		EEPROM_Write(0x99,2);
		HAL_Delay(20);
		EEPROM_Write(0x10,1);
	}
	HAL_UART_Receive_DMA(&huart1,(uint8_t*)buf1,6);
	sprintf(buf2,"   LED:ON");
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
		
  }
  /* USER CODE END 3 */
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32(11)按键产生中断

1.初始化IO引脚&#xff0c;设置模式&#xff0c;速度等 2.设置AFIO&#xff08;配置EXTI的引脚映射&#xff09;&#xff0c;记得开启时钟 3.配置EXTI的通道&#xff08;EXTI0和EXTI1&#xff09; 4.配置NVIC 4.1 中断优先级分组 4.2 配置中断 5.编写中断响应函数 在中断向量…

Vue前端的工作需求

加油&#xff0c;新时代打工人&#xff01; 需求&#xff1a; 实现带树形结构的表格&#xff0c;父数据显示新增下级&#xff0c;和父子都显示编辑。 技术&#xff1a; Vue3 Element Plus <template><div><el-table:data"tableData"style"width…

《数字图像处理(MATLAB版)》相关算法代码及其分析(2)

目录 1 将8连通边界转换为4连通边界 1.1 移除对角线转折 1.2 插入额外像素 1.3 总结 2 将边界信息转换为二进制图像 2.1 函数定义 2.2 参数处理和验证 2.3 默认大小参数设置 2.4 根据参数调整边界位置 2.5 生成二进制图像 2.6 错误处理 2.7 总结 3 对二值图像边界…

【EAI 028】Video as the New Language for Real-World Decision Making

Paper Card 论文标题&#xff1a;Video as the New Language for Real-World Decision Making 论文作者&#xff1a;Sherry Yang, Jacob Walker, Jack Parker-Holder, Yilun Du, Jake Bruce, Andre Barreto, Pieter Abbeel, Dale Schuurmans 作者单位&#xff1a;Google DeepMi…

Sqli-labs靶场第16关详解[Sqli-labs-less-16]自动化注入-SQLmap工具注入

Sqli-labs-Less-16 #自动化注入-SQLmap工具注入 SQLmap用户手册&#xff1a;文档介绍 - sqlmap 用户手册 以非交互式模式运行 --batch 当你需要以批处理模式运行 sqlmap&#xff0c;避免任何用户干预 sqlmap 的运行&#xff0c;可以强制使用 --batch 这个开关。这样&#xff0…

如何使用恢复软件恢复删除的文件?回收站文件恢复攻略

随着计算机在日常生活中的普及&#xff0c;文件的管理和存储成为我们不可或缺的技能。在Windows操作系统中&#xff0c;回收站作为一个帮助我们管理文件删除的重要工具&#xff0c;在误删了一些重要文件之后&#xff0c;我们可能会因为找不到回收站中恢复的文件而感到困惑。本文…

动态规划DP之背包问题3---多重背包问题

目录 DP分析&#xff1a; 优化&#xff1a; 二进制优化 例题&#xff1a; 01背包是每个物品只有一个&#xff0c;完全背包问题是每个物品有无限个。 那么多重背包问题就是 每个物品有有限个。 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件&#xff0c;每件体…

安卓手机安装termux、kali linux及基本配置

相关阅读&#xff1a;Termux 高级终端安装使用配置教程 | 国光 百度安全验证 该文安装的 kali liunx 应该是简易版的&#xff0c;没有相关工具 一、下载安装termux 建议通过 f-droid 应用市场下载链接termux&#xff0c;点击即直接下载。 二、配置termux 1.更换镜像源 te…

【大厂AI课学习笔记NO.61】环境部署的选择

主要是选择单机和分布式、生产和开发环境的规划等。 开发环境、测试环境、预发布环境和生产环境是软件开发和部署过程中常见的几个环境&#xff0c;它们各自的定义、区别、联系以及实现的关键技术如下&#xff1a; 1. 开发环境&#xff08;Development Environment&#xff09…

深入理解Docker自定义网络:构建高效的容器网络环境

文章目录 一、docker自定义网络介绍1.1 docker自定义网络介绍1.2 使用技术的优势1.3 基本使用流程 二、实战操作2.1 模式理论介绍bridge模式(默认模式)host模式 2.2 模式特点查看桥接模式的特点查看仅主机模式的特点 2.3 实战操作bridge模式host模式自定义网络 一、docker自定义…

STM32单片机基本原理与应用(十)

汉字显示实验 显示原理 字库文件的实际上包含了每个汉字的模。单片机应用经常会用到液晶显示或者LED点阵屏&#xff0c;是用点阵的方式显示的&#xff0c;要显示汉字或字符的时候会用到字模&#xff0c;字模就是字在点阵上显示时对应的编码。以字模的方式存储图形或者文字&am…

【本科组冠名奖】2023年第八届数维杯数学建模挑战赛获奖感言

美国大学生数学建模竞赛已结束过半&#xff0c;现在又迎来了2024年第九届数维杯国赛&#xff0c;准备参加今年数维杯国赛的同学&#xff0c;今天我们一起看看去年优秀的选手都有什么获奖感言吧~希望能帮到更多热爱数学建模的同学。据说文末在看点赞的大佬都会直冲国奖呢&#x…

【.NET Core】.NET中的流(Stream)

【.NET Core】.NET中的流&#xff08;Stream&#xff09; 文章目录 【.NET Core】.NET中的流&#xff08;Stream&#xff09;一、流&#xff08;Stream&#xff09;1.1 FileStream类1.2 IsolatedStorageFileStream类1.3 MemoryStream类1.4 BufferedStream类1.5 NetworkStream类…

BUUCTF---[极客大挑战 2019]Http1

1.题目描述&#xff0c;在地址框输入下面的网址 2.来到页面&#xff0c;ctrlu查看源码&#xff0c;仔细观察会看到一个.php的跳转页面 3.点进去页面提示It doesnt come from https://Sycsecret.buuoj.cn 4.页面提示它不是来源于这个网址&#xff0c;我们需要用bp抓包对数据进行…

matlab 写入格式化文本文件

目录 一、save函数 二、fprintf函数 matlab 写入文本文件可以使用save和fprintf函数 save输出结果: fprintf输出结果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf输出结果更加人性化,符合要求,下面分别介绍。 一、save函数 …

深入了解 JavaScript 混淆加密和环境检测

JavaScript混淆加密是一种通过修改代码结构和命名约定来增加代码的复杂性&#xff0c;使其难以被理解和逆向工程的技术。在这篇文章中&#xff0c;我们将深入探讨JS混淆加密的一些逻辑&#xff0c;并介绍如何通过环境检测来提高代码的安全性。我们将使用案例代码演示这些概念。…

外汇110:社交媒体上的金融欺诈激增,网民该如何识别骗局?

社交媒体平台上的金融欺诈正在以令人担忧的速度增加。从某种程度上来说&#xff0c;社交媒体已成为诈骗者的门户&#xff0c;因为它使欺诈者能够方便地与用户联系&#xff0c;并创建一个隐藏在虚假社交媒体资料后面、充斥着非法投资内容的在线角色。 由于社交媒体在我们日常生活…

智慧城市中的公共服务创新:让城市生活更便捷

目录 一、引言 二、智慧城市公共服务创新的实践 1、智慧交通系统 2、智慧医疗服务 3、智慧教育系统 4、智慧能源管理 三、智慧城市公共服务创新的挑战 四、智慧城市公共服务创新的前景 五、结论 一、引言 随着信息技术的迅猛发展&#xff0c;智慧城市已成为现代城市发…

基于React低代码平台开发:构建高效、灵活的应用新范式

文章目录 一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践四、未来展望《低代码平台开发实践&#xff1a;基于React》编辑推荐内容简介作者简介目录前言为什么要写这本书 读者对象如何阅读本书 随着数字化转型的深入&…

用BIO实现tomcat

一、前言 本课程的难度较高&#xff0c;需要将Servlet原理和IO课程全部学完。 二、当前项目使用方式 (1).自定义servlet 自定义servlet需要实现WebServlet并且实现name和urlMapping 重启进行访问 http://localhost:8090/myServlet (2).自定义html 重启进行访问 http://loc…