news 2026/10/3 1:28:21

基于51单片机的太阳能智能谷物翻晒机器人:Proteus仿真与实现全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于51单片机的太阳能智能谷物翻晒机器人:Proteus仿真与实现全解析

暑假在老家帮爸妈晒过稻谷的人,应该都懂那个滋味:太阳越大,人越不能走,手里一把木耙,隔一两个小时就得把谷子翻一遍,不然表层晒干了、底层还潮湿,一场阵雨下来更是手忙脚乱。这个活说白了就是“高温下的重复劳动”。后来我在课设选题表里看到“基于51单片机的太阳能智能谷物翻晒机器人”这个题目,第一反应是——它把一个特别传统的农活,和单片机、传感器、新能源整个串起来了,而且用Proteus就能完成大部分逻辑验证,不用先买一堆元器件也能把方案跑通。这篇就把我从方案设计、Proteus仿真、控制程序到实物移植的完整思路拆开讲,给同样在做51单片机课设、电子设计竞赛选题的同学一个能直接参考的框架。

先说个题外话,软件官方拼写是Proteus,市面上和考研群里打成“Protues”的也大有人在,搜索引擎也能识别,不用太纠结。真正要纠结的,是怎么在仿真图里把“太阳能板”“雨滴传感器”这些Proteus元件库里没有的东西合理地“平替”掉,再把控制逻辑写对。这才是这个项目最花时间的地方。

1. 翻晒任务的本质:为什么谷子必须反复翻动

1.1 谷物翻晒的工艺要求

很多人以为翻晒就是把谷子摊开晾着就行,但实际做过农活就知道,翻晒是有明确工艺目标的。

刚收割的稻谷含水率一般还在22%~26%,要降到13%~14%左右才能入仓长期储存。问题在于,晒场上的谷子铺开之后,接受到阳光和地面热辐射的主要是表层那一两厘米,底层谷粒的水分降得非常慢。如果长时间不翻动,底层谷粒会因为闷热潮湿开始呼吸作用加剧,轻则发黄,重则发霉、发芽,整批粮食品质直接崩掉。所以翻晒的本质是:利用机械翻动将上下层谷粒交换位置,让所有谷粒轮流接触高温干燥的表层环境,加快整体降水速率。

翻晒频率也有讲究,晴天大概1~2小时翻一遍,刚摊开的前两遍尤其要勤。另外还要注意地面温度,午后水泥晒场表面能到60℃以上,谷粒如果一直贴着地面暴晒,容易造成“爆腰”——谷壳开裂、米粒断裂,影响出米率。所以太阳最毒的那两三个小时,其实需要的是适当的遮挡或者增加翻动频率来降温。这些参数不一定都要写进单片机程序里,但它们决定了机器人的工作模式:不能只做一个定时器到点就转,还要考虑光强、时段和突发天气。

1.2 人工作业的痛点,正好是“智能”的切入点

人工作业的痛点非常直观。第一是高温,晒谷场基本没有遮挡,地面反射加上头顶暴晒,人在场里走两趟就大汗淋漓;第二是枯燥,翻晒动作高度重复,一天下来腰酸背痛;第三是突发天气压力,夏天阵雨说来就来,雨点落下来之前要把几百斤甚至几千斤谷子收拢盖好,一个人根本忙不过来。

所以这个项目里“智能”两个字不是噱头。它至少应该做到三件事:自动定时翻晒、光线不足时自动停机、检测到降雨时自动回到遮雨位置。再加上太阳能供电,整机不需要拖电线、不需要频繁换电池,放在晒场边上就能自己工作。这个定位,正好对应了51单片机加传感器组合最擅长的控制场景——输入信号不多、逻辑状态清晰、实时性要求不苛刻。

1.3 为什么选51单片机加Proteus仿真

这套设计选51单片机几乎是必然的。AT89C52或STC89C52这类芯片成本低、资料极多,网上随便就能找到参考代码,而且Proteus对51内核的仿真支持非常成熟,从按键、数码管到ADC0809、L293D、DS18B20都有现成模型。

更重要的是,Proteus仿真可以把整个系统的电气逻辑先跑通,比如传感器信号怎么采集、电机什么时候启动、雨滴信号来了程序走哪个分支。这些逻辑如果在实物上调试,一旦接线错误或者元器件损坏,排查起来特别消耗时间;在仿真环境里,至少能把“程序逻辑问题”和“硬件问题”先切开,这是这个项目最值得推荐的开发路径。

2. 整机方案:太阳能供电、运动控制和翻晒机构怎么配合

2.1 系统组成与模块划分

整个系统我按功能拆成了五个模块:供电模块、感知模块、控制模块、驱动模块和执行机构。模块化设计的好处是后期调试时能单独验证每块电路,出了问题不用全盘排查。

模块实物选型Proteus仿真模型作用
供电模块太阳能板+锂电池+稳压电路直流电压源+限流电阻给整机供电
感知模块光敏电阻/光强传感器LDR或可调电阻判断光照是否适合翻晒
感知模块雨滴传感器可调电阻分压+ADC检测降雨
感知模块边界光电开关按钮+上拉电阻检测晒场边界
控制模块STC89C52/AT89C52AT89C52逻辑处理
驱动模块L293D/ULN2003L293D电机驱动
执行机构直流减速电机+旋转耙齿直流电机模型行走与翻晒

这里有个原则先讲清楚:Proteus仿真验证的是控制逻辑和电气接口,不是机械结构和力学特性。所以仿真阶段不需要纠结机械臂怎么设计、耙齿用几根,重点是让电机转起来、传感器信号进来之后程序能正确响应。

2.2 工作流程:机器人一天怎么干活

机器人的工作流程我设计成下面这样,每一步对应程序里的一个状态:

  1. 上电初始化,读取光强值,低于阈值则进入低功耗待机。
  2. 光强满足且距离上次翻晒超过设定间隔(比如30分钟),启动行走电机和翻晒电机。
  3. 机器人沿晒场直线行进,翻晒耙齿持续翻动谷粒。
  4. 前方边界光电开关触发,说明走到晒场边缘,原地转向约180度,继续下一行。
  5. 光强跌到阈值以下,或者到达预设的日落时间,返回出发位置停机。
  6. 雨滴传感器触发,无论当前在做什么,立即停止翻晒、返回遮雨棚。

这个流程看起来简单,但已经覆盖了谷物翻晒的基本需求。后面要做的就是把这个流程翻译成51单片机的状态机。

2.3 太阳能供电:为什么不能拿太阳能板直接怼单片机

太阳能供电是整个项目里“听起来简单、做起来坑最多”的部分。很多人第一次设计时想的是:太阳能板出来两根线,直接接单片机不就行了?实际上光伏板的输出电压受光照影响极大,阴天可能只有标称值的50%,而且当电机启动瞬间电流突然拉高,电压会跌到单片机复位阈值以下,控制系统就不断重启。

实物的正确做法是:太阳能板(6V或12V)经过充电管理模块给锂电池充电,锂电池再通过稳压电路输出稳定的5V给单片机。这样光照波动被电池缓冲掉了,电机启动的大电流也不会直接冲击MCU电源。

但在Proteus仿真里,我不建议花太多时间搭完整的太阳能充电管理电路,因为Proteus对BQ24650、TP4056这类充电管理芯片的模型支持很有限。最务实的做法是:用一路直流电压源模拟稳压后的5V电源,再用一个可调电阻模拟太阳能板在不同光照下的输出电压变化,重点验证的是“光照变弱之后,程序能不能检测到并进入待机状态”这个逻辑,而不是光伏板的电气特性。

2.4 执行机构:为什么用直流电机而不是步进电机

翻晒机器人的执行机构有两路:行走机构和翻晒机构。我选的方案是两路直流减速电机,而不是步进电机或舵机。

原因有三个:第一,成本,直流减速电机几块钱一个,驱动电路用L293D或者ULN2003就能带,步进电机加驱动板成本直接翻倍;第二,控制复杂度,51单片机要输出两路PWM做差速控制并不难,但步进电机需要精确的脉冲序列,程序更复杂,Proteus仿真里的步进电机模型也没直流电机那么直观;第三,这个应用场景根本不需要精确的角度控制,机器人从A点走到B点翻晒谷子,多走几厘米少走几厘米没有任何影响,闭环反馈靠的是边界检测开关,而不是电机本身。

翻晒机构我设计的是一个旋转耙齿组件:一根电机轴装上几根带有弯角的金属丝或者橡胶齿,电机旋转时这些齿像耙子一样把谷粒从底层翻到表层。设计要点是齿的高度要能微调,齿太矮翻不动底层谷粒,齿太高又会把谷粒甩出晒场。这个在仿真阶段不用管,但做实物之前必须想清楚。

3. Proteus仿真:元器件的替代方案和连线关键

3.1 太阳能板和雨滴传感器的仿真替代思路

Proteus元件库里的“官方模型”覆盖的是常见数字芯片、模拟芯片、无源器件和部分传感器,但太阳能板、雨滴传感器、光电开关这类偏应用层的器件,库里通常没有直接对应的模型。遇到这种情况不需要卡住,思路是:找到一类电气特性和真实传感器等价的元件来模拟。

雨滴传感器的本质是一个“湿度变化导致电阻变化,进而引起输出电压变化”的器件。所以我在Proteus里用一只电位器(POT-HG)和固定电阻组成分压电路,调节电位器就能改变送入ADC引脚的电压,模拟雨滴传感器AO口输出的0~5V模拟信号。光照检测我用光敏电阻LDR,Proteus里有这个模型,双击可以设置光照强度参数,仿真运行中改变光照值就能看到光敏电阻两端电压变化。如果你用的Proteus版本里LDR用起来不顺手,同样可以用电位器替代。

边界检测开关我用按钮加一个10k上拉电阻模拟。按键没按下时输入为高电平,代表没有边界;按下时拉低,代表机器人走到了晒场边缘。实物里的E18-D80NK光电开关输出的是开关量信号,和按键的电气行为完全一致——一个输入引脚的高底电平变化。

3.2 ADC0809的连线:地址线、时钟和EOC时序

光敏电阻和雨滴传感器的输出电压是模拟信号,而51单片机本身没有内置ADC(STC12系列等增强型芯片除外),所以仿真里我用了经典的ADC0809,连接方式必须记清楚:

  • IN0接光敏分压输出,IN1接雨滴传感器模拟输出。
  • ADDA、ADDB、ADDC接P1.3、P1.4、P1.5,作为通道选择地址。
  • ALE和START接同一个引脚(P1.0),上升沿锁存地址、下降沿启动转换。
  • EOC接P1.1,转换结束时输出高电平,程序查询这个引脚判断转换是否完成。
  • OE接P1.2,置高电平时把转换结果输出到数据总线。
  • CLK接一个频率为500kHz左右的脉冲信号源(Proteus里用DCLOCK元件,频率填500k)。
  • 数据输出D0~D7接P2口。

其中最容易出问题的是CLK时钟。ADC0809的CLK频率范围是10kHz到1280kHz,推荐500kHz左右。频率太高转换不稳定,频率太低转换速度慢但逻辑上没毛病。有些人直接把51单片机的ALE引脚分频给ADC0809用,这个做法在Proteus里反而容易因为时序配合问题翻车,我建议直接用独立时钟源省心。

P0口接ADC0809数据线的问题也经常有人踩:AT89C52的P0口是开漏输出,做输入口使用时必须外接上拉电阻,不然读到的数据永远是0xFF。我用的是一个10k排阻连接到5V电源,接在P0口和ADC数据口之间。连线这块我整理成了一张表,照着画不会乱:

ADC0809引脚接到哪里备注
D0~D7P2.0~P2.7数据输出线
IN0光敏电阻分压点光强模拟量
IN1电位器滑臂雨量模拟量
ADDA/ADDB/ADDCP1.3~P1.5通道选择地址
START、ALEP1.0启动转换
EOCP1.1转换结束指示
OEP1.2输出使能
CLK500kHz脉冲源工作时钟
VREF++5V参考电压上限
VREF-GND参考电压下限

3.3 关于DS18B20仿真,为什么我不建议在这个项目里加温度检测

网上很多人在搜“直接接线用Proteus仿真DS18B20”,因为这个模块看着简单,实际仿真时坑不少。Proteus里的DS18B20模型对时序的要求非常严格,51单片机用普通GPIO模拟1-Wire时序,如果延时不够精确,很容易读到85℃(上电默认值)或者-127℃(通信失败)。我在一个温控项目里调过很久,最后发现Proteus的仿真速度会影响时序,尤其是全速仿真时延时函数和真实硬件存在偏差。

回到谷物翻晒机器人这个题目,温度检测是个“锦上添花”的功能,不是核心。晒场温度确实会影响谷粒品质,但通过光强和时间判断完全可以替代大部分温度检测的需求。如果你确实想加DS18B20做一个“高温暂停翻晒”的保护功能,我的建议是:先在实物上验证时序,仿真阶段跑通DS18B20可以用,但不要在这个点上死磕太久,它不决定你项目的核心功能能不能展示。

3.4 L293D驱动电机:PWM频率和使能脚的处理

电机驱动我用了L293D,一方面是Proteus自带这个模型,另一方面L293D的电路结构很适合教学演示:每个通道有使能端(EN)和两个方向控制脚(IN1、IN2),使能为高电平时电机工作,方向由IN1和IN2的电平组合决定。

在Proteus里仿真L293D时有一个经验:PWM频率不要设太高。51单片机用定时器中断产生PWM,如果频率设到20kHz以上,仿真画面里的电机转速变化反而看不出来,因为仿真器的实时性有限。我是用1kHz的PWM,一个周期中断100次,每次中断累加计数器,输出高电平的时间占整个周期的百分比就是占空比,这样控制起来线性感很强。

真正的51单片机硬件上PWM频率可以更高,但在仿真里验证逻辑,1kHz足够。

4. 控制程序:定时间隔和突发降雨的判定逻辑

4.1 翻晒策略:为什么是“光强+时间”双重判断

如果程序只看时间定时翻晒,那阴天和傍晚也会傻乎乎地转起来,把潮湿的谷子翻得更难干。如果只看光强,正午光最强的时候一直都在翻,但谷子已经晒到位了,反而可能增加碎米率。所以我的策略是双条件叠加:

  • 条件A:当前光强值大于阈值(比如ADC值大于200)。
  • 条件B:距离上次翻晒的时间超过设定间隔(比如30分钟,具体值要再根据晒场面积调)。

两个条件同时满足才执行一次翻晒动作。光强不足但时间到了,程序只更新“上次检测时间”,等到光强恢复后再重新计时。这样可以避免阴天反复无效启动,也避免晴天翻晒频率过高。

状态机我分成五个状态:待机、翻晒中、边界转向、返航、遮雨停车。每个状态对应一个循环里的switch分支,标志位的切换条件就是传感器输入和时间变量。

4.2 雨滴检测的防误触发处理

雨滴传感器最怕什么?最怕的是传感器表面沾了一滴露水或者昆虫爬过,程序立刻判定“下雨了”,整机撤回遮雨棚,结果大太阳继续晒,谷子晾晒进度全耽误了。

所以雨滴检测不能做“一次触发就生效”,我在程序里做了连续采样滤波:每200ms读一次雨滴通道的ADC值,连续读到5次都大于阈值才确认进入下雨状态。这个方案我用过一个很形象的类比——就像人感觉到有一两滴雨落在脸上,大概率会抬头再看一眼天、再伸手接一下确认,不会立刻拔腿就跑。另外一旦进入遮雨停车状态,需要光强恢复正常且雨滴信号持续消失超过3分钟,才能允许重新出车翻晒,避免雨停了又下雨造成频繁往返。

4.3 关键代码实现:ADC读取、PWM和主循环

下面三段代码是这个项目里最核心的部分。第一段是ADC0809的读取函数:

#include <reg52.h> #include <intrins.h> sbit START = P1^0; sbit EOC = P1^1; sbit OE = P1^2; sbit ADDA = P1^3; sbit ADDB = P1^4; sbit ADDC = P1^5; #define ADC_DATA P2 unsigned char Get_ADC(unsigned char ch) { unsigned char dat; ADDA = ch & 0x01; // 通道地址低三位 ADDB = (ch >> 1) & 0x01; ADDC = (ch >> 2) & 0x01; START = 0; _nop_(); START = 1; // 下降沿启动转换 _nop_(); START = 0; while (EOC == 0); // 等待转换结束,EOC变高 OE = 1; _nop_(); dat = ADC_DATA; OE = 0; return dat; }

第二段是定时器0产生PWM信号控制电机转速。这里用的方法是定时器每0.1ms中断一次,计数器加到100就是10ms周期,也就是1kHz的PWM:

unsigned char pwm_cnt = 0; unsigned char duty = 70; // 占空比0~100 void Timer0_Init(void) { TMOD &= 0xF0; TMOD |= 0x01; // 定时器0,模式1 TH0 = 0xFF; TL0 = 0x9C; // 100us定时初值 ET0 = 1; TR0 = 1; EA = 1; } void Timer0_ISR(void) interrupt 1 { TH0 = 0xFF; TL0 = 0x9C; pwm_cnt++; if (pwm_cnt >= 100) pwm_cnt = 0; if (pwm_cnt < duty) MOTOR_EN = 1; // 使能电机 else MOTOR_EN = 0; }

第三段是主循环里的状态机骨架。这里只贴了核心分支逻辑,实际代码里还要加上数码管显示当前状态、界限保护这些内容:

void main(void) { unsigned char light, rain; Timer0_Init(); while (1) { light = Get_ADC(0); // 光强通道 rain = Get_ADC(1); // 雨滴通道 if (rain_flag && rain > RAIN_THRESHOLD) { // 已确认下雨,进入遮雨停车状态 Motor_A_Stop(); Motor_B_Stop(); state = E_STATE_RAIN; } else if (state == E_STATE_RAIN) { // 雨停后延时恢复,这里略 } else if (light > LIGHT_THRESHOLD && time_interval >= TURN_INTERVAL) { // 光强足够且到翻晒间隔 Motor_A_Forward(); Motor_B_Forward(); state = E_STATE_WORK; } else { // 其他状态分支,边界转向、返航等 state = E_STATE_IDLE; } } }

实现时我发现一个问题:51单片机中断里调用函数要非常小心,特别是ADC读取函数里用到了while等待EOC,如果这个函数被中断打断或者因为总线上其他操作被拖延,可能卡住整个程序。我的建议是ADC采样不要放在定时器中断里面做,放在主循环里轮询就够了。谷物翻晒机器人又不是做高精度电流环控制,几十毫秒的采样延迟完全不影响。

5. 仿真通过后,实物移植时的三个坑

5.1 供电差异:仿真里一个5V源,实物要分数字电源和电机电源

仿真阶段整块板子用一路5V电压源供电,电机模型电流小得可以忽略,一切看起来都很美好。但真正拿起烙铁焊接实物之后,第一课就是:电机启动瞬间的电流冲击,会把电源电压瞬间拉低,单片机和数码管直接掉电重启。

我踩过这个坑之后学乖了:实物电源要做分流处理。太阳能板的输出先经过充电管理给锂电池充电,锂电池输出分两路,一路通过低压差线性稳压器(如AMS1117-5.0)给单片机、传感器、ADC供电;另一路直接给电机驱动芯片供电。两路电源的地必须共地,但电源线在PCB布局上要尽量分开,避免电机的大电流回路干扰MCU电源。

5.2 传感器差异:仿真里信号干净,实物里噪声缠身

Proteus里的传感器信号都是理想信号,电压切换干净利落,ADC读到的数值非常稳定。实物里完全是另一个世界:雨滴传感器的输出会缓慢漂移,光敏电阻的阻值受温度影响,电机转动时的电磁干扰会被ADC0809采集到,数据上下跳个不停。

解决办法不复杂:一是ADC采样值配合多次采样取平均,我一般连续读8次丢掉最大最小再取平均;二是传感器到单片机之间的走线尽量短,使用屏蔽线或者双绞线;三是电机驱动芯片的电源引脚旁边加电解电容和104瓷片电容,吸收换向噪声。这三个手段做下来,大部分干扰都能压住。

5.3 机械结构不能照搬仿真的“成功画面”

仿真里电机一通电,机器人就能“走”,但仿真不会告诉你:真实的旋转耙齿扎进厚重的谷堆里,阻力会让减速电机转速掉一大截,甚至卡死。所以实物调试时一定要留一个手动调速的电位器,现场调整翻晒电机的PWM占空比,找到既能翻得动谷粒、又不会把谷粒甩飞的那个临界速度。

另外,晒场地面不可能绝对平整,机器人的两个驱动轮如果出现打滑,就会走偏,边界检测开关可能永远触发不了。我的折中方案是不追求高精度直线行走,而是采用“定时转向+边界优先”的模式:默认走直线,如果边界开关没触发但已经连续走了设定时间,也强制执行一次转向。这个兜底逻辑在实物上极其好用,强烈建议加进程序。

6. 从课设到能下地的机器:还能往哪些方向扩展

做完基础版本之后,其实可以往三个方向加东西,复杂度依次增加,但每一个都很适合写进毕业论文或者竞赛作品里。

第一个方向是太阳能板追光。在机器人的太阳能板两侧各放一个光敏电阻,比较两边的光强差值,差值超过死区就启动一个舵机调整太阳能板的角度,让光伏板始终大致正对太阳。这个功能完全可以在Proteus里仿真验证,因为核心逻辑还是ADC读取和PWM输出,不需要新增硬件模型。

第二个方向是手动设定翻晒路径。目前的边界检测逻辑只能让机器人走直线返回到晒场边缘,没法高效覆盖整个矩形晒场。改进思路是给机器人加一个编码器测距轮,记录每次直线行走的距离,配合电磁循迹或者灰度传感器识别晒场四周的标记线,实现“弓”字形路径遍历。这个方案的难点在路径规划算法,51单片机内存够不够、计算速度跟不跟得上,都需要仔细评估。

第三个方向是远程监控。通过串口加ESP8266 WiFi模块,把机器人的工作状态、当前光强、雨滴值、电池电压定时推送到手机端,用户不用蹲在晒场守着,手机上就能看到机器人在干嘛。做这个扩展时,Proteus里可以先把串口通信和AT指令逻辑跑通,ESP8266部分再用真实模块联调。这对提高项目的“完整度”帮助极大,答辩时也更有亮点。

我实际做完这一套之后最大的感触是:谷物翻晒机器人的技术门槛其实不高,真正的难点在于把“太阳能供电”“传感器判断”“电机控制”三个领域咬合在一起。分开看每一块都是51单片机课设里最基础的知识点,但合起来就是一个完整的小系统工程。如果你也在做类似的课设,建议不要一上来就写代码、画电路,先用一张纸把状态机和模块接口画清楚,这一步做好了,后面至少能省一半的调试时间。最后再分享一个小技巧:Proteus仿真的时候,可以在每个传感器输出端临时加一个探针或者LED,实时观察信号电平变化。项目做完删掉就行,但调试那几天它真的能救命。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 1:28:21

DRV8818+PIC18F47K40工业级步进电机控制方案

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

作者头像 李华
网站建设 2026/10/3 1:28:21

数字孪生智能工厂落地指南:四层架构、MES+ERP集成与避坑实践

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

作者头像 李华
网站建设 2026/10/3 1:27:47

PMIC电源管理芯片选型与设计实战:从功耗分析到Layout落地

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

作者头像 李华
网站建设 2026/10/3 1:27:02

磷酸化蛋白组学实操指南:从TiO₂富集到DIA定量的可信数据生成

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

作者头像 李华
网站建设 2026/10/3 1:26:00

弹性定位导航授时参考架构落地:多源融合与干扰演练

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

作者头像 李华
网站建设 2026/10/3 1:26:00

Pcileech:基于PCIe DMA的硬件级内存观测技术

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

作者头像 李华