STC15F104E单片机最小系统开发板完全指南

STC15F104E单片机最小系统开发板完全指南

一、STC15F104E单片机核心规格

1. 基本参数

参数 规格 说明
封装 SOP-8 / DIP-8 8引脚封装,体积小巧
内核 增强型8051 1T单时钟周期,比传统8051快6-12倍
工作电压 3.8V-5.5V 宽电压范围,兼容5V和3.3V系统
主频 最高35MHz 内部RC时钟,±1%温飘精度
Flash 4KB 程序存储器,擦写10万次以上
RAM 128字节 数据存储器
I/O数量 6个 P3.0-P3.5,全部可配置
定时器 2个16位 Timer0和Timer1
串口 1个UART 全双工异步通信
中断源 5个外部中断 INT0-INT4,支持掉电唤醒
EEPROM 1KB 数据存储,擦写10万次

2. 引脚功能定义

引脚1 (VCC): 电源正极 (3.8V-5.5V)
引脚2 (P3.0/RxD): 通用I/O 或 串行输入(接收端)
引脚3 (P3.1/TxD): 通用I/O 或 串行输出(发送端)  
引脚4 (P3.2/INT0): 通用I/O 或 外部中断0输入
引脚5 (P3.3/INT1): 通用I/O 或 外部中断1输入
引脚6 (P3.4/T0): 通用I/O 或 定时器0外部计数输入
引脚7 (P3.5/T1): 通用I/O 或 定时器1外部计数输入
引脚8 (GND): 电源地

二、最小系统开发板设计

1. 开发板基本组成

根据搜索结果,典型的STC15F104E最小系统开发板包含以下核心组件:

2. 最小系统原理图设计要点

2.1 电源电路

// 典型电源设计
外部电源(5-15V) → 7805稳压 → 5V输出 → 滤波电容
                                ↓
                            STC15F104E VCC
                            
// 滤波电容配置
VCC与GND之间:10μF电解电容 + 0.1μF陶瓷电容

2.2 复位电路(可选)

由于STC15F104E内部集成高可靠复位电路,支持8级可选复位门槛电压,可彻底省掉外部复位电路。如需外部复位按钮:

VCC → 10kΩ电阻 → RST引脚
              ↓
            按钮 → GND

2.3 时钟电路(可选)

内部集成高精度R/C时钟,±1%温飘,5MHz-35MHz宽范围可设置,可彻底省掉外部晶振。

2.4 下载电路

单片机TxD(P3.1) → MAX232 → DB9接口(PC串口)
单片机RxD(P3.0) ← MAX232 ← DB9接口(PC串口)

3. PCB布局建议

三、开发环境与编程

1. 所需软件工具

工具 用途 下载来源
Keil C51 程序编译开发 Keil官网
STC-ISP 程序下载烧录 宏晶科技官网
串口调试助手 串口通信测试 第三方工具

2. 程序下载步骤

  1. 硬件连接:开发板通过串口线连接电脑
  2. 选择芯片型号:STC-ISP中选择"STC15F104E"
  3. 设置串口参数:选择正确COM口,波特率9600
  4. 打开程序文件:选择编译好的.hex文件
  5. 下载操作:点击"下载/编程",然后给开发板上电

3. 基础程序框架

#include <STC15F104E.H>  // 头文件包含

// 宏定义
#define uchar unsigned char
#define uint unsigned int

// I/O定义
sbit LED = P3^3;    // LED连接P3.3
sbit KEY = P3^2;    // 按键连接P3.2

// 延时函数
void DelayMS(uint ms) {
    uint i, j;
    for(i = ms; i > 0; i--)
        for(j = 114; j > 0; j--);
}

// 主函数
void main() {
    // 初始化
    P3M0 = 0x00;    // 设置P3口为准双向模式
    P3M1 = 0x00;
    
    LED = 1;        // 初始LED熄灭
    
    while(1) {
        if(KEY == 0) {          // 按键按下
            DelayMS(10);        // 消抖
            if(KEY == 0) {
                LED = ~LED;     // LED状态翻转
                while(!KEY);    // 等待按键释放
            }
        }
    }
}

参考代码 STC15F104E单片机最小系统开发板 www.youwenfan.com/contentcnt/134063.html

四、实用应用示例

1. 按键控制LED(基础示例)

/* 
 * 功能:按键控制LED亮灭
 * 硬件:按键接P3.2,LED接P3.3
 * 原理:检测按键下降沿,控制LED翻转
 */
#include <STC15F104E.H>

sbit KEY = P3^2;
sbit LED = P3^3;

void Delay10ms() {
    uchar i, j;
    i = 108;
    j = 145;
    do {
        while (--j);
    } while (--i);
}

void main() {
    LED = 1;  // 初始熄灭
    
    while(1) {
        if(KEY == 0) {
            Delay10ms();
            if(KEY == 0) {
                LED = ~LED;
                while(!KEY);  // 等待释放
            }
        }
    }
}

2. 串口通信示例

/*
 * 功能:串口收发数据
 * 硬件:P3.0(RxD)接收,P3.1(TxD)发送
 * 参数:波特率9600,8位数据,无校验
 */
#include <STC15F104E.H>
#include <intrins.h>

#define FOSC 11059200L      // 系统频率
#define BAUD 9600           // 波特率

// 串口初始化
void UART_Init() {
    SCON = 0x50;            // 8位数据,可变波特率
    AUXR |= 0x40;           // 定时器1时钟为Fosc
    AUXR &= 0xFE;           // 定时器1为12T模式
    TMOD &= 0x0F;           // 清除定时器1模式位
    TMOD |= 0x20;           // 定时器1为8位自动重装
    TH1 = TL1 = 256 - FOSC/12/32/BAUD;
    TR1 = 1;                // 启动定时器1
    ES = 1;                 // 使能串口中断
    EA = 1;                 // 开启总中断
}

// 发送一个字节
void UART_SendByte(uchar dat) {
    SBUF = dat;
    while(!TI);             // 等待发送完成
    TI = 0;                 // 清除发送标志
}

// 发送字符串
void UART_SendString(char *s) {
    while(*s) {
        UART_SendByte(*s++);
    }
}

// 串口中断服务函数
void UART_ISR() interrupt 4 {
    if(RI) {
        RI = 0;             // 清除接收标志
        // 处理接收到的数据
        UART_SendByte(SBUF);  // 回传接收的数据
    }
}

void main() {
    UART_Init();
    UART_SendString("STC15F104E UART Ready!\r\n");
    
    while(1) {
        // 主循环
        _nop_();
    }
}

3. PWM信号生成

/*
 * 功能:生成PWM信号控制LED亮度
 * 硬件:P3.4输出PWM,LED串联限流电阻
 * 原理:定时器中断调整占空比
 */
#include <STC15F104E.H>

#define PWM_PIN P3_4

uchar pwm_duty = 50;    // 占空比0-100
uchar pwm_counter = 0;

// 定时器0初始化
void Timer0_Init() {
    AUXR |= 0x80;       // 定时器0为1T模式
    TMOD &= 0xF0;       // 清除定时器0模式位
    TMOD |= 0x01;       // 定时器0为16位定时器
    TH0 = 0xFF;         // 定时100us
    TL0 = 0x9C;
    ET0 = 1;            // 使能定时器0中断
    TR0 = 1;            // 启动定时器0
    EA = 1;             // 开启总中断
}

// 定时器0中断服务函数
void Timer0_ISR() interrupt 1 {
    TH0 = 0xFF;         // 重装定时值
    TL0 = 0x9C;
    
    pwm_counter++;
    if(pwm_counter >= 100) {
        pwm_counter = 0;
    }
    
    if(pwm_counter < pwm_duty) {
        PWM_PIN = 1;    // 高电平
    } else {
        PWM_PIN = 0;    // 低电平
    }
}

void main() {
    PWM_PIN = 0;        // 初始低电平
    Timer0_Init();
    
    while(1) {
        // 呼吸灯效果
        for(pwm_duty = 0; pwm_duty < 100; pwm_duty++) {
            DelayMS(10);
        }
        for(pwm_duty = 100; pwm_duty > 0; pwm_duty--) {
            DelayMS(10);
        }
    }
}

4. 外部中断应用

/*
 * 功能:外部中断控制
 * 硬件:INT0(P3.2)接按键,触发外部中断
 */
#include <STC15F104E.H>

sbit LED = P3^3;

// 外部中断0初始化
void INT0_Init() {
    IT0 = 1;            // 下降沿触发
    EX0 = 1;            // 使能外部中断0
    EA = 1;             // 开启总中断
}

// 外部中断0服务函数
void INT0_ISR() interrupt 0 {
    LED = ~LED;         // LED状态翻转
    DelayMS(10);        // 简单消抖
}

void main() {
    LED = 1;
    INT0_Init();
    
    while(1) {
        // 主循环可执行其他任务
        _nop_();
    }
}

五、进阶应用项目

1. 红外遥控系统

/*
 * 项目:红外遥控灯扇
 * 功能:接收红外信号,控制LED和风扇
 * 硬件:红外接收头接P3.2(INT0),LED接P3.3,风扇控制接P3.4
 */
#include <STC15F104E.H>

// 红外解码相关变量
uchar IR_code;          // 红外键码
bit IR_Flag = 0;        // 红外接收标志

// 初始化
void Init_System() {
    // 外部中断0用于红外解码
    IT0 = 1;            // 下降沿触发
    EX0 = 1;
    
    // 定时器0用于红外时序测量
    TMOD |= 0x01;       // 定时器0模式1
    TH0 = 0;
    TL0 = 0;
    
    EA = 1;             // 总中断使能
}

// 红外解码中断服务
void INT0_ISR() interrupt 0 {
    static uchar bit_cnt = 0;
    static uchar ir_data[4];
    uint time_val;
    
    TR0 = 1;            // 启动定时器
    TH0 = 0;
    TL0 = 0;
    
    while(!INT0);       // 等待高电平
    TR0 = 0;            // 停止定时器
    
    time_val = (TH0 << 8) | TL0;
    
    if(time_val > 4000 && time_val < 5000) {
        // 引导码
        bit_cnt = 0;
        ir_data[0] = ir_data[1] = ir_data[2] = ir_data[3] = 0;
    } else if(time_val > 1000 && time_val < 2000) {
        // 数据1
        ir_data[bit_cnt/8] |= (1 << (bit_cnt%8));
        bit_cnt++;
    } else if(time_val > 200 && time_val < 800) {
        // 数据0
        bit_cnt++;
    }
    
    if(bit_cnt >= 32) {
        // 解码完成
        IR_code = ir_data[2];  // 取键码
        IR_Flag = 1;
        bit_cnt = 0;
    }
}

void main() {
    Init_System();
    
    while(1) {
        if(IR_Flag) {
            IR_Flag = 0;
            
            switch(IR_code) {
                case 0x45:  // 电源键
                    P3_3 = ~P3_3;  // 控制LED
                    break;
                case 0x46:  // 模式键
                    P3_4 = ~P3_4;  // 控制风扇
                    break;
                // 其他按键处理...
            }
        }
    }
}

2. 继电器控制系统

/*
 * 项目:按键控制继电器
 * 功能:按键控制继电器通断1秒启动停止
 * 硬件:按键接P3.5,继电器控制接P3.3
 */
#include <STC15F104E.H>

sbit RELAY = P3^3;      // 继电器控制
sbit KEY = P3^5;        // 控制按键

uchar sec_count = 0;
bit relay_state = 0;

// 定时器1初始化(1ms中断)
void Timer1_Init() {
    AUXR |= 0x40;       // 1T模式
    TMOD &= 0x0F;
    TMOD |= 0x10;       // 定时器1模式1
    TH1 = 0xFC;         // 1ms定时
    TL1 = 0x67;
    ET1 = 1;
    TR1 = 1;
    EA = 1;
}

// 定时器1中断
void Timer1_ISR() interrupt 3 {
    TH1 = 0xFC;
    TL1 = 0x67;
    
    sec_count++;
    if(sec_count >= 1000) {  // 1秒
        sec_count = 0;
        if(relay_state) {
            RELAY = ~RELAY;  // 继电器状态翻转
        }
    }
}

void main() {
    RELAY = 0;          // 继电器初始断开
    Timer1_Init();
    
    while(1) {
        if(KEY == 0) {
            DelayMS(10);
            if(KEY == 0) {
                relay_state = ~relay_state;  // 启动/停止
                while(!KEY);                 // 等待释放
            }
        }
    }
}

六、开发注意事项

1. 电源设计要点

  1. 输入电压:开发板通常设计为5-15V直流输入,经7805稳压至5V
  2. 滤波电容:VCC与GND间应并联10μF电解电容和0.1μF陶瓷电容
  3. 电流需求:STC15F104E工作电流约5-20mA,考虑外设后建议电源提供200mA以上

2. 下载问题排查

问题现象 可能原因 解决方法
无法连接芯片 1. 串口线错误
2. 电源未接通
3. 芯片损坏
1. 检查接线
2. 测量VCC电压
3. 更换芯片
下载失败 1. 波特率不匹配
2. 冷启动时序错误
1. 降低波特率
2. 先点下载再上电
程序不运行 1. 复位电路问题
2. 时钟设置错误
1. 检查复位引脚
2. 确认时钟源

3. I/O使用建议

  1. 驱动能力:每个I/O口最大灌电流20mA,总电流不超过100mA
  2. 上拉电阻:内部有弱上拉,约20kΩ,如需强上拉可外接4.7kΩ电阻
  3. 电平兼容:5V系统可直接驱动3.3V器件,但3.3V驱动5V需电平转换

4. 资源优化技巧

  1. 代码压缩:4KB Flash有限,避免使用大型库函数
  2. 变量优化:多用无符号字符型(uchar),少用整型
  3. 中断精简:中断服务函数尽量简短
  4. 睡眠模式:空闲时进入IDLE模式降低功耗

七、学习资源推荐

1. 官方资料

2. 开发工具

3. 学习路径建议

  1. 第一阶段:GPIO控制(LED、按键)
  2. 第二阶段:定时器应用(延时、PWM)
  3. 第三阶段:中断系统(外部中断、定时中断)
  4. 第四阶段:通信接口(UART、模拟I2C/SPI)
  5. 第五阶段:综合项目(红外遥控、数据采集)

4. 常见项目创意

  1. 智能台灯:PWM调光 + 定时关闭
  2. 温湿度监控:DHT11传感器 + 串口上报
  3. 红外遥控器:学习型遥控器
  4. 简单PLC:多路输入输出控制
  5. 数据记录器:EEPROM存储关键数据

STC15F104E最小系统开发板以其极小的体积、完整的功能和低廉的成本,成为入门8051单片机开发和嵌入式系统设计的理想平台。通过合理的设计和编程,这个只有8个引脚的小芯片能够实现许多实用的控制功能,特别适合空间受限、成本敏感的应用场景。

专注于matlab/simulink,电子电路,编程