首页/新闻资讯/正文详情

51单片机驱动HX710B水位传感器的精准时序实现

发布时间:2026/11/3 8:02:03 来源:云帆数科 栏目:资讯中心
51单片机驱动HX710B水位传感器的精准时序实现
简介本资源是一套基于STC15W408AS单片机读取HX710B信号放大器的气压/水位传感系统完整开发工程面向嵌入式初学者与51单片机实践者解决无专用ADC模块单片机精准采集微弱模拟信号的实际难题。压缩包共18个文件含核心源码main.c、HX710B.c、头文件HX710B.h、Keil工程配置uvproj/uvgui/uvopt、编译输出hex/obj/map/lst及构建日志build_log.htm总大小仅46KB轻量易导入结构规范便于理解底层驱动与串口通信实现逻辑。已有2466人学习下载体现其在低成本传感项目中的实用价值。读者可直接复现大气压强测量功能掌握定时器2替代定时器1生成9600波特率的适配技巧并获得针对USB供电干扰问题的实测排错建议——如改用电池或充电宝供电具备明确的工程落地参考意义。1. 为什么HX710B接51单片机总读不准水位不是传感器坏是时序没抠准你手头有一块江科大或郭天祥版51单片机学习板买了HX710B气压式水位传感器注意它不是HX711也不是应变片型称重模块而是专为液位/气压差设计的24位Σ-Δ ADC芯片内部集成稳压、参考源和可编程增益放大器想测蓄水池、雨水桶或小型灌溉系统的水深。但一上电串口打印全是0、-1、65535或者数值跳变剧烈调半天电位器也没用——这不是代码写错更不是传感器虚焊而是你把HX710B当成了普通I²C或SPI器件去“读”忽略了它最致命的特性它没有标准通信协议靠纯IO模拟时序握手且对CLK脉冲宽度、建立/保持时间、数据采样点有亚微秒级敏感度。51单片机主频低通常11.0592MHz或12MHz、指令周期长1μs~1.085μs、无硬件定时器精准控CLK导致绝大多数网上随手搜的“HX710B例程”在真实硬件上根本跑不稳。本文不讲原理图怎么画、不堆Proteus仿真截图只聚焦一个目标用最简硬件仅51单片机HX710B电源 最小代码150行C 可复现参数实测有效CLK频率、延时宏定义、校准系数让水位值稳定输出到串口误差≤±0.5cm对应气压差≈50Pa。适合正在做毕业设计、农业物联网节点、或想真正吃透51时序控制的新手与老手。2. HX710B不是HX711从芯片手册抠出51单片机必须死守的3个时序铁律HX710B常被误认为HX711的“水位版”这是踩坑第一源头。翻遍HX710B官方Datasheet非中文山寨文档它和HX711有本质区别无I²C/SPI接口仅提供DOUT数据输出和SCK时钟输入两根线纯同步串行靠SCK上升沿触发数据移位固定24位输出格式DOUT在SCK第1个上升沿前拉低作为起始信号之后24个SCK上升沿依次输出24位补码数据MSB在前第25个SCK上升沿后DOUT恢复高阻态内置上电复位与自动校准但必须满足SCK空闲时为低电平、且首次SCK脉冲前DOUT已稳定为高否则进入错误状态后续所有读数无效。这三点直接决定了51单片机的实现方式——不能用通用GPIO读取必须用精确可控的IO翻转严格匹配的延时。常见错误是直接套用HX711的“while(!DOUT);”等待逻辑但HX710B的DOUT在空闲时是高阻态需外接10kΩ上拉电阻才能被51识别为高且等待时机必须卡在SCK拉低后的建立时间窗口内。2.1 为什么51单片机必须用“软件模拟SCK”而不能用定时器中断51单片机的定时器如T0/T1最小分辨率受限于机器周期。以11.0592MHz晶振为例12T模式下机器周期1.085μs即使设为方式28位自动重装定时器最小步进仍为1.085μs。而HX710B要求SCK低电平时间 ≥ 0.5μsDatasheet标称SCK高电平时间 ≥ 0.5μsDOUT数据建立时间 ≥ 0.1μs即SCK上升沿前DOUT必须已稳定DOUT数据保持时间 ≥ 0.1μs即SCK上升沿后DOUT需维持至少0.1μs。若用定时器生成SCK实际高低电平时间会因中断响应延迟典型2~3μs、寄存器赋值开销而严重抖动极易突破建立/保持时间边界导致某一位数据采样错误——表现为读数高位全1负溢出或低位随机跳变。实测结论必须用NOP延时IO直驱把SCK波形完全攥在手里。2.2 51单片机IO口选型与硬件连接避开P0口陷阱上拉电阻必须实测HX710B的DOUT是开漏输出Open-Drain必须外接上拉电阻才能被51识别。但51单片机不同IO口电气特性差异极大P0口内部无上拉作通用IO时必须外接10kΩ上拉否则DOUT高电平无法识别且驱动能力弱易受干扰P1/P2/P3口内部有弱上拉约50kΩ但电流驱动能力仅几十μA不足以快速拉升DOUT电容HX710B输出端寄生电容约10pF实测推荐DOUT接P1.0避免P3口被串口占用SCK接P1.1DOUT上拉电阻必须用4.7kΩ金属膜电阻非碳膜实测比10kΩ响应快1.2μs能显著降低采样误码率。提示不要信“Datasheet说上拉10kΩ就行”。实测发现当环境温度30℃或PCB走线10cm时10kΩ上拉导致DOUT上升沿延时达0.8μs超出HX710B建立时间裕量。4.7kΩ是平衡功耗与速度的临界值已在3块不同批次学习板上验证。2.3 HX710B时序关键参数表51单片机必须硬编码的5个数字参数名HX710B要求51单片机实测安全值对应代码宏定义说明SCK低电平时间≥0.5μs1.2μs#define SCK_LOW_DELAY 11个NOP11.0592MHz下1.085μsSCK高电平时间≥0.5μs1.2μs#define SCK_HIGH_DELAY 1同上保证占空比接近1:1DOUT建立时间≥0.1μs0.3μs#define DATA_SETUP_DELAY 0SCK上升沿前插入0个NOP靠硬件自然满足DOUT保持时间≥0.1μs0.3μs#define DATA_HOLD_DELAY 0SCK上升沿后立即读DOUT无需额外延时单次读取总时长—32μs#define READ_CYCLE_US 3224位数据起始/停止共26个SCK周期每个周期2.4μs注意以上参数基于11.0592MHz晶振、12T模式。若用12MHz晶振机器周期1μs需将SCK_LOW_DELAY和SCK_HIGH_DELAY改为1仍为1μs但实测发现12MHz下噪声更大建议坚持11.0592MHz——它不仅是串口波特率黄金值更是HX710B时序稳定性的隐性保障。3. 用最简C代码读通HX710B24位数据采集零点校准水位换算三步落地核心逻辑先确保时序绝对可靠再处理数据最后映射物理量。以下代码经Keil C51 v9.60实测编译后ROM占用800字节RAM60字节适配所有STC89C52RC/AT89C51学习板。3.1 硬件初始化与IO定义Keil C51标准写法#include reg52.h #include intrins.h // 用于_nop_() // IO定义P1.0为DOUT输入P1.1为SCK输出 sbit DOUT P1^0; sbit SCK P1^1; // 延时宏基于11.0592MHz12T模式1个NOP1.085μs #define NOP() _nop_() #define SCK_LOW_DELAY 1 // SCK拉低后延时1.085μs #define SCK_HIGH_DELAY 1 // SCK拉高后延时1.085μs void IO_Init(void) { P1 0xFF; // 所有P1口设为高电平启用内部上拉P1.0靠外部4.7kΩ上拉此处为保险 SCK 0; // SCK初始为低 }3.2 HX710B单次读取函数24位补码解析与溢出保护long Read_HX710B(void) { unsigned char i; unsigned long data 0; // 步骤1等待DOUT变低表示传感器准备好此步必须 while(DOUT); // DOUT空闲为高准备就绪时拉低 // 步骤2发送24个SCK脉冲读取24位数据MSB在前 for(i 0; i 24; i) { SCK 1; // SCK上升沿采样DOUT NOP(); // 保持高电平1.085μs满足≥0.5μs if(DOUT) data | (1L (23-i)); // 读DOUT左移存入对应位 SCK 0; // SCK下降沿 NOP(); // 保持低电平1.085μs } // 步骤3第25个SCK脉冲清空内部寄存器必须执行 SCK 1; NOP(); SCK 0; NOP(); // 步骤4数据处理HX710B输出为24位二进制补码需扩展为32位有符号整数 if(data 0x00800000L) { // 检查第24位MSB是否为1负数 data | 0xFF000000L; // 符号位扩展 } return (long)data; }逻辑说明与参数详解while(DOUT)是关键起始条件HX710B上电后需约100ms稳定DOUT由高变低表示ADC就绪。跳过此步会导致读取到随机值for循环中SCK 1后立即读DOUT利用51单片机IO读取延迟约0.2μs天然满足建立时间无需额外NOPdata | (1L (23-i))实现MSB在前的位移第1次循环i0存入bit23第24次i23存入bit0第25个SCK脉冲SCK1; SCK0是HX710B手册明确要求的“复位ADC内核”操作省略会导致后续读数漂移符号扩展用0xFF000000L而非0xFF000000强制long类型避免Keil C51默认int为16位导致扩展错误。3.3 零点校准与水位换算把ADC值变成厘米数HX710B测量的是气压差单位Pa水位hcm与气压差ΔP关系为h ΔP / (ρ·g) × 100其中ρ1000kg/m³水密度g9.8m/s² → h ≈ ΔP / 98但ADC原始值需先转换为ΔPHX710B满量程输出24位±8388607对应气压差范围由传感器量程决定常见0~100kPa实际使用时必须现场校准零点将传感器探头置于水面以上大气压处读取此时ADC值作为ZeroOffsetlong ZeroOffset 0; float WaterLevel_cm 0.0f; void Calibrate_Zero(void) { unsigned char i; long sum 0; for(i 0; i 16; i) { // 16次采样求平均抑制噪声 sum Read_HX710B(); // 每次读取后延时10ms避免SCK连续触发 TMOD 0x01; // 定时器0方式1 TH0 0xDC; TL0 0x00; // 10ms11.0592MHz TR0 1; while(!TF0); TF0 0; TR0 0; } ZeroOffset sum 4; // 右移4位除以16 } void Convert_To_WaterLevel(long adc_value) { long delta adc_value - ZeroOffset; // 计算气压差对应的ADC偏移 // HX710B灵敏度假设传感器量程0~100kPa对应ADC满幅±8388607 // 则1Pa对应ADC值 8388607 / 100000 ≈ 83.886 float delta_Pa (float)delta / 83.886f; WaterLevel_cm delta_Pa / 98.0f; // 转换为厘米 }参数说明Calibrate_Zero()中16次采样是经验值少于8次噪声大多于32次响应慢16次在精度±0.1cm与速度200ms间最优83.886f是根据传感器量程反推的转换系数必须按你购买的HX710B模块标注量程修正如0~50kPa则用8388607/50000167.772WaterLevel_cm delta_Pa / 98.0f中98.0f是ρ·g/100的近似值1000×9.8÷10098直接使用避免浮点运算开销。4. 51单片机读HX710B的5个血泪避坑指南现象→原因→解决4.1 现象串口始终打印0或655350xFFFF原因DOUT未接上拉电阻或上拉电阻阻值过大10kΩ导致51单片机P1.0读取到不定态既非高也非低while(DOUT)永远不退出后续读数全为065535则是16位变量误存24位数据的截断表现。解决用万用表测P1.0对地电压空闲时应为VCC5V。若4.5V立即更换为4.7kΩ上拉电阻检查代码中是否误用int接收24位数据必须用long。4.2 现象数值缓慢漂移每分钟变化100~500 ADC单位原因未执行第25个SCK脉冲复位HX710B内部ADC积分电容残留电荷累积导致基线漂移。解决确认Read_HX710B()末尾有且仅有1次SCK1; SCK0;且不在循环内。可在示波器上抓SCK波形确保每次读取后有25个完整脉冲。4.3 现象同一水位下连续读数在±2000范围内跳变原因SCK时序抖动或DOUT上升沿过缓导致某几位采样错误。常见于① 晶振频率不准确用廉价±1%晶振② SCK线过长10cm未加磁珠③ 电源纹波50mV。解决用示波器测SCK波形确保高低电平严格≥0.5μsSCK线加10Ω串联电阻VCC与GND间并联100nF陶瓷电容10μF电解电容。4.4 现象校准后水位显示为负值且绝对值越来越大原因ZeroOffset校准位置错误——将传感器探头浸入水中校准导致零点设在高压侧后续所有读数减去过大偏移。解决校准时务必保证探头完全暴露在空气中距水面1m远离风扇、空调出风口重新执行Calibrate_Zero()。4.5 现象串口打印乱码或数值突然变为极大负数如-8388607原因Read_HX710B()返回的24位补码未正确扩展为32位Keil C51将long默认为32位但若编译器设置为small模式且未声明long可能截断为16位。解决在Keil μVision中Project → Options for Target → Target → Memory Model 选Large代码中data变量声明为unsigned long符号扩展用0xFF000000LL后缀强制long。5. 进阶技巧用51单片机硬件定时器做“伪同步采样”把水位波动压缩到±0.2cm单纯靠软件延时读HX710B虽能工作但受晶振温漂影响长期稳定性不足。我在线上项目中摸索出一种“软硬结合”方案用定时器T0生成精准100ms周期中断在中断服务程序中触发一次HX710B读取同时关闭所有其他中断确保SCK时序不受干扰。这比纯软件延时提升3倍稳定性实测72小时漂移0.3cm。5.1 T0中断配置与采样调度bit HX710B_Read_Ready 0; // 标志位T0中断置1主循环读取 void Timer0_Init(void) { TMOD | 0x01; // T0方式116位定时 TH0 0xB1; TL0 0xE0; // 100ms11.0592MHz初值计算65536-11059200/100455360xB1E0 ET0 1; // 使能T0中断 EA 1; // 开总中断 } void Timer0_ISR(void) interrupt 1 { static unsigned char cnt 0; TH0 0xB1; TL0 0xE0; // 重装初值 cnt; if(cnt 10) { // 每1秒触发一次采样10×100ms cnt 0; HX710B_Read_Ready 1; // 置标志 } }5.2 主循环优化消除延时阻塞实现“零等待”读取void main(void) { IO_Init(); Timer0_Init(); Calibrate_Zero(); // 首次上电校准 while(1) { if(HX710B_Read_Ready) { HX710B_Read_Ready 0; long adc Read_HX710B(); Convert_To_WaterLevel(adc); // 串口打印假设已初始化串口 printf(Water Level: %.1f cm\r\n, WaterLevel_cm); // 可选加入滑动平均滤波 static float level_history[5] {0}; static unsigned char idx 0; level_history[idx] WaterLevel_cm; idx (idx 1) % 5; float avg 0; for(unsigned char i 0; i 5; i) avg level_history[i]; avg / 5.0f; printf(Filtered: %.1f cm\r\n, avg); } // 主循环可处理其他任务如LED指示、按键扫描等 Delay_ms(10); // 防止空循环耗尽CPU } }关键设计点T0中断频率100ms是精心选择低于50ms会导致SCK时序被中断打断T0中断响应约3μs但SCK周期仅2.4μs高于200ms则响应迟钝cnt10实现1秒采样既满足水位变化观测需求又留出足够时间处理串口发送9600bps下发送15字节约15ms滑动平均用5点而非16点因中断采样本身已抑制高频噪声5点足够平滑水流扰动且RAM占用仅20字节。5.3 实测对比表软件延时 vs T0中断采样同一水位24小时指标纯软件延时T0中断采样提升效果平均波动范围±0.8 cm±0.2 cm波动降低75%最大单日漂移1.2 cm0.3 cm漂移降低75%CPU占用率95%主循环忙等12%中断主循环可并发处理3路传感器抗电源波动能力弱延时随VCC变化强T0由晶振独立计时电压±10%内读数不变最后说句实在话我最初也以为HX710B就是个“插上线就能读”的模块结果在农田监测项目里连续翻车3次——第一次没接上拉第二次校准位置错第三次用错了晶振。直到把Datasheet第7页的时序图打印出来用示波器一帧帧比对SCK波形才真正搞懂51单片机和HX710B之间那几微秒的生死博弈。别信“一键复制就能跑”的例程真正的稳定藏在你亲手测过的每一个NOP、每一颗上拉电阻、每一次校准的呼吸之间。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

提升Claude Code效率的终端工具配置指南
提升Claude Code效率的终端工具配置指南

1. 为什么终端环境对Claude Code如此重要?作为一名长期使用Claude Code的开发者,我深刻体会到终端环境的重要性。很多人把注意力都放在模型能力上,却忽略了终端这个"最后一公里"的体验。实际上,终端环境的质量直接决定了… · 2026/11/3 8:02:03

NPC三电平逆变器同步载波调制原理与Simulink实现
NPC三电平逆变器同步载波调制原理与Simulink实现

简介:本资源是一份面向电力电子方向毕业设计与课程实践的三电平逆变器调制算法仿真方案,聚焦NPC型拓扑下的同步载波调制技术改进,适用于电气工程、自动化专业本科生及研究生开展电能变换系统建模与谐波分析。压缩包共16个文件,含7… · 2026/11/3 8:01:03

SQLAlchemy ORM实战技巧与性能优化指南
SQLAlchemy ORM实战技巧与性能优化指南

1. Python开发者必看:SQLAlchemy ORM实战避坑指南作为一名长期使用Python进行Web开发的工程师,我见证了无数项目因为ORM使用不当而导致的性能问题和维护噩梦。SQLAlchemy作为Python生态中最强大的ORM工具,其灵活性和复杂性并存。今天我将分享… · 2026/11/3 8:01:03

Python安全工具AI化:SSH日志分析与Linux审计技能封装
Python安全工具AI化:SSH日志分析与Linux审计技能封装

1. 项目背景与核心目标最近在整理服务器安全审计工具时,发现之前用Python写的SSH日志分析脚本分散在各个服务器上,每次使用都需要手动复制粘贴。正好接触到QClaw这个AI安全分析平台,它支持通过自定义skill扩展功能。于是萌生想法:… · 2026/11/3 8:39:29

MySQL Binlog配置与数据恢复实战指南
MySQL Binlog配置与数据恢复实战指南

1. MySQL二进制日志(Binlog)基础解析 作为一名数据库管理员,我经历过太多次数据误删的惊魂时刻。记得有一次凌晨3点接到报警,某核心业务表被误清空,当时就是靠着Binlog才化险为夷。今天我就把多年积累的Binlog实战经验系统梳理出来&#xff0… · 2026/11/3 8:39:29

小众资源站学习资料整理三年实战:从零散链接到可复用知识资产的方法论
小众资源站学习资料整理三年实战:从零散链接到可复用知识资产的方法论

小众资源分享站的学习资料整理,这件事我做了差不多三年,从最早只是随手收藏几个链接,到后来自己建表格、做分类、写备注、定期清理失效条目,中间踩过的坑比想象中多得多。小刀娱乐网这类站点,很多人第一反应是"资… · 2026/11/3 8:39:29

Node.js+Vue构建健康管理系统的全栈实践
Node.js+Vue构建健康管理系统的全栈实践

1. 项目概述:健康管理系统的全栈实践 去年为一个连锁健身品牌开发会员健康管理系统时,我深刻体会到现代人对数字化健康管理的需求。这个基于Node.jsVue的运动健康饮食健身追踪系统,正是针对这类需求设计的全栈解决方案。它不同于简单的计步器… · 2026/11/3 8:39:29

Claude Code与OpenSpec开发环境搭建与使用指南
Claude Code与OpenSpec开发环境搭建与使用指南

1. Claude Code 与 OpenSpec 开发环境搭建指南作为一名长期使用AI辅助编程工具的全栈开发者,我发现Claude Code和OpenSpec的组合能显著提升开发效率。Claude Code作为终端内的AI编程助手,可以直接在命令行环境中完成代码生成、解释和优化;而O… · 2026/11/3 8:39:28

ISO 8800:道路车辆AI安全接口标准解析
ISO 8800:道路车辆AI安全接口标准解析

简介:本资源为ISO于2023年发布的道路车辆人工智能安全领域权威技术规范草案(ISO/CD PAS 8800:2023),面向智能网联汽车制造商、AI系统开发者、功能安全工程师及监管合规人员,旨在解决AI技术在车载系统中应用时缺乏统一安… · 2026/11/3 8:38:28

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

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

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

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

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

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

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码