蓝桥杯嵌入式第10届真题(完成) STM32G431

news2024/11/30 8:35:19

蓝桥杯嵌入式第10届真题(完成) STM32G431

题目

image-20240213154311661

image-20240213154320780

image-20240213154327510

image-20240213154336005

image-20240213154343448

image-20240213154351517

main.c

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
#include "key.h"
#include "myadc.h"
#include "stdbool.h"
#include "stdio.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
int8_t upled = 0x01;
int8_t uplednum = 1;
int8_t lowled = 0x02;
int8_t lowlednum = 2;
float upval = 2.4;
float lowval = 1.2;
float val;
uint32_t led1time = 0;
uint32_t led2time = 0;
uint8_t led1enable = 0;//开关
uint8_t led2enable = 0;
uint8_t view = 0;
uint8_t lcdtext[30];
uint8_t status[30];
extern struct Key key[4];
/* 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_process(void);
void lcd_process(void);
void adc_process(void);
void key_process(void);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void lcdclear(void)
{
	 LCD_Clear(Black);
   LCD_SetBackColor(Black);
   LCD_SetTextColor(White);
}
/* 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_ADC2_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
		HAL_TIM_Base_Start_IT(&htim2);
    LCD_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

    lcdclear();

   
		led_display(0x00);
    while (1)
    {
			key_process();
			adc_process();
			lcd_process();
			led_process();
    /* USER CODE END WHILE */
		 
    
			
    /* USER CODE BEGIN 3 */
    }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
  RCC_OscInitStruct.PLL.PLLN = 20;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the peripherals clocks
  */
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
  PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
void led_process(void)
{
    static bool led1flag = false;
    static bool led2flag = false;
    uint32_t currentTick = HAL_GetTick(); // 获取当前的系统时刻

    if(led1enable && (currentTick - led1time >= 200))
    {
        led1time = currentTick; // 更新时间戳
        led1flag = !led1flag; // 切换标志状态
        if(led1flag)
        {
            led_display(upled); // 点亮LED
        }
        else
        {
            led_display(0x00); // 熄灭LED
        }
    }

    if(led2enable && (currentTick - led2time >= 200))
    {
        led2time = currentTick; // 更新时间戳
        led2flag = !led2flag; // 切换标志状态
        if(led2flag)
        {
            led_display(lowled); // 点亮LED
        }
        else
        {
            led_display(0x00); // 熄灭LED
        }
    }
}

void lcd_process(void)
{
	switch(view)
	{
		case 0:
		{
			sprintf((char *)lcdtext,"        Main");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext,"  Volt:%.2f",val);
			LCD_DisplayStringLine(Line4,lcdtext);
			sprintf((char *)lcdtext,"  Status:%s",status);
			LCD_DisplayStringLine(Line6,lcdtext);
		}break;
		case 1:
		{
			sprintf((char *)lcdtext,"        Setting");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext," Max Volt:%.2f",upval);
			LCD_DisplayStringLine(Line3,lcdtext);
			sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
			LCD_DisplayStringLine(Line5,lcdtext);
			sprintf((char *)lcdtext," Upper:LD%d",uplednum);
			LCD_DisplayStringLine(Line7,lcdtext);
			sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
			LCD_DisplayStringLine(Line9,lcdtext);
		}break;
		case 2://maxval
		{
			sprintf((char *)lcdtext,"        Setting");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext," Max Volt:%.2f",upval);
			LCD_SetBackColor(Green);
			LCD_DisplayStringLine(Line3,lcdtext);
			LCD_SetBackColor(Black);
			sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
			LCD_DisplayStringLine(Line5,lcdtext);
			sprintf((char *)lcdtext," UpperLD:%d",uplednum);
			LCD_DisplayStringLine(Line7,lcdtext);
			sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
			LCD_DisplayStringLine(Line9,lcdtext);
		}break;
		case 3://minval
		{
			sprintf((char *)lcdtext,"        Setting");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext," Max Volt:%.2f",upval);
			LCD_DisplayStringLine(Line3,lcdtext);
			sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
			LCD_SetBackColor(Green);
			LCD_DisplayStringLine(Line5,lcdtext);
			LCD_SetBackColor(Black);
			sprintf((char *)lcdtext," Upper:LD%d",uplednum);
			LCD_DisplayStringLine(Line7,lcdtext);
			sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
			LCD_DisplayStringLine(Line9,lcdtext);
		}break;
		case 4://led1
		{
			sprintf((char *)lcdtext,"        Setting");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext," Max Volt:%.2f",upval);
			LCD_DisplayStringLine(Line3,lcdtext);
			sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
			LCD_DisplayStringLine(Line5,lcdtext);
			sprintf((char *)lcdtext," Upper:LD%d",uplednum);
			LCD_SetBackColor(Green);
			LCD_DisplayStringLine(Line7,lcdtext);
			LCD_SetBackColor(Black);
			sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
			LCD_DisplayStringLine(Line9,lcdtext);
		}break;
		case 5://led2
		{
			sprintf((char *)lcdtext,"        Setting");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext," Max Volt:%.2f",upval);
			LCD_DisplayStringLine(Line3,lcdtext);
			sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
			LCD_DisplayStringLine(Line5,lcdtext);
			sprintf((char *)lcdtext," Upper:LD%d",uplednum);
			LCD_DisplayStringLine(Line7,lcdtext);
			sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
			LCD_SetBackColor(Green);
			LCD_DisplayStringLine(Line9,lcdtext);
			LCD_SetBackColor(Black);
		}break;
	}
}
void adc_process(void)
{
	
	val = getADcVal(&hadc2);
	if(val>upval)
	{
		led1enable = 1;
		led2enable = 0;
		sprintf((char *)status,"Upper ");
	}else if(val<=upval&&val>=lowval)
	{
		led1enable = 0;
		led2enable = 0;
		led_display(0x00);
		sprintf((char *)status,"Normal ");
	}else{
		led1enable = 0;
		led2enable = 1;
		sprintf((char *)status,"Lower ");
	}
}
void key_process(void)
{
	
	if(key[0].key_single_flag)
	{
		lcdclear();
		key[0].key_single_flag = 0;
		if(view==0)
		{
			view = 1;
		}else if(view==1||view==2||view==3||view==4||view==5)
		{
			view = 0;
		}
	}
	
	if(key[1].key_single_flag)
	{
		lcdclear();
		key[1].key_single_flag = 0;
		if(view==1)
		{
			view = 2;
		
		}else if(view>=2&&view<=5)
		{
			view++;
			if(view>5)
				view = 2;
		}
		
	}
	
	if(key[2].key_single_flag) {
		key[2].key_single_flag = 0; // 清除按键标志位
		
		if(view == 4) { // 选择upled
				uplednum = (uplednum % 8) + 1; // 循环遍历1到8
				upled = 0x01 << (uplednum - 1); // 更新upled位掩码
		} else if(view == 5) { // 选择lowled
				lowlednum = (lowlednum % 8) + 1; // 循环遍历1到8
				lowled = 0x01 << (lowlednum - 1); // 更新lowled位掩码
		}
	}

	if(key[3].key_single_flag) {
			key[3].key_single_flag = 0; // 清除按键标志位
			if(view == 4) { // 选择upled
					uplednum = (uplednum == 1) ? 8 : uplednum - 1; // 反向循环遍历8到1
					upled = 0x01 << (uplednum - 1); // 更新upled位掩码
			} else if(view == 5) { // 选择lowled
					lowlednum = (lowlednum == 1) ? 8 : lowlednum - 1; // 反向循环遍历8到1
					lowled = 0x01 << (lowlednum - 1); // 更新lowled位掩码
			}
	}

	

}
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
    /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
    /* User can add his own implementation to report the file name and line number,
       tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */



/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

key.c

#include "key.h"

struct Key key[4]={0,0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM2)
	{
		key[0].key_gpio = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		key[1].key_gpio = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		key[2].key_gpio = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		key[3].key_gpio = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
		for(int i = 0;i<4;i++)
		{
			switch(key[i].key_status)
			{
				case 0:
				{
					if(key[i].key_gpio==0)
					{
						key[i].key_status = 1;
					}
				}break;
				case 1:
				{
					if(key[i].key_gpio==0)
					{
						key[i].key_single_flag = 1;
						key[i].key_status = 2;
					}else{
						key[i].key_status = 0;
					}
				}break;
				case 2:
				{
					if(key[i].key_gpio==1)
					{
						key[i].key_status = 0;
					}
				}break;
			}
		}
	}
}


led.c

#include "led.h"


void led_display(uint8_t led)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOC,led<<8,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

myadc.c

#include "myadc.h"
float getADcVal(ADC_HandleTypeDef *hadc)
{
	float val;
	HAL_ADC_Start(hadc);
	val = HAL_ADC_GetValue(hadc);
	return val*3.3f/4096;

}


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

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

相关文章

linux信号机制[一]

目录 信号量 时序问题 原子性 什么是信号 信号如何产生 引入 信号的处理方法 常见信号 如何理解组合键变成信号呢&#xff1f; 如何理解信号被进程保存以及信号发送的本质&#xff1f; 为什么要有信号 信号怎么用&#xff1f; 样例代码 core文件有什么用呢&#…

python系统学习Day1

section1 python introduction 文中tips只做拓展&#xff0c;可跳过。 PartOne introduction 首先要对于python这门语言有一个宏观的认识&#xff0c;包括特点和应用场景。 特点分析&#xff1a; 优势 提供了完善的基础代码库&#xff0c;许多功能不必从零编写简单优雅 劣势 运…

Linux环境下配置HTTP代理服务器教程

大家好&#xff0c;我是你们可爱的Linux小助手&#xff01;今天&#xff0c;我将带你们一起探索如何在Linux环境下配置一个HTTP代理服务器。请注意&#xff0c;这不是一次火箭科学的实验&#xff0c;而是一次简单而有趣的冒险。 首先&#xff0c;我们需要明确什么是HTTP代理服…

使用MICE进行缺失值的填充处理

在我们进行机器学习时&#xff0c;处理缺失数据是非常重要的&#xff0c;因为缺失数据可能会导致分析结果不准确&#xff0c;严重时甚至可能产生偏差。处理缺失数据是保证数据分析准确性和可靠性的重要步骤&#xff0c;有助于确保分析结果的可信度和可解释性。 在本文中&#…

【Linux学习】线程互斥与同步

目录 二十.线程互斥 20.1 什么是线程互斥&#xff1f; 20.2 为什么需要线程互斥? 20.3 互斥锁mutex 20.4 互斥量的接口 20.4.1 互斥量初始 20.4.2 互斥量销毁 20.4.3 互斥量加锁 20.4.4 互斥量解锁 20.4.5 互斥量的基本原理 20.4.6 带上互斥锁后的抢票程序 20.5 死锁问题 死锁…

怎么使用ChatGPT提高工作效率?

怎么使用ChatGPT提高工作效率&#xff0c;这是一个有趣的话题。 相信不同的人有不同的观点&#xff0c;大家的知识背景和从事的工作都不完全相同&#xff0c;所以最终ChatGPT能起到的作用也不一样。 在编程过程中&#xff0c;如果我们要找一个库&#xff0c;我们最先做的肯定…

python3 获取某个文件夹所有的pdf文件表格提取表格并一起合并到excel文件

下面是一个完整的示例&#xff0c;其中包括了merge_tables_to_excel函数的定义&#xff0c;并且假设该函数的功能是从每个PDF文件中提取第一个表格并将其合并到一个Excel文件中&#xff1a; import os from pathlib import Path import pandas as pd import pdfplumber …

GEE重投影——NICFI数据集重投影到WGS84坐标

简介 重投影 遥感影像的重投影是将一幅影像从一个地理坐标系统转换到另一个地理坐标系统的过程。在遥感应用中,重投影非常重要,因为不同的遥感影像可能来自于不同的遥感传感器或不同的地理坐标系统,而在进行数据分析和集成时,需要保证所有影像在同一地理坐标系统下。 重…

部分意图分类【LLM+RAG】

在生成人工智能领域工作最有价值的事情之一就是发现新兴技术如何融入新的解决方案。 举个例子&#xff1a;在为北美顶级金融服务公司之一设计对话式人工智能助手时&#xff0c;WillowTree 的数据和人工智能研究团队 (DART) 发现&#xff0c;将意图分类与大型语言模型 (LLM) 结合…

钓鱼邮件的发送工具GUI

一.简介 本程序利用Python语言编写&#xff0c;使用Tkinter实现图形化界面&#xff0c;可使用Pyinstaller进行exe打包&#xff0c;程序主界面截图如下&#xff1a; 二.功能 1.支持腾讯企业邮、网易企业邮、阿里企业邮、自建邮服SMTP授权账号&#xff08;其他邮服&#xff0c…

如果把vue组件动态添加到body上?

tools.js: import Vue from vue/*** param Component 组件实例的选项对象* param props 组件实例中的prop*/ export function create(Component, props) {const comp new (Vue.extend(Component))({ propsData: props }).$mount()document.body.appendChild(comp.$el)comp.re…

知识图谱与语言预训练:深度融合的智能问答时代

目录 前言1 直接使用预训练模型 vs. 知识图谱与预训练相结合1.1 直接使用预训练模型1.2 构建知识图谱后与预训练相结合 2 预训练语言模型的发展历程2.1 Word2Vec和GloVe2.2 ELMo2.3 BERT 3 知识图谱对预训练的助力3.1 弥补低频实体信息的不足3.2 提供领域知识的支持 4 典型知识…

ASCII码和EASCII码对照表

ASCII ASCII&#xff0c;是American Standard Code for Information Interchange的缩写&#xff0c; 是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语。ASCII的局限在于只能显示26个基本拉丁字母、阿拉伯数字和英式标点符号&#xff0c;因此只能用于显示现代美国英语…

车载诊断协议DoIP系列 —— DoIP APP车辆识别和声明请求报文

车载诊断协议DoIP系列 —— DoIP APP车辆识别和声明请求报文 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江…

【C++计算几何】点是否在线段上

题目描述 输入一个点Q和一条线段P1P2的坐标&#xff0c;判断这个点是否在该线段上。 输入 一行&#xff0c;共六个浮点数&#xff0c;依次表示Q&#xff0c;P1和P2的坐标。 输出 一行&#xff0c;一个字符数&#xff0c;“YES”或“NO”分别表示改点在或者不在线段上。 样…

C# CAD2016获取数据操作BlockTableRecord、Polyline、DBObject

一、数据操作说明 //DBObject 基础类 DBObject dbObj (DBObject)tr.GetObject(outerId, OpenMode.ForRead); //Polyline 线段类 Polyline outerPolyline (Polyline)tr.GetObject(outerId, OpenMode.ForRead); //BlockTableRecord 块表类 BlockTableRecord modelSpace (Bloc…

Ubuntu Desktop - Screenshot (截图工具)

Ubuntu Desktop - Screenshot [截图工具] 1. Search your computer -> Screenshot -> Lock to Launcher2. gnome-screenshot3. System Settings -> Keyboard -> ShortcutsReferences 1. Search your computer -> Screenshot -> Lock to Launcher 2. gnome-s…

uniapp API文档地址 以及 HBuilder安装

uniapp API文档地址 以及 HBuilder安装 一、进入 当前网站 uni-app 官网 [uni-app](https://zh.uniapp.dcloud.io/quickstart-hx.html)二、点击截图下载文件 三、 进入 当前网站 &#xff08;https://www.dcloud.io/hbuilderx.html&#xff09; 浏览器会识别 也可以自行选择…

寒假学习记录11:grid布局

1. display:grid 2. grid-template-columns: 100px 100px 100px //指定每列的宽度 grid-template-rows: 100px 100px 100px //指定每行的宽度 3. column-gap: 24px //列间距 row-gap: 24px //行间距 gap: 24px //都设置 4.grid-template-areas用法 <!DO…

pythondjangomysql苏州一日游之可视化分析69216-计算机毕业设计项目选题推荐(附源码)

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对旅游服务等问题&#xff0c;对旅游服务进行…