光genji 解散:自制单片机控制电瓶放电容量检测仪 - 1五湖四海1的日志 - 中国机械社区 - Power...
来源:百度文库 编辑:偶看新闻 时间:2024/05/01 21:53:45
自制单片机控制电瓶放电容量检测仪
热度 1已有 124 次阅读 2010-12-25 09:18
本人在2010年12月份开始制作单片机控制电瓶放电容量检测仪,经过半个月的努力完成了此项目。在其中遇到的问题数不胜数,但还是用时间和大量精力解决了现有问题。 工作原理:单片机控制放电容量检测仪是由单片机时钟控制电路,电子负载,单片机AD转换电压电流检测电路等组成。首先检测电瓶的当前电压,根据电压的大小判断电瓶是什么状态,如果小于10.5V说明已经放电结束,检测仪不能工作,当电压在充满电后方可开始准备工作,当按下按钮S后,启动信号输入单片机,单片机内部定时器开始计时,触发继电器开始吸合控制电子负载对电瓶进行放电。电子负载是利用控制场效应管的导通角实现恒流放电的。同时单片机AD转换检测电流电压然后送到单片机在通过数码管显示出来。当放电电压不足10.5V时,单片机控制内部定时器停止计时,并将结果锁存起来,通过数码管显示出来。 以下是电子负载的程序资料,原理图和实物图 ////////////2010.12.09.21:00///////////////////#include
#define uchar unsigned char
#define uint unsigned int
#define shum P0 //数码
#define saom P1 //数码扫描
char ddisp[4]={0,0,0,0};
char ddosp[4]={0,0,0,0};
char code DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar hour=0,min=0,sec=0,rou=0;
uchar deda=0;
bit d_05s=0;
uchar set=0;
void delay(uint k);
sbit out=P3^7;
sbit shut=P3^3;
sbit s=P3^0;
sbit P3_2=P3^2;/*-----------------------走时函数--------------------------*/
void init_timer()
{
TMOD=0x01;
TH0=(65536-12000)/256; //定时器采用定时4ms. 初值为12000
TL0=(65536-12000)%256;
IE=0x82;
}
/*-----------------------4ms定时中断服务函数--------------------------*/
void T0_srv(void) interrupt 1
{
TH0=(65536-12000)/256; //定时器采用定时4ms. 初值为12000
TL0=(65536-12000)%256;
deda++ ;
}
/*----------------------时,分,秒单元及走时单元转换-------------------------*/
void conv()
{
if(deda<=100)d_05s=0;
else d_05s=1;
if(deda>=250){sec++;deda=0;}
if(sec==60){min++;sec=0;}
if(min==60){hour++;min=0;}
if(hour==24){hour=0;}
rou=(sec+min*60)*5;
}void diyi()
{
ddisp[3]=min/10;
ddisp[2]=min%10;
ddisp[1]=sec/10;
ddisp[0]=sec%10;
}void dier()
{
ddisp[3]=rou/60/10;
ddisp[2]=rou/60%10;
ddisp[1]=rou%60/10;
ddisp[0]=rou%60%10;
}
/*-------------------走时时间显示函数部分-------------------------*/
void disp()
{ char j,scan; scan=0xf7;
for(j=0;j<4;j++)
{
shum=0xff;
saom=scan;
P0=DATA_7SEG[ddisp[j]];
delay(4);
scan>>=1;
}
}
void scan_key()
{
if(s==0)
{
delay(1);
if(s==0)
{
hour=0,min=0,sec=0;out=0;
TR0=1;
}
}
if(shut==1)
{
delay(1);
if(shut==1)
{
TR0=0;
out=1;
}
}
}
/*--------扫描按键函数--------*/
void jianpan()
{
delay(1);
if(P3_2==0)set++;
if(set>=2)set=0;
F0:if(P3_2==0)goto F0;
}/*--------延时函数-------------*/
void delay(uint k)
{
uint i,j;
for(i=0;j
for(j=0;j<120;j++);
}
}
/*-----------------主函数-------------------------------------*/
void main()
{
init_timer();
while(1)
{
scan_key(); if(P3_2==0)jianpan();
switch(set)
{
case 0:conv();diyi();disp();break;
case 1:conv();dier();disp();break;
default:break; } }
}// ADC0809模数转换
//ADC0809采样通道3输入的模拟量,转换后结果显示在数码管上
#include
#define uchar unsigned char
#define uint unsigned int
#define shum P1 //数码
#define saom P2 //数码扫描char code tab[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
char disp[4]={0,0,0,0};
//ADC0809引脚定义
sbit OE=P3^7;
sbit EOC=P3^1;
sbit ST=P3^5;
uchar i;
//延时
void delay(int x)
{
int i,j;
for(i=0;i
}
//显示转换结果
void display_led(int count2)//数码管模块
{char j,scan;
disp[3]=count2%10;
disp[2]=count2%100/10;
disp[1]=count2/100%10;
disp[0]=count2/1000;
scan=0xdf;
for(j=0;j<4;j++)
{
shum=0xff;
saom=scan;
P1=tab[disp[j]];
delay(4);
scan>>=1;
}
}
// 主程序
void main()
{ ST=1;
EOC=1;
OE=1;
//选择ADC0809通道3(0111)
//高4位设通道地址为0111
while(1)
{
ST=1;
ST=0;
for(i=0;i<1;i++);
ST=1;//启动转换
while(EOC==0); //等待转换结果
OE=0; //允许输出
display_led(P0); //显示A/D转换结果
OE=1; //关闭输出
}
}
用单片机检测控制液压系统
电动自行车的电瓶如何放电?
多大容量的电瓶
自制单片机仿真器
电瓶可以同时放电和存电
怎么用闪盘自制电脑检测仪
51单片机下载线自制
容量不一样的电瓶能不能串联使用
电瓶的充放电有一定的规律、可寻么 谢谢
单片机控制步进电机
单片机控制步进电机
用单片机控制电源开关
单片机输出控制问题
单片机 如何控制拨号上网
基于单片机的装甲车辆状态检测仪的设计
镍氢电池容量跟电池自然放电关系!
一般的温度控制仪里面都是采用单片机吗?
单片机89s51怎么自制下载线?
关于单片机下载线!怎样自制?
放电锰的检测方法和标准
单片机温度巡循控制
单片机如何控制步进电机
单片机能否实现PID控制?
设计单片机控制二极管发光