news 2026/5/12 12:08:05

用STC15F104W单片机+315MHz模块DIY一个无线遥控器(附完整Keil代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用STC15F104W单片机+315MHz模块DIY一个无线遥控器(附完整Keil代码)

用STC15F104W单片机打造低成本无线遥控系统

在智能家居和物联网设备普及的今天,无线遥控技术已经成为许多DIY项目的核心需求。STC15F104W这款8位单片机以其极低的成本和简单的开发环境,成为入门级无线控制项目的理想选择。本文将带你从零开始,用不到50元的硬件成本,构建一个完整的315MHz无线遥控系统。

1. 项目准备与硬件选型

1.1 核心组件介绍

STC15F104W是一款国产8位单片机,具有以下特点:

  • 工作电压:3.3V-5.5V
  • 内置RC振荡器(精度±1%)
  • 4KB Flash存储器
  • 仅8个引脚,体积小巧
  • 价格通常低于2元/片

315MHz无线模块是常见的低成本射频解决方案:

  • 传输距离:室内约30米,开阔地带可达100米
  • 工作电压:3V-12V
  • 典型功耗:发射时约12mA
  • 模块价格约5-10元/对(收发各一)

1.2 所需材料清单

组件数量备注
STC15F104W单片机1核心控制器
315MHz发射模块1遥控端使用
315MHz接收模块1被控端使用
按键开关1-4根据需求选择数量
LED指示灯1状态显示
10kΩ电阻2上拉/下拉用
面包板/PCB1电路搭建
杜邦线若干连接用

提示:所有组件均可从主流电子商城一站式购齐,总成本控制在50元以内。

2. 发射端电路设计与编程

2.1 硬件连接示意图

发射端的核心是将单片机与315MHz模块正确连接:

STC15F104W引脚配置: P3.2(INT0) -- 按键输入(按下=低电平) P3.3(INT1) -- 315MHz模块DATA脚 VCC -- 模块VCC GND -- 模块GND

实际接线时需要注意:

  • 按键需接10kΩ上拉电阻
  • 模块天线可用约23cm的导线替代
  • 建议在VCC与GND之间加104电容滤波

2.2 Keil工程配置要点

新建Keil工程时需特别注意:

  1. 选择Device为STC15F104W
  2. 设置Target选项:
    • Xtal频率设为内部11.0592MHz
    • 勾选"Create HEX File"
  3. 添加启动文件STARTUP.A51

关键编译器设置:

  • Memory Model: Small
  • Code Rom Size: Large
  • 勾选"Use On-chip ROM"

2.3 核心发射代码解析

#include <STC15.H> #include <intrins.h> #define TX_PIN P3_3 // 315MHz模块数据引脚 void delay_us(unsigned int us) { while(us--) _nop_(); } void sendBit(bit b) { TX_PIN = 1; if(b) delay_us(600); // 发送'1' else delay_us(300); // 发送'0' TX_PIN = 0; delay_us(300); } void sendCode(unsigned long code) { unsigned char i; for(i=0; i<24; i++) { // 发送24位编码 sendBit(code & 0x800000); code <<= 1; } } void main() { P3M0 = 0x00; // 准双向口模式 P3M1 = 0x00; while(1) { if(!P3_2) { // 按键按下 sendCode(0xAABBCC); // 自定义编码 delay_ms(20); // 防抖延时 while(!P3_2); // 等待按键释放 } } }

这段代码实现了:

  1. 定义600μs高电平+300μs低电平为'1'
  2. 定义300μs高电平+300μs低电平为'0'
  3. 每次按键发送24位自定义编码(0xAABBCC)
  4. 包含基本的按键防抖处理

3. 接收端设计与系统集成

3.1 接收电路搭建

接收端需要将315MHz模块信号解码后控制执行机构:

315MHz接收模块 -- STC15F104W DATA -- P3.2(INT0) VCC -- 5V GND -- GND 单片机输出 -- 执行机构 P3.3 -- 继电器控制端

继电器驱动建议:

  • 使用NPN三极管(如S8050)驱动
  • 继电器线圈并联续流二极管
  • 控制高电平有效

3.2 接收端核心代码

#include <STC15.H> #include <intrins.h> #define RELAY_PIN P3_3 unsigned long rxCode = 0; unsigned char bitCount = 0; void INT0_ISR() interrupt 0 { static unsigned long lastTime; unsigned int pulseWidth; pulseWidth = TH0*256 + TL0; // 获取脉冲宽度 TH0 = TL0 = 0; // 定时器清零 if(pulseWidth > 400 && pulseWidth < 800) { rxCode <<= 1; if(pulseWidth > 500) rxCode |= 1; // 识别为'1' bitCount++; } if(bitCount >= 24) { if(rxCode == 0xAABBCC) { // 验证编码 RELAY_PIN = !RELAY_PIN; // 切换继电器状态 } bitCount = 0; rxCode = 0; } } void main() { P3M0 = 0x08; // P3.3推挽输出 P3M1 = 0x00; IT0 = 1; // INT0下降沿触发 EX0 = 1; // 允许INT0中断 EA = 1; // 全局中断使能 TMOD = 0x01; // 定时器0模式1 TR0 = 1; // 启动定时器0 while(1) { // 主循环可添加其他任务 } }

代码工作流程:

  1. 利用定时器0测量脉冲宽度
  2. 在INT0中断中解码接收信号
  3. 识别到正确编码后切换继电器状态
  4. 支持24位自定义编码验证

3.3 系统测试与优化

实际测试中可能会遇到以下问题及解决方案:

问题现象可能原因解决方法
遥控距离短天线长度不合适调整天线为λ/4长度(约23cm)
偶尔误触发电源干扰增加滤波电容(104+10μF)
响应延迟解码算法效率低优化中断服务程序
不同时工作编码不匹配检查收发两端编码是否一致

提高系统可靠性的技巧:

  • 在编码中加入校验位
  • 采用曼彻斯特编码提高抗干扰性
  • 增加信号强度指示LED
  • 使用不同编码区分多个遥控器

4. 项目扩展与应用实例

4.1 多按键遥控器改造

通过修改发射端代码,可以实现多按键控制:

unsigned long keyCodes[] = {0xAABB01, 0xAABB02, 0xAABB03, 0xAABB04}; void checkKeys() { if(!P3_2) { sendCode(keyCodes[0]); delay_ms(20); while(!P3_2); } if(!P3_4) { sendCode(keyCodes[1]); delay_ms(20); while(!P3_4); } if(!P3_5) { sendCode(keyCodes[2]); delay_ms(20); while(!P3_5); } } void main() { // 初始化代码... while(1) { checkKeys(); } }

硬件改动:

  • 增加按键数量(最多可利用P3.2/P3.4/P3.5)
  • 每个按键对应不同编码
  • 接收端根据编码执行不同操作

4.2 智能家居控制应用

将系统集成到家居环境中:

  1. 灯光控制

    • 接收端连接继电器模块
    • 控制客厅/卧室灯具
    • 可扩展为多路独立控制
  2. 窗帘控制

    • 通过继电器控制电机正反转
    • 长按实现开/关,点按实现暂停
  3. 安防报警

    • 接收端作为无线门磁
    • 触发后发送报警信号到主机

4.3 与其他系统的联动

通过串口通信实现更复杂控制:

void uartInit() { SCON = 0x50; // 模式1,允许接收 TMOD |= 0x20; // 定时器1模式2 TH1 = 0xFD; // 9600bps@11.0592MHz TR1 = 1; ES = 1; // 允许串口中断 } void uartSend(char *str) { while(*str) { SBUF = *str++; while(!TI); TI = 0; } }

这样可以将无线接收端:

  • 接入Node-RED等物联网平台
  • 与ESP8266等WiFi模块配合
  • 实现手机APP远程控制

5. 进阶优化与性能提升

5.1 低功耗设计技巧

对于电池供电的应用,可采取以下措施:

  1. 硬件层面

    • 选用低静态电流的LDO(如HT7333)
    • 增加电源开关电路
    • 使用MOS管切断模块供电
  2. 软件层面

    • 启用单片机休眠模式
    • 降低工作频率
    • 缩短发射时间
void enterSleep() { PCON |= 0x01; // 进入空闲模式 _nop_(); } // 在按键中断中唤醒 void INT0_ISR() interrupt 0 { PCON &= ~0x01; // 退出休眠 // ...其他处理代码 }

5.2 提高通信可靠性

  1. 编码改进

    • 增加前导码和同步头
    • 采用CRC校验
    • 实现简单的重传机制
  2. 协议优化

    • 定义标准的帧结构
    • 增加地址字段区分设备
    • 实现双向通信确认

示例改进后的帧结构:

[前导码 4字节] [同步字 2字节] [地址 1字节] [命令 1字节] [CRC 1字节]

5.3 外壳设计与安装

完成电子部分后,还需考虑物理安装:

  1. 发射端

    • 使用3D打印外壳或改造现有遥控器
    • 选择合适尺寸的电池(CR2032或AAA)
    • 设计符合人体工学的按键布局
  2. 接收端

    • 选择通风良好的安装位置
    • 注意与执行机构的接线安全
    • 考虑使用端子排方便接线

实际项目中,我用旧电视遥控器外壳改造发射端,内部空间刚好容纳STC15F104W和315MHz模块,通过替换原有按键实现无缝改装。接收端则安装在86型开关盒内,直接替换原有墙壁开关。

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

从数据中台到智能治理:六家厂商产品定位与核心能力拆解测评

一、数据治理&#xff1a;决定数据中台价值兑现的关键变量2026年&#xff0c;一个行业的共识正在变得清晰&#xff1a;数据中台的上限由计算架构决定&#xff0c;但下限由数据治理决定。过去数年&#xff0c;大量企业投入资源搭建了数据中台的基础设施——数据湖、数仓、调度引…

作者头像 李华
网站建设 2026/5/12 12:06:19

中小物流企业如何用AI自动化提升10倍效率:实战案例与技术方案

1. 项目概述&#xff1a;当传统仓储遇上AI自动化在蒙特利尔港附近经营一家保税仓库&#xff0c;每周处理数百票进港货物、海关单据和客户沟通&#xff0c;这听起来像是一个典型的重人力、重流程的传统行业。没错&#xff0c;在引入自动化之前&#xff0c;我们团队的大部分时间确…

作者头像 李华
网站建设 2026/5/12 12:06:16

使用OBLITERATUS工具进行激活向量消融:深入解析大语言模型安全机制

1. 项目概述与核心动机 作为一名长期关注人工智能技术发展的从业者&#xff0c;我常常思考一个问题&#xff1a;我们日常交互的大型语言模型&#xff0c;其展现出的能力边界&#xff0c;究竟在多大程度上是技术本身的限制&#xff0c;又在多大程度上是人为设定的“护栏”所塑造…

作者头像 李华
网站建设 2026/5/12 12:05:46

从1.6到16:一份跨越十年的AOSP源码归档与高效获取指南

1. AOSP源码的十年变迁与归档价值 2009年发布的Android 1.6&#xff08;Donut&#xff09;是首个支持CDMA网络的版本&#xff0c;当时整个源码包仅有不到2GB。而到了2023年的Android 14&#xff0c;源码体积已膨胀到84GB&#xff0c;这背后是15年间超过400个重要功能的迭代。我…

作者头像 李华
网站建设 2026/5/12 12:04:42

herdctl:容器管理新利器,简化Docker与K8s日常运维

1. 项目概述&#xff1a;一个为容器化环境量身定制的轻量级管理工具在容器化技术成为基础设施标配的今天&#xff0c;我们手头的工具链也变得越来越丰富和复杂。Docker CLI、Kubernetes 的kubectl、Podman 的命令行&#xff0c;每一个都功能强大&#xff0c;但在日常的开发和运…

作者头像 李华