×
单片机 > 单片机程序设计 > 详情

基于MAX1898的智能充电器设计

发布时间:2020-05-30 发布时间:
|
单片机在控制方面不仅可以在工业控制方面大展神通,如果用在控制一些很有意思的芯片方面也可以实现实用的功能。比如用单片机控制冲电芯片实现手机的智能充电器设计,基于次参考有关资料学习了基于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);

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯