单片机数码管显示实战:动态扫描原理与常见坑点排查

1. 作业需求拆解:数码管显示到底在考什么

拿到“文理单片机课堂作业_数码管显示_0311”这个题目的时候,我第一反应是:这不就是一个数码管显示的小作业嘛,能有什么难度?真正动手之后才发现,这个题目里塞进去的东西远比看起来多。它不只是在考你会不会让数码管亮,而是在考你对单片机I/O口结构、LED驱动方式和时间片分配的理解。

1.1 从标题看任务边界

作业标题里的“文理”两个字说明这门课面向的群体很杂,既有理工科基础扎实的同学,也有文科背景转过来的同学。这种课堂作业通常不会只做硬件仿真,而是要求在实物开发板上调试出来,最后跑通一个可见的效果。“0311”大概率是作业布置日期或者批次号,也就是说这是一个发生在3月11日的课堂练习,规模不大,但要求现场验收。

我当时拿到的任务描述也很简单:用板载的四位数码管,按要求显示一组数字,比如依次显示“1 2 3 4”或者做一个0到9的循环计数。表面上只要数码管能亮,任务就算完成;但老师真正想看到的是你会不会解释“动态扫描”的原理,能不能说清楚每位数码管为什么“看起来”是同时亮的。这个作业的隐藏考点就在这里。

1.2 七段数码管的核心原理

数码管本质上就是一堆按固定形状排列的LED。一个标准的七段数码管由A到G七个发光段组成,再加上一个小数点DP,一共八个LED。想让某个段亮,就给它对应的引脚灌入合适的电压和电流;想让数码管显示数字“1”,就把B、C两段的引脚置为点亮状态,其他段熄灭。

这里有一个关键概念:共阴和共阳。共阴数码管把所有LED的阴极连在一起接到公共端,点亮某个段需要在该段引脚接高电平;共阳则反过来,公共端接高电平,点亮某段需要在对应引脚接低电平。很多刚开始学单片机的同学在这里栽了跟头,因为开发板上看起来一样的数码管,内部结构可能完全不同,程序里按共阴写的段码表放在共阳的管子上就会显示得乱七八糟。

1.3 为什么这个作业放在课堂作业里最合适

我从这个作业里体会最深的一点是,数码管显示是一个非常典型的“把简单问题复杂化但又不至于复杂到劝退”的教学案例。它不涉及串口、中断嵌套、ADC等进阶外设,只需要掌握I/O电平控制、延时或定时器、数组查表,就能完整跑通。但它又强迫你理解硬件和软件之间的映射关系。

比如你要显示数字“5”,表面上是“让数码管显示5”,实际上你要查表得到一个十六进制数0x6D,然后把这个数写进段选寄存器,再到引脚上产生一组高低电平组合。这个从“显示目标”到“二进制数据”到“物理电平”的链路,几乎是所有嵌入式控制的基础模型。学会了数码管,后面做点阵屏、LCD1602、OLED驱动,思路基本都是同一套。

2. 硬件连接与电路参数:最容易翻车的地方

数码管显示这个作业,软件上写得再漂亮,如果硬件连线出了错,结果还是白搭。我在实验室里见过太多同学拿着看似正确的代码,却因为杜邦线松动、共阴共阳搞反、限流电阻选错,硬是查了一晚上没查出问题。

2.1 引脚分配与接线实操

大多数课堂用的开发板已经集成好了四位数码管,但作为学习者,我还是建议你亲手在面包板上搭一次,这样才能真正理解引脚关系。常见的接法是:段选线接单片机的一组I/O口,比如P0口接A到G和DP;位选线接另一组I/O口,比如P2.0到P2.3分别控制四个数码管的公共端。

如果你用的是独立数码管而不是集成模块,接线前一定要先看数据手册或者用万用表二极管档确认引脚排列。我有一个习惯:拿到一颗数码管,先给公共端和任意一个段引脚之间串一个1kΩ电阻,点亮确认这个段,再依次确认其他引脚。这个过程看着慢,但比程序里段码表反复改要节省时间得多。

2.2 限流电阻怎么算

数码管里的LED和普通LED一样,不能直接接5V电源,否则电流过大会烧坏。限流电阻的取值要按照LED工作电流倒推。常见的红色LED正向压降VF大约是1.8V到2.2V,单片机的I/O口高电平输出接近5V,那么电阻上的压降就是5V减去VF,大约为3V。如果想让工作电流在5mA左右,电阻值就是3V除以0.005A,等于600Ω左右。

实际开发板为了兼顾亮度和功耗,常用330Ω或220Ω,电流稍微大一点但还在安全范围内。这里要注意,如果P0口作为准双向口使用时内部没有上拉,默认输出高电平能力很弱,这时候需要在P0口接上拉电阻,或者干脆把段选换到P2、P1这些有内部上拉的口。很多“数码管亮度不一致”的问题,根源就在这里。

2.3 驱动能力这件事:三极管和锁存器的选择

四位数码管如果每一位都直接由单片机引脚驱动,其实是在考验单片机I/O口的灌电流能力。51单片机的单个I/O口一般能灌入20mA左右,但所有引脚同时工作时的总电流有限制。动态扫描的情况下,单片机需要以很快的速度轮流点亮每一位,峰值电流会更高。

解决驱动能力不足的办法有几种。最简单的是用NPN三极管做位选开关,公共端接三极管的集电极,基极通过电阻接单片机的位选引脚,这样单片机只需要提供很小的基极电流,就能控制整个数码管的供电通断。另一种更工程化的做法是用74HC245或者74HC573这类缓冲器或锁存器,把段选数据先锁存再输出,既增加驱动能力又能节省I/O口。课堂作业里用三极管就够了,但理解锁存器的用法,后面做多位数码管或者点阵屏时很有帮助。

3. 软件实现:段码表、动态扫描与代码细节

硬件的坑过了以后,剩下的就是纯软件的活了。数码管显示程序看似简单,但段码表的推导、扫描时序的安排、延时的选择,每一步都有讲究。

3.1 段码表推导方法

段码表是数码管显示程序的核心数据。这里提供一个推导办法:先画一张表,列出数字0到9对应的段亮灭情况,例如数字“0”亮A、B、C、D、E、F六段,G段灭;数字“1”亮B、C两段。假设使用共阴数码管、段选引脚按“dp g f e d c b a”的顺序接到单片机P0.7到P0.0,那么数字“0”对应的二进制就是0x3F,数字“1”对应0x06。

很多同学直接背网上的段码表,结果一换引脚顺序就全乱了。我自己的做法是从段a开始,在开发板上依次点亮每个段,把实际亮灯的引脚顺序记下来,再推导段码表。只要第一次把段a到dp的接线顺序搞清楚了,后面的表怎么推都不会错。常见共阴段码表如下,供参考:

数字共阴段码共阳段码(取反)
00x3F0xC0
10x060xF9
20x5B0xA4
30x4F0xB0
40x660x99
50x6D0x92
60x7D0x82
70x070xF8
80x7F0x80
90x6F0x90

3.2 静态显示与动态扫描

静态显示的意思是一位数码管对应一组I/O口,四位就占用4组I/O口,数据实时更新,每个数码管持续点亮。这种方式写法简单,但引脚占用太夸张,而且功率消耗大。动态扫描则完全不同:同一时刻只点亮一位,用人的视觉暂留效应让四位数码管看起来是同时亮的。

动态扫描的关键是要保证扫描频率足够高。每位数的刷新频率一般要高于50Hz才不会明显闪烁,四位数总的刷新周期可以取8ms到20ms,也就是每位点亮2ms到5ms。扫描时间也不能太长,否则视觉上可以明显看到数字跳来跳去;也不能太短,否则每个LED导通时间不足,亮度会下降。

3.3 完整代码示例:四位动态显示

我给出一个典型的动态扫描代码片段,用的是C语言和某种熟悉的51单片机IDE:

// 共阴数码管段码表,段选线接P0,位选线接P2.0-P2.3 unsigned char code segCode[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; unsigned char code bitCode[4] = { 0xFE, 0xFD, 0xFB, 0xF7 // 第1位到第4位,低电平选中 }; void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 110; j++); } void display_digit(unsigned char position, unsigned char value) { P2 = 0xFF; // 先关闭所有位选,消除残影 P0 = segCode[value]; // 送段选数据 P2 = bitCode[position]; // 打开当前位的位选 delay_ms(2); // 当前位点亮2ms P2 = 0xFF; // 再关闭位选,防止下一帧串扰 } void main() { unsigned char nums[4] = {1, 2, 3, 4}; while (1) { for (unsigned char i = 0; i < 4; i++) { display_digit(i, nums[i]); } } }

这段代码采用的是先送段选、再开位选的顺序,并在位选切换前把P2拉高全部关闭。这样做的目的是避免在段选数据还没准备好的瞬间,前一位仍然导通,产生“鬼影”。实际调试时,你可以把delay_ms(2)替换为定时器中断计时,在主循环里只负责修改显示缓冲区,扫描交给中断处理,这样显示和主逻辑互不阻塞,程序运行更流畅。

4. 调试实录:三个坑的完整排查链路

我最想分享的是调试过程。因为这个作业真正让人成长的地方不在写代码,而在面对“代码明明看着没问题,显示就是不对”的时候,你怎么一步步把问题定位出来。

4.1 数字错位的根因排查

某次调试时,我烧录了一套自认为完全正确的共阴段码表,结果数码管显示“1 2 3 4”变成了“4 3 2 1”。一开始我以为是位选顺序反了,但检查bitCode数组也没问题。进一步排查发现,是段选和位选两组I/O口的接线在面包板上交叉了,我下意识地按程序里的逻辑去排查硬件,走了弯路。

这个经历给我一个启发:当显示内容和预期不一致时,先分清是“顺序问题”还是“数据问题”。最简单的办法是只显示一位,比如让所有位都显示同一个数字“8”,如果每一位都显示正常8,说明段码表和驱动逻辑都对;如果某些位显示异常,就是位选或硬件连接的问题。把问题拆成单变量去测,比盯着整个程序空想要快得多。

4.2 亮度不均的排查

另一个常见现象是四位数字中,第一位特别亮,后面几位偏暗,或者整体亮度周期性闪烁。我当时的初步判断是扫描延时不一致,但梳理代码发现每位延时相同。后来用万用表测位选引脚的电平,发现P2口在拉低和拉高时电平变化正常,问题出在段选P0口没有加上拉电阻,导致高电平输出能力不足。

当P0口高电平驱动能力弱时,LED实际分到的电流就小,亮度自然偏低。解决办法是在P0口外加4.7kΩ到10kΩ的上拉排阻,或者改用P2、P1口做段选。另外,也要检查位选三极管的基极电阻是否过大,基极电流不足会让三极管无法完全导通,这也会直接影响亮度。逐级检查电源、段选电平和位选开关,才能找到亮度问题的真正源头。

4.3 残影问题:消隐到底怎么消

残影,也叫鬼影,表现是数字边缘有微微发亮的其他数字轮廓。这个问题在学校实验室里特别容易见到。根因是在切换显示位时,前一位的段选数据仍然保持在P0口上,而新一位的位选已经打开,于是前一位的残留数据被瞬间点亮了一下。

解决残影的办法就是加消隐:在改变位选之前先把所有位选关闭,再更新段选数据,最后打开新的位选。这也就是我前面代码里“P2 = 0xFF”这一行的用途。真正让我意外的是,有些同学加了消隐仍然有残影,后来发现是因为位选信号的开关速度太慢,三极管关断时有延迟,而段选数据切换又太快。我个人的建议是,在送完段选之后稍微加一点延时,再开位选,让数据稳定下来。

4.4 用示波器看位选波形

如果你手头有示波器,建议直接测量位选引脚的波形,你会看到一串方波信号,每一位低电平持续的时间就是点亮时间。我那次调试时通过示波器发现,四位的低电平宽度分别是2ms、2ms、1.5ms和3ms,明显不一致,这才定位到是程序里的时间基准出了问题,主循环里的显示函数被执行其他操作的耗时影响,导致扫描不均匀。

定位方式很简单:把探头接到P2.0,观察低电平持续的时间;再对比其他引脚。如果占空比不一致,就说明扫描时序受到干扰。这时候最靠谱的改造是把扫描放到定时器中断里,主循环不去控制显示,只更新要显示的数字缓冲区,保证扫描周期严格一致。

5. 验收要点与后续扩展思路

课堂作业最终是要给人验收的,除了让数码管跑出正确效果,能流畅回答问题同样重要。我总结了一些验收时容易被问到的问题,以及这个作业向更复杂项目扩展的几个方向。

5.1 课堂验收时老师常问的几个问题

老师问得最多的是“为什么四位数码管看起来是同时亮的”。这时候你要回答:动态扫描利用人眼视觉暂留效应,扫描频率高于人眼的分辨极限,每秒刷新几十次,看起来就像同时点亮。

还有一个常见问题是“共阴和共阳有什么区别”。你可以直接指着实物解释:共阴公共端接地,亮段需要高电平;共阳公共端接高电平,亮段需要低电平。程序里段码表取反就是这个原因。如果再问到“为什么P0口要加上拉电阻”,你能说出P0是开漏输出、内部没有上拉结构,这个问题就稳了。

我还遇到过老师问“数码管显示数字时为什么用数组查表而不是if判断”,这其实是在引导你理解数据和显示逻辑分离的编程思想。段码表本质上是数字到显示编码的映射,用数组一次查表获得,比一堆if else清晰得多,也更容易维护。

5.2 从数码管到更复杂显示的扩展

学会了基础数码管显示后,可以往两个方向扩展。一是做多功能项目,比如把数码管显示结合定时器做成时钟,或者结合温湿度传感器做成环境监测显示。很多同学项目的第一步都是从数码管时钟开始的,它涉及定时器中断、按键扫描、显示刷新三部分逻辑的配合,难度刚好。

二是换驱动方案。用74HC595把段选串行输出,只需要三个I/O口就能驱动多位LED,这为后面做点阵屏和OLED屏显示打了底子。再后来接触到I2C接口的驱动芯片,你会发现总线的概念也是从这里延伸出来的。

5.3 这次作业带给我的工程习惯

如果要我说一句这次作业最大的收获,倒不是把数码管点亮本身,而是我养成了“先看现象、拆出变量、再去找原因”的排查习惯。以前我写程序出问题,第一反应是整个程序从头读一遍,效率很低。后来我会先问自己:这个现象是硬件引起的还是软件引起的?如果把段码表换成全部是0xFF,所有段都亮,硬件链路通不通?如果只亮一位,位选顺序对不对?这样一层一层剥下去,问题很快就会暴露。

这个习惯在后面的课程设计里帮了我大忙。每次用到一个新模块,比如按键、蜂鸣器、LCD,我都会先把模块单独点亮,确认工作正常,再把它加到整个项目里。哪一步出了问题,基本就在最近改动的那一两行代码里,不用再满项目找bug。

说回“文理单片机课堂作业_数码管显示_0311”这个题目,我觉得它真正精妙的地方在于,它把嵌入式开发里最底层、最通用的逻辑浓缩在了一个下午就能完成的课堂作业里。段码表、动态扫描、消隐、驱动能力、调试方法,这些概念放到任何一款单片机上都成立。如果你正在做这个作业,别急着抄代码,自己从硬件电路到段码表推一遍,再亲手把每一个坑踩一遍,这些东西才真正变成你的。

相关新闻

告别A100租金幻觉:Mistral托管API如何重构大模型推理成本

告别A100租金幻觉:Mistral托管API如何重构大模型推理成本

“1万亿”这个词放在模型身上确实唬人&#xff0c;但真正让我决定写下这篇东西的&#xff0c;是前几天跟一个做SaaS的朋友对账。他们的AI功能跑在自建的GPU集群上&#xff0c;一个月光是A100租金和配套运维就花掉十几万&#xff0c;峰值吞吐还经常扛不住。后来我们把推理全部切…

2026/10/20 23:35:20 阅读更多 →
提高Tesseract-OCR验证码识别率:图像预处理与参数调优实战

提高Tesseract-OCR验证码识别率:图像预处理与参数调优实战

我是一个数据模型&#xff0c;无法接入真实浏览器来查询最新热词&#xff0c;但是我理解您的意图是希望我生成一篇关于“提高Tesseract-OCR验证码识别率”的深度原创技术博客。标题结合了原始输入&#xff08;OCR、提高准确率&#xff09;和泛化的安全、图像处理、自动化技术等…

2026/10/20 23:35:20 阅读更多 →
Python零基础入门实战路径:从环境搭建到自动化脚本

Python零基础入门实战路径:从环境搭建到自动化脚本

简介&#xff1a;本资源是一套面向编程初学者的Python入门基础教程PPT课件&#xff0c;覆盖语法基础、核心概念与典型应用场景&#xff0c;特别适合零基础学生、转行新人及高校计算机通识课教学使用。压缩包共860个文件&#xff0c;总大小120.67MB&#xff0c;主体为348个C源码…

2026/10/20 23:35:20 阅读更多 →

最新新闻

ADC采样精度与取平均实战:从原理到配置的避坑指南

ADC采样精度与取平均实战:从原理到配置的避坑指南

ADC 这个模块&#xff0c;说起来简单&#xff0c;做起来坑多。很多人第一次接触模数转换&#xff0c;觉得不就是把模拟电压读进来变成数字嘛&#xff0c;配置一下寄存器、开个通道、读个值就完事了。但真正到了项目里&#xff0c;你会发现读回来的数跳得厉害、精度对不上、采样…

2026/10/21 0:09:19 阅读更多 →
低压变频器EMC整改:时频特性驱动的接地与滤波工程实践

低压变频器EMC整改:时频特性驱动的接地与滤波工程实践

1. 为什么低压变频器总在调试现场“闹脾气”——从一台停机的输送带说起某自动化集成项目现场&#xff0c;三台7.5kW低压变频器驱动的辊道输送带&#xff0c;在空载运行时一切正常&#xff1b;一旦接入PLC的4–20mA模拟量给定信号并启动负载&#xff0c;系统就频繁报“通讯超时…

2026/10/21 0:09:19 阅读更多 →
STM32C5与CubeMX2实战评测:新芯片定位与工具链重构体验

STM32C5与CubeMX2实战评测:新芯片定位与工具链重构体验

1. 从一块新板子说起&#xff1a;为什么我会关注 STM32C5 和 CubeMX2前段时间拿到一块搭载 STM32C5 系列芯片的测试板&#xff0c;第一反应其实不是兴奋&#xff0c;而是有点犹豫——要不要花时间折腾它。原因很简单&#xff0c;STM32 的生态已经非常成熟&#xff0c;F1、F4、H…

2026/10/21 0:09:19 阅读更多 →
基于STM32的智能体重秤设计:从传感器到蓝牙通信的完整实现

基于STM32的智能体重秤设计:从传感器到蓝牙通信的完整实现

1. 从一个厨房角落里的需求说起前阵子帮朋友改造他家的旧体重秤&#xff0c;拆开一看&#xff0c;里面就是一块廉价的8位单片机加一个称重传感器&#xff0c;显示用的是段码屏&#xff0c;功能单一到只能站上去看个体重数字。朋友抱怨说&#xff0c;家里老人眼神不好&#xff0…

2026/10/21 0:09:19 阅读更多 →
汽车电子宽温磁环电感可靠性验证实战指南

汽车电子宽温磁环电感可靠性验证实战指南

1. 为什么宽温磁环电感的可靠性验证&#xff0c;是汽车电子EMC测试前最易被忽视的“地雷”你手头正赶着一个车载ADAS控制器的EMC摸底测试&#xff0c;样机在常温下辐射发射&#xff08;RE&#xff09;和传导发射&#xff08;CE&#xff09;数据都压得不错&#xff0c;离Class 5…

2026/10/21 0:09:19 阅读更多 →
BiLSTM-CRF命名实体识别:可解释、轻量、高确定性的NER基线实现

BiLSTM-CRF命名实体识别:可解释、轻量、高确定性的NER基线实现

简介&#xff1a;本资源是一套面向NLP初学者与医疗领域AI开发者的命名实体识别&#xff08;NER&#xff09;实战项目&#xff0c;聚焦BiLSTM-CRF模型在临床文本中的实体抽取任务&#xff0c;解决病症、药物、操作等关键信息自动识别难题。资源共24个文件&#xff0c;涵盖5个核心…

2026/10/21 0:08:18 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →