news 2026/6/9 23:44:06

STM32学习_GPIO简介

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32学习_GPIO简介

STM32学习_GPIO简介

一、GPIO输出部分

- 实现 LED 点亮的代码:

#include"stm32f10x.h"// Device headerintmain(void){// 开启 RCC 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 配置结构体,用于初始化 GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 初始化GPIOAGPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_0);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯亮GPIO_SetBits(GPIOA,GPIO_Pin_0);// 设置 GPIOA,GPIO_Pin_0 为高电平,灯灭GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯亮GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯灭while(1){}}

- 实现 LED 闪烁的代码:

#include"stm32f10x.h"// Device header#include"Delay.h"intmain(void){// 开启 RCC 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 配置结构体,用于初始化 GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 初始化GPIOAGPIO_Init(GPIOA,&GPIO_InitStructure);while(1){GPIO_ResetBits(GPIOA,GPIO_Pin_0);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯亮Delay_ms(500);GPIO_SetBits(GPIOA,GPIO_Pin_0);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯灭Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯亮Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯灭Delay_ms(500);}}

- 实现 LED 流水灯的代码:

#include"stm32f10x.h"// Device header#include"Delay.h"intmain(void){// 开启 RCC 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 配置结构体,用于初始化 GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | ···;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;// 选择全部的端口GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 初始化GPIOAGPIO_Init(GPIOA,&GPIO_InitStructure);while(1){GPIO_Write(GPIOA,~0x0001);// 0000 0000 0000 0001Delay_ms(500);GPIO_Write(GPIOA,~0x0002);// 0000 0000 0000 0010Delay_ms(500);GPIO_Write(GPIOA,~0x0004);// 0000 0000 0000 0100Delay_ms(500);GPIO_Write(GPIOA,~0x0008);// 0000 0000 0000 1000Delay_ms(500);GPIO_Write(GPIOA,~0x0010);// 0000 0000 0001 0000Delay_ms(500);GPIO_Write(GPIOA,~0x0020);// 0000 0000 0010 0000Delay_ms(500);GPIO_Write(GPIOA,~0x0040);// 0000 0000 0100 0000Delay_ms(500);GPIO_Write(GPIOA,~0x0080);// 0000 0000 1000 0000Delay_ms(500);}}

- 实现 蜂鸣器的代码:

#include"stm32f10x.h"// Device header#include"Delay.h"intmain(void){// 开启 RCC 时钟,易错点:时钟没有从 GPIOA 换成 GPIOB,导致蜂鸣器不响RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 配置结构体,用于初始化 GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 初始化GPIOAGPIO_Init(GPIOB,&GPIO_InitStructure);while(1){// 输出低电平,蜂鸣器响GPIO_ResetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_ResetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_12);Delay_ms(700);}}

二、GPIO输入部分

目录结构,创建代码前先完善目录,并在魔术棒内添加路径配置

- 按键控制代码展示:

main.c 主函数代码:

#include"stm32f10x.h"// Device header#include"Delay.h"#include"LED.h"#include"Key.h"uint8_tKeyNum;intmain(void){LED_Init();Key_Init();while(1){KeyNum=Key_GetNum();if(KeyNum==1){LED1_Turn();}if(KeyNum==2){LED2_Turn();}}}

LED.c 和 LED.h 代码:

#include"stm32f10x.h"// Device headervoidLED_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 开启时钟,并完成配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);}voidLED1_ON(void)// 点亮 Led1{GPIO_ResetBits(GPIOA,GPIO_Pin_1);}voidLED1_OFF(void)// 熄灭 Led1{GPIO_SetBits(GPIOA,GPIO_Pin_1);}voidLED1_Turn(void)// 翻转 Led1 GPIO,实现按下点亮,再按下熄灭{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0)// 关于这个函数,下面会给个表格{GPIO_SetBits(GPIOA,GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_1);}}// 和上面一样,这里不赘述voidLED2_ON(void){GPIO_ResetBits(GPIOA,GPIO_Pin_2);}voidLED2_OFF(void){GPIO_SetBits(GPIOA,GPIO_Pin_2);}voidLED2_Turn(void){if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0){GPIO_SetBits(GPIOA,GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_2);}}
#ifndef__LED_H#define__LED_HvoidLED_Init(void);voidLED1_ON(void);voidLED1_OFF(void);voidLED2_ON(void);voidLED2_OFF(void);voidLED1_Turn(void);voidLED2_Turn(void);#endif

Key.c 和 Key.h 代码:

#include"stm32f10x.h"// Device header#include"Delay.h"/** * 函 数:按键初始化 * 参 数:无 * 返 回 值:无 */voidKey_Init(void){/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//将PB1和PB11引脚初始化为上拉输入}/** * 函 数:按键获取键码 * 参 数:无 * 返 回 值:按下按键的键码值,范围:0~2,返回0代表没有按键按下 * 注意事项:此函数是阻塞式操作,当按键按住不放时,函数会卡住,直到按键松手 */uint8_tKey_GetNum(void){uint8_tKeyNum=0;//定义变量,默认键码值为0if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);//延时消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);//等待按键松手Delay_ms(20);//延时消抖KeyNum=1;//置键码为1}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)//读PB11输入寄存器的状态,如果为0,则代表按键2按下{Delay_ms(20);//延时消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);//等待按键松手Delay_ms(20);//延时消抖KeyNum=2;//置键码为2}returnKeyNum;//返回键码值,如果没有按键按下,所有if都不成立,则键码为默认值0}
#ifndef__KEY_H#define__KEY_HvoidKey_Init(void);uint8_tKey_GetNum(void);#endif

表格只保留小白最常用的操作,用**PA1(通用引脚)PC13(LED常用)**做示例,重点标注你提到的GPIO_ReadOutputDataBit

操作类型标准库函数功能说明(大白话)示例代码(直接能用)
开启GPIO时钟RCC_APB2PeriphClockCmd()给GPIO端口“通电”,必须第一步做开启GPIOA时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
开启GPIOC时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO引脚初始化GPIO_Init()配置引脚的工作模式(比如输出/输入)配置PA1为推挽输出:
c<br>GPIO_InitTypeDef GPIO_InitStruct;<br>GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;<br>GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;<br>GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br>GPIO_Init(GPIOA, &GPIO_InitStruct);<br>
设置引脚为高电平GPIO_SetBits()把引脚拉成高电平(比如让PC13的LED熄灭)PA1设为高电平:
GPIO_SetBits(GPIOA, GPIO_Pin_1);
PC13设为高电平:
GPIO_SetBits(GPIOC, GPIO_Pin_13);
设置引脚为低电平GPIO_ResetBits()把引脚拉成低电平(比如让PC13的LED点亮)PA1设为低电平:
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
PC13设为低电平:
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
读取引脚的输出电平GPIO_ReadOutputDataBit()查“软件设置的引脚电平”(不是实际外部电平)读取PA1的输出电平:
c<br>// 返回SET(1)表示高电平,RESET(0)表示低电平<br>uint8_t level = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1);<br>
读取引脚的实际输入电平GPIO_ReadInputDataBit()查“引脚实际接的外部电平”(比如读按键)读取PA0的实际电平:
uint8_t key_level = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
读取整个端口的输出数据GPIO_ReadOutputData()一次性读整个GPIO口的所有引脚输出电平(少用)读取GPIOA所有引脚输出电平:
uint16_t data = GPIO_ReadOutputData(GPIOA);
读取整个端口的输入数据GPIO_ReadInputData()一次性读整个GPIO口的所有引脚实际电平(少用)读取GPIOA所有引脚实际电平:
uint16_t data = GPIO_ReadInputData(GPIOA);

- GPIO操作的3个核心步骤

无论控制LED还是读按键,都要按这个流程来,少一步都不行

步骤1:开启GPIO时钟
// 以操作PC13(LED)为例,开启GPIOC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

小白提醒:忘记开时钟是最常见的错误,代码写了也没反应!

步骤2:初始化GPIO引脚

需要用一个叫GPIO_InitTypeDef结构体来配置引脚参数,小白只需关注3个参数:

  • GPIO_Pin:选要操作的引脚(比如GPIO_Pin_13
  • GPIO_Mode:引脚模式(常用2种:
    • GPIO_Mode_Out_PP:推挽输出(适合驱动LED、继电器,最常用)
    • GPIO_Mode_IPU:上拉输入(适合读按键,避免引脚悬空)
  • GPIO_Speed:输出速度(选GPIO_Speed_50MHz就行,对LED、按键无影响)

示例(配置PC13为推挽输出):

GPIO_InitTypeDef GPIO_InitStruct;// 定义配置结构体GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;// 选择PC13引脚GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;// 推挽输出模式GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;// 输出速度50MHzGPIO_Init(GPIOC,&GPIO_InitStruct);// 执行初始化
步骤3:用函数操作引脚(电平设置/读取)
// 比如让PC13点亮(低电平)GPIO_ResetBits(GPIOC,GPIO_Pin_13);// 读取PC13的输出电平uint8_tlevel=GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_13);

- 关键函数详解:GPIO_ReadOutputDataBit

小白最容易搞混“读取输出电平”和“读取输入电平”,用表格对比一下:

函数读取的是什么?举个例子(PC13)
GPIO_ReadOutputDataBit()读取软件设置的电平(输出寄存器ODR的值)你用GPIO_SetBits()把PC13设为高电平,即使外部电路把PC13拉低,这个函数仍返回高电平(SET)
GPIO_ReadInputDataBit()读取引脚实际的外部电平(输入寄存器IDR的值)你用GPIO_SetBits()把PC13设为高电平,但外部电路把PC13拉低,这个函数返回低电平(RESET)

小白总结

  • 想知道“我让引脚输出什么电平”,用GPIO_ReadOutputDataBit()
  • 想知道“引脚实际接的是什么电平”,用GPIO_ReadInputDataBit()

- 光敏电阻控制蜂鸣器

main.c 主函数代码

#include"stm32f10x.h"// Device header#include"Delay.h"#include"Buzzer.h"#include"LightSensor.h"uint8_tKeyNum;intmain(void){Buzzer_Init();LightSensor_Init();while(1){if(LightSensor_Get()==1){Buzzer_ON();}else{Buzzer_OFF();}}}

蜂鸣器代码:

#include"stm32f10x.h"// Device headervoidBuzzer_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_12);}voidBuzzer_ON(void){GPIO_ResetBits(GPIOB,GPIO_Pin_12);}voidBuzzer_OFF(void){GPIO_SetBits(GPIOB,GPIO_Pin_12);}voidBuzzer_Turn(void){if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12)==0){GPIO_SetBits(GPIOB,GPIO_Pin_12);}else{GPIO_ResetBits(GPIOB,GPIO_Pin_12);}}
#ifndef__BUZZER_H#define__BUZZER_HvoidBuzzer_Init(void);voidBuzzer_ON(void);voidBuzzer_OFF(void);voidBuzzer_Turn(void);#endif

光敏传感器代码:

#include"stm32f10x.h"// Device headervoidLightSensor_Init(void){/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);}uint8_tLightSensor_Get(void){returnGPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);}
#ifndef__LIGHT_SENSOR_H#define__LIGHT_SENSOR_HvoidLightSensor_Init(void);uint8_tLightSensor_Get(void);#endif
对比项有源蜂鸣器无源蜂鸣器备注(STM32使用建议)
核心结构内置振荡电路(含三极管、振荡芯片)仅电磁线圈+振膜,无振荡电路有源的“源”指内置振荡源,并非“电源”
驱动方式直接接直流电压(如3.3V/5V)即可发声需输入一定频率的方波信号(如1kHz~5kHz)才能发声有源:STM32用GPIO输出高低电平就能控制;无源:需用PWM或延时翻转GPIO产生方波
声音控制只能控制响/不响,音调固定可通过改变方波频率控制音调(如不同频率出不同声音)做音乐播放选无源,仅做报警提示选有源
工作电压有固定电压(如3V、5V,错压易烧毁)电压范围宽(如3V~5V),由方波幅值决定需匹配STM32引脚输出电平(3.3V)
引脚标识通常标“+”“-”(正负极性,反接不响)无正负极(两根引脚可互换)有源反接不会烧,但不工作;无源无极性限制
外观特征顶部盖板多为黑色/红色,底部电路板可见芯片顶部盖板多为白色/透明,内部可见线圈和振膜肉眼可快速区分(新手实用技巧)
STM32驱动示例GPIO_ResetBits(GPIOB, GPIO_Pin_0);(低电平响,需看接线)用延时生成方波:
c<br>while(1){<br>GPIO_SetBits(GPIOB, GPIO_Pin_0);<br>Delay_us(500);<br>GPIO_ResetBits(GPIOB, GPIO_Pin_0);<br>Delay_us(500);<br>}<br>(1kHz方波)
有源驱动代码简单,无源需生成方波
成本与适用场景成本稍高,适合简单报警(如按键提示、故障报警)成本稍低,适合音乐播放、复杂音效(如电子琴)新手入门先玩有源,易上手

- 光敏电阻模块工作原理

光敏模块是STM32入门常用的环境光检测模块,核心是光敏电阻,配合简单的电路实现“光强→电信号”的转换,新手易上手。

1. 核心元件:光敏电阻的工作原理

光敏电阻(也叫光导管)是一种半导体光敏元件,基于光电导效应工作:

  • 当光线照射到光敏电阻表面时,其内部的半导体材料会产生更多的载流子,导致电阻值急剧减小(光线越强,电阻越小);
  • 当无光线(黑暗环境)时,光敏电阻的电阻值很大(可达数兆欧)。

简单说:光强 ↗ → 电阻 ↘;光弱 ↗ → 电阻 ↗

2. 光敏模块的电路结构(两种常见类型)

市面上的光敏模块主要分数字输出型模拟输出型,新手常用数字输出型(接线简单)。

- 数字输出型光敏模块(最常用)
电路组成:
  • 光敏电阻 + 固定电阻 → 分压电路;
  • 比较器(如LM393)→ 将分压电压与参考电压比较,输出高低电平。
工作过程:
  1. 模块上有一个电位器,可调节参考电压(即灵敏度);
  2. 当环境光强超过设定值时,光敏电阻阻值变小,分压后的电压低于参考电压,比较器输出低电平
  3. 当环境光强低于设定值时,光敏电阻阻值变大,分压后的电压高于参考电压,比较器输出高电平
关键特点:

输出只有高/低两种电平,可直接接STM32的GPIO输入引脚,用GPIO_ReadInputDataBit()读取。

- 模拟输出型光敏模块
电路组成:

仅由光敏电阻 + 固定电阻组成的分压电路,无比较器。

工作过程:

输出端直接输出分压后的模拟电压(范围0~3.3V/5V),电压值随光强连续变化(光越强,电压越高;光越弱,电压越低)。

关键特点:

需接STM32的ADC引脚(如PA0),通过ADC采集电压值,计算出具体的光强大小(精度更高)。


写在最后

  1. 有源蜂鸣器和无源蜂鸣器的核心区别是是否内置振荡电路,新手入门选有源更易实现;
  2. 光敏模块通过光敏电阻的阻值变化将光强转为电信号,数字输出型适合简单的开关控制,模拟输出型适合高精度的光强检测。
    结合STM32的GPIO和ADC操作,能快速实现对这两种模块的控制,是新手练手的好案例。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 18:11:50

永生数字系统:与之配套的测试哲学

在数字技术飞速发展的今天&#xff0c;永生数字系统&#xff08;Immortal Digital Systems&#xff09;作为前沿科技的代表&#xff0c;正逐步从概念走向现实。这类系统旨在通过持续的数据采集、人工智能驱动和云端集成&#xff0c;模拟或扩展人类意识与存在&#xff0c;实现某…

作者头像 李华
网站建设 2026/6/9 16:18:48

23、Linux 文本处理工具全解析

Linux 文本处理工具全解析 在 Linux 系统中,文本处理是一项非常重要的任务,无论是系统管理员进行配置文件管理,还是软件开发人员处理代码,都离不开各种文本处理工具。下面将详细介绍一些常用的文本处理工具及其使用方法。 1. 排序与去重 在处理文本文件时,经常需要对文…

作者头像 李华
网站建设 2026/6/6 7:26:35

【第二十六周】OCR学习01

文章目录摘要Abstract一、图像预处理1. 图像滤波1.1 高斯模糊&#xff1a;1.2 中值模糊&#xff1a;1.3 拉普拉斯滤波器&#xff1a;1.4 双边滤波器&#xff1a;2. 使用分割技术检测和移除背景3. 数据集增强4. 像素值调整二、案例&#xff1a;图片文字提取器1. 原始版本1.1 代码…

作者头像 李华
网站建设 2026/6/9 3:47:54

[CSP-S 2023] 密码锁

原题 题目描述 小 Y 有一把五个拨圈的密码锁&#xff0c;每个拨圈上是从 0 到 9 的数字。每个拨圈都是从 0 到 9 的循环&#xff0c;即 9 拨动一个位置后可以变成 0 或 8&#xff0c;小 Y 采用的锁车方式是&#xff1a;从正确密码开始&#xff0c;随机转动密码锁仅一次&#…

作者头像 李华
网站建设 2026/6/8 23:51:29

自动门MCGS7.7与三菱FX3U PLC联机程序新探索

自动门MCGS7.7和三菱fx3uPLC联机程序新&#xff0c;带io表&#xff0c;运行效果视频&#xff0c;com1口通讯 最近在做一个自动门项目&#xff0c;涉及到MCGS7.7与三菱FX3U PLC的联机&#xff0c;和大家分享一下其中的历程与心得&#xff0c;还会附上IO表以及运行效果视频链接哦…

作者头像 李华
网站建设 2026/6/8 11:56:52

计算机毕业设计springboot基于vue的手机商城系统 基于 SpringBoot+Vue 的移动端数码商城平台 前后端分离架构下的智能手机在线销售系统

计算机毕业设计springboot基于vue的手机商城系统rg2215p1 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。移动互联网把“买手机”从线下柜台搬到指尖&#xff0c;价格、库存、参…

作者头像 李华