简介:本资源为2024年江西省大学生科技创新竞赛电子专题设计竞赛(仿真设计竞赛项)的赛题资料,面向备赛该赛项的高校电子、自动化及嵌入式方向学生与指导教师。内容围绕智能巡逻机器人设计任务展开,涵盖Proteus原理图绘制、代码编写、系统调试与功能实现,并附有提交规范、文件夹命名规则及双层压缩包密码说明。资源包共1个PDF文件,大小约567KB,集中呈现竞赛任务书、硬件框图、地图示意与液晶显示界面等关键信息,便于快速把握赛题要求与评分要点。目前已有649人学习下载,适合需要了解赛题结构、梳理设计流程、对照功能要求查漏补缺的参赛者参考使用。
1. 从一份仿真赛题拆起:智能巡逻机器人到底在考什么
如果你手头正好有一套 Proteus 仿真工程,里面躺着 STM32F1 或者 51 单片机的代码、一张带仓库标记的地图、一个带超声波和舵机的底盘模型,那你大概率正在啃 2024 年江西省电子专题赛仿真设计这道题。它表面上是「智能巡逻机器人」,实际考的是三件事:能不能把 Proteus 工程整理到「打开即仿真」、能不能把循迹避障和传感器上报串成一条完整状态机、能不能在提交前把工程和代码各留一份。很多人栽的不是算法,而是文件夹里多了一个副本、压缩包密码没对上、或者 Proteus 打开后提示找不到 HEX 文件。这篇就按我拆这套资源的顺序,把原理图、代码结构、串口协议和提交前的自检一条条过一遍,新手能照着复现,熟手能直接对参数边界。
2. 拆开 Proteus 工程:底盘模型、传感器与主控选型
2.1 底盘模块与地图坐标的对应关系
这套仿真底盘不是随便摆的,它把超声波、电机、光电传感器和舵机都做成了可交互的元件。地图 map.png 加载后,初始坐标默认在巡检站,车头方向与箭头同向。你第一步要做的不是写代码,而是把底盘属性里的「初始坐标」和「车头朝向」确认一遍。常见做法是:在 Proteus 里双击底盘模型,看它的 X/Y 坐标和角度,然后跟地图上巡检站的位置对齐。如果这里偏了,后面循迹会一直往墙上撞,你还以为是光电传感器阈值不对。
光电传感器一般用 4 路或者 5 路,仿真里常用的是反射式红外对管模型。循迹逻辑就是:黑线吸收红外,输出高电平;白底反射,输出低电平。你需要在代码里定义一个传感器状态数组,比如uint8_t track[5],然后根据 00100、01100、00110 这种模式判断直行、左转、右转。舵机控制超声波方位,通常是用 PWM 占空比控制角度,0.5ms 对应 0 度,2.5ms 对应 180 度,仿真里可以直接看舵机转轴的角度变化来验证。
提示:Proteus 里电机模块的转速和方向由 H 桥输入决定,别只给一个方向信号,否则仿真里车不动,你还以为代码没跑起来。
2.2 STM32F1 与 51 单片机的选型差异
题目允许选 STM32F1 系列或者 51 单片机。如果你之前用 51 做过循迹小车,选 51 上手快,但要注意 51 的定时器资源少,超声波测距和舵机 PWM 容易抢定时器。常见做法是:用 Timer0 做超声波计时,Timer1 做舵机 PWM,主循环里轮询按键和串口。STM32F1 的话,资源宽裕很多,可以用 TIM2 做超声波输入捕获,TIM3 做舵机 PWM,USART1 做串口上报,DHT11 和空气质量传感器用普通 GPIO 时序读取。
选型建议:如果你对中断嵌套和输入捕获不熟,51 反而更稳,因为逻辑简单,出问题容易查。如果你要做「强制返航」这种需要串口中断实时响应的功能,STM32 的中断优先级配置会更灵活。我一般会先看示例程序里给的是哪个平台,跟着示例走,省得自己搭底层。
2.3 Proteus 工程整理:打开即仿真的三个检查点
题目明确说「Proteus 工程打开后直接可以仿真,如未整理好,需要扣分」。这句话翻译过来就是:你提交的 .pdsprj 文件里,所有元件路径必须是相对路径,HEX 文件必须跟工程在同一个文件夹或者子文件夹里。检查点有三个:
- 双击单片机,看 Program File 那一栏是不是指向你代码文件夹里的 .hex,而不是你电脑桌面上的某个绝对路径。
- 看工程目录下有没有
Project Backups或者*.pdsbak这种备份文件,有就删掉,否则压缩包里会出现多份工程。 - 打开仿真,按运行,看蜂鸣器是不是响三下、液晶是不是显示开机界面。如果液晶一片空白,先查液晶模型的对比度引脚是不是接了地或者接了电位器。
# 整理后的目录结构应该是这样,不要有多余副本 JX2024-XXX/ ├── Proteus/ │ ├── robot.pdsprj │ └── robot.hex ├── 代码/ │ ├── main.c │ ├── dht11.c │ └── ... ├── 说明文档.docx └── 功能演示.mp4上面这个结构里,Proteus 文件夹只放一个工程文件和一个 HEX,代码文件夹只放一份源码。如果你在 Proteus 文件夹里又建了一个「备份」子文件夹,里面还有一份 .pdsprj,那就直接判不合格。血泪经验:提交前把压缩包解压到另一个盘,用 Proteus 重新打开一次,能跑通再交。
3. 代码工程怎么搭:从开机三响到状态机切换
3.1 开机初始化与液晶显示时序
功能 1 要求上电后蜂鸣器鸣响三次,液晶显示开机界面,按键 K1 启动。这里最容易翻车的是液晶显示。带中文显示的液晶一般是 12864 或者 1602 加中文字库,仿真里常用的是 LM016L 或者 12864 模型。初始化顺序不能乱:先延时 15ms 等液晶内部复位,再发指令 0x38 设置八位数据接口,然后 0x0C 开显示不显光标,0x06 设置输入模式,最后 0x01 清屏。
蜂鸣器三响可以用一个简单的循环:
// 蜂鸣器三响,每响 200ms,间隔 200ms for (uint8_t i = 0; i < 3; i++) { BEEP = 1; // 蜂鸣器开启,具体电平看驱动电路 delay_ms(200); BEEP = 0; delay_ms(200); }这段代码里BEEP是蜂鸣器控制引脚,如果你的驱动电路是低电平触发,就把 1 和 0 反过来。延时用软件延时就行,开机阶段不需要精确。三响结束后,液晶显示开机界面,然后进入等待 K1 的状态。K1 消抖我一般用 20ms 延时再确认,仿真里按键抖动不明显,但养成习惯没坏处。
3.2 循迹避障与舵机扫描的配合逻辑
功能 2 要求启动后自动循迹、避障,到仓库 1,过程中黄色 LED 闪烁。循迹和避障的优先级要理清:正常情况下光电传感器循迹,超声波检测到前方障碍物时,舵机转动超声波测左右距离,然后决定绕行方向。常见做法是:舵机先转到 90 度正前方测一次,如果距离小于 20cm,就转到 45 度测左边,再转到 135 度测右边,哪边距离大往哪边转。
// 超声波测距简化逻辑,单位 cm float get_distance(void) { TRIG = 1; delay_us(10); TRIG = 0; while (!ECHO); // 等待回波高电平 TH0 = 0; TL0 = 0; // 清零定时器 while (ECHO); // 等待回波结束 uint16_t t = (TH0 << 8) | TL0; return t * 0.017; // 晶振 12MHz 时,1 个计数约 1us,距离 = 时间 * 声速 / 2 }参数说明:TRIG是触发引脚,给 10us 高电平;ECHO是回波引脚,高电平持续时间就是超声波往返时间。0.017这个系数是声速 340m/s 除以 2 再换算成 cm 和 us 的结果。如果你的晶振不是 12MHz,这个系数要改。舵机转动后要延时 300ms 等它到位再测距,否则测到的还是上一个角度的距离。
黄色 LED 闪烁可以用定时器中断里翻转 IO,比如每 200ms 翻转一次。注意不要在循迹的死循环里用 delay 闪灯,那样会拖慢循迹响应。
3.3 串口上报格式与 DHT11 读取时序
功能 2 和功能 3 都要求串口发送C1 T:XX H:XX A:XX和C2 T:XX H:XX A:XX。串口配置一般是 9600 波特率、8 位数据、1 位停止、无校验。发送时用printf重定向或者自己写一个字符串拼接函数。DHT11 是单总线时序,读一次要 40 位数据,前 16 位湿度、后 16 位温度、最后 8 位校验和。
// DHT11 读取简化流程 void dht11_read(uint8_t *temp, uint8_t *humi) { // 主机拉低至少 18ms,然后拉高 20-40us DHT11_PIN = 0; delay_ms(20); DHT11_PIN = 1; delay_us(30); // 等待 DHT11 响应,然后读 40 位 // 每位数据以 50us 低电平开始,高电平持续时间决定 0 或 1 // 高电平 26-28us 为 0,70us 为 1 for (uint8_t i = 0; i < 40; i++) { while (!DHT11_PIN); // 等待低电平结束 delay_us(40); uint8_t bit = DHT11_PIN; // 40us 后还是高电平就是 1 while (DHT11_PIN); // 等待高电平结束 // 把 bit 存入缓冲区 } }空气质量传感器在仿真里用电位器模拟,99 代表最好,0 代表最差。你只需要用 ADC 读电位器分压,然后映射到 0 到 99 就行。串口发送前,把温度、湿度、空气质量拼成C1 T:25 H:60 A:80这种格式,注意冒号和空格的位置要和题目一致,串口调试助手看到的数据才算对。
4. 避坑与排查:五条仿真赛里的常见翻车记录
4.1 现象:Proteus 打开后提示找不到 HEX 文件
原因:工程里 Program File 指向的是绝对路径,换一台电脑或者换个文件夹就失效。解决:把 HEX 文件复制到 Proteus 工程同级目录,然后在单片机属性里重新选择,保存工程。提交前把整个文件夹复制到 U 盘,换一台电脑打开验证。
4.2 现象:液晶显示乱码或者只亮背光不显示字符
原因:初始化时序不对,或者数据线接反了。仿真里常见的是 DB0 到 DB7 顺序接反,或者 RS、RW、E 三个控制引脚接错。解决:对照液晶模型的数据手册,确认 RS 接普通 IO,RW 接地,E 接另一个 IO。初始化延时不够也会导致乱码,把 15ms 改成 50ms 试试。
4.3 现象:循迹时车一直在原地转圈
原因:光电传感器的阈值判断反了,或者左右电机接线对调。解决:在仿真里单独测试每个光电传感器,看黑线时输出是高还是低,然后在代码里调整判断条件。电机对调的话,把左右轮的驱动信号互换。
4.4 现象:串口调试助手收不到数据
原因:波特率不匹配,或者串口中断没开。仿真里还要检查串口模型的波特率是不是和代码一致。解决:先用固定字符串测试,比如上电就发Hello,确认能收到再改上报格式。如果用的是 STM32,记得使能 USART 的 TX 引脚复用功能。
4.5 现象:压缩包提交后判不合格,说有多份工程
原因:Proteus 自动生成了备份文件,或者你手动复制了一份代码文件夹。解决:压缩前把Project Backups、*.pdsbak、代码 - 副本这类文件全部删掉。压缩包第一层密码FangZh_2024@#,第二层密码@&2024_FengB@#,密码不要写错,大小写敏感。
5. 强制返航与提交前自检:一个串口指令的完整闭环
功能 4 要求通过串口调试工具发送指令,强制机器人立刻返航到巡检站。这个功能考的是串口接收中断和状态机切换。我一般会在串口中断里设一个标志位,比如volatile uint8_t force_return = 0;,收到特定字符串后置 1,主循环里检测到这个标志就跳出当前巡检流程,直接进入返航状态。
// 串口接收中断里判断指令 void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { uint8_t ch = USART_ReceiveData(USART1); if (ch == 'R') { // 假设指令以 R 开头 force_return = 1; } USART_ClearITPendingBit(USART1, USART_IT_RXNE); } }参数说明:force_return要加volatile,防止编译器优化。主循环里每个状态切换前都检查这个标志,一旦置位就跳到返航状态。返航逻辑就是沿着来时的路径反向循迹,直到光电传感器检测到巡检站的标记线,然后停车,液晶显示停止界面。
提交前的自检我习惯走一遍清单:Proteus 工程打开能直接仿真、代码工程只有一份、说明文档和视频各一份、压缩包两层密码正确、解压后没有姓名学校信息、整个文件夹里没有重复的 .pdsprj 和 .hex。从那以后我每次交仿真赛作品,都会把压缩包解压到另一台电脑上,用 Proteus 重新打开跑一遍,确认蜂鸣器响三下、液晶显示正常、串口能收到C1和C2数据,才敢提交。希望帮到你。
本文还有配套的精品资源,点击获取