当前位置: 首页 > news >正文

STM32智能楼宇照明系统教程

目录

  1. 引言
  2. 环境准备
  3. 智能楼宇照明系统基础
  4. 代码实现:实现智能楼宇照明系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化
  5. 应用场景:楼宇照明管理与优化
  6. 问题解决方案与优化
  7. 收尾与总结

1. 引言

智能楼宇照明系统通过STM32嵌入式系统结合各种传感器、执行器和通信模块,实现对楼宇照明的实时监控、自动控制和数据传输。本文将详细介绍如何在STM32系统中实现一个智能楼宇照明系统,包括环境准备、系统架构、代码实现、应用场景及问题解决方案和优化方法。

2. 环境准备

硬件准备

  1. 开发板:STM32F4系列或STM32H7系列开发板
  2. 调试器:ST-LINK V2或板载调试器
  3. 传感器:如光传感器、PIR运动传感器
  4. 执行器:如LED灯、继电器模块
  5. 通信模块:如Wi-Fi模块、ZigBee模块
  6. 显示屏:如OLED显示屏
  7. 按键或旋钮:用于用户输入和设置
  8. 电源:电源适配器

软件准备

  1. 集成开发环境(IDE):STM32CubeIDE或Keil MDK
  2. 调试工具:STM32 ST-LINK Utility或GDB
  3. 库和中间件:STM32 HAL库和FreeRTOS

安装步骤

  1. 下载并安装STM32CubeMX
  2. 下载并安装STM32CubeIDE
  3. 配置STM32CubeMX项目并生成STM32CubeIDE项目
  4. 安装必要的库和驱动程序

3. 智能楼宇照明系统基础

控制系统架构

智能楼宇照明系统由以下部分组成:

  1. 数据采集模块:用于采集光照、运动等数据
  2. 数据处理与控制模块:对采集的数据进行处理和分析,生成控制信号
  3. 通信与网络系统:实现照明系统与服务器或其他设备的通信
  4. 显示系统:用于显示系统状态和控制信息
  5. 用户输入系统:通过按键或旋钮进行设置和调整

功能描述

通过各种传感器采集楼宇环境中的光照和运动数据,并实时显示在OLED显示屏上。系统通过数据处理和网络通信,实现对楼宇照明的监控和自动控制。用户可以通过按键或旋钮进行设置,并通过显示屏查看当前状态。

4. 代码实现:实现智能楼宇照明系统

4.1 数据采集模块

配置光传感器

使用STM32CubeMX配置ADC接口:

  1. 打开STM32CubeMX,选择您的STM32开发板型号。
  2. 在图形化界面中,找到需要配置的ADC引脚,设置为输入模式。
  3. 生成代码并导入到STM32CubeIDE中。

代码实现:

#include "stm32f4xx_hal.h"ADC_HandleTypeDef hadc1;void ADC_Init(void) {__HAL_RCC_ADC1_CLK_ENABLE();ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;hadc1.Init.Resolution = ADC_RESOLUTION_12B;hadc1.Init.ScanConvMode = DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;hadc1.Init.DMAContinuousRequests = DISABLE;hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;HAL_ADC_Init(&hadc1);sConfig.Channel = ADC_CHANNEL_0;sConfig.Rank = 1;sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}uint32_t Read_Light_Intensity(void) {HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);return HAL_ADC_GetValue(&hadc1);
}int main(void) {HAL_Init();SystemClock_Config();ADC_Init();uint32_t light_intensity;while (1) {light_intensity = Read_Light_Intensity();HAL_Delay(1000);}
}
配置PIR运动传感器

使用STM32CubeMX配置GPIO接口:

  1. 打开STM32CubeMX,选择您的STM32开发板型号。
  2. 在图形化界面中,找到需要配置的GPIO引脚,设置为输入模式。
  3. 生成代码并导入到STM32CubeIDE中。

代码实现:

#include "stm32f4xx_hal.h"GPIO_InitTypeDef GPIO_InitStruct = {0};void GPIO_Init(void) {__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_1;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}uint8_t Read_PIR_Sensor(void) {return HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
}int main(void) {HAL_Init();SystemClock_Config();GPIO_Init();uint8_t motion_detected;while (1) {motion_detected = Read_PIR_Sensor();HAL_Delay(1000);}
}

4.2 数据处理与控制模块

数据处理模块将传感器数据转换为可用于控制系统的数据,并进行必要的计算和分析。

照明控制算法

实现一个简单的照明控制算法,用于自动控制灯光的开关:

#define LIGHT_THRESHOLD 3000
#define MOTION_DETECTED 1
#define MOTION_NOT_DETECTED 0void Control_Lights(uint32_t light_intensity, uint8_t motion_detected) {if (light_intensity < LIGHT_THRESHOLD || motion_detected == MOTION_DETECTED) {// 打开灯光HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);} else {// 关闭灯光HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);}
}int main(void) {HAL_Init();SystemClock_Config();ADC_Init();GPIO_Init();uint32_t light_intensity;uint8_t motion_detected;while (1) {light_intensity = Read_Light_Intensity();motion_detected = Read_PIR_Sensor();Control_Lights(light_intensity, motion_detected);HAL_Delay(1000);}
}

4.3 通信与网络系统实现

配置Wi-Fi模块

使用STM32CubeMX配置UART接口:

  1. 打打开STM32CubeMX,选择您的STM32开发板型号。
  2. 在图形化界面中,找到需要配置的UART引脚,设置为UART模式。
  3. 生成代码并导入到STM32CubeIDE中。

代码实现:

#include "stm32f4xx_hal.h"
#include "usart.h"
#include "wifi_module.h"UART_HandleTypeDef huart1;void UART1_Init(void) {huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart1);
}void Send_Data_To_Server(uint32_t light_intensity, uint8_t motion_detected) {char buffer[128];sprintf(buffer, "Light Intensity: %lu, Motion Detected: %d", light_intensity, motion_detected);HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
}int main(void) {HAL_Init();SystemClock_Config();UART1_Init();ADC_Init();GPIO_Init();uint32_t light_intensity;uint8_t motion_detected;while (1) {light_intensity = Read_Light_Intensity();motion_detected = Read_PIR_Sensor();Send_Data_To_Server(light_intensity, motion_detected);HAL_Delay(1000);}
}

4.4 用户界面与数据可视化

配置OLED显示屏

使用STM32CubeMX配置I2C接口:

  1. 打打开STM32CubeMX,选择您的STM32开发板型号。
  2. 在图形化界面中,找到需要配置的I2C引脚,设置为I2C模式。
  3. 生成代码并导入到STM32CubeIDE中。

代码实现:

首先,初始化OLED显示屏:

#include "stm32f4xx_hal.h"
#include "i2c.h"
#include "oled.h"void Display_Init(void) {OLED_Init();
}

然后实现数据展示函数,将照明监测数据展示在OLED屏幕上:

void Display_Data(uint32_t light_intensity, uint8_t motion_detected) {char buffer[32];sprintf(buffer, "Light: %lu", light_intensity);OLED_ShowString(0, 0, buffer);sprintf(buffer, "Motion: %d", motion_detected);OLED_ShowString(0, 1, buffer);
}int main(void) {HAL_Init();SystemClock_Config();I2C1_Init();Display_Init();ADC_Init();GPIO_Init();uint32_t light_intensity;uint8_t motion_detected;while (1) {light_intensity = Read_Light_Intensity();motion_detected = Read_PIR_Sensor();// 显示照明监测数据Display_Data(light_intensity, motion_detected);HAL_Delay(1000);}
}

5. 应用场景:楼宇照明管理与优化

办公楼照明管理

智能楼宇照明系统可以用于办公楼的照明管理,通过实时监测环境数据,实现自动控制,提高办公效率和节能效果。

商场照明管理

在商场中,智能楼宇照明系统可以实现对不同区域的照明自动控制,提升顾客体验,并节约电力资源。

家庭照明管理

智能楼宇照明系统可以用于家庭照明,通过自动化控制和数据分析,实现更智能的家庭照明管理。

智能楼宇研究

智能楼宇照明系统可以用于智能楼宇研究,通过数据采集和分析,为楼宇照明管理和优化提供科学依据。

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

 

6. 问题解决方案与优化

常见问题及解决方案

传感器数据不准确

确保传感器与STM32的连接稳定,定期校准传感器以获取准确数据。

解决方案:检查传感器与STM32之间的连接是否牢固,必要时重新焊接或更换连接线。同时,定期对传感器进行校准,确保数据准确。

照明控制不稳定

优化控制算法和硬件配置,减少照明控制的不稳定性,提高系统反应速度。

解决方案:优化控制算法,调整参数,减少振荡和超调。使用高精度传感器,提高数据采集的精度和稳定性。选择更高效的执行器,提高照明控制的响应速度。

数据传输失败

确保Wi-Fi模块与STM32的连接稳定,优化通信协议,提高数据传输的可靠性。

解决方案:检查Wi-Fi模块与STM32之间的连接是否牢固,必要时重新焊接或更换连接线。优化通信协议,减少数据传输的延迟和丢包率。选择更稳定的通信模块,提升数据传输的可靠性。

显示屏显示异常

检查I2C通信线路,确保显示屏与MCU之间的通信正常,避免由于线路问题导致的显示异常。

解决方案:检查I2C引脚的连接是否正确,确保电源供电稳定。使用示波器检测I2C总线信号,确认通信是否正常。如有必要,更换显示屏或MCU。

优化建议

数据集成与分析

集成更多类型的传感器数据,使用数据分析技术进行环境状态的预测和优化。

建议:增加更多监测传感器,如温湿度传感器、CO2传感器等。使用云端平台进行数据分析和存储,提供更全面的环境监测和管理服务。

用户交互优化

改进用户界面设计,提供更直观的数据展示和更简洁的操作界面,增强用户体验。

建议:使用高分辨率彩色显示屏,提供更丰富的视觉体验。设计简洁易懂的用户界面,让用户更容易操作。提供图形化的数据展示,如实时环境参数图表、历史记录等。

智能化控制提升

增加智能决策支持系统,根据历史数据和实时数据自动调整控制策略,实现更高效的环境控制和管理。

建议:使用数据分析技术分析环境数据,提供个性化的环境管理建议。结合历史数据,预测可能的问题和需求,提前优化控制策略。

7. 收尾与总结

本教程详细介绍了如何在STM32嵌入式系统中实现智能楼宇照明系统,从硬件选择、软件实现到系统配置和应用场景都进行了全面的阐述。

相关文章:

STM32智能楼宇照明系统教程

目录 引言环境准备智能楼宇照明系统基础代码实现&#xff1a;实现智能楼宇照明系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;楼宇照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能楼宇照明系…...

【C语言】原码、反码、补码详解 -《码上有道 ! 》

目录 原码、反码、补码详解及其在C语言中的应用一、原码&#xff08;Sign-Magnitude&#xff09;1.1 定义与表示1.2 历史来源与作用1.3 示例1.4 C语言示例1.5 代码运行结果 二、反码&#xff08;Ones Complement&#xff09;2.1 定义与表示2.2 历史来源与作用2.3 示例2.4 C语言…...

C++找到错误的具体信息

fprintf(stderr, "Errno: %d, Error message: %s\n", errno, strerror(errno));为什么不用printf来打印输出&#xff1f; 使用 fprintf(stderr, …)&#xff0c;将错误消息输出到标准错误流 stderr。这种做法是为了将错误信息输出到一个专门用于记录错误的流中&…...

Windows 安装Zookeeper

安装 下载地址&#xff1a;Apache ZooKeeper 我下载的版本&#xff1a;zookeeper-3.4.12 下载后&#xff0c;解压 配置 1、 在D:\zookeeper-3.4.12文件夹中创建一个“data”文件夹和“log”文件夹 2、 复制zoo_sample.cfg&#xff0c;改名&#xff1a;zoo.cfg 修改zoo.c…...

从人工巡检到智能预警:视频AI智能监控技术在水库/河湖/水利防汛抗洪中的应用

一、背景需求分析 近日&#xff0c;我国多省市遭遇连日暴雨&#xff0c;导致水库、湖泊、河道等水域水位暴涨&#xff0c;城市内涝频发。随着夏季汛期的到来&#xff0c;降雨天气频繁&#xff0c;水利安全管理面临严峻挑战。为保障水库安全、预防和减少洪涝灾害&#xff0c;采…...

【轻松拿捏 】Java-static关键字(面试)

Java-static关键字 1. 定义和基本概念 回答要点&#xff1a; 示例回答&#xff1a; 2. static 变量 回答要点&#xff1a; 示例回答&#xff1a; 代码示例&#xff1a; 3. static方法 回答要点&#xff1a; 示例回答&#xff1a; 代码示例&#xff1a; 4. static 代…...

【阶乘】个人练习-Leetcode-LCP 22. 黑白方格画

题目链接&#xff1a;https://leetcode.cn/problems/ccw6C7/description/ 题目大意&#xff1a;给出一块白方格面积为n*n&#xff0c;给出一个数字k&#xff0c;每一次操作可以把方格的某一整行或者某一整列涂黑&#xff0c;求使得黑色格子数字为k的【最终图案】的个数。 思路…...

十七、【文本编辑器(三)】图像坐标变换

目录 一、缩放功能 二、旋转功能 三、镜像功能 四、QMatrix简单介绍 一、缩放功能 &#xff08;1&#xff09;在头文件中添加 “protected slots:" 变量&#xff1a; void ShowZoomln( ); &#xff08;2&#xff09;在 createActionso函数的最后添力口事件关联&…...

生活中生智慧

【 圣人多过 小人无过 】 觉得自己做得不够才能做得更好&#xff0c;互相成全&#xff1b;反求诸己是致良知的第一步&#xff1b;有苦难才能超越自己&#xff0c;开胸怀和智慧&#xff1b;不浪费任何一次困苦&#xff0c;危机中寻找智慧&#xff0c;成长自己。 把困苦当作当下…...

2024第18届中国西部(成都)教育装备展12月14日举办

2025中国国际工业气体设备技术及应用展览会 2025 China International Industrial Gas Equipment Technology and Application Exhibition 时间&#xff1a;2025年3月18-20日 地点&#xff1a;北京全国农业展览馆&#xff08;新馆&#xff09; 展览前言 随着需求市场的持续…...

Webpack看这篇就够了

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

基于京东电商蓝牙耳机产品评论数据的情感分析与文本分析

摘要 随着电子商务的迅速发展&#xff0c;了解用户对产品的意见和情感倾向对企业至关重要。本研究旨在利用Python大数据技术对电商产品评论进行情感分析和主题建模&#xff0c;为企业提供有价值的市场洞察。 通过爬虫获取电商评论数据&#xff0c;使用pandas清洗和预处理数据&a…...

【Linux网络】poll{初识poll / poll接口 / poll vs select / poll开发多客户端echo服务器}

文章目录 1.初识pollpoll与select的主要联系与区别poll的原理poll的优点poll的缺点poll vs select 2.poll开发多客户端echo服务器封装套接字接口Makefile主函数日志服务聊天服务器 1.初识poll poll是Linux系统中的一个系统调用&#xff0c;它用于监控多个文件描述符&#xff08…...

数据库db文件损坏修复方法(sqlite3:database disk image is malformed)

参考博客&#xff1a; https://www.cnblogs.com/liuyangQAQ/p/18037546 sqlite3数据库提示database disk image is malformed 解决办法-CSDN博客 【SQL】sqlite数据库损坏报错&#xff1a;database disk image is malformed&#xff08;已解决&#xff09;-CSDN博客 一、第…...

Prometheus 云原生 - 微服务监控报警系统 (Promethus、Grafana、Node_Exporter)部署、简单使用

目录 开始 Prometheus 介绍 基本原理 组件介绍 下文部署组件的工作方式 Prometheus 生态安装&#xff08;Mac&#xff09; 安装 prometheus 安装 grafana 安装 node_exporter Prometheus 生态安装&#xff08;Docker&#xff09; 安装 prometheus 安装 Grafana 安装…...

Spring源码注解篇三:深入理解@Component注解

Component及其派生注解的源码 Spring框架作为Java开发中不可或缺的一部分&#xff0c;其依赖注入机制的核心是通过注解来实现的。本文将深入探讨Spring中Component及其派生注解的源码实现&#xff0c;分析Spring如何通过类路径扫描&#xff08;Classpath Scanning&#xff09;和…...

SpringBoot中常用的注解及其用法

1. 常用类注解 RestController和Controller是Spring中用于定义控制器的两个类注解. 1.1 RestController RestController是一个组合类注解,是Controller和ResponseBody两个注解的组合,在使 用 RestController 注解标记的类中&#xff0c;每个方法的返回值都会以 JSON 或 XML…...

【大语言模型】私有化搭建-企业知识库-知识问答系统

下面是我关于大语言模型学习的一点记录 目录 人工智能学习路线 MaxKB 系统(基于大语言模型的知识问答系统) 部署开源大语言模型LLM 1.CPU模式(没有好的GPU&#xff0c;算力和效果较差) 2.GPU模式&#xff08;需要有NVIDIA显卡支持&#xff09; Ollama网络配置 Ollama前…...

CSS常用的样式

字体和文本样式 font-family: 定义文本字体。 font-size: 设置字体大小。 color: 设置文本颜色。 text-align: 水平对齐文本&#xff08;左对齐、右对齐、居中、两端对齐&#xff09;。 line-height: 设置行间距。 text-decoration: 控制文本装饰线&#xff08;如下划线、…...

结合实体类型信息(2)——基于本体的知识图谱补全深度学习方法

1 引言 1.1 问题 目前KGC和KGE提案的两个主要缺点是:(1)它们没有利用本体信息;(二)对训练时未见的事实和新鲜事物不能预测的。 1.2 解决方案 一种新的知识图嵌入初始化方法。 1.3 结合的信息 知识库中的实体向量表示&#xff0b;编码后的本体信息——>增强 KGC 2基…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...