利用lm317进行恒流放电,lm358作为电压比较强来判断电池电压,通过单片机定时器统计放电时间,并自动转换为容量通过数码管显示出来,并且可以通过开关来切换放电速度,实现以每小时600ma或每小时240ma的不同速率放电。满足不同容量电池不同场合的使用。当电池放电到3v时自动断开放电电路,切换到充电电路。
单片机用的是at89c2051,也可以用stc的2051 4052之类的兼容的单片机,当然也可以使用最常见的stc89c51·52单片机,显示用的是四位共阳数码管,建议用四位一体的那种,可以省很多不必要的连线,我用的是两位一体的,板子后面线很乱,
![](http://img.mydigit.net/Mon_1212/108_3_0cb3215739021d8.jpg?60)
317恒流放电,358的一个比较器检测电压,第2脚和第6脚连在一起,通过旋转电位器来设定放电终止电压,建议设置在3v以上,另一个比较器作为数码管的延时开关,因为我们测电池容量是并不需要数码管一直亮着,所以加入这个电路后可以在按下显示键后一段时间后自动关闭数码管电源,节约电能,具体的延时长短可以通过调整电阻电容的值来实现,继电器的常闭触点是通过一个2.2欧的电阻和一个1n4007接到+5v电源上的,可以为带有保护板的锂电池充电,接入电池后按下启动键继电器上电自锁,单片机开始测试容量,当电压降到3v以下是自动断开放电电路,连接到充电电路上。
![](http://img.mydigit.net/Mon_1212/108_3_9df12e483c7b9c0.jpg?54)
元件貌似很多,实际上没几个
![](http://img.mydigit.net/Mon_1212/108_3_faef36f292ea056.jpg?53)
万能板出场,diy离不开它。。
![](http://img.mydigit.net/Mon_1212/108_3_1353f53b67a755a.jpg?55)
焊接完毕,
![](http://img.mydigit.net/Mon_1212/108_3_ed11d59a4d6e192.jpg?47)
调试成功,测试时有一个led会以1秒得周期闪烁,测试完成停止闪烁
![](http://img.mydigit.net/Mon_1212/108_3_c03f87a37d0cfad.jpg?36)
背面有点乱,还可以了,没画pcb直接开工焊接的
![](http://img.mydigit.net/Mon_1212/108_3_5f2eac6d121eb69.jpg?39)
下面有个小视频演示下
http://www.tudou.com/v/rggSQEb2avo/&%3brpid=78698299&%3bresourceId=78698299_05_05_99&%3bbid=05/v.swf
程序如下:
//51单片机,12M晶振
#include<reg51.h>
#define uint unsigned int
unsigned char int_time;
unsigned int s,m,ma;
sbit led0=P3^2;//第1个数码管
sbit led1=P3^3;//第2个数码管
sbit led2=P3^4;//第3个数码管
sbit led3=P3^5;//第4个数码管
sbit jiance=P3^0;//j启动检测
sbit gz=P3^7;//工作指示灯
sbit qiehuan=P3^1;//放电电流切换
unsigned char Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极的段码
void delay(uint z)//延时程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void interserve(void)interrupt 1 using 1//定时器中断
{
int_time++;
if(int_time==20)
{
int_time=0;
s++;
}
if(qiehuan==0)//以240ma电流放电
{
if(s==15)
{
s=0;
ma++;
}
}
if(qiehuan==1)//以600ma电流放电
{
if(s==6)
{
s=0;
ma++;
}
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void display()//显示程序
{
led0=led1=led2=led3=1;
P1=Tab[(ma%10000)/1000];
led0=0;
delay(5);
led0=led1=led2=led3=1;
P1=Tab[(ma%1000)/100];
led1=0;
delay(5);
led0=led1=led2=led3=1;
P1=Tab[(ma%100)/10];
led2=0;
delay(5);
led0=led1=led2=led3=1;
P1=Tab[ma%10];
led3=0;
delay(5);
}
void main(void)//主程序
{
TMOD=0X01;
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
int_time=0;
s=0;
while(1)
{
if (jiance==0)
EA=1;
display();
if (jiance==1)
EA=0;
if(s%2&jiance==0)
gz=0;
delay(10);
gz=1;
}
}