单片机在控制方面不仅可以在工业控制方面大展神通,如果用在控制一些很有意思的芯片方面也可以实现实用的功能。比如用单片机控制冲电芯片实现手机的智能充电器设计,基于次参考有关资料学习了基于MAX1898的智能充电器设计。
主要器件:
1、 AT89C52单片机芯片,用于控制充电器芯片。
2、 可提供精确的恒流/恒压充电,可对所有化学类型的Li+电池进行安全充电的MAX1898。
3、 LM7805提供稳定的+5v电压。
试验流程图:
试验电路图:
试验程序代码:
//BattCharger.h程序
#ifndef _BATTCHARGER_H // 防止BattCharger.h被重复引用
#define _BATTCHARGER_H
#include
#define uchar unsigned char
#define uint unsigned int
sbit GATE = P2^0;
sbit BP = P2^1;
uint t_count,int0_count;
#endif
//BattCharger.c程序
#include "BattCharger.h"
/* 定时器0中断服务子程序 */
void timer0() interrupt 1 using 1
{
TR0 = 0; // 停止计数
TH0 = -5000/256; // 重设计数初值
TL0 = -5000%256;
t_count++;
if (t_count>600) // 第一次外部中断0产生后3s
{
if (int0_count==1) // 还没有出现第二次外部中断0,则认为充电完毕
{
GATE = 0; // 关闭充电电源
BP = 0; // 打开蜂鸣器报警
}
else // 否则即是充电出错
{
GATE = 1;
BP = 1;
}
ET0 = 0; // 关闭T0中断
EX0 = 0; // 关闭外部中断0
int0_count = 0;
t_count = 0;
}
else
TR0 = 1; // 启动T0计数
}
/* 外部中断0服务子程序 */
void int0() interrupt 0 using 1
{
if (int0_count==0)
{
TH0 = -5000/256; // 5ms定时
TL0 = -5000%256;
TR0 = 1; // 启动定时/计数器0计数
t_count = 0; // 产生定时器0中断的计数器清零
}
int0_count++;
}
/* 初始化 */
void init()
{
EA = 1; // 打开CPU中断
PT0 = 1; // T0中断设为高优先级
TMOD = 0x01; // 模式1,T0为16位定时/计数器
ET0 = 1; // 打开T0中断
IT0 = 1; // 外部中断0设为边沿触发
EX0 = 1; // 打开外部中断0
GATE = 1; // 光耦正常输出电压
BP = 1; // 关闭蜂鸣器
int0_count = 0; // 产生外部中断0的计数器清零
}
void main()
{
/* 调用初始化函数 */
init();
/* 无限循环 */
while(1);
}