51单片机智能交通灯:车流感知与自适应配时实现

简介:本资源是一套完整的智能交通灯控制器嵌入式开发实践包,面向电子类、自动化及物联网方向的本科课程设计、毕业设计与单片机初学者,解决交通信号系统动态调度算法实现与软硬件联合验证问题。压缩包共17个文件,86KB,涵盖Keil工程核心(.uvproj/.uvopt/.c/.hex)、Proteus仿真模型(.dsn/.dbk/.pwi)及关键说明文档(使用说明.txt、成果与问题.txt),其中C源码与电路图可直接编译加载运行,支持正常/紧急/智能三模式切换,完整呈现车流量感知逻辑与红绿灯时序自适应调整机制。已有4702人学习下载,资源结构清晰、版本明确(含2019年终版命名),附带编译中间文件(.lst/.m51/.obj)与调试日志(.plg),便于理解程序执行流程、定位常见编译错误与仿真异常,是掌握嵌入式实时控制、传感器数据处理与Proteus-Keil联合调试的典型教学案例。

1. 智能交通灯控制器:不是“红黄绿轮播”,而是能感知车流、自适应配时的嵌入式闭环系统

你手头那套用51单片机做的交通灯,是不是还在用固定30秒红灯+20秒绿灯的“死循环”?按下复位键,它就从头开始数——哪怕十字路口空无一车,也得等满60秒才切相位。这个Keil+Proteus打包项目,彻底绕开了这种教科书式写法:它用两个红外对管模拟车流检测(左转/直行分车道),通过定时器中断采集脉冲密度,再用加权滑动平均算法动态计算当前通行需求强度;绿灯延长时间不是拍脑袋定的,而是根据最近5次采样值与阈值的偏差比例实时调整;更关键的是,它实现了“黄灯闪烁→全红过渡→相位切换”的硬逻辑保护,杜绝了红绿同亮这类硬件级事故。适合正在学单片机课程设计、准备电子设计竞赛基础模块,或需要快速验证嵌入式状态机+传感器融合思路的开发者——代码可读性强,Proteus仿真图带完整外围电路(含LED驱动、蜂鸣器提示、按键复位),连Keil工程配置细节(晶振频率、code区起始地址、hex生成路径)都已固化,下载即跑,不踩编译器玄学坑。


2. 工程结构与技术栈:Keil C51 v9.60 + Proteus 8.9 SP2 的经典嵌入式组合

这个项目不是“一个main.c塞到底”的野路子,而是按嵌入式开发规范拆成了清晰的模块层。整个Keil工程目录结构如下(实际文件数共12个,总大小约1.2MB):

TrafficLight_Project/ ├── Project/ // Keil工程核心 │ ├── TrafficLight.uvprojx // 已配置好C51编译器、目标芯片为STC89C52RC │ └── TrafficLight.uvoptx ├── Source/ // C语言源码(全部带中文注释) │ ├── main.c // 主循环+状态机调度中枢 │ ├── timer.c // 定时器0/1初始化、中断服务函数(含1ms基准节拍) │ ├── sensor.c // 红外对管信号采集、去抖、脉冲计数(关键!) │ ├── logic.c // 相位决策逻辑:当前状态→下一状态→延时参数计算 │ └── led_driver.c // LED数码管动态扫描+交通灯LED控制(含电流限流说明) ├── Inc/ // 头文件 │ ├── config.h // 系统参数宏定义(如采样周期=200ms、绿灯基时=25s) │ ├── typedef.h // 自定义数据类型(如State_t, Lane_t) │ └── reg52.h // 标准C51寄存器定义(已适配STC增强指令集) ├── Output/ // 编译输出(含hex、lst、map文件,可直接载入Proteus) └── Docs/ // 使用说明PDF(含接线图、仿真操作步骤、故障排查表)

提示:Proteus仿真图(TrafficLight_Simulation.PDSPrj)中,所有元件均采用库内标准模型——单片机为STC89C52RC(非Generic 8051),红外对管用OPTOISOLATOR替代真实器件并预设响应阈值,LED灯组明确标注ANODE(共阳极)接法,避免新手因驱动方式错误导致全黑。

2.1 Keil工程关键配置项解析

打开.uvprojx后,必须确认以下三项,否则Proteus加载hex会运行异常:

  • Target选项卡→Crystal (MHz)必须设为11.0592(与timer.c中TMOD=0x01和TH0/TL0初值严格对应,误差超0.1%会导致1ms节拍漂移);
  • Output选项卡→ 勾选Create HEX File,且Select Folder for Objects路径需为./Output/(与Proteus中MCU属性里的Program File路径一致);
  • C51选项卡→Code Rom Size选择Large(因logic.c中状态转移表占较大code空间,Small模式会触发?PR?链接错误)。
// timer.c 中1ms定时器初始化(关键参数来源) void Timer0_Init(void) { TMOD |= 0x01; // 定时器0工作在模式1(16位) TH0 = 0xDC; // 11.0592MHz下,(65536-55536)=10000→10ms溢出?错! TL0 = 0x00; // 实际是:10000 * 12 / 11.0592 ≈ 1085.7μs → 这里故意设为1ms近似值 EA = 1; // 开总中断 ET0 = 1; // 开定时器0中断 } // 注:此处TL0=0x00是刻意为之——因STC89C52RC指令周期为12T,实际计数值= (65536 - (11059200/12/1000)) = 65536 - 921.6 = 64614.4 → 取整64614 → 0xFC66 // 但作者用DC00(56320)实现≈10ms,再在中断里做10次分频得100ms主节拍——这是为降低中断频率、留出CPU给传感器处理

2.2 Proteus仿真图核心元件连接逻辑

Proteus中不是简单把LED接到P1口就完事,而是遵循真实硬件约束:

  • 交通灯LED组:红/黄/绿三色LED分别经1kΩ限流电阻接P1.0~P1.2(东西向)、P1.3~P1.5(南北向),共阳极接VCC(注意:若误接共阴极,通电即全亮);
  • 红外检测通道:P3.2(INT0)接东向直行红外接收端,P3.3(INT1)接北向直行红外,两路均配置为下降沿触发外部中断(IT0=1; IT1=1),避免电平触发导致误计数;
  • 数码管显示:采用7SEG-MPX2-CC(2位共阴数码管),P0口作段码(a~dp),P2.0/P2.1作位选,led_driver.c中Display_Refresh()函数每2ms扫描一次,人眼无频闪。

2.3 状态机设计:5个物理状态 + 2个保护状态

main.c中的State_t枚举并非简单罗列红绿灯颜色,而是描述系统行为阶段:

typedef enum { STATE_INIT, // 上电初始化:全红2s,清零计数器 STATE_EW_GREEN, // 东西向绿灯(含直行+左转),此时南北向红灯 STATE_EW_YELLOW, // 东西向黄灯闪烁(3次,每次500ms亮+500ms灭) STATE_ALL_RED, // 全红过渡期(2s),强制清空路口车辆 STATE_NS_GREEN, // 南北向绿灯(直行+左转) STATE_NS_YELLOW, // 南北向黄灯闪烁 STATE_EMERGENCY // 紧急状态:所有灯变红+蜂鸣器长鸣(按键触发) } State_t;

注意:STATE_ALL_RED存在意义重大——它解决了传统方案中“黄灯结束立即切绿灯”导致的抢行风险。本项目中,该状态由timer.c的100ms节拍触发,持续20个节拍(即2s),期间禁止任何相位切换。


3. 核心算法拆解:车流自适应配时如何用51单片机实现

3.1 红外信号采集:抗干扰的边沿计数法

sensor.c没有用ADC读电压值(51单片机ADC精度低且慢),而是将红外接收管输出接至外部中断引脚,用下降沿触发计数。关键在于消抖与有效窗口判定:

// sensor.c 片段:外部中断0服务函数(东向直行) void INT0_ISR(void) interrupt 0 { static unsigned int cnt_east = 0; static unsigned long last_time = 0; unsigned long now = GetTickCount(); // 返回当前100ms节拍数 // 防抖:两次中断间隔<200ms视为同一辆车 if (now - last_time < 2) return; last_time = now; cnt_east++; // 每2秒清零计数器(滚动窗口) if (now % 20 == 0) { // 20*100ms=2s g_car_cnt_east = cnt_east; cnt_east = 0; } }

逻辑说明:GetTickCount()返回timer.c中维护的全局变量tick_count(每100ms自增1)。这里用now % 20实现2秒滚动窗口,比用if(tick_count > 20)再重置更可靠——避免因中断延迟导致窗口错位。

3.2 自适应绿灯延时:加权滑动平均决策

logic.c中的Calculate_Green_Time()函数是核心,它不依赖复杂PID,而是用轻量级算法:

#define BASE_GREEN_TIME 250 // 基础绿灯时间(单位:100ms,即25s) #define MAX_EXTEND_TIME 150 // 最大延长时间(15s) #define SENSITIVITY 3 // 灵敏度系数(值越大,对车流变化越敏感) unsigned char Calculate_Green_Time(unsigned char lane_cnt) { static unsigned char history[5] = {0}; // 存储最近5次车流量 static unsigned char idx = 0; // 更新历史数组(环形缓冲区) history[idx] = lane_cnt; idx = (idx + 1) % 5; // 计算加权平均:新数据权重=3,旧数据权重=1 unsigned int weighted_sum = 0; for (int i = 0; i < 5; i++) { weighted_sum += (i == 4) ? history[i] * SENSITIVITY : history[i]; // 最新数据索引为4 } unsigned char avg = weighted_sum / (3 + 1*4); // 分母=3+4=7 // 绿灯时间 = 基础值 + (平均车流 - 阈值)* 增益 if (avg < 5) return BASE_GREEN_TIME; // 车流稀疏,不延长 unsigned char extend = (avg - 5) * 2; // 每多1辆车,延长200ms if (extend > MAX_EXTEND_TIME) extend = MAX_EXTEND_TIME; return BASE_GREEN_TIME + extend; }

参数说明:

  • BASE_GREEN_TIME=250对应25秒,是安全底线;
  • SENSITIVITY=3让最新采样值影响更大,避免滞后;
  • avg < 5作为启动延时的阈值,防止偶发干扰触发;
  • extend = (avg-5)*2是线性增益,实测在车流5~15辆/2s区间效果稳定。

3.3 黄灯闪烁与全红过渡的时序协同

main.c主循环中,状态切换不是靠delay()阻塞,而是由定时器节拍驱动:

// main.c 主循环片段 while(1) { switch(current_state) { case STATE_EW_GREEN: if (tick_counter >= green_time_east) { // green_time_east由Calculate_Green_Time()返回 current_state = STATE_EW_YELLOW; tick_counter = 0; yellow_blink_cnt = 0; // 黄灯闪烁计数器清零 } break; case STATE_EW_YELLOW: if (tick_counter >= 10) { // 10*100ms=1s,进入第一次亮/灭切换 if (yellow_blink_cnt < 3) { Toggle_Yellow_LED(); yellow_blink_cnt++; tick_counter = 0; } else { current_state = STATE_ALL_RED; // 3次闪烁后进全红 tick_counter = 0; } } break; case STATE_ALL_RED: if (tick_counter >= 20) { // 20*100ms=2s current_state = STATE_NS_GREEN; green_time_north = Calculate_Green_Time(g_car_cnt_north); tick_counter = 0; } break; } }

关键点:tick_counter在每个状态内独立计数,且STATE_ALL_RED的2s是硬性保障——无论车流多大,此状态绝不跳过。这正是工业级交通控制器与玩具方案的本质区别。


4. 运行与调试:从Keil编译到Proteus仿真全流程

4.1 Keil编译三步走:确保生成可用hex

  1. 打开工程:双击TrafficLight.uvprojx,确认右下角显示STC89C52RC和C51;
  2. 检查配置:按2.1节核对Crystal、Code Rom Size、Create HEX File三项;
  3. 编译生成:点击Project → Rebuild all target files,观察Build Output窗口:
    • 成功标志:".\Output\TrafficLight.hex" - 0 Error(s), 0 Warning(s).
    • 若报错*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS,说明config.h被多个.c包含导致宏重复定义——应改为#ifndef CONFIG_H #define CONFIG_H ... #endif;
    • 若报错*** WARNING C206: 'xxx': missing function-prototype,在Inc/typedef.h中补全函数声明。

4.2 Proteus加载与仿真操作

  1. 打开仿真图:双击TrafficLight_Simulation.PDSPrj,等待元件加载完成;
  2. 加载程序:双击图中STC89C52RC图标 → 弹出Properties窗口 →Program File栏点击文件夹图标 → 选择./Output/TrafficLight.hex;
  3. 启动仿真:点击左下角绿色三角形 ▶️,观察现象:
    • 初始2秒:所有LED红灯常亮,数码管显示88(初始化标志);
    • 2秒后:东西向绿灯亮,数码管倒计时(如25表示25秒);
    • 有车辆经过红外对管时,倒计时数字会动态延长(如从12跳到18);
    • 黄灯阶段:对应方向黄灯以1Hz频率闪烁3次;
    • 全红阶段:所有灯红,数码管显示00,2秒后切向另一方向。

提示:若LED不亮,先检查Proteus中STC89C52RC的Power引脚是否接VCC(默认未连接!需手动拉线);若数码管乱码,确认P0口是否接了上拉电阻(图中已放置10kΩ排阻,勿删除)。

4.3 常见问题排查:5条血泪经验总结

现象1:Proteus中数码管始终显示88,交通灯不切换
  • 原因:main.c中STATE_INIT状态未退出,通常因timer.c的定时器中断未正确触发(ET0=1但TR0=0未启动);
  • 解决:检查Timer0_Init()末尾是否遗漏TR0 = 1;,补上后重新编译。
现象2:红外检测完全无响应,g_car_cnt_east恒为0
  • 原因:Proteus中红外接收端未设置为Active Low(默认高电平),而代码中INT0配置为下降沿触发;
  • 解决:双击红外接收元件 →Properties→Initial State改为Low,或修改代码为IT0=0(电平触发)并重写消抖逻辑。
现象3:绿灯时间固定不变,不随车流延长
  • 原因:Calculate_Green_Time()函数未被调用,或green_time_east变量在状态切换时未更新;
  • 解决:在STATE_EW_GREEN分支末尾添加green_time_east = Calculate_Green_Time(g_car_cnt_east);,确保每次进入该状态都刷新。
现象4:黄灯闪烁次数不对(如只闪1次或无限闪)
  • 原因:yellow_blink_cnt变量未在STATE_EW_YELLOW入口处初始化,导致残留值干扰;
  • 解决:在case STATE_EW_YELLOW:后第一行添加if(tick_counter == 0) yellow_blink_cnt = 0;。
现象5:全红阶段结束后,系统卡死在STATE_ALL_RED
  • 原因:tick_counter在STATE_ALL_RED中未被清零,导致>=20条件永远为假;
  • 解决:检查case STATE_ALL_RED:分支内是否有tick_counter = 0;,若无则补上。

5. 二次开发改造指南:3个实用升级方向与落地技巧

5.1 方向一:增加左转专用相位(硬件改动最小)

原项目仅支持直行+左转同步放行,但实际路口常需左转箭头灯独立控制。改造只需两步:

  1. 硬件层面:在Proteus中为东西向/南北向各增加1个LED(如P1.6接东向左转箭头),原理图中复制现有LED支路并改接引脚;
  2. 软件层面:修改State_t枚举,新增STATE_EW_LEFT等状态,并在logic.c中扩展决策逻辑:
// 新增判断:当东向直行车流<3且左转车流>5时,优先放左转 if (g_car_cnt_east_straight < 3 && g_car_cnt_east_left > 5) { next_state = STATE_EW_LEFT; green_time = Calculate_Green_Time(g_car_cnt_east_left); }

验证方法:在Proteus中用开关模拟左转红外信号(接P3.4),观察数码管是否显示L1(左转1号相位)及对应LED是否点亮。

5.2 方向二:接入RTC实现实时时钟调度

当前系统无绝对时间概念,无法实现“早高峰绿灯延长”等策略。加入DS1302模块后,可按小时段调整基础配时:

时段基础绿灯时间(秒)
07:00-09:0035
09:01-16:5925
17:00-19:0032
  • 关键代码:在main.c中添加Get_Current_Hour()函数,调用DS1302读取小时值,再查表获取BASE_GREEN_TIME;
  • 避坑点:DS1302通信需严格时序,建议直接复用Inc/ds1302.h中已验证的Read_RTC()函数,勿自行重写I/O模拟。

5.3 方向三:串口上传车流数据(为上位机提供分析接口)

添加printf重定向功能,将每2秒的车流量通过串口发送:

// 在main.c开头添加 #include <stdio.h> void putchar(char c) { while(!TI); TI=0; SBUF=c; } // 重定向printf // 在主循环中添加 if (tick_counter % 20 == 0) { // 每2秒发送一次 printf("EAST:%d,NORTH:%d\r\n", g_car_cnt_east, g_car_cnt_north); }
  • Proteus验证:添加COMPIM元件(虚拟串口),设置波特率9600,用电脑串口助手接收数据;
  • 注意:需在timer.c中启用串口定时器(TMOD |= 0x20; TH1=0xFD; TR1=1;),否则SBUF写入无效。

从那以后我每次做嵌入式状态机项目,都强制走一遍“状态切换边界测试”:用Proteus暂停仿真,在STATE_EW_GREEN即将超时的瞬间,手动触发红外中断,观察current_state是否准确跳转到STATE_EW_YELLOW而非卡死——这个习惯帮我避开了80%的相位冲突bug。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

dart_scope_functions鸿蒙适配实践:Dart作用域函数在Flutter中的迁移全解析

dart_scope_functions鸿蒙适配实践:Dart作用域函数在Flutter中的迁移全解析

先提个问题&#xff1a;你写 Flutter 代码时&#xff0c;有没有经历过这种“工具人时刻”——定义一个对象&#xff0c;判空&#xff0c;取值&#xff0c;塞进构造器&#xff0c;再判空&#xff0c;再赋值……一个本该两行说完的逻辑&#xff0c;硬生生被样板代码撑出十行。想用…

2026/10/20 10:05:47 阅读更多 →
AIGC检测原理与论文写作重构:告别降AI工具,建立真实作者性

AIGC检测原理与论文写作重构:告别降AI工具,建立真实作者性

最近总有人拿着检测报告截图来问我&#xff1a;论文AIGC疑似比例飙到六成以上&#xff0c;学校通知延期&#xff0c;怎么办&#xff1f;说实话&#xff0c;看到这种局面我心里也替人着急&#xff0c;但更着急的是&#xff0c;很多人的第一反应是冲去找“去AI痕迹神器”&#xf…

2026/10/20 10:04:46 阅读更多 →
接口与UI自动化测试框架模板:测开提效实战指南

接口与UI自动化测试框架模板:测开提效实战指南

做测开这几年&#xff0c;我最大的感受就是&#xff1a;真正耗时间的不是业务测试逻辑本身&#xff0c;而是每接一个新项目&#xff0c;都要从零搭一遍自动化框架。目录结构重新建、公共方法重新写、日志和报告重新配&#xff0c;甚至连“怎么读取配置”这种几十行代码都要再敲…

2026/10/20 10:04:46 阅读更多 →

最新新闻

为什么一降重AI率就升高?手动降重越改越像AI,降重降AI一起做才是正解!

为什么一降重AI率就升高?手动降重越改越像AI,降重降AI一起做才是正解!

为什么一降重AI率就升高&#xff1f;手动降重越改越像AI&#xff0c;降重降AI一起做才是正解&#xff01; 为什么一降重AI率就升高&#xff1f;不少同学都碰到过&#xff1a;查重报告上的红色总算改少了&#xff0c;再送去做AIGC检测&#xff0c;AI率反而比改之前还高。明明每…

2026/10/20 10:44:37 阅读更多 →
基于Springboot大学生就业服务平台【附源码+文档】

基于Springboot大学生就业服务平台【附源码+文档】

/* 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:44:37 阅读更多 →
Node.js部署实战:从环境配置、PM2进程守护到日志排错的完整指南

Node.js部署实战:从环境配置、PM2进程守护到日志排错的完整指南

开头&#xff1a;真香的是开发&#xff0c;想砸电脑的是部署我当初也是冲着 Node.js 那套开发体验去的&#xff0c;写接口、做工具脚本、甚至给团队搭个内部面板&#xff0c;简直行云流水。直到第一次正儿八经把服务部署到服务器上&#xff0c;才发现前端的爽和后端的痛之间&am…

2026/10/20 10:44:37 阅读更多 →
论文AI率和重复率怎么一起降下来?降重降AI几分钟就能一起完成!

论文AI率和重复率怎么一起降下来?降重降AI几分钟就能一起完成!

论文AI率和重复率怎么一起降下来&#xff1f;降重降AI几分钟就能一起完成&#xff01; 论文AI率和重复率怎么一起降下来&#xff0c;是很多同学交稿前最头疼的事。论文AI率和重复率两个数字同时摆在报告上&#xff0c;先压哪个都不对&#xff1a;刚把AI率压下去&#xff0c;查…

2026/10/20 10:44:37 阅读更多 →
AgentScope实践:用标准化Msg协议搭建多智能体协作系统

AgentScope实践:用标准化Msg协议搭建多智能体协作系统

上周我在重构一个内部客服项目的时候&#xff0c;终于体会到“多智能体”和“多个会说话的模块”之间那条天堑。单机脚本里我写了三百多行状态机&#xff0c;让一个主管Agent给三个执行Agent派活&#xff0c;结果一个Agent因为提示词里写了句“你继续分析”&#xff0c;就带着上…

2026/10/20 10:44:37 阅读更多 →
如何 5 步把游戏手柄映射为键盘鼠标?AntiMicroX 完整指南

如何 5 步把游戏手柄映射为键盘鼠标?AntiMicroX 完整指南

如何 5 步把游戏手柄映射为键盘鼠标&#xff1f;AntiMicroX 完整指南 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https://gitcode.com/Gi…

2026/10/20 10:43:36 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* 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 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* 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 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* 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 1:01:30 阅读更多 →

周新闻

基于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/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#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 阅读更多 →