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最小系统开发板包含以下核心组件:
- 主控芯片:STC15F104E单片机
- 电源管理:7805稳压芯片(输入5-15V,输出稳定5V)
- 通信接口:MAX232芯片(实现RS232电平转换)
- 滤波电容:电源滤波,提高稳定性
- 电源指示:LED指示灯
- I/O排针:全部6个I/O口引出,方便扩展
- 复位电路:上电复位功能(部分设计利用内部复位)
- 下载接口:串口下载或专用下载线接口
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布局建议
-
尺寸:约25mm×18mm×10mm
-
层数:双面板即可满足需求
-
布局原则:
- 电源部分靠近输入接口
- 滤波电容尽量靠近芯片电源引脚
- 数字地与模拟地分开,单点连接
- 信号线避免平行长距离走线
三、开发环境与编程
1. 所需软件工具
| 工具 | 用途 | 下载来源 |
|---|---|---|
| Keil C51 | 程序编译开发 | Keil官网 |
| STC-ISP | 程序下载烧录 | 宏晶科技官网 |
| 串口调试助手 | 串口通信测试 | 第三方工具 |
2. 程序下载步骤
- 硬件连接:开发板通过串口线连接电脑
- 选择芯片型号:STC-ISP中选择"STC15F104E"
- 设置串口参数:选择正确COM口,波特率9600
- 打开程序文件:选择编译好的.hex文件
- 下载操作:点击"下载/编程",然后给开发板上电
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. 电源设计要点
- 输入电压:开发板通常设计为5-15V直流输入,经7805稳压至5V
- 滤波电容:VCC与GND间应并联10μF电解电容和0.1μF陶瓷电容
- 电流需求:STC15F104E工作电流约5-20mA,考虑外设后建议电源提供200mA以上
2. 下载问题排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 无法连接芯片 | 1. 串口线错误 2. 电源未接通 3. 芯片损坏 |
1. 检查接线 2. 测量VCC电压 3. 更换芯片 |
| 下载失败 | 1. 波特率不匹配 2. 冷启动时序错误 |
1. 降低波特率 2. 先点下载再上电 |
| 程序不运行 | 1. 复位电路问题 2. 时钟设置错误 |
1. 检查复位引脚 2. 确认时钟源 |
3. I/O使用建议
- 驱动能力:每个I/O口最大灌电流20mA,总电流不超过100mA
- 上拉电阻:内部有弱上拉,约20kΩ,如需强上拉可外接4.7kΩ电阻
- 电平兼容:5V系统可直接驱动3.3V器件,但3.3V驱动5V需电平转换
4. 资源优化技巧
- 代码压缩:4KB Flash有限,避免使用大型库函数
- 变量优化:多用无符号字符型(uchar),少用整型
- 中断精简:中断服务函数尽量简短
- 睡眠模式:空闲时进入IDLE模式降低功耗
七、学习资源推荐
1. 官方资料
- 数据手册:STC15F100系列数据手册(宏晶科技官网)
- 编程手册:STC15系列单片机参考手册
- ISP工具:STC-ISP下载软件(含示例程序)
2. 开发工具
- 编译器:Keil C51 V9.0以上
- 仿真器:STC官方仿真器(可选)
- 调试工具:串口调试助手、逻辑分析仪
3. 学习路径建议
- 第一阶段:GPIO控制(LED、按键)
- 第二阶段:定时器应用(延时、PWM)
- 第三阶段:中断系统(外部中断、定时中断)
- 第四阶段:通信接口(UART、模拟I2C/SPI)
- 第五阶段:综合项目(红外遥控、数据采集)
4. 常见项目创意
- 智能台灯:PWM调光 + 定时关闭
- 温湿度监控:DHT11传感器 + 串口上报
- 红外遥控器:学习型遥控器
- 简单PLC:多路输入输出控制
- 数据记录器:EEPROM存储关键数据
STC15F104E最小系统开发板以其极小的体积、完整的功能和低廉的成本,成为入门8051单片机开发和嵌入式系统设计的理想平台。通过合理的设计和编程,这个只有8个引脚的小芯片能够实现许多实用的控制功能,特别适合空间受限、成本敏感的应用场景。