2025年西电A测:气压测控仿真系统

Jachin Zhang

所需软件

  • Proteus 8.9 SP2 及以上仿真软件(需要自己去网上寻找破解版资源)
  • Arduino IDE(下载链接在此)
  • 虚拟串口驱动软件 Virtual Serial Port Driver(VSPD)(下载链接见此博客
  • Proteus仿真软件所需要的pdsprj工程文件
  • 一个带GUI窗口的软件,可以实现串口通信(注意!这个软件需要你自己写,不能直接用现成的XCOM等现成的串口助手软件

实现功能:使用 Arduino UNO 微控制器,搭建一个 PC 上位机远程气压检测控制系统。上位机程序可以向 Arduino 程序发送学号以调整气压阈值,同时可以接收来自 Arduino 发送的当前气压值,显示于上位机程序的GUI界面。

思路梳理

我们可以简单梳理一下完成这个测试需要准备的东西: - VSPD:用于建立虚拟串口对,实现串口间的相互通信 - Arduino代码,需要我们自己编写,代码逻辑决定了工程文件中的仿真电路将会怎样工作 - Arduino工程文件,需要将Arduino代码编译生成的十六进制文件导入芯片 - 上位机软件,需要我们自己编写,占用COM2串口,可以实现与COM1串口之间的相互通信

思路梳理流程图
思路梳理流程图

Arduino代码与编译

Arduino代码有两个必须要有的函数:setup函数用于仿真软件开始运行时的初始化,loop函数在仿真软件运行时循环调用。一般会在loop函数末尾添加delay(1000);用于使每相邻两次loop函数的调用之间间隔1000毫秒(间隔可以短一些,但最好要有)。

在Arduino IDE中书写以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <LiquidCrystal.h>
Adafruit_BMP085 bmp;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // 初始化 LCD

const int motorPin = 7; // 直流电机引脚
String str = ""; // 用于存储从串口接收的学号
int length_, last = 0;

void setup() {
Serial.begin(9600); // 初始化串口
lcd.begin(16, 2); // 初始化 LCD 显示
pinMode(motorPin, OUTPUT); // 设置电机引脚为输出模式
bmp.begin();
}

void loop() {
int setPressure;
int realPressure = bmp.readPressure() / 100; // 读取气压值,单位转换为 hPa

lcd.print("ID:");
if (Serial.available() > 0) { // 检查是否有串口输入
while (Serial.available() > 0) {
str += (char)Serial.read();
delay(10);
}
lcd.println(str);
// 提取学号的末位数字
length_ = str.length();
last = str.substring(length_ - 1, length_).toInt();
setPressure = 860 + last;
str = "";
length_ = 0;
last = 0;
}
Serial.print("Pressure: ");
Serial.print(realPressure);
Serial.println("hPa");

// 显示当前气压值
lcd.setCursor(0, 1);
lcd.print("PRESS: ");
lcd.print(realPressure);
lcd.print("hPa");
lcd.home();

// 根据气压值控制直流电机
if (realPressure >= setPressure) {
digitalWrite(motorPin, HIGH);
} else {
digitalWrite(motorPin, LOW);
}

delay(1000); // 等待一秒
}

写完代码后点击界面左上角的对勾(验证)按钮,此时界面下方会出现输出窗口显示程序的编译情况。编译完成后在下图所示的红框位置可以得到程序编译的输出路径。将该路径对应的文件后缀elf改为hex就是我们想要的十六进制文件路径。

在编译输出中找到十六进制文件的保存位置
在编译输出中找到十六进制文件的保存位置

仿真电路介绍

仿真电路
仿真电路

仿真电路工程文件是题目直接提供的,我们几乎无需对各组件的配置进行修改,只需要双击芯片组件,将其中的Program File修改为我们刚刚找到的十六进制文件路径即可。

将程序编译的十六进制文件导入芯片
将程序编译的十六进制文件导入芯片

点击界面左下方的绿色三角形按钮运行仿真,这时候应该就可以看到程序开始运行了,右上方的LCD程序会在第二行显示PRESS: 860hPa,同时左下方的电机开始旋转。之所以LCD屏幕第一行不显示信息,是因为在代码中我们设置只有当串口接收到来自外部(即串口COM2)的信息(学号)时才会在LCD的第一行打印信息。

此时设定的气压阈值为默认值,即860hPa。右下方的气压计可以看到当前的实测气压(默认为860hPa)。点击左边的两个按钮可以对实测气压手动调节,当气压小于860hPa时电机会逐渐停止。

PC上位机GUI程序

题目要求我们编写的上位机程序需要满足以下需求:

  • 窗口标题处显示我们自己的学号和姓名
  • 可选择该程序当前使用的串口并允许打开或关闭操作
  • 向仿真程序发送学号,仿真程序会自动调整气压阈值
  • 接收当前仿真程序的气压值并在GUI界面上显示

这里就不将程序开源了,因为如果界面长得一模一样的话肯定会被判定为抄袭……可以根据以上需求拷打一下AI,一般是没啥问题的。这里我提供一个GUI窗口的范例,权当一个设计思路。

题目并没有要求我们的GUI程序有手动调节气压的功能,我一开始没发现气压计就可以直接调节气压,所以在写上位机程序的时候加上了这个需求。读者写的时候不需要加上这个。

GUI窗口示例
GUI窗口示例

不出意外的话,以上步骤走完,你的A测应该就可以完成了。如果出了意外,可能大概率是在程序编译这一步会报库缺失的错。我好像没有遇到这种情况,如果读者遇到了就上网查一下有关资料吧。

写在最后

这A测真的好讨厌啊!!!!

  • Title: 2025年西电A测:气压测控仿真系统
  • Author: Jachin Zhang
  • Created at : 2025-10-01 17:57:49
  • Updated at : 2025-10-01 17:57:49
  • Link: https://jachinzhang1.github.io/2025/10/01/xidian-A-test/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments