STC15W104单片机8脚4路2262/1527解码输出程序:带学习功能,掉电储存

张开发
2026/4/6 17:52:40 15 分钟阅读

分享文章

STC15W104单片机8脚4路2262/1527解码输出程序:带学习功能,掉电储存
STC15W104单片机8脚4路2262 1527解码输出程序带学习功能掉电储存。老铁们今天咱们搞点硬核的最近在玩STC15W104这个8脚小钢炮折腾出个支持1527/2262编码的万能遥控解码器。核心功能就三点自动学习遥控器、掉电记忆数据、四路输出控制。直接上干货STC15W104单片机8脚4路2262 1527解码输出程序带学习功能掉电储存。先看硬件配置P3.2接315M超外差接收头P5.4-P5.7四个输出口P3.3用来进学习模式。存储用片内EEPROMSTC15自带IAP功能真香省了外置24C02。// 存储结构体 typedef struct { unsigned long addrCode; // 地址码 unsigned char dataCode; // 数据码 unsigned char validFlag; // 有效标志 } RemoteCode; RemoteCode savedCodes[4]; // 对应四个输出通道学习模式的关键在于捕捉2262的时序特征。实测发现1527的引导码约9ms高电平跟2262兼容。用定时器1的捕获功能稳如老狗void Timer1_Init() { AUXR 0xBF; // 定时器时钟12T模式 TMOD 0x0F; // 16位自动重装 TL1 0x00; TH1 0x00; TR1 1; // 启动定时器 } // 中断里抓取高低电平时间 if (TF1) { pulseWidth (TH1 8) | TL1; TH1 TL1 0; TF1 0; decodeProcess(pulseWidth); // 核心解码逻辑 }解码状态机才是精髓用switch-case处理不同阶段的电平enum DecodeState { IDLE, SYNC, DATA }; enum DecodeState currentState IDLE; void decodeProcess(unsigned int width) { switch(currentState) { case IDLE: if(width 8000) { // 识别到同步头 currentState SYNC; bitCounter 0; tempCode 0; } break; case SYNC: if(width 2000) { // 短脉冲可能是0或1 tempCode 1; if(width 1000) tempCode | 1; if(bitCounter 24) { // 24位编码 saveLearnedCode(); currentState IDLE; } } break; } }掉电存储要特别注意擦除次数限制。STC15的EEPROM本质是Flash写之前必须擦除整个扇区void SaveToEEPROM() { IAP_CONTR 0x80; // 使能IAP IAP_CMD 0x03; // 扇区擦除 IAP_ADDRH 0x00; // 扇区地址 IAP_ADDRL 0x00; IAP_Trigger(); _nop_();_nop_(); // 逐个字节写入 for(int i0; isizeof(savedCodes); i) { IAP_CMD 0x02; IAP_ADDRL i; IAP_DATA *((byte*)savedCodes i); IAP_Trigger(); } IAP_CONTR 0; // 关闭IAP }实际应用中发现几个坑接收头输出要接10K上拉否则低电平不稳学习时按住遥控键至少3秒确保完整接收三组编码用软件去抖代替硬件电路节省空间完整代码里加了超时机制——超过2秒没收到后续信号自动退出学习模式。输出部分用74HC595扩展PWM控制继电器也没压力。这个小东西塞进86型开关盒里改造传统灯具美滋滋最后给个快速测试技巧用镊子短接VCC和GND模拟掉电立马验证存储是否靠谱。这方案成本不到5块钱比某宝成品香多了老铁们赶紧焊起来

更多文章