51单片机流水灯Proteus仿真全攻略:电路搭建、代码实现与排错指南
简介面向51单片机初学者、电子竞赛学生及PROTEUS仿真爱好者这份C51流水灯仿真资源以8路LED多花样点亮为核心任务通过单灯依次循环、自左至右累加点亮并在全灯亮后触发蜂鸣器提示、随后熄灭复位的逻辑清晰展示端口位操作、循环移位、延时函数等单片机入门核心技巧适合课程设计、实验预习与个人自学。资源共18个文件压缩包约985KB包含C语言主程序与hex烧录文件可直接用于Keil编译及PROTEUS仿真同时提供完整Keil工程文件uvproj/uvopt、STARTUP.A51汇编启动代码、仿真运行截图及mp4演示录屏覆盖从代码编写、程序编译到电路仿真的完整链路。资源已有5387人学习浏览工程结构紧凑、源码便于二次修改读者可调整延时参数或循环规律实现更多流水灯花样是一份实用的51单片机入门级仿真学习素材。1. 流水灯仿真单片机入门里最容易被低估的一个作业我第一次接触51单片机时觉得流水灯就是个“8个LED轮流亮”的幼稚园题目直到自己动手在Proteus里搭完电路、写完代码、点下运行那一下才发现这玩意儿根本不像看起来那么简单。它其实是把“最小系统电路设计→芯片选型→寄存器操作→延时控制→仿真调试”整条链路一次性走完的完整闭环做完它能抵半本教材的前六章。无论你是刚看完理论正打算动手的初学者还是带学生做课设的某高校老师又或者是想快速验证某个I/O控制思路的在职开发者这个仿真资源都能帮你避开从电路到代码的绝大部分坑。2. 从电路到仿真环境Proteus里搭最小系统的三个关键选型2.1 为什么用AT89C51而不是STC系列很多刚接触Proteus的人上来就找STC89C52因为在淘宝买开发板都是这个芯片。但Proteus的元件库里对STC系列的仿真模型覆盖得并不均匀有些版本压根没有STC的模型你只能拿AT89C51或AT89C52来替代。我一般直接在Proteus里用AT89C51原因有三个第一AT89C51是Proteus里仿真最成熟的51内核芯片之一时序、中断、串口的行为都和真实芯片高度一致极少出现“仿真能跑、实物翻车”的玄学问题。第二它的I/O口结构和STC系列基本一致——P0口是开漏输出、P1到P3口是准双向口——所以你在仿真里验证过的代码逻辑烧到实物板上不需要大改。第三元件库里搜索关键字AT89C51就能直接找到不需要额外导入第三方库。AT89C51的主要参数是4KB Flash程序存储器、128字节RAM、32个I/O口P0到P3、两个16位定时器、5个中断源。对流水灯这个项目来说4KB Flash绰绰有余编译出来的hex文件一般只有几百字节。2.2 时钟电路和复位电路不是随便画一画就能跑的最小系统除了芯片本身还需要时钟和复位两个外围电路。晶振我习惯用12MHz配合两个20pF到30pF的负载电容。这里有个重要原因12MHz晶振下AT89C51的机器周期正好是1微秒12个时钟周期为一个机器周期这会让后面的延时计算变得非常直观——一个空循环执行一次大约是几个微秒乘以循环次数就能估出延时总量。复位电路用经典的“上电自动复位”结构一个10μF电解电容串联在RST引脚和VCC之间再并一个10kΩ电阻到GND。当上电瞬间电容相当于短路RST引脚得到一个高电平脉冲芯片复位随后电容充电完毕RST被电阻拉到低电平芯片开始正常运行。要注意的是Proteus里很多人搭完电路发现运行没反应十有八九是复位电路画反了——把电阻接到了VCC而不是GND。AT89C51是高电平复位所以正常工作时RST引脚必须保持低电平。2.3 流水灯电路限流电阻和共阳共阴的取舍流水灯部分就是8个LED分别串联一个限流电阻后接到P1口的8个引脚。至于LED用共阳极还是共阴极接法——也就是说发光二极管的正极统一接VCC、负极接单片机引脚共阳极还是反过来共阴极——我推荐共阳极。原因在于51单片机的I/O口输出高电平时的驱动能力弱输出低电平时的灌电流能力强。标准51的P1口输出高电平时电流只有几十微安到几百微安带不动LED到足够的亮度但拉低到地的时候可以灌入几毫安的电流刚好够点亮普通LED。共阳极接法的逻辑也正好是反向的想让某个LED亮就给对应引脚写0。这在代码里会体现为P1 ~(1 i)这种带取反的操作很多新手第一次看到会懵但理解了灌电流这个概念之后就通透了。限流电阻我一般选220Ω到330Ω。仿真里你不加电阻其实也能亮因为Proteus的虚拟LED对电流不敏感但这会养成坏习惯——实物电路里没有限流电阻的LED会直接烧掉而且会拉挂单片机的I/O口。220Ω在5V供电下能把电流限制在大概15mA左右在仿真里也能保证LED亮度饱满。搭完电路之后把单片机型号、晶振频率这些参数检查一遍确保芯片属性里的Clock Frequency设置成了12MHz。这个参数在Proteus里默认可能不是12M如果不改后面代码里的延时时间全部对不上号。3. 代码实现的三种路子位操作、查表法、循环移位流水灯的代码逻辑本身很简单难在怎么写得更像“工程代码”而不是“作业糊弄”。我按从浅到深的顺序讲三种实现方案你可以根据自己的水平选一种来写也可以把三种都写完做对比。3.1 方案一位操作最直观的“手动挡”位操作的意思是用移位或者取反直接控制P1口的某一位。比如让第一个灯亮就是P1 0xFE二进制1111_1110最右边那位是0对应的LED亮第二个灯亮就是P1 0xFD1111_1101。完整代码如下#include reg51.h void delay(unsigned int ms) { unsigned int i, j; for (i 0; i ms; i) for (j 0; j 120; j); } void main() { unsigned char i; while (1) { for (i 0; i 8; i) { P1 ~(0x01 i); // 低电平点亮所以取反 delay(200); // 延时200ms } } }这段代码的逻辑是0x01左移i位得到0000_0001、0000_0010、0000_0100……这些二进制数每一个都只有一位是1。然后取反变成只有一位是0其他位全是1。因为用的是共阳极接法低电平点亮所以这一位0对应的那个LED就亮了。delay函数的参数是毫秒数。里面两层空循环外层循环ms次内层循环120次。在12MHz晶振下内层这个120次的循环大约消耗1毫秒所以整体延时就是ms毫秒。这里的120不是精确计算出来的是我验证过的一个经验值不同编译器的优化级别会影响这个数但误差在可接受范围内。这个方案的优点是逻辑透明你能明确知道每个时刻哪个引脚是什么电平。缺点是代码重复性高越往后写越觉得“应该有个更聪明的办法”。3.2 方案二查表法适合花式流水查表法是先把8种LED状态列成一个数组然后用索引依次取出数值赋给P1。好处在于你想让流水灯走什么花样不需要改逻辑只需要改表里的数据。#include reg51.h code unsigned char LED_TABLE[] { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F }; void delay(unsigned int ms) { unsigned int i, j; for (i 0; i ms; i) for (j 0; j 120; j); } void main() { unsigned char i; while (1) { for (i 0; i 8; i) { P1 LED_TABLE[i]; delay(200); } } }注意这里我用了关键字code。这个关键字的作用是把数组存放在程序存储区Flash而不是RAM里。AT89C51只有128字节RAM如果放一个大数组在RAM里很快就会爆而放在code区就没有这个压力。这是个很实际的工程习惯——用51做项目时常量数据一律用code修饰。这个方案的优势是想改流水方向比如先左后右再左只需要改动数组元素的排列顺序想搞出“跑马灯”效果——两个灯同时亮着跑——就重新写一组表数据。逻辑代码一行都不用动。3.3 方案三循环移位最短代码但不是最优解第三种方案是用C语言的循环左移或右移指令。Keil C51的头文件intrins.h里提供了_crol_循环左移和_cror_循环右移两个函数用它们可以写出非常短的代码#include reg51.h #include intrins.h void delay(unsigned int ms) { unsigned int i, j; for (i 0; i ms; i) for (j 0; j 120; j); } void main() { unsigned char led 0xFE; // 初始状态第一个灯亮 while (1) { P1 led; delay(200); led _crol_(led, 1); // 循环左移一位 } }crol(led, 1)的执行效果是把led的位模式整体左移一位移出的最高位补到最低位。从0xFE1111_1110开始第一次左移变成0xFD1111_1101——注意那个0从最右边跑到最左边相邻的位置了所以看起来就是亮灯逐个往右挪如果从正面看LED排列方向的话具体方向取决于你的电路排列。这个方案代码量最小但有个隐藏问题你无法精确控制中间某个时刻的状态。比如你想让第1、3、5个灯亮用移位就很别扭必须回到查表法。所以我的建议是刚学用方案一理解原理做作业用方案二图省事方案三知道有这回事就行。实际开发里查表法出场率远高于循环移位。3.4 Keil工程的建立和hex文件生成最容易卡壳的一步代码写完之后要在Keil里建立工程、选芯片型号、编译生成hex文件然后在Proteus里把hex文件加载到单片机里。这一整套流程里有几个细节容易出错。芯片型号在Keil里选择AT89C51不要选AT89C52虽然C52也能跑但C51的RAM和Flash更小选错了会掩盖一些资源越界问题。编译时要勾选“Output”选项卡里的“Create HEX File”选项否则Keil不会生成hex文件——这个问题每年都有大量的人踩编译成功但找不到hex文件就是因为没勾这个。生成hex文件之后双击Proteus里的单片机元件在弹出的属性对话框里点击Program File一栏的文件夹图标选择刚才生成的hex文件然后点运行。如果一切正常你会看到LED依次点亮像一条流动的光带。4. 常见问题排查流水灯仿真的翻车现场和被忽略的坑4.1 编译报错“undeclared identifier”但代码看起来没问题现象Keil编译时报错提示某个变量或寄存器名称未定义比如P1或EA未声明。原因这个报错九成是因为没包含头文件reg51.h或者把reg51.h写成了reg52.h但用到了AT89C51特有的寄存器。另一小部分情况是你调用了_crol_函数但没包含intrins.h。解决检查代码文件头部是否写了#include reg51.h。用循环移位方案的话确认#include intrins.h也写上了。如果都写上了还报错看一眼是不是文件名写错了比如reg51.h打成了reg51.h后面多一个空格。4.2 LED全亮不流动或者亮灭变化快到看不清现象仿真运行后8个LED要么全部同时亮着要么一闪而过根本没有“流动”的视觉效果。原因延时时间太短或者干脆没调用延时函数。如果你把delay的参数写成10毫秒甚至1毫秒LED切换速度远超人眼分辨能力看起来就是常亮。解决把延时加大到300毫秒以上比如delay(300)。人眼对闪烁的感知能力大概在50毫秒以下就很难分辨了300毫秒是一个非常稳妥的节奏——每个灯亮0.3秒完整走一轮需要2.4秒视觉节奏感很好。4.3 用的是P0口LED亮度很低或者完全不亮现象把LED接到了P0口仿真里LED微亮、闪烁不明显甚至整个P0口驱动的LED都不正常。原因P0口和P1、P2、P3口不一样它内部是开漏结构输出高电平时是悬空状态没有内部上拉能力。Proteus仿真虽然不是真实硬件但模型层面也会把P0口的电气特性模拟出来导致高电平驱动能力严重不足。解决最简单的方法是把LED挪到P1口或P2口绕开这个问题。如果必须用P0口那就在P0口加一个上拉电阻排通常4.7kΩ到10kΩ把引脚拉到高电平——这是51单片机应用里非常经典的一个操作也是很多从实物板转到仿真的人容易忽略的差异点。4.4 hex文件加载后仿真完全没反应现象Proteus里单片机加载了hex文件点击运行LED一个都不亮程序好像没在执行。原因可能有三层原因。第一层是hex文件加载的路径不对加载了一个旧版本或空文件的hex第二层是单片机属性里的Clock Frequency没设置默认值可能是0或者极小值导致芯片完全没有时钟第三层是复位电路接错了RST引脚一直被拉在高电平芯片永远处于复位状态。解决按这个顺序排查——先在单片机属性里确认Clock Frequency等于12MHz再确认hex文件路径正确且文件大小不是0字节在Keil的输出文件夹里看一眼hex文件的大小最后检查复位电路的电容极性方向如果用了极性电容和电阻连接点是否接在RST上而不是VCC上。4.5 Proteus仿真运行速度异常卡顿或LED反应迟钝现象仿真运行后LED能亮但反应非常迟钝按下键盘或修改电路后要好几秒才有响应。原因Proteus的仿真速度受CPU占用限制。如果你的电脑同时开着Keil编译、浏览器和仿真软件或者Proteus设置了很低的目标仿真速度就会出现这种情况。解决在Proteus的菜单里找到System → Animation Speed设置把仿真速度目标开关打开将速率调到接近实时同时关掉不需要的后台程序。另外调试模式下如果打开了变量监视窗口或逻辑分析仪也会拖慢仿真速度跑流水灯这种简单项目时把调试窗口全部关掉。4.6 第一章就提到过的“会亮了但觉得这实现方式不优雅”的别扭感现象你手里的代码能跑但你把代码拿给别人看时总觉得自己写的是一个“铁板一块”的硬编码而不是一个灵活的解决方案。原因因为你用的可能是方案一的位操作且没有把延时和LED状态更新拆成独立函数。代码全堆在main里复用性极差。解决按本章前面给出的三个方案重新整理代码。把延时做成独立函数把LED状态做成表格把main函数保持简洁——只做“取数据→赋值→延时→循环”这四件事。5. 进阶玩法把流水灯从“会动”变成“可控、可调、可扩展”流水灯仿真做完能跑这只是第一步。我一般建议在此基础上做三个方向的扩展每一层都能逼着你把前面的代码重构一遍。第一层是变速流水灯。给流水灯加两个按键——一个加速、一个减速——通过改变延时函数的参数来调节流水速度。这个扩展的工程价值在于它逼着你把延时从硬编码改成全局变量涉及到变量的作用域和跨函数访问这是从“玩具代码”走向“可配置代码”的第一个台阶。volatile unsigned int flow_speed 300; // 全局变量默认300ms void speed_up() { if (flow_speed 50) flow_speed - 50; // 最小不能小于50ms否则视觉上糊成一片 } void speed_down() { if (flow_speed 1000) flow_speed 50; } void main() { unsigned char i; while (1) { if (P3_0 0) speed_up(); // 按键1按下加速 if (P3_1 0) speed_down(); // 按键2按下减速 for (i 0; i 8; i) { P1 LED_TABLE[i]; delay(flow_speed); } } }按键检测那里要注意抖动问题——机械按键按下和松开时会有大约5到10毫秒的电平抖动不消抖的话一次按下可能被识别成两三次。最简单的消抖方法是软件延时检测到按键为低电平后先延时10毫秒再确认一次仍然是低电平再执行动作。第二层是双向流水。在查表法的基础上增加一个方向标志位正向流水时遍历表格的下标从0到7反向时从7到0。这个改动量不大但让你第一次意识到“数据结构决定行为逻辑”——同样的LED_TABLE遍历顺序不同视觉效果完全不同。第三层是把延时函数改成定时器中断实现。这也是我认为最有价值的一步。相比空循环占用CPU的方式定时器中断可以让单片机在延时的同时去处理其他事情——比如扫描按键、刷新数码管。51的定时器0配置为模式116位定时器在中断里翻转一个标志位主循环每检测到标志位变化就更新一次LED状态。这个阶段做完你会对中断、寄存器配置这些书上老讲不清的概念产生真正的体感。做变速流水灯时我踩过一个特别典型的坑在按键检测里用了阻塞式延时消抖结果消抖延时期间流水灯停住了看起来就像按键按下时LED卡了一下。后来我把消抖逻辑改成了“检测到按下先置一个标志位等主循环空闲时统一处理”才解决这个问题。从那以后我每次写带按键的单片机程序都会强制自己先画一遍事件流——先处理什么、后处理什么、哪些状态可以同时发生——画清楚了再动手写代码。流水灯仿真虽然只是入门项目但把它往深处做一遍至少能帮你省下后面做小系统项目时踩一半坑的时间。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

51单片机数字电压表设计:从ADC0809到数码管显示完整方案

51单片机数字电压表设计:从ADC0809到数码管显示完整方案

简介:一份基于51单片机的数字电压表设计资料包,面向电子、嵌入式方向初学者及课程设计者,用于打通模拟信号采集、数字显示与系统仿真的完整开发链路。压缩包共35个文件,约1.15MB,内部按源程序、原理图、仿真图、论文与…

2026/10/14 22:24:49 阅读更多 →
基于DNN的社交媒体性格分析:构建用户画像的关键技术与避坑指南

基于DNN的社交媒体性格分析:构建用户画像的关键技术与避坑指南

简介:深度学习与心理学交叉领域的实用资源包,面向人工智能、自然语言处理开发者及想用TensorFlow完成文本分类任务的初学者。内容围绕大五人格理论,基于DNN对社交媒体用户文本进行性格分类,覆盖数据清洗、词嵌入、多层神经网络构建…

2026/10/14 22:23:49 阅读更多 →
Windows 上安装配置 JDK 1.6.0_06 完整指南:环境变量、避坑与可复现实践

Windows 上安装配置 JDK 1.6.0_06 完整指南:环境变量、避坑与可复现实践

简介:这份资源是面向32位Windows系统的Java Development Kit 1.6.0_06安装包,适合仍在使用旧版Windows环境、需要维护或调试Java 6遗留项目的开发者与测试人员。JDK作为Java开发的核心工具集,内含编译器、调试器、文档生成器及Java运行时环境…

2026/10/14 22:23:49 阅读更多 →

最新新闻

Elasticsearch集群运维:索引模板与ILM生命周期策略实战

Elasticsearch集群运维:索引模板与ILM生命周期策略实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 5:22:10 阅读更多 →
MATLAB图像处理工具箱:交互式设计与性能优化

MATLAB图像处理工具箱:交互式设计与性能优化

1. 项目背景与设计思路去年在实验室带本科生做毕业设计时,发现很多同学虽然学了数字图像处理理论,但真正动手实现时却无从下手。市面上现有的MATLAB图像处理工具箱要么过于学术化,要么封装得太"黑箱"。于是花了三个月时间&#xff…

2026/10/15 5:22:10 阅读更多 →
Coze智能体开发实战:工作流逻辑与应用交付深度指南

Coze智能体开发实战:工作流逻辑与应用交付深度指南

1. 这不是又一个“Coze速成课”,而是我用三个月踩出的智能体开发真实路径你点开这个标题,大概率是被“B站讲得最好”“从入门到精通”这类词吸引来的。但我想先说清楚:Coze本身没有魔法,它只是一把结构清晰、手感扎实的螺丝刀——…

2026/10/15 5:22:10 阅读更多 →
字节Seed独立设立大模型安全与对齐部门,对齐到底在做什么

字节Seed独立设立大模型安全与对齐部门,对齐到底在做什么

据报道,10 月 13 日字节跳动 AI 模型部门 Seed 通过内部通知宣布,单独成立一个专门负责大模型安全与对齐的新部门,名叫 “Seed Model - Alignment & Preparedness”,由严林负责,直接向 Seed 负责人吴永辉汇报&…

2026/10/15 5:22:10 阅读更多 →
Nginx 限流实战:防 CC 攻击和爬虫的四个配置

Nginx 限流实战:防 CC 攻击和爬虫的四个配置

背景 服务器上有个公开的 dashboard,虽然不对外宣传,但日志里经常看到: 同一个 IP 一秒钟请求几十次 某个爬虫把整站扫了一遍 偶尔有恶意请求把 CPU 拉满 fail2ban 能封 IP,但它是事后——等攻击发生了才封。 想做到&#xf…

2026/10/15 5:22:10 阅读更多 →
Qt音频EQ曲线绘制重构:滤波器分层、对数采样与性能优化

Qt音频EQ曲线绘制重构:滤波器分层、对数采样与性能优化

做桌面音频工具这行,EQ曲线是个看似简单、实际一碰就头疼的模块。最近我把手头Qt源码里的EQ曲线绘制整体重写了一遍,完成了一次“升级版”重构。这次升级的重点不在样式的花活,而是把所有计算重新分层、把每个公式的来龙去脉整理成详尽注释&a…

2026/10/15 5:21:10 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →