一、项目概述
本方案设计一个基于STC89C52单片机的智能充电控制单元,用于连接在充电器与插排之间,能够自动检测充电设备的连接状态,并根据检测结果控制充电器的电源供应。当检测到有设备在充电时保持供电,当设备充满电或移除时自动切断充电器电源,以达到节能和保护充电器的目的。

二、硬件设计
2.1 硬件组件清单
| 组件名称 | 型号/规格 | 数量 | 单价(元) | 小计(元) |
|---|---|---|---|---|
| 单片机 | STC89C52RC | 1 | 2.5 | 2.5 |
| 运放 | LM358 | 1 | 0.5 | 0.5 |
| 三极管 | TIP122 | 1 | 0.8 | 0.8 |
| 采样电阻 | 0.1Ω/1W | 1 | 0.3 | 0.3 |
| LED | 5mm 红色 | 1 | 0.2 | 0.2 |
| 电阻 | 1kΩ | 2 | 0.1 | 0.2 |
| 电阻 | 10kΩ | 2 | 0.1 | 0.2 |
| 电阻 | 100kΩ | 1 | 0.1 | 0.1 |
| 电阻 | 220Ω | 1 | 0.1 | 0.1 |
| 电容 | 10μF/25V | 2 | 0.2 | 0.4 |
| 电容 | 0.1μF | 2 | 0.1 | 0.2 |
| 二极管 | 1N4007 | 2 | 0.1 | 0.2 |
| 晶振 | 11.0592MHz | 1 | 0.5 | 0.5 |
| 复位按钮 | 6×6mm | 1 | 0.3 | 0.3 |
| 洞洞板 | 5×7cm | 1 | 1.5 | 1.5 |
| 电源模块 | 7805稳压模块 | 1 | 2.0 | 2.0 |
| 总计 | 10.8 |
2.2 电路图设计
2.2.1 总体电路框图
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 电源电路 │──────│ STC89C52 │──────│ 三极管开关 │
└──────────────┘ │ 最小系统 │ │ 控制电路 │
└──────┬───────┘ └──────────────┘
│
┌──────▼───────┐
│ 电流检测电路 │
└──────────────┘
2.2.2 详细电路图

2.3 各模块电路说明
2.3.1 单片机最小系统
- STC89C52RC:8位单片机,作为系统控制核心
- 晶振电路:11.0592MHz晶振,提供时钟信号
- 复位电路:10kΩ电阻和10μF电容组成,实现上电复位和手动复位
2.3.2 电流检测电路
- 采样电阻:0.1Ω/1W电阻,串联在充电回路中
- LM358运放:将采样电阻两端的电压差放大
- 滤波电路:0.1μF电容滤波,提高信号稳定性
- 信号调理:通过电阻分压网络将信号调整到合适范围
2.3.3 三极管开关控制电路
- TIP122三极管:NPN达林顿管,作为电子开关
- 基极电阻:1kΩ电阻,限制基极电流
- 续流二极管:1N4007,保护三极管免受反电动势损坏
- 负载电路:连接充电器的电源回路
2.3.4 电源电路
- 7805稳压模块:将输入的直流电压稳定为5V
- 滤波电容:10μF和0.1μF电容,滤除纹波
- 电源指示:LED指示灯,显示系统供电状态
三、软件设计
3.1 程序结构
/*
智能充电控制单元 - STC89C52版本
功能:检测充电器是否有设备在充电,有设备时保持供电,无设备时自动切断电源
硬件:STC89C52单片机、LM358运放、TIP122三极管、采样电阻、LED指示灯
作者:DIY爱好者
日期:2025-07-23
*/
#include <reg52.h>
#include <intrins.h>
// 引脚定义
sbit LED_PIN = P1^4; // LED指示灯引脚
sbit RELAY_PIN = P3^2; // 三极管控制引脚
sbit CURRENT_PIN = P1^1; // 电流检测信号引脚(模拟输入)
// 参数定义
#define CURRENT_THRESHOLD 500 // 充电电流阈值(ADC值)
#define NO_LOAD_TIME 30000 // 无负载判断时间(毫秒)
#define CHECK_INTERVAL 1000 // 电流检测间隔(毫秒)
#define LED_BLINK_INTERVAL 200 // LED闪烁间隔(毫秒)
// 全局变量
bit isCharging = 0; // 充电状态标志
bit relayState = 0; // 继电器状态
unsigned long lastChargeTime = 0; // 上次检测到充电的时间
unsigned int currentValue = 0; // 当前电流值(ADC值)
unsigned long lastCheckTime = 0; // 上次检测时间
unsigned long ledBlinkTime = 0; // LED闪烁计时
// 函数声明
void delay_ms(unsigned int ms);
void delay_us(unsigned int us);
void ADC_Init();
unsigned int Read_ADC();
unsigned int GetFilteredCurrent();
void UpdateChargingState();
void ControlSwitch();
void UpdateLED();
void SystemInit();
3.2 主要函数说明
3.2.1 延时函数
// 延时函数(毫秒级)
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--);
}
// 延时函数(微秒级)
void delay_us(unsigned int us) {
while (us--) {
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
}
}
3.2.2 电流检测函数
// 软件ADC初始化
void ADC_Init() {
// 设置P1.1为输入模式
P1 |= 0x02;
}
// 软件ADC读取函数(基于RC充放电原理)
unsigned int Read_ADC() {
unsigned int adc_value = 0;
unsigned char i;
// 充电阶段
P1 &= ~0x02; // P1.1设为输出低电平,对电容充电
delay_us(10); // 充电时间
// 放电计时阶段
P1 |= 0x02; // P1.1设为输入模式,开始放电计时
i = 0;
// 计时直到电压降到阈值以下
while ((P1 & 0x02) && (i < 1023)) {
i++;
delay_us(1);
}
adc_value = i;
return adc_value;
}
// 读取并滤波处理电流值
unsigned int GetFilteredCurrent() {
unsigned int sum = 0;
unsigned char i;
// 采样10次取平均值
for (i = 0; i < 10; i++) {
sum += Read_ADC();
delay_us(50);
}
return sum / 10;
}
3.2.3 充电状态判断函数
// 更新充电状态
void UpdateChargingState() {
// 读取滤波后的电流值
currentValue = GetFilteredCurrent();
// 判断是否有充电电流
if (currentValue > CURRENT_THRESHOLD) {
isCharging = 1;
lastChargeTime = 0; // 重置无负载计时
} else {
// 如果长时间没有检测到充电电流,则认为无设备充电
if (lastChargeTime < NO_LOAD_TIME) {
lastChargeTime++;
} else {
isCharging = 0;
}
}
}
3.2.4 开关控制函数
// 控制三极管开关
void ControlSwitch() {
if (isCharging && !relayState) {
// 有设备充电且开关关闭,打开开关
RELAY_PIN = 1;
relayState = 1;
LED_PIN = 0; // LED常亮表示充电中
} else if (!isCharging && relayState) {
// 无设备充电且开关打开,关闭开关
RELAY_PIN = 0;
relayState = 0;
}
}
3.2.5 LED指示函数
// 更新LED指示
void UpdateLED() {
if (isCharging) {
LED_PIN = 0; // LED常亮表示充电中
} else {
// 未充电时LED闪烁表示待机状态
if (ledBlinkTime >= LED_BLINK_INTERVAL) {
ledBlinkTime = 0;
LED_PIN = ~LED_PIN; // 翻转LED状态
}
}
}
3.2.6 系统初始化函数
// 系统初始化
void SystemInit() {
// 初始化引脚
LED_PIN = 1; // LED初始关闭
RELAY_PIN = 0; // 三极管初始关闭
relayState = 0;
// 初始化ADC
ADC_Init();
// 延时稳定
delay_ms(100);
// 闪烁LED表示系统启动
LED_PIN = 0;
delay_ms(200);
LED_PIN = 1;
delay_ms(200);
LED_PIN = 0;
delay_ms(200);
LED_PIN = 1;
}
3.2.7 主函数
// 主函数
void main() {
// 系统初始化
SystemInit();
// 主循环
while (1) {
// 定时检测电流
if (lastCheckTime >= CHECK_INTERVAL) {
lastCheckTime = 0;
// 更新充电状态
UpdateChargingState();
// 控制开关
ControlSwitch();
}
// 更新LED指示
UpdateLED();
// 延时并更新计时
delay_ms(1);
lastCheckTime++;
if (!isCharging) {
ledBlinkTime++;
}
}
}
四、制作步骤
4.1 准备工作
-
工具准备:
- 电烙铁
- 焊锡丝
- 烙铁架
- 剥线钳
- 剪线钳
- 螺丝刀
- 万用表
-
材料准备:
- 按照组件清单购买所有电子元件
- 准备洞洞板或制作PCB
- 准备连接线和杜邦线
4.2 电路板制作
-
设计布局:
- 在洞洞板上规划各组件的位置
- 考虑信号流向和干扰最小化
- 留出足够的空间用于调试
-
焊接组件:
- 先焊接低矮的组件(电阻、电容)
- 再焊接较高的组件(芯片座、三极管)
- 最后焊接连接器和开关
4.3 组件连接
-
单片机最小系统:
- 焊接STC89C52芯片或芯片座
- 连接晶振和复位电路
- 连接电源和地线
-
电流检测电路:
- 焊接LM358运放
- 连接采样电阻和相关电阻电容
- 连接信号输出到单片机
-
开关控制电路:
- 焊接TIP122三极管
- 连接基极电阻和续流二极管
- 连接电源输入和输出
-
电源电路:
- 焊接7805稳压模块
- 连接输入和输出电容
- 连接电源指示LED
4.4 代码烧录
-
准备烧录工具:
- USB-TTL转换器
- 烧录软件(STC-ISP)
- 连接线缆
-
烧录步骤:
- 安装STC-ISP软件
- 选择正确的芯片型号(STC89C52RC)
- 加载编译好的HEX文件
- 连接USB-TTL到单片机
- 点击下载按钮,然后给电路板上电
4.5 测试与调试
-
电源测试:
- 测量各点电压是否正常
- 检查是否有短路或过热现象
-
电流检测测试:
- 连接一个已知负载(如手机充电器)
- 测量采样电阻两端的电压
- 调整程序中的阈值参数
-
功能测试:
- 连接充电器和充电设备
- 观察LED是否正确指示充电状态
- 测试开关是否能正确控制电源
-
稳定性测试:
- 长时间运行测试
- 测试不同负载下的性能
- 测试无负载自动关闭功能
五、调试技巧
5.1 常见问题及解决方案
-
电流检测不准确:
- 检查采样电阻的精度
- 调整运放的放大倍数
- 校准ADC读数
- 增加滤波电容
-
开关控制不稳定:
- 检查三极管的散热
- 增加基极电阻
- 检查续流二极管是否正确连接
-
系统不稳定:
- 检查电源稳定性
- 增加去耦电容
- 优化布线减少干扰
5.2 参数调整
-
电流阈值调整:
- 根据实际使用的充电器调整CURRENT_THRESHOLD值
- 小功率充电器可能需要降低阈值
-
无负载时间调整:
- 根据需要调整NO_LOAD_TIME值
- 延长时间可避免频繁开关,缩短时间可更快关闭电源
-
检测间隔调整:
- 根据需要调整CHECK_INTERVAL值
- 增加间隔可减少功耗,减小间隔可提高响应速度
六、使用说明
6.1 连接方式
- 输入端:连接到交流电源插座
- 输出端:连接到充电器的电源插头
- 充电设备:连接到充电器
6.2 LED状态指示
- LED常亮:表示正在充电
- LED闪烁:表示待机状态,无设备充电
- LED熄灭:表示系统未工作或出现故障
6.3 注意事项
-
安全用电:
- 处理交流电源时请注意安全
- 确保开关的额定电流大于充电器的最大电流
- 建议使用带绝缘外壳的成品
-
使用环境:
- 避免在高温、潮湿的环境中使用
- 避免阳光直射和灰尘积累
- 保持通风良好
-
维护保养:
- 定期检查连接线和焊点
- 清理电路板上的灰尘
- 检查采样电阻是否过热
七、扩展功能
7.1 增加显示功能
-
添加LCD显示:
- 连接1602或2004LCD显示屏
- 显示电流、电压和充电时间
- 增加用户交互界面
-
添加数码管显示:
- 连接4位或8位数码管
- 显示充电电流或时间
- 简化显示电路
7.2 增加保护功能
-
过流保护:
- 增加过流检测电路
- 在程序中添加过流保护逻辑
- 当电流超过阈值时自动关闭
-
过热保护:
- 添加温度传感器(如DS18B20)
- 在程序中添加过热保护逻辑
- 当温度超过阈值时自动关闭
-
短路保护:
- 增加短路检测电路
- 快速响应短路情况
- 保护系统和充电设备
7.3 增加通信功能
-
添加串口通信:
- 利用单片机的串口功能
- 连接到电脑或其他设备
- 实现数据监控和参数调整
-
添加无线通信:
- 添加nRF24L01无线模块
- 实现远程监控和控制
- 连接到智能家居系统
八、总结
本方案提供了一个基于STC89C52单片机的智能充电控制单元的完整设计和制作指南。通过合理选择低成本组件和优化电路设计,总成本可以控制在15-20元以内。该方案具有以下特点:
- 低成本:使用STC89C52单片机和常见元件,成本低廉
- 易制作:电路简单,适合初学者制作
- 功能完整:实现了充电检测和电源控制的核心功能
- 可扩展:预留了扩展接口,可根据需要增加功能
通过这个项目,您可以学习到单片机编程、电路设计、焊接技术和调试技巧等知识,是一个很好的电子制作入门项目。同时,这个智能充电控制单元也具有实用价值,可以帮助您节省能源,延长充电器的使用寿命。
希望本方案对您有所帮助,祝您制作成功!
STC89C52智能充电控制系统
8045

被折叠的 条评论
为什么被折叠?



