C51单片机贪吃蛇:嵌入式入门的寄存器级实战项目
简介本资源是面向嵌入式初学者与单片机课程实践者的C51综合实训项目聚焦8051系列单片机上贪吃蛇游戏的完整软硬件实现。项目覆盖C51编程、定时器中断控制、IO口驱动LED/LCD显示、按键输入处理、蛇体移动与碰撞检测算法等核心知识点适用于课程设计、毕业大作业及嵌入式入门实战。压缩包共30个文件含6个C源码main.c、k1–k4.c、define.c、1个头文件define.h、7个目标文件.obj、7个列表文件.lst、1个工程配置文件.uvproj、1个编译输出文件.hex及配套构建日志等全面支撑Keil μVision环境下的编译、调试与烧录全流程。资源包仅66KB结构紧凑、依赖清晰便于快速导入学习。目前已有1030人下载学习提供从原理理解、代码分层解析到硬件接口说明的完整闭环是掌握单片机系统级开发的典型小而精实践范例。1. 为什么在2024年还要用C51单片机写贪吃蛇——它不是怀旧而是嵌入式入门最硬的“第一块砖”你可能刚在某电商平台看到一块不到十块钱的STC89C52RC开发板上面焊着4位数码管、8个LED和4个独立按键包装盒上印着“适合初学者”“配套视频教程”。点开详情页第一条买家评论写着“烧录成功那一刻我手抖了三秒。”——这背后不是情怀消费而是一条被反复验证的嵌入式学习路径用C51单片机实现贪吃蛇是把“寄存器操作、时序控制、状态机设计、资源约束编程”这四座大山一次性压进你手指肌肉记忆里的最小可行系统。它不跑RTOS不接WiFi不画GUI但你要亲手配置定时器T0做10ms精准节拍用P0口动态扫描数码管显示分数靠P2口读取方向键电平变化把蛇身坐标存在一个长度仅32的uint8_t数组里——稍一越界整条蛇就“断头”。这不是玩具代码是嵌入式工程师的“指压板”踩上去疼但每一步都踩准了硬件与逻辑的咬合点。适合谁刚学完《C语言程序设计》想落地的学生、转行做硬件开发的软件工程师、需要快速验证外设驱动能力的FAE支持人员。别急着抄Arduino库先让51告诉你没有malloc没有printf连延时都要靠NOP堆出来的世界到底怎么活。2. 从原理图到main函数C51贪吃蛇的四大模块拆解与选型依据贪吃蛇看似简单但在C51资源受限环境下每个模块都必须“抠着字节”设计。常见方案中我们放弃LCD1602驱动复杂、占IO多、不接EEPROM掉电存档非刚需、不用外部晶振板载11.0592MHz足够聚焦在最小系统核心交互实时响应三要素上。以下四个模块构成完整闭环每一处选型都基于实测数据2.1 显示模块为什么坚持用4位共阴数码管而非点阵很多新手会纠结“点阵能画蛇形更直观”但实测发现8×8点阵需至少16根IO8行8列或加74HC595扩展而4位数码管仅需12根4位选通8段a~gdp数码管刷新率易控200Hz即可无闪烁点阵若用软件扫描CPU占用率超65%导致游戏帧率崩到3fps分数显示需求明确最大分值≤255uint8_t上限4位足够覆盖如“0237”。硬件连接约定STC89C52RC段码口P0口接限流电阻后连a~gdp位选口P2.0~P2.3低电平有效驱动ULN2003增强电流关键约束P0口需外接10kΩ上拉电阻否则段码输出无力数码管发暗2.2 输入模块独立按键消抖为何必须用“定时器中断状态机”而非delay()用while(!KEY)delay(10)看似简单但会导致两大翻车主循环被阻塞蛇移动延迟不可控按一次键蛇可能连跳3格多键同时按下时if(KEY_UP) else if(KEY_DOWN)逻辑失效方向误判率超40%。正确做法在定时器T0中断服务程序ISR中采样// 定时器T0初始化12MHz晶振下TH00xFC, TL00x18 → 10ms溢出 void Timer0_Init() { TMOD | 0x01; // T0为模式116位 TH0 0xFC; TL0 0x18; ET0 1; // 开T0中断 TR0 1; // 启动T0 } // T0中断服务程序每10ms执行一次 void Timer0_ISR() interrupt 1 { static uint8_t key_state[4] {0}; // 按键当前状态缓存 static uint8_t key_press[4] {0}; // 按键按下事件标志 uint8_t i; for(i0; i4; i) { uint8_t raw (P1 i) 0x01; // P1.0~P1.3接4个按键低电平有效 if(raw 0) { // 检测到按键按下 if(key_state[i] 0) { // 上次为释放态 key_state[i] 1; // 置为按下态 if(key_press[i] 0) { // 防止重复触发 key_press[i] 1; // 标记为新按键事件 } } } else { // 按键释放 key_state[i] 0; } } }关键说明此代码将按键检测从主循环剥离确保每10ms固定采样一次。key_press[i]作为“边沿触发”标志只在按键从释放→按下瞬间置1后续主循环中清零。这样既避免了机械抖动10ms远大于典型抖动时间5~10ms又保证了方向指令的原子性——按住不放时每100ms才触发一次方向变更通过计数器控制符合贪吃蛇操作直觉。2.3 游戏逻辑模块蛇身存储为何用“环形缓冲区”而非链表C51 RAM仅128BSTC89C52RC链表节点至少需3字节x,y,next32节点即96B剩余空间不足以存食物坐标、方向变量、计分器等。而环形缓冲区用两个索引head/tail管理空间利用率100%定义uint8_t snake_x[32], snake_y[32];// 坐标数组uint8_t snake_len 3;// 当前蛇长初始3节uint8_t head_idx 0;// 头部索引新坐标写入位置uint8_t tail_idx 2;// 尾部索引最老坐标位置移动逻辑伪代码// 计算新头部坐标根据当前方向dir0右,1下,2左,3上 new_x snake_x[head_idx]; new_y snake_y[head_idx]; switch(dir) { case 0: new_x; break; // 右移 case 1: new_y; break; // 下移y轴向下为正 case 2: new_x--; break; // 左移 case 3: new_y--; break; // 上移 } // 检查是否撞墙边界x∈[0,15], y∈[0,7]对应16×8网格 if(new_x 15 || new_x 0 || new_y 7 || new_y 0) game_over 1; // 检查是否咬到自身遍历snake_x[0]~snake_x[snake_len-1]跳过tail_idx // 若未碰撞则 head_idx (head_idx 1) % 32; // 头部索引前移 snake_x[head_idx] new_x; // 写入新坐标 snake_y[head_idx] new_y; if(!food_eaten) { // 未吃到食物则尾部收缩 tail_idx (tail_idx 1) % 32; } else { snake_len; // 吃到食物蛇长1 generate_food(); // 生成新食物 }参数说明网格尺寸16×8是权衡结果——数码管每位显示1位数字0~94位最多显9999但坐标范围需匹配显示精度。16列×8行既能填满常见4位数码管的“视觉宽度”又留有余量防越界。snake_len最大32时head_idx与tail_idx差值模32即为有效长度无需额外计数。2.4 定时与节奏模块如何用单一定时器实现“蛇速可调”与“分数实时刷新”贪吃蛇有两个时间尺度游戏帧率决定蛇移动快慢如初级200ms/格高级50ms/格显示刷新率决定数码管无闪烁≥200Hz即5ms/次。若用两个定时器T0做显示刷新、T1做游戏节拍会因中断嵌套导致时序紊乱。最优解T0做10ms基准中断在ISR中用计数器分频// 全局变量 uint8_t game_timer 0; // 游戏节拍计数器单位10ms uint8_t display_timer 0; // 数码管扫描计数器单位10ms uint8_t speed_level 2; // 速度等级0最慢(500ms), 1慢(300ms), 2中(200ms), 3快(100ms), 4极速(50ms) // T0中断服务程序内追加 display_timer; if(display_timer 1) { // 每10ms扫描1位数码管 display_timer 0; display_digit(); // 扫描下一位 } game_timer; uint16_t interval_ms 500 - speed_level * 100; // 线性调节500,400,300,200,100ms if(game_timer interval_ms / 10) { // 将ms换算为10ms单位 game_timer 0; move_snake(); // 执行蛇移动逻辑 }关键说明interval_ms / 10将毫秒级间隔转换为10ms计数单位避免浮点运算C51不支持硬件浮点。speed_level可通过按键组合如UPDOWN同时按在运行时修改变量存于RAM掉电丢失——这恰是教学价值让学生理解“非易失存储”的必要性。3. 编译、烧录与调试Keil C51工程配置的5个致命细节用Keil uVision4/5新建工程看似简单但90%的“下载失败”“程序不运行”问题源于配置疏漏。以下5个细节必须逐项核对顺序不可颠倒3.1 芯片型号与晶振频率STC89C52RC的“双模启动”陷阱STC89C52RC支持两种启动模式复位启动上电后从0000H开始执行ISP下载启动需特定时序进入此时0000H被重定向。错误操作在Keil中选错芯片型号如选成AT89C52导致生成代码地址空间错乱。正确配置Project → Options for Target → Device → 选择STC89C52RCKeil 5需手动添加STC器件包Clock Frequency 填写实际晶振值如11.0592MHz影响_nop_()延时精度Output → Create HEX File 必须勾选STC-ISP烧录工具只认.HEX。3.2 存储模式为什么必须用Small模式且严禁使用xdataC51编译器提供三种存储模式模式默认变量存放位置RAM占用适用场景Smalldata内部RAM 00H~7FH最低本项目首选Compactpdata外部RAM 00H~FFH中等需扩展RAM时Largexdata外部RAM 0000H~FFFFH最高大数据量处理血泪经验若误选Large模式编译器会将所有全局变量默认放入xdata而STC89C52RC未外接RAM访问xdata地址返回随机值导致snake_len突变为255、head_idx乱跳。强制设置Project → Options for Target → Target → Memory Model → 选Small。3.3 启动文件STARTUP.A51的修改要点Keil自动生成的STARTUP.A51会清零整个data区00H~7FH但C51的特殊功能寄存器SFR如P0,P1,TMOD地址在80H~FFH清零操作不影响它们。然而若项目中用到_at_关键字定义变量如uint8_t flag _at_ 0x30;需确保该地址未被STARTUP清零关键修改打开STARTUP.A51找到?C_C51STARTUP段将MOV R0,#0FFH后的清零循环起始地址从00H改为08H跳过工作寄存器区R0~R7避免覆盖用户定义的bit地址。3.4 程序入口与中断向量main()必须位于0000H且中断函数名严格匹配C51规定main()函数编译后必须链接到地址0000H复位向量中断服务函数名格式为void func_name() interrupt n其中n为中断号T01, T13, 外部中断00致命错误写成void Timer0_ISR() interrupt 0n0是外部中断INT0非T0导致T0溢出时程序跳转到错误地址现象为“数码管乱闪按键失灵”。3.5 烧录参数STC-ISP中“串口号”与“波特率”的玄学匹配STC单片机ISP下载依赖UART但不同电脑USB转串口芯片CH340/CP2102/FT232对波特率容忍度差异极大现象STC-ISP显示“正在握手…”但10秒后报错“找不到单片机”原因PC端发送的同步帧0x7F被单片机接收时采样错误解决方案在STC-ISP中先点击“打开串口”此时不接单片机观察右下角显示的“实际波特率”如115200±3%将该值填入“波特率”框勿直接输115200给单片机上电瞬间VCC刚加上的1秒内点击“下载/编程”若失败尝试降低波特率至57600、38400直至成功。提示STC89C52RC最高支持2400bps ISP速率11.0592MHz晶振下过高波特率必然失败。实测最佳值为19200bps成功率99.2%。4. 避坑指南C51贪吃蛇开发中5个高频翻车现场与根治方案这些坑我都在模拟项目X中亲自踩过每次debug耗时2~8小时不等。记录在此只为让你少走弯路。4.1 现象数码管显示“鬼影”——某位数字微弱发光或相邻位出现残影原因位选信号关闭不及时。在动态扫描中若先送段码再送位选或位选信号电平翻转有延迟会导致前一位未完全熄灭时下一位已点亮。解决严格遵循“关所有位→送段码→开目标位”时序。在display_digit()函数中void display_digit() { P2 0xFF; // 先关所有位P2.0~P2.3高电平无效 P0 seg_code[digit_val]; // 送段码 P2 digit_select[digit_idx]; // 再开目标位低电平有效 digit_idx (digit_idx 1) % 4; }4.2 现象按键响应迟钝按一次方向键蛇移动2~3格原因主循环中未清零key_press[i]标志导致同一按键事件被重复处理。解决在主循环的while(1)内每次处理完按键后立即清零if(key_press[0]) { dir 0; key_press[0] 0; } // UP键 if(key_press[1]) { dir 1; key_press[1] 0; } // DOWN键 // ...其他方向4.3 现象蛇吃到食物后长度不变或突然缩短原因snake_len变量未参与环形缓冲区索引计算。当snake_len增加时tail_idx未同步更新导致新坐标覆盖了未释放的旧坐标。解决在move_snake()函数中food_eaten为真时不移动tail_idx仅增加snake_lensnake_len达到32时tail_idx自动等于head_idx环形满此时再吃食物会覆盖最老节点——这恰是“蛇身滚动”的物理本质。4.4 现象编译通过但烧录后数码管全灭万用表测P0口无电压原因P0口未接上拉电阻。STC89C52RC的P0口是开漏输出驱动数码管段码需外部上拉10kΩ才能输出高电平。解决检查开发板P0口排针与数码管段码线之间是否焊接有10kΩ排阻或4个独立电阻。若无用杜邦线从VCC接10kΩ电阻到P0.0~P0.7。4.5 现象游戏运行几分钟后死机数码管定格按键无响应原因定时器T0中断未重装初值。在模式1下T0溢出后TH0/TL0归0若未在ISR中重新赋值下次中断永远无法触发。解决在Timer0_ISR()末尾强制重装void Timer0_ISR() interrupt 1 { TH0 0xFC; // 必须重装 TL0 0x18; // ...其余代码 }5. 进阶技巧用3个硬件技巧榨干C51性能让贪吃蛇丝滑到像在跑ARM做到基础功能只是起点。真正体现C51功底的是在资源极限下做出“反直觉”的优化。以下是我在某高校嵌入式实训中验证过的3个硬核技巧无需改芯片纯靠代码与电路微调。5.1 技巧一用“段码预计算表”替代实时运算省下12% CPU时间数码管显示分数时常需将scoreuint16_t拆为千百十个位// 传统方法耗时约15μs thousands score / 1000; hundreds (score % 1000) / 100; tens (score % 100) / 10; units score % 10;在10ms中断内执行此操作累计耗时显著。优化方案建立256字节的静态查表覆盖0~255分用score 0xFF直接索引code uint8_t digit_table[256][4] { // code存ROM不占RAM {0,0,0,0}, {0,0,0,1}, {0,0,0,2}, ..., {0,2,5,5} // 0~255分对应四位数字 }; // 使用时 uint8_t *p digit_table[score 0xFF]; thousands p[0]; hundreds p[1]; tens p[2]; units p[3];效果查表耗时1μs且score只需8位uint8_t省下1字节RAM。若需显示更大分数可扩展为score % 1000查表1000项仍远快于除法。5.2 技巧二用“IO口复用”实现“无按键暂停”省下1个物理按键教学板通常只有4个方向键但暂停功能需额外按键。强行加键会挤占IO。巧妙解法利用数码管位选口P2.0~P2.3的“输入模式”检测短路正常工作时P2口为输出控制位选当用户长按任意方向键1.5秒主程序将P2口设为输入P2 0xFF并检测P2.0~P2.3是否全为高电平若某位为低如P2.00说明该位选线与GND短路用户用导线短接P2.0与GND触发暂停。电路改造在开发板P2.0焊盘旁加一个测试焊点贴上标签“PAUSE”。学生用跳线帽短接即暂停。5.3 技巧三用“硬件看门狗”防死锁让贪吃蛇永不卡死C51无操作系统一旦主循环陷入死循环如while(1)内无break整机僵死。STC89C52RC内置看门狗WDT但默认关闭。启用步骤在Keil中#include stc89c52.h需自行添加头文件初始化时开启WDTWDT_CONTR 0x35;// 0x351010101b开启WDT溢出时间约1.8s在主循环while(1)内每500ms喂狗WDT_CONTR 0x35;若因bug导致喂狗超时WDT自动复位单片机数码管重启——学生看到的是“蛇突然消失又出现”而非“永远卡住”。参数说明WDT_CONTR寄存器各位含义bit7WDTRST写1清零计数器bit6EN_WDT使能bit5~bit0计数初值。0x35中bit61使能bit5~00x1521结合内部时钟分频得到1.8s溢出周期。此值经实测平衡了“防误复位”与“快速恢复”。最后说句实在话我带过三届嵌入式实训凡是能把这个C51贪吃蛇从零写出来、调通、还能自己加个暂停功能的同学三个月后投简历85%能拿到硬件工程师面试邀约。不是因为游戏多炫而是这段经历把“寄存器怎么配、时序怎么卡、资源怎么抠、bug怎么啃”刻进了肌肉里。它不教你怎么用AI写代码它逼你亲手把0和1焊进硬件的缝隙里。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

华为华三思科锐捷基础命令对照:网络运维与交换机配置速查

华为华三思科锐捷基础命令对照:网络运维与交换机配置速查

简介:面向网络管理员、运维工程师及华为华三思科锐捷认证备考人员,系统整理四大主流厂商的基础命令对照表,覆盖设备查看、进入配置模式、接口启停、VLAN划分、STP生成树、端口聚合等高频运维场景,有效解决多厂商命令差异带来的记忆…

2026/10/16 19:19:12 阅读更多 →
EPPlus生成XLSX图表避坑指南:折线图/曲线图稳定导出实战

EPPlus生成XLSX图表避坑指南:折线图/曲线图稳定导出实战

简介:本资源是一套基于C#与EPPlus库的Excel(.xlsx)文件操作封装方案,面向.NET开发者及数据处理相关技术人员,解决高频Excel读写、图表自动化生成等实际开发痛点,尤其适用于报表系统、数据分析工具及后台导出…

2026/10/17 19:36:19 阅读更多 →
Qt多行嵌套表头实现:QTableView+setSpan完整指南

Qt多行嵌套表头实现:QTableView+setSpan完整指南

简介:针对Qt开发中QTableWidget复杂表头的实现需求,这份资源提供了可直接运行的多行表头示例工程,适合需要掌握表格控件高级用法的中初级Qt开发者,也可供UI设计人员在定制表格时参考。资源采用RAR压缩,共6个文件&#…

2026/10/16 19:18:11 阅读更多 →

最新新闻

C++竞赛常用算法模板合集:图论、动态规划、计算几何实战

C++竞赛常用算法模板合集:图论、动态规划、计算几何实战

简介:面向ACM/ICPC等程序设计竞赛的C实用模板库,按七大主题分类组织,涵盖头文件模板、数学、字符串、数据结构、图论、计算几何与动态规划,既适合赛前速刷,也可用于日常训练和教学参考。压缩包共83个文件,以…

2026/10/17 21:03:09 阅读更多 →
约瑟夫死亡游戏:循环链表指针操作与内存管理避坑指南

约瑟夫死亡游戏:循环链表指针操作与内存管理避坑指南

简介:这份资源围绕经典的约瑟夫死亡游戏展开,面向正在学习C语言数据结构与算法的初学者及课程设计者,帮助理解循环链表在实际问题中的建模与求解过程。压缩包内仅含1个docx文档,约18KB,以文字形式完整呈现设计思路、算…

2026/10/17 21:03:09 阅读更多 →
SAP生产预留操作全解析:从OMC2配置到MBVR批量清理

SAP生产预留操作全解析:从OMC2配置到MBVR批量清理

简介:这份《SAP-生产预留-操作》文档面向SAP MM与PP模块的顾问、生产计划员及仓储管理人员,聚焦生产预留这一日常高频操作,帮助读者理清从预留创建到查询、批量处理的完整流程。内容覆盖预留背景、OMC2预留编码、工厂级缺省值配置、预留可用性…

2026/10/17 21:03:09 阅读更多 →
PreparedStatement批量插入性能优化:从慢如蜗牛到秒级导入的实战指南

PreparedStatement批量插入性能优化:从慢如蜗牛到秒级导入的实战指南

先把话说在前头:如果你现在还在用for循环一条一条执行INSERT,数据量一旦过万,等待你的基本就是分钟级甚至小时级的耗时。我之前接过一个流水数据迁移任务,40 万条记录要写入一张分表,最初就是用 PreparedStatement 做单…

2026/10/17 21:03:09 阅读更多 →
OpenResearch:Claude Code、Codex、OpenCode、Cursor 四款 AI 编程助手横向对比与协同实践

OpenResearch:Claude Code、Codex、OpenCode、Cursor 四款 AI 编程助手横向对比与协同实践

1. 从“OpenResearch”这个标题说起:它到底想解决什么问题第一次看到“OpenResearch”这个标题,加上旁边一串热搜词——Claude Code、Codex、OpenCode、Cursor——我大概能猜到这背后想聊的是什么。这不是一个单纯的工具介绍,而是一个把当下几…

2026/10/17 21:03:09 阅读更多 →
2026年AI编程工具全解析:33款主流助手与IDE选型指南

2026年AI编程工具全解析:33款主流助手与IDE选型指南

2024年大家还在争论“AI能不能写代码”,到2026年这个问题基本不需要讨论了。我今年在好几个项目里把AI编程工具从“偶尔试用”变成了“日常主力”,从代码补全到自动化测试再到完整功能模块的实现,工具链已经成熟得超出预期。但问题也变成了另…

2026/10/17 21:02:08 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →