打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
自制单片机控制电瓶放电容量检测仪 - 1五湖四海1的日志 - 中国机械社区 - Power...

本人在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<k;i++)< p="">

{

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<x;i++)< p="">

for(j=1;j<120;j++);

}

//显示转换结果

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;  //关闭输出

}

}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
51单片机控制3位共阴数码管
怎样用keil编写4位数码管显示1234的程序
篮球计分器的设计与仿真
单片机电子广告牌系统设计(原理图+源程序+论文)
单片机入门-C51实现用TLC549模数转换用数码管设计电压表解说
89s52+ds1302电子钟
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服