版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
校园无人超市管理系统的设计与实现摘要随着数字化校园建设的不断推进,传统校园超市在高峰时段拥堵、人力成本高、运营效率低等问题日益突出。无人零售模式凭借其便捷性和智能化特点,成为解决校园零售痛点的有效途径。本文设计并实现了一套基于STM32单片机的校园无人超市管理系统,该系统整合了扫码识别、手动输入、环境监测、自动控制和无线通信等多项功能。用户可通过扫码枪扫描商品条形码或使用矩阵键盘手动输入商品编号完成选购,系统通过OLED显示屏实时展示商品信息、购物清单和结算金额。支付完成后,系统自动控制步进电机开启超市门,同时支持通过WiFi模块与手机端进行数据交互,实现库存价格查询和远程调节。此外,系统还具备温湿度自动调节和烟雾报警功能,能够保障超市内部环境安全。测试结果表明,该系统运行稳定,操作简便,能够满足校园无人超市的基本运营需求,具有较高的实用价值和推广前景。关键词校园无人超市;STM32单片机;扫码识别;WiFi通信;环境监测AbstractWiththecontinuousadvancementofdigitalcampusconstruction,traditionalcampussupermarketsarefacingincreasinglyprominentproblemssuchascongestionduringpeakhours,highlaborcostsandlowoperationalefficiency.Theunmannedretailmodelhasbecomeaneffectivewaytosolvethepainpointsofcampusretailduetoitsconvenienceandintelligence.ThispaperdesignsandimplementsacampusunmannedsupermarketmanagementsystembasedonSTM32single-chipmicrocomputer,whichintegratesmultiplefunctionssuchascodescanningrecognition,manualinput,environmentalmonitoring,automaticcontrolandwirelesscommunication.Userscancompleteshoppingbyscanningproductbarcodeswithacodescannerormanuallyenteringproductnumbersusingamatrixkeyboard.Thesystemdisplaysproductinformation,shoppinglistsandsettlementamountsinrealtimethroughanOLEDdisplay.Afterpaymentiscompleted,thesystemautomaticallycontrolsthesteppermotortoopenthesupermarketdoor,andsupportsdatainteractionwiththemobileterminalthroughtheWiFimoduletorealizeinventorypricequeryandremoteadjustment.Inaddition,thesystemalsohasautomatictemperatureandhumidityadjustmentandsmokealarmfunctions,whichcanensuretheinternalenvironmentalsafetyofthesupermarket.Testresultsshowthatthesystemrunsstablyandiseasytooperate,whichcanmeetthebasicoperationalneedsofcampusunmannedsupermarketsandhashighpracticalvalueandpromotionprospects.KeywordsCampusUnmannedSupermarket;STM32Single-chipMicrocomputer;CodeScanningRecognition;WiFiCommunication;EnvironmentalMonitoring目录12609摘要 I16903Abstract II131721绪论 1283221.1研究背景 1242381.1.1研究背景 1312221.1.2研究意义 1136391.2国内外研究现状 2116581.2.1国内研究现状 243651.2.2国外研究现状 2247792系统总体设计 395202.1系统的设计目标 355882.2系统设计内容 3164742.3系统功能分析 4270432.3.1单片机的选型 4226962.3.2WiFi模块的选型 4232082.3.3显示模块的选型 5308263系统的硬件设计 6166573.1单片机模块 666023.2ESP8266-12FWiFi电路 7282303.3OLED显示屏电路 7124943.4ULN2003步进电机驱动电路 8218703.5DHT11温湿度传感器电路 8241503.6MQ-2烟雾传感器电路 9278953.7矩阵键盘电路 10235463.8扫码模块电路 10147043.9执行机构电路 11286674系统的软件设计 12133784.1软件介绍 12290954.2软件程序的设计 1253744.2.1主程序流程图 12270944.2.2按键函数流程设计 15313304.2.3显示函数流程设计 16308375系统的测试 1762115.1软件调试 17120865.2硬件调试 17312245.3实物展示 17212055.3.1扫码识别功能测试 1794745.3.2手动输入功能测试 18162905.3.3显示功能测试 1915345.3.4WiFi通信功能测试 1921286结论 218745参考文献 233101谢辞 256652附录A 2623326附录B 271绪论1.1研究背景1.1.1研究背景近年来,物联网、人工智能和移动支付技术的快速发展,推动了零售行业的数字化转型。无人超市作为一种新型零售业态,通过减少人工干预,实现了购物流程的自动化和智能化,显著提升了零售效率。在校园场景中,学生群体具有消费能力稳定、接受新事物快、购物时间集中等特点,对无人零售模式的接受度较高。传统校园超市通常采用人工收银方式,在上下课高峰时段,收银台前排长队的现象十分普遍,严重影响了学生的购物体验。同时,人工成本的不断上涨也增加了校园超市的运营压力。此外,传统超市在环境管理方面存在不足,温湿度控制不及时可能导致商品变质,火灾隐患也难以实时监测。因此,设计一套适合校园场景的无人超市管理系统,对于提升校园零售服务质量、降低运营成本、保障购物安全具有重要的现实意义。1.1.2研究意义本设计开发的校园无人超市管理系统,能够实现商品选购、结算、支付和门禁控制的全流程自动化,有效解决传统校园超市高峰时段拥堵的问题。学生可以通过扫码或手动输入的方式快速完成购物,无需排队等待,大大节省了购物时间。对于超市运营方而言,该系统减少了对收银人员的需求,降低了人力成本,同时通过WiFi模块实现的远程管理功能,能够实时掌握商品库存和销售情况,提高了运营管理效率。系统集成的温湿度自动调节和烟雾报警功能,能够实时监测超市内部环境,当温湿度超出设定范围时,自动启动加热、风扇或除湿设备;当烟雾浓度超标时,立即发出报警并启动喷淋装置,有效保障了商品质量和消防安全。此外,该系统采用模块化设计思路,便于后续功能扩展和升级,可根据实际需求添加人脸识别、智能货架等功能,具有较强的适应性和可扩展性。1.2国内外研究现状1.2.1国内研究现状我国无人零售行业起步较晚,但发展迅速。2017年以来,阿里巴巴、京东、苏宁等互联网巨头纷纷布局无人零售领域,推出了各自的无人超市解决方案。阿里巴巴的淘咖啡采用了计算机视觉、传感器融合和深度学习等技术,实现了“拿了就走”的购物体验;京东的无人超市则整合了RFID识别、人脸识别和移动支付技术,能够自动识别商品和用户身份。在学术研究方面,国内众多高校和科研机构也开展了无人超市相关技术的研究。清华大学、浙江大学等高校的研究团队在计算机视觉识别、智能货架和无人配送等方面取得了一系列成果。然而,目前国内的无人超市解决方案大多面向商业市场,成本较高,且功能复杂,不太适合校园这种小规模、低成本的应用场景。针对校园无人超市的专门研究相对较少,现有系统在环境监测和远程管理方面的功能也不够完善。1.2.2国外研究现状国外无人零售行业发展较早,技术相对成熟。亚马逊于2016年推出了AmazonGo无人超市,采用了先进的计算机视觉、传感器融合和机器学习技术,能够准确识别用户的购物行为和商品信息,实现了无需排队结账的购物体验。截至2023年,亚马逊已经在全球开设了数十家AmazonGo门店。除了亚马逊,沃尔玛、塔吉特等传统零售巨头也在积极探索无人零售模式。沃尔玛推出了自助收银系统和智能货架,能够实时监控商品库存;塔吉特则与科技公司合作,开发了基于RFID技术的无人零售解决方案。国外的无人超市技术虽然先进,但同样存在成本高昂、部署复杂等问题,难以在校园等场景大规模推广应用。此外,国外的无人超市系统主要针对当地消费者的购物习惯设计,不太符合国内校园的实际需求。2系统总体设计2.1系统的设计目标根据校园无人超市的实际运营需求,本系统需要实现以下功能:支持通过扫码枪扫描商品条形码识别商品信息,同时支持通过矩阵键盘手动输入商品编号。能够记录用户选购的商品数量和价格,自动计算总价,并在显示屏上展示购物清单。通过扫码枪扫描预设的付款码完成支付流程,支付成功后自动开门。采用步进电机模拟超市门的开关,支付完成后自动开门,延时一段时间后自动关门。通过OLED显示屏实时显示系统状态、商品信息、购物清单、结算金额和环境参数。实时监测超市内部的温湿度和烟雾浓度,当参数超出设定阈值时,自动启动相应的执行设备。通过WiFi模块连接手机端,实现商品库存价格查询、远程调节和环境数据同步。2.2系统设计内容本系统以STM32F103C8T6单片机为核心,整合了输入、处理和输出三大部分。输入部分包括扫码模块、温湿度传感器、烟雾传感器、矩阵键盘和供电电路;处理部分由STM32单片机完成,负责数据采集、逻辑判断和控制指令的发送;输出部分包括OLED显示屏、步进电机、蜂鸣器、执行机构和WiFi模块。用户进入超市后,通过扫码枪扫描商品条形码或使用矩阵键盘手动输入商品编号,系统将商品信息添加到购物清单并在显示屏上显示。选购完成后,用户进入结算界面,扫描预设的付款码完成支付。系统验证付款码有效后,控制步进电机开启超市门,同时清空购物清单。在整个购物过程中,系统实时监测超市内部的温湿度和烟雾浓度,根据设定的阈值自动控制加热、风扇、除湿和喷淋设备。此外,系统通过WiFi模块将商品信息、销售数据和环境参数同步到手机端,方便管理人员远程查看和调节。图1.1系统框图2.3系统功能分析2.3.1单片机的选型方案一:STC89C52STC89C52是一款基于8051架构的8位单片机,工作电压为5V,具有价格低廉、开发简单、资料丰富等优点。它内置8KB的FLASH程序存储器和512B的RAM,能够满足简单控制系统的需求。此外,STC89C52支持ISP在线编程,无需专用编程器即可完成程序烧录,非常适合初学者使用。方案二:STM32F103C8T6STM32F103C8T6是意法半导体公司推出的一款32位ARMCortex-M3内核单片机,工作电压为3.3V,最高时钟频率可达72MHz。它内置64KB的FLASH程序存储器和20KB的RAM,具有丰富的外设接口,包括USART、SPI、I2C、ADC和定时器等。与STC89C52相比,STM32F103C8T6具有更强的运算能力和更多的外设资源,能够同时处理多个任务,满足复杂控制系统的需求。综合考虑系统的功能需求和性能要求,本设计选择STM32F103C8T6作为核心控制器。该单片机运算速度快,外设接口丰富,能够同时处理扫码、传感器数据采集、显示和电机控制等多个任务,保证了系统的实时性和稳定性。虽然其价格略高于STC89C52,但对于本系统的功能实现来说,性价比更高。2.3.2WiFi模块的选型方案一:ESP-01ESP-01是一款基于ESP8266芯片的WiFi模块,体积小巧,价格低廉,支持STA和AP两种工作模式。它内置TCP/IP协议栈,能够实现串口与WiFi之间的转换。ESP-01模块只有8个引脚,接口简单,易于使用,适合对体积和成本要求较高的应用场景。方案二:ESP8266-12FESP8266-12F同样基于ESP8266芯片,相比ESP-01,它具有更多的GPIO引脚,支持更多的外设扩展。该模块内置32Mbit的FLASH存储器,能够存储更多的程序和数据。此外,ESP8266-12F采用板载天线设计,信号强度更好,通信距离更远,稳定性更高。本系统需要通过WiFi模块实现与手机端的双向数据通信,不仅要上传环境数据和销售数据,还要接收手机端发送的控制指令。ESP8266-12F具有更多的GPIO引脚和更大的存储空间,能够满足系统的功能需求,同时其良好的信号强度和稳定性也保证了通信的可靠性。因此,本设计选择ESP8266-12F作为WiFi通信模块。2.3.3显示模块的选型方案一:LCD1602LCD1602是一款字符型液晶显示模块,能够显示两行各16个字符。它采用并行接口与单片机连接,控制简单,价格低廉,广泛应用于各种嵌入式系统中。LCD1602的显示内容清晰,功耗较低,适合显示简单的文字和数字信息。方案二:OLED128x64OLED128x64是一款有机发光二极管显示屏,具有自发光、高对比度、宽视角、响应速度快等优点。它采用I2C或SPI接口与单片机连接,接口简单,占用引脚资源少。OLED显示屏能够显示图形、文字和数字,显示内容更加丰富,视觉效果更好。此外,OLED显示屏不需要背光源,功耗更低,使用寿命更长。本系统需要显示商品信息、购物清单、结算金额和环境参数等多种信息,LCD1602的显示容量有限,无法满足需求。OLED128x64显示屏能够显示更多的内容,且显示效果更好,能够提升用户的购物体验。因此,本设计选择OLED128x64作为显示模块。3系统的硬件设计3.1单片机模块STM32F103C8T6是整个系统的控制核心,所有的数据处理和控制指令都由它完成。该单片机采用LQFP48封装,共有48个引脚,包括37个通用I/O引脚、3个USART接口、2个SPI接口、2个I2C接口、1个12位ADC和3个定时器。电源电路采用Type-C接口供电,输入电压为5V,通过AMS1117-3.3V稳压芯片将5V电压转换为3.3V,为单片机和其他3.3V器件供电。在电源输入端并联了一个22uF的电解电容和一个100nF的陶瓷电容,用于滤除电源中的纹波,保证供电稳定。晶振电路采用8MHz的无源晶振,配合两个30pF的陶瓷电容组成振荡电路,为单片机提供时钟信号。复位电路采用按键复位方式,通过一个10K的上拉电阻和一个100nF的电容实现上电复位和手动复位功能。BOOT设置电路通过两个10K的电阻将BOOT0和BOOT1引脚拉低,使单片机从FLASH存储器启动。单片机的PA0-PA7引脚连接矩阵键盘的行和列,PB14和PB15引脚连接OLED显示屏的SDA和SCL引脚,PA9和PA10引脚连接ESP8266-12F模块的RX和TX引脚,PA1和PB0-PB2引脚连接MOS管的栅极,控制执行机构的启停。PA5引脚连接MQ-2烟雾传感器的模拟输出端,用于采集烟雾浓度数据。图3.1单片机接线情况3.2ESP8266-12FWiFi电路ESP8266-12F模块负责实现系统与手机端的无线通信,将采集到的环境数据和销售数据上传到手机端,并接收手机端发送的控制指令。该模块共有16个引脚,其中VCC引脚接3.3V电源,GND引脚接地,EN引脚接3.3V使能模块,TX引脚接单片机的PA10引脚,RX引脚接单片机的PA9引脚。为了保证模块的稳定工作,在VCC引脚和GND引脚之间并联了一个100nF的陶瓷电容,用于滤除电源噪声。模块的GPIO0-GPIO15引脚可以作为通用I/O口使用,本设计中未使用这些引脚,将它们悬空处理。ESP8266-12F模块采用AT指令进行控制,单片机通过USART1接口向模块发送AT指令,实现WiFi连接、数据发送和接收等功能。在电路连接时,需要注意单片机和ESP8266-12F模块的电平匹配问题。STM32F103C8T6的工作电压为3.3V,ESP8266-12F模块的工作电压也为3.3V,因此两者可以直接连接,不需要电平转换电路。通信时,单片机的TX引脚连接模块的RX引脚,单片机的RX引脚连接模块的TX引脚,实现数据的双向传输。图3.2ESP8266-12FWiFi电路3.3OLED显示屏电路OLED128x64显示屏用于显示系统状态、商品信息、购物清单、结算金额和环境参数等内容。该显示屏采用I2C接口与单片机连接,共有4个引脚,分别是VCC、GND、SDA和SCL。VCC引脚接3.3V电源,GND引脚接地,SDA引脚接单片机的PB14引脚,SCL引脚接单片机的PB15引脚。I2C总线是一种串行通信总线,由数据线SDA和时钟线SCL组成,支持多设备连接。在本系统中,OLED显示屏作为I2C从设备,单片机作为I2C主设备,通过I2C总线向显示屏发送数据和指令。显示屏的驱动芯片为SSD1306,单片机通过向SSD1306发送初始化指令,配置显示屏的工作模式,然后发送显示数据,控制显示屏的显示内容。图3.3OLED显示屏电路3.4ULN2003步进电机驱动电路步进电机用于模拟超市门的开关,由ULN2003芯片驱动。ULN2003是一款高耐压、大电流的达林顿管阵列芯片,内部集成了7个达林顿管,每个达林顿管的最大输出电流可达500mA,能够直接驱动小型步进电机。ULN2003芯片的IN1-IN4引脚分别连接单片机的PA4-PA7引脚,接收单片机发送的控制信号。OUT1-OUT4引脚分别连接步进电机的四个相位绕组,为步进电机提供驱动电流。芯片的COM引脚接5V电源,为步进电机供电。步进电机采用四相八拍的工作方式,单片机通过向PA4-PA7引脚输出不同的电平组合,控制步进电机的转动方向和速度。当需要开门时,单片机输出正转的电平序列,步进电机正转一定角度,打开超市门;当需要关门时,单片机输出反转的电平序列,步进电机反转一定角度,关闭超市门。图3.4ULN2003步进电机驱动电路3.5DHT11温湿度传感器电路DHT11是一款数字温湿度传感器,能够同时测量温度和湿度,测量范围为0-50℃,湿度测量范围为20%-90%RH,精度为±2℃和±5%RH。该传感器采用单总线通信方式,只需要一根数据线即可与单片机进行通信。DHT11传感器共有3个引脚,分别是VCC、GND和DATA。VCC引脚接5V电源,GND引脚接地,DATA引脚接单片机的PA8引脚。在DATA引脚和VCC引脚之间接了一个4.7K的上拉电阻,用于保证总线在空闲状态下为高电平。单片机通过单总线协议向DHT11传感器发送读取指令,传感器收到指令后,将采集到的温度和湿度数据转换为数字信号,通过DATA引脚发送给单片机。单片机接收到数据后,对数据进行校验和处理,得到实际的温度和湿度值。图3.5DHT11温湿度传感器电路3.6MQ-2烟雾传感器电路MQ-2是一款气敏传感器,能够检测烟雾、液化气、丙烷等多种可燃气体,具有灵敏度高、响应速度快、价格低廉等优点。该传感器的输出为模拟电压信号,与检测到的气体浓度成正比。MQ-2传感器共有4个引脚,分别是VCC、GND、DO和AO。VCC引脚接5V电源,GND引脚接地,DO引脚为数字输出端,当气体浓度超过设定阈值时,输出低电平;AO引脚为模拟输出端,输出与气体浓度成正比的模拟电压信号。本设计中使用AO引脚连接单片机的PA5引脚,通过ADC采集模拟电压信号,计算出烟雾浓度。图3.6MQ-2烟雾传感器电路3.7矩阵键盘电路矩阵键盘用于手动输入商品编号、取消付款、购买商品、确定、删除以及结算等操作。本设计采用4x4矩阵键盘,共有16个按键,包括10个数字键和6个功能键。矩阵键盘的行线连接单片机的PB3-PB6引脚,列线连接单片机的PB7-PB10引脚。单片机通过逐行扫描的方式检测按键的按下情况。扫描时,单片机依次将行线拉低,然后读取列线的电平状态。如果某一列线为低电平,则说明该行和该列交叉处的按键被按下。为了消除按键抖动的影响,软件中采用了延时防抖的方法。当检测到按键按下时,延时10ms后再次检测,如果按键仍然处于按下状态,则认为是有效按键按下。在电路连接时,在每根列线上接了一个10K的上拉电阻,用于保证列线在空闲状态下为高电平。按键的一端连接行线,另一端连接列线,当按键按下时,对应的行线和列线导通,列线电平被拉低。图3.7矩阵键盘电路3.8扫码模块电路扫码模块用于扫描商品条形码和付款码,实现商品识别和支付功能。本设计采用EM2000X扫码枪,该扫码枪支持一维码和二维码扫描,具有扫描速度快、识别率高、兼容性好等优点。EM2000X扫码枪通过USB接口与单片机连接,采用串口通信方式。扫码枪的TX引脚接单片机的PA10引脚,RX引脚接单片机的PA9引脚。当扫码枪扫描到条形码或二维码时,将解码后的数据通过串口发送给单片机。单片机通过USART1接口接收扫码枪发送的数据,对数据进行解析和处理。如果是商品条形码,则根据条形码信息查询商品数据库,获取商品名称和价格,并将商品添加到购物清单;如果是付款码,则验证付款码的有效性,验证通过后控制步进电机开门。在电路设计时,扫码枪的电源由USB接口提供,不需要额外的电源电路。为了保证通信的稳定性,串口线应尽量短,避免受到电磁干扰。图3.8扫码模块电路3.9执行机构电路执行机构包括加热装置、风扇、除湿设备和水泵,用于实现温湿度自动调节和消防喷淋功能。这些设备由N沟道MOS管控制,MOS管的栅极连接单片机的I/O引脚,漏极连接设备的电源端,源极接地。当单片机的I/O引脚输出高电平时,MOS管导通,设备通电工作;当输出低电平时,MOS管截止,设备断电停止工作。本设计中,PB0引脚控制加热装置,PB1引脚控制风扇,PA11引脚控制除湿设备,PA1引脚控制水泵。为了保护MOS管和设备,在每个设备的电源端并联了一个1N4007二极管,用于吸收设备断电时产生的反向电动势。同时,在MOS管的栅极和源极之间接了一个10K的下拉电阻,用于保证MOS管在空闲状态下处于截止状态。蜂鸣器用于烟雾浓度超标时的报警提示,由NPN三极管驱动。三极管的基极通过一个1K的电阻连接单片机的PB3引脚,集电极连接蜂鸣器的负极,发射极接地。当单片机的PB3引脚输出高电平时,三极管导通,蜂鸣器发出报警声;当输出低电平时,三极管截止,蜂鸣器停止报警。图3.9执行机构电路4系统的软件设计4.1软件介绍本系统的软件开发在Keil5集成开发环境下进行,采用C语言编写程序,使用STM32HAL库进行底层驱动开发。Keil5是一款专门针对ARM系列单片机的集成开发环境,具有界面友好、功能强大、编译效率高等优点,支持代码编辑、编译、调试和烧录等全过程开发。STM32HAL库是意法半导体公司推出的一套硬件抽象层库,提供了丰富的API函数,能够简化单片机的底层驱动开发,提高开发效率。本系统使用HAL库实现了GPIO、USART、ADC、定时器和I2C等外设的驱动,大大缩短了开发周期。程序采用模块化设计思想,将不同的功能划分为独立的函数,包括主函数、按键函数、监测函数、显示函数和处理函数等。每个函数负责完成特定的功能,函数之间通过全局变量进行数据交互。这种设计方式使得程序结构清晰,易于理解和维护,同时也便于后续功能的扩展和升级。图4.1Keil_5软件界面4.2软件程序的设计4.2.1主程序流程图系统上电后,首先进行初始化操作,包括HAL库初始化、系统时钟配置、GPIO初始化、USART初始化、ADC初始化、定时器初始化、OLED显示屏初始化和ESP8266-12F模块初始化。初始化完成后,进入主循环,依次执行按键函数、监测函数、显示函数和处理函数。按键函数负责检测矩阵键盘的按键按下情况,并根据按键值执行相应的操作;监测函数负责采集温湿度和烟雾浓度数据,接收扫码枪发送的数据,并进行处理;显示函数负责根据系统状态更新OLED显示屏的显示内容;处理函数负责根据采集到的环境数据和用户操作,控制执行机构的启停和步进电机的转动。主循环不断重复执行这四个函数,实现系统的持续运行。在运行过程中,系统通过定时器中断实现精确的延时和数据采集定时,通过串口中断实现扫码数据和WiFi数据的实时接收。图4.2程序总体流程图4.2.2按键函数流程设计按键函数首先调用按键扫描函数,检测是否有按键按下。如果检测到按键按下,并且防抖标志有效,则判断按键的类型。如果是数字键,则在输入商品编号界面下,将数字添加到商品编号数组中,并更新显示;如果是功能键,则根据按键值执行相应的功能。按键3用于进入输入商品编号界面,按下该键后,系统切换到输入界面,提示用户输入商品编号;按键7用于进入购买界面,按下该键后,系统切换到购买界面,显示已选商品的信息;按键11用于取消付款并返回初始界面,按下该键后,清空购物清单,系统切换到初始界面;按键12用于确认商品编号,按下该键后,系统根据输入的商品编号查询商品信息,如果商品有效,则将商品添加到购物清单;按键14用于删除已输入的商品编号,按下该键后,删除商品编号数组中的最后一个数字;按键15用于付款结算,按下该键后,系统切换到结算界面,显示商品总价,并提示用户出示付款码。图4.3按键函数子流程图4.2.3显示函数流程设计监测函数每500ms执行一次温湿度和烟雾浓度数据采集。首先调用DHT11读取函数,获取温度和湿度值;然后启动ADC转换,读取MQ-2传感器的模拟输出电压,将电压值转换为烟雾浓度值。接着,检测串口1是否接收到扫码枪发送的数据。如果接收到数据,则判断当前系统状态。如果不是结算界面,则判断数据是否为有效商品码。如果是有效商品码,则根据商品码添加对应的商品到购物清单,并切换到购买界面;如果是无效商品码,则显示“无效商品码”提示信息。如果是结算界面,则判断数据是否为有效付款码。如果是有效付款码,则控制步进电机开门,清空购物清单,并切换到初始界面;如果是无效付款码,则显示“无效付款码”提示信息。图4.4显示函数子流程图5系统的测试5.1软件调试软件调试分为单元测试和集成测试两个阶段。单元测试阶段,对每个功能函数进行单独测试,验证函数的功能是否正常。例如,测试按键扫描函数时,按下不同的按键,观察函数返回的按键值是否正确;测试温湿度采集函数时,改变环境温湿度,观察函数返回的温湿度值是否准确。集成测试阶段,将所有功能函数整合在一起,测试系统的整体功能。模拟用户的购物流程,测试商品扫码、手动输入、结算支付和门禁控制等功能是否正常。同时,测试环境监测和控制功能,改变温湿度和烟雾浓度,观察执行机构是否能够自动启停。在调试过程中,使用Keil5的在线调试功能,通过J-Link仿真器连接单片机,设置断点,单步执行程序,查看变量的值和程序的执行流程,查找和解决程序中的错误。5.2硬件调试硬件调试首先进行焊接检查,检查电路板上的元器件是否焊接正确,有无虚焊、漏焊和短路等问题。然后进行通电测试,先不安装单片机和其他核心芯片,只焊接电源电路,通电后测量电源输出电压是否正常。如果电源电压正常,再依次安装其他芯片,通电后检查各芯片的工作状态。接着,对每个硬件模块进行单独测试。例如,测试OLED显示屏时,下载显示测试程序,观察显示屏是否能够正常显示;测试步进电机时,下载电机测试程序,观察步进电机是否能够正常转动;测试扫码模块时,连接扫码枪,扫描条形码,观察单片机是否能够接收到正确的数据。在硬件调试过程中,使用万用表和示波器等工具,测量电路中的电压和波形,查找和解决硬件故障。5.3实物展示5.3.1扫码识别功能测试测试方法:准备多个带有条形码的商品,使用扫码枪依次扫描每个商品的条形码,观察系统是否能够正确识别商品信息,并将商品添加到购物清单中。测试过程:共扫描10个不同的商品条形码,每个条形码扫描3次。测试结果:所有条形码都能够被正确识别,商品信息显示准确,购物清单更新及时,没有出现漏扫和错扫的情况。图5.1扫码识别功能测试5.3.2手动输入功能测试测试方法:使用矩阵键盘手动输入多个商品编号,观察系统是否能够正确识别商品编号,并将对应的商品添加到购物清单中。测试过程:共输入10个不同的商品编号,每个编号输入3次,同时测试删除功能和确认功能。测试结果:所有商品编号都能够被正确输入,删除功能和确认功能正常,商品添加准确,没有出现输入错误和功能失效的情况。图5.2手动输入功能测试5.3.3显示功能测试测试方法:切换系统的不同界面,观察OLED显示屏的显示内容是否正确,显示是否清晰。测试过程:依次切换初始界面、购买界面、输入商品编号界面和结算界面,检查每个界面的显示内容。测试结果:所有界面显示内容正确,文字和数字清晰,没有出现乱码和显示不全的情况,界面切换流畅。图5.3显示功能测试5.3.4WiFi通信功能测试测试方法:将系统连接到WiFi网络,使用手机端APP查看环境数据和商品信息,并发送控制指令调节温湿度阈值,观察系统是否能够正确接收和执行指令。测试过程:多次发送不同的控制指令,检查系统的响应情况。测试结果:系统能够成功连接到WiFi网络,环境数据和商品信息能够实时同步到手机端,控制指令能够被正确接收和执行,通信稳定,没有出现数据丢失和延迟的情况。图5.4WiFi通信功能测试结论本文设计并实现了一套基于STM32单片机的校园无人超市管理系统,该系统整合了扫码识别、手动输入、环境监测、自动控制和无线通信等多项功能,能够满足校园无人超市的基本运营需求。系统以STM32F103C8T6单片机为核心,通过合理的硬件电路设计和软件程序开发,实现了商品选购、结算支付、门禁控制和环境管理的自动化。经过测试,系统运行稳定,功能正常,扫码识别准确率高,手动输入方便快捷,显示清晰,通信稳定,环境控制准确,报警及时。该系统能够有效解决传统校园超市高峰时段拥堵的问题,提升学生的购物体验,降低超市的运营成本,具有较高的实用价值。当然,本系统还存在一些不足之处。例如,目前的支付功能只是模拟实现,没有对接真实的支付平台;系统的商品管理功能还不够完善,无法实现商品库存的自动更新。未来可以进一步完善系统功能,对接移动支付平台,添加人脸识别和智能货架等功能,提高系统的智能化水平和用户体验。参考文献[1]杨文涛.校园快递站智能快递柜:,CN202210353026.9[P].2022.[2]李宗蔚.浅议智能柜在校园快递配送中的应用[J].中国物流与采购,2022(21):2.[3]徐晓萍,王碧,谢丹艳.一种基于树莓派的校园智能共享箱柜:,2021.[4]伍楚花.一种便于取放物件的快递柜:,CN213188761U[P].2021.[5]史耀军,张迦南.基于服务设计理念的校园智能取餐柜设计研究[J].设计,2022,35(13):3.[6]刘邓忠.物流柜及物流柜的控制方法:,CN113205647A[P].2021.[7]魏树桂,李彦慧,孙中国,等.一种校园快递数字发放系统:CN,CN103065170A[P].2013.[8]陈霏.一种具有自动取件功能的大容量快递柜:,CN202111103997.X[P].2022.[9]丁猛.大学校园智能快递柜选址研究[D].深圳大学.[10]牛勇,周玉熬,马麟.基于多件同取模式的校园快递取件控制系统研究与应用[J].现代信息科技,2022(003):006.[11]万波,卢洲.基于智能算法的高校智能快递柜选址问题研究[J].物流技术,2022,41(11):6.[12]徐西萍.智慧物流背景下智能快递柜的应用研究[J].中国物流与采购,2022(9):2.[13]范江波.基于物联网的智能快递柜系统设计[J].三门峡职业技术学院学报,2022(001):021.[14]杜悦,诸正杰,刘瑞.一种智能便捷快递柜:,CN217013519U[P].2022.[15]魏霞.一种基于物联网的快递取放柜:,CN215987470U[P].2022.[16]鞠文航,张天华,赵子丰,等.一种无人快递收发柜:,CN215873985U[P].2022.[17]季荣.一种自助式快递暂存柜:,CN202111330628.4[P].2022.[18]倪泰乐,欧心悦,舒俊豪,等.快递自提柜服务需求分析与改进设计[J].机械设计,2022,39(10):7.[19]郑婷婷,陈芸.紫外消杀快递存放柜及其使用方法:,CN202210801302.3[P].2022.[20]袁哲,吴婷.高校快递配送模式探讨——以武科大城市学院为例[J].物流工程与管理,2021,43(5):3.[21]付丽琴,侯佳丽.校园智慧物流平台设计[J].物联网技术,2021.谢辞在本次毕业设计的过程中,我得到了许多人的帮助和支持,在此向他们表示衷心的感谢。首先,我要感谢我的指导老师,从课题的选择、方案的设计到论文的撰写,老师都给予了我悉心的指导和耐心的帮助。老师严谨的治学态度、渊博的知识和无私的奉献精神,深深地感染了我,使我受益匪浅。其次,我要感谢我的同学和朋友们,在毕业设计的过程中,我们相互交流、相互帮助,共同解决了许多技术难题。他们的支持和鼓励,让我能够顺利完成毕业设计。最后,我要感谢我的家人,他们一直以来对我的学习和生活给予了无微不至的关怀和支持,是我前进的动力和坚强的后盾。在今后的学习和工作中,我将继续努力,不断提高自己的专业能力,不辜负老师、同学和家人的期望。附录A原理图:附录B部分源程序:/*USERCODEBEGINHeader*//*********************************************************************************@file:main.c*@brief:Mainprogrambody*******************************************************************************@attention**Copyright(c)2022STMicroelectronics.*Allrightsreserved.**ThissoftwareislicensedundertermsthatcanbefoundintheLICENSEfile*intherootdirectoryofthissoftwarecomponent.*IfnoLICENSEfilecomeswiththissoftware,itisprovidedAS-IS.********************************************************************************//*USERCODEENDHeader*//*Includes*/#include"main.h"#include"adc.h"#include"tim.h"#include"usart.h"#include"gpio.h"/*Privateincludes*//*USERCODEBEGINIncludes*/#include"./HAL/key/key.h"#include"./HAL/OLED/OLED_NEW.H"#include"./HAL/DELAY/delay.h"#include"./HAL/dht11/dht11.h"#include"./HAL/AliESP8266/AliESP8266.h"/*USERCODEENDIncludes*//*Privatetypedef*//*USERCODEBEGINPTD*/voidKey_function(void); //按键函数voidMonitor_function(void); //监测函数voidDisplay_function(void); //显示函数voidManage_function(void); //处理函数/*USERCODEENDPTD*//*Privatedefine*//*USERCODEBEGINPD*//*USERCODEENDPD*//*Privatemacro*//*USERCODEBEGINPM*//*USERCODEENDPM*//*Privatevariables*//*USERCODEBEGINPV*/uint8_tkey_num,flag_display;//按键与显示变量uint8_tkey_bz; //按键标志位uint16_ttime_1ms,time_500ms;//计时变量1ms,500msuint16_txy_num1,xy_num2,xy_num3,xy_num4; //购买商品数量uint16_tdj_num1=2,dj_num2=8,dj_num3=24,dj_num4=14; //商品单价变量uint8_tmq2_value,mq2_yu=50;uint16_ttemp,humi;uint8_ttemp_min=10,temp_max=30,humi_min=20,humi_max=80;uint8_tfan_flag,hot_flag,humi_flag,pumb_flag;uint8_tbeep_flag;uint8_tspbh_num[9];//商品编号数组uint8_tPassword_Num; //编号计数变量uint8_tmoto_flag;uint8_tMotor_Status;//步进电机状态变量uint16_tMotor_Num;//步进电机计数变量uint8_tconstMotor_Buf[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//步进电机步数数组//串口1的数据获取uint8_tuart1_value;//串口传的单个数据//串口的储存数组,串口的接收时间,串口存值的数量uint8_tuart1_buf[512],uart1_time,uart1_num;uint8_tuart1_rx_flag;//串口的获取值的标志位/*USERCODEENDPV*//*Privatefunctionprototypes*/voidSystemClock_Config(void);/*USERCODEBEGINPFP*//*USERCODEENDPFP*//*Privateusercode*//*USERCODEBEGIN0*/uint16_tdong_get_adc(){//开启ADC1HAL_ADC_Start(&hadc1);//等待ADC转换完成,超时为100msHAL_ADC_PollForConversion(&hadc1,100);//判断ADC是否转换成功if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)) { //读取值 returnHAL_ADC_GetValue(&hadc1); }return0;}/***********按键设置函数*****/voidKey_function(void){ key_num=Chiclet_Keyboard_Scan(); //按键扫描 if(key_num==0xff)key_bz=1; if((key_num!=0xff&&key_bz==1)) { key_bz=0; if((key_num<12&&key_num%4<3)||key_num==13) //按下的是数字键 { if(flag_display==2) { if(Password_Num<9) { /*数字为1~9*/ if(key_num!=13)spbh_num[Password_Num]=key_num/4*3+(key_num%4+1); /*数字为0*/ elsespbh_num[Password_Num]=0; Password_Num++; } } } switch(key_num) { case3://输入商品编号 if(flag_display==0||flag_display==1) { flag_display=2; OLED_Clear();//清屏 } break; case7://购买商品 if(xy_num1>0||xy_num2>0||xy_num3>0||xy_num4>0) { flag_display=1; OLED_Clear();//清屏 } break; case11://取消付款,回到初始页面 if(flag_display==3) { xy_num1=0; xy_num2=0; xy_num3=0; xy_num4=0; flag_display=0; OLED_Clear();//清屏 } if(flag_display==1||flag_display==2) { flag_display=0; OLED_Clear();//清屏 } break; case12://商品编号确定 if(flag_display==2) { if(spbh_num[0]==6&&spbh_num[1]==9&&spbh_num[2]==2&&spbh_num[3]==4&&spbh_num[4]==5&&spbh_num[5]==3&&spbh_num[6]==0&&spbh_num[7]==1)//判断分析数据 { switch(spbh_num[8]) { case0: Oled_ShowString(8,1,(uint8_t*)""); Oled_ShowCHinese(16,1,(uint8_t*)"无效商品编号"); Oled_ShowString(112,1,(uint8_t*)""); HAL_Delay(1500); break; case1: Oled_ShowString(8,1,(uint8_t*)""); Oled_ShowCHinese(16,1,(uint8_t*)"无效商品编号"); Oled_ShowString(112,1,(uint8_t*)""); HAL_Delay(1500); break; case2: Oled_ShowString(8,1,(uint8_t*)""); Oled_ShowCHinese(16,1,(uint8_t*)"无效商品编号"); Oled_ShowString(112,1,(uint8_t*)""); HAL_Delay(1500); break; case3: Oled_ShowString(8,1,(uint8_t*)""); Oled_ShowCHinese(16,1,(uint8_t*)"无效商品编号"); Oled_ShowString(112,1,(uint8_t*)""); HAL_Delay(1500); break; case4: Oled_ShowString(8,1,(uint8_t*)""); Oled_ShowCHinese(16,1,(uint8_t*)"无效商品编号"); Oled_ShowString(112,1,(uint8_t*)""); HAL_Delay(1500); break; case5: Oled_ShowString(8,1,(uint8_t*)""); Oled_ShowCHinese(16,1,(uint8_t*)"无效商品编号"); Oled_ShowString(112,1,(uint8_t*)""); HAL_Delay(1500); break; case6: xy_num1++; flag_display=1; OLED_Clear();//清屏 break; case7: xy_num2++; flag_display=1; OLED_Clear();//清屏 break; case8: xy_num3++; flag_display=1; OLED_Clear();//清屏 break; case9: xy_num4++; flag_display=1; OLED_Clear();//清屏 break; default: break; } } else { Oled_ShowString(8,1,(uint8_t*)""); Oled_ShowCHinese(16,1,(uint8_t*)"无效商品编号"); Oled_ShowString(112,1,(uint8_t*)""); HAL_Delay(1500); } } break; case14://删除 if(flag_display==2) { if(Password_Num>0) { Password_Num--; spbh_num[Password_Num]=0; } } break; case15://付款结算 if(flag_display==1&&(xy_num1>0||xy_num2>0||xy_num3>0||xy_num4>0)) { flag_display=3; OLED_Clear(); //清屏 } elseif(moto_flag==1) { moto_flag=0; } break; default: break; } }}/***********监测函数*****/voidMonitor_function(void){ if(time_500ms==1) { time_500ms=0; DHT11_Read_TempAndHumidity(&DHT11_Data);//调用获取温湿度函数 temp=DHT11_Data.temperature; humi=DHT11_Data.humidity; mq2_value=(dong_get_adc()/4095.0)*99;//获取烟雾值 } if(flag_display!=3) { if(uart1_rx_flag==1)//串口1接收扫码数据 { uart1_rx_flag=0; if(uart1_buf[0]==0x36&&uart1_buf[1]==0x39&&uart1_buf[2]==0x32&&uart1_buf[3]==0x34 &&uart1_buf[4]==0x35&&uart1_buf[5]==0x33&&uart1_buf[6]==0x30&&uart1_buf[7]==0x31)//判断接收数据 { flag_display=1; OLED_Clear(); switch(uart1_buf[8]) { case0x36://商品1 xy_num1++; break; case0x37://商品2 xy_num2++; break; case0x38://商品3 xy_num3++; break; case0x39://商品4 xy_num4++; break; default: break; } } else { if(xy_num1>0||xy_num2>0||xy_num3>0||xy_num4>0) { flag_display=0; OLED_Clear();//清屏 Oled_ShowString(16,2,(uint8_t*)""); Oled_ShowCHinese(24,2,(uint8_t*)"无效商品码"); Oled_ShowString(104,2,(uint8_t*)""); HAL_Delay(1500); flag_display=1; OLED_Clear();//清屏 } else { flag_display=0; OLED_Clear();//清屏 Oled_ShowString(16,2,(uint8_t*)""); Oled_ShowCHinese(24,2,(uint8_t*)"无效商品码"); Oled_ShowString(104,2,(uint8_t*)""); HAL_Delay(1500); OLED_Clear();//清屏 } } } } if(flag_display==3)//结算付款界面 { if(uart1_rx_flag==1)//串口1接收扫码数据 { uart1_rx_flag=0; if((uart1_buf[0]==0x31&&uart1_buf[1]==0x33)||(uart1_buf[0]==0x32&&uart1_buf[1]==0x38))//判断接收数据 { moto_flag=1;//步进电机开门 xy_num1=0;//清0 xy_num2=0; xy_num3=0; xy_num4=0; OLED_Clear(); flag_display=0; } else { Oled_ShowString(16,4,(uint8_t*)""); Oled_ShowCHinese(24,4,(uint8_t*)"无效付款码"); Oled_ShowString(104,4,(uint8_t*)""); HAL_Delay(1500); } } }}/***********显示函数*****/voidDisplay_function(void){ uint8_ti; switch(flag_display) //根据不同的显示模式标志位,显示不同界面 { case0: //初始界面 Oled_ShowCHinese(16,0,(uint8_t*)"无人消费超市"); Oled_ShowString(0,3,(uint8_t*)"T:"); OLED_Show_Temp(16,3,temp); Oled_ShowString(80,3,(uint8_t*)"H:"); OLED_Show_Humi(96,3,humi); Oled_ShowCHinese(0,6,(uint8_t*)(uint8_t*)"烟雾"); Oled_ShowString(32,6,(uint8_t*)":"); OLED_ShowNum(40,6,mq2_value,2); if(moto_flag==1) { Oled_ShowCHinese(80,6,(uint8_t*)(uint8_t*)"门已开"); } else { Oled_ShowString(80,6,(uint8_t*)""); }// OLED_ShowNum(80,6,humi_min,2); break; case1: //商品购买显示界面 if(xy_num1>0) { Oled_ShowCHinese(0,0,(uint8_t*)(uint8_t*)"商品"); Oled_ShowString(32,0,(uint8_t*)"1:"); OLED_ShowNum(48,0,xy_num1,2); OLED_ShowNum(88,0,dj_num1,2); Oled_ShowCHinese(104,0,(uint8_t*)"元"); } if(xy_num2>0) { Oled_ShowCHinese(0,2,(uint8_t*)"商品"); Oled_ShowString(32,2,(uint8_t*)"2:"); OLED_ShowNum(48,2,xy_num2,2); Oled_ShowString(64,2,(uint8_t*)""); OLED_ShowNum(88,2,dj_num2,2); Oled_ShowCHinese(104,2,(uint8_t*)"元"); } else Oled_ShowString(16,2,(uint8_t*)""); if(xy_num3>0) { Oled_ShowCHinese(0,4,(uint8_t*)"商品"); Oled_ShowString(32,4,(uint8_t*)"3:"); OLED_ShowNum(48,4,xy_num3,2); OLED_ShowNum(88,4,dj_num3,2); Oled_ShowCHinese(104,4,(uint8_t*)"元"); } if(xy_num4>0) { Oled_ShowCHinese(0,6,(uint8_t*)"商品"); Oled_ShowString(32,6,(uint8_t*)"4:"); OLED_ShowNum(48,6,xy_num4,2); OLED_ShowNum(88,6,dj_num4,2); Oled_ShowCHinese(104,6,(uint8_t*)"元"); } break; case2: //输入商品编号界面 Oled_ShowCHinese(8,1,(uint8_t*)"请输入商品编号"); for(i=0;i<9;i++) { if(i<Password_Num)OLED_ShowNum(28+8*i,5,spbh_num[i],1); elseOled_ShowString(28+8*i,5,(uint8_t*)""); } break; case3: //结算付款界面 Oled_ShowCHinese(16,1,(uint8_t*)"总价"); Oled_ShowString(48,1,(uint8_t*)":"); OLED_ShowNum(56,1,xy_num1*dj_num1+xy_num2*dj_num2+xy_num3*dj_num3+xy_num4*dj_num4,5); Oled_ShowCHinese(96,1,(uint8_t*)"元"); Oled_ShowCHinese(16,4,(uint8_t*)"请出示付款码"); break; }}/***********处理函数*****/voidManage_function(void){if(moto_flag==1) //打开{ if((Motor_Status&0x40)==0x00) { Motor_Status|=0x81; }}else{ if(Motor_Status&0x40) //关闭 { Motor_Status&=~0x41; Motor_Status|=0x80; }} if(temp<temp_min*10) { hot_flag=1; } else { hot_flag=0; } if(temp>temp_max*10||humi>humi_max) { fan_flag=1; } else { fan_flag=0; } if(humi<humi_min) { humi_flag=1; } else { humi_flag=0; } if(mq2_value>mq2_yu) { pumb_flag=1; beep_flag=1; } else { pumb_flag=0; beep_flag=0; } RELAY_FAN(fan_flag); RELAY_HOT(hot_flag); RELAY_HUMI(humi_flag); RELAY_PUMB(pumb_flag); BEEP(beep_flag);}/*USERCODEEND0*//***@briefTheapplicationentrypoint.*@retvalint*/intmain(void){/*USERCODEBEGIN1*//*USERCODEEND1*//*MCUConfiguration*//*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/HAL_Init();/*USERCODEBEGINInit*//*USERCODEENDInit*//*Configurethesystemclock*/SystemClock_Config();/*USERCODEBEGINSysInit*//*USERCODEENDSysInit*//*Initializeallconfiguredperipherals*/MX_GPIO_Init();MX_TIM1_Init();MX_USART2_UART_Init();MX_TIM3_Init();MX_USART1_UART_Init();MX_ADC1_Init();/*USERCODEBEGIN2*/HAL_TIM_Base_Start_IT(&htim1);//定时器1中断使能 HAL_UART_Receive_IT(&huart1,&uart1_value,1);//串口1中断使能HAL_UART_Receive_IT(&Huart_wifi,&uartwifi_value,1);//WiFi串口中断使能/*USERCODEEND2*//*Infiniteloop*//*USERCODEBEGINWHILE*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年广西贵港市高一10月月考语文试题(解析版)
- 2025-2026年天津市人教版高一物理第5课电磁学综合测试题
- 2025-2026年老年康复治疗伦理与法规考核试卷
- 2026年福建省部编版四年级英语第11课Animals课文理解课件
- 内科医院感染工作总结范文
- 2026年事业单位考试法律法规真题汇编及解析
- 乡村绿化技术规程(试行)
- 投融资专业考试题及答案
- 网球裁判考试复习题及答案
- 维修工考试题及答案卷及答案
- 【《10kV供电系统工程继电保护系统设计案例》4000字】
- 气管切开中医护理
- 电气一次考试题库及答案
- 土地抵押债务借款合同范本
- 口腔护理漱口液的选择
- JBT 10381-2013 柔性组合式悬挂起重机
- 知道智慧网课《科技伦理》章节测试答案
- 实验室安全培训课件
- 牵手混声合唱谱
- 建筑企业舆情应对培训课件
- GA 1808-2022军工单位反恐怖防范要求
评论
0/150
提交评论