基于单片机的电动车电池充放电电量显示功能方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
___疯子鱼敬上
QQ:328292074
___疯子鱼敬上
QQ:328292074 LED显示:用4PCS 绿色LED显示,充电时电量显示分别是
40% 60% 80% 100%LED灯依次亮起,放电时通过
按键显示LED100% 80% 60% 40% 依次
熄灭,当电池电压在34V时20%LED 不停闪烁
(低压报警)到30V时熄灭。
总电压时42V
34V——20% 36V——40% 38V——60%
40V——80% 42V——100%
注:以下电路是模块电路,需要中间加一元件进行切换(充电与充电完成后切换"根据个人喜好加上相应的元件进行切换")
1:根据电压不同,555输出的频率与脉宽不同而设计,以下电路为理论上的电路,已通过仿真,元件根据自己调试的为准.
2.因555元件的电压输入范围在4-15V,因此根据分压原理把42-30V的电压分成在此范围内的电压(由图上R9与R11确定).
3.因输入电压不同,555输出频率不同,从而确定所检测电压的大小. EG:30V-----分压后----10V-----对应555频率----113HZ
___疯子鱼敬上
QQ:328292074
34V-----分压后----11.3V-----对应555频率----123HZ
36V-----分压后----12V-----对应555频率----127HZ
38V-----分压后----12.6V-----对应555频率----131HZ
40V-----分压后----13.3V-----对应555频率----135HZ
42V-----分压后----14V-----对应555频率----138HZ
放电时电路:
___疯子鱼敬上
QQ:328292074
充电时电路:
___疯子鱼敬上
QQ:328292074
程序代码:
#include<reg51.h> //用12M晶振
bit int_flag; //定时器0 1S到标志位
unsigned char volatile int_count; //定时器0中断次数
unsigned char volatile T1count; //定时器1中断次数
unsigned int LED_0 = 0;
sbit inpe = P1^1;
unsigned long sum; //1S内脉冲总个数
//软件延时
void delay(unsigned int cnt)
{
___疯子鱼敬上
QQ:328292074
while(--cnt);
}
//定时器0初始化
void init_t0(void)
{
TMOD=(TMOD&0xF0)||0x01; //定时器0工作于方式1
TH0=(65536-50000)/256; //定时50ms
TL0=(65535-50000)%256;
}
// 定时器1初始化
void init_t1(void)
{
TMOD=(TMOD&0x0F)|0x50; //timer 1 for count
TH1 =0x00;
TL1 =0x00;
}
//显示当放电时的状况
void disp(void)
{
if(sum <=113) //如果电压小于30V,LED(相对的LED)熄灭
{
P2=0xff;//取显示数据11111101
}
// else if((sum>113)&&(sum <=123) )//如果电压为34V时,LED不停的闪烁
else if((sum>113)&&(sum <124) )
{
P2=0x00;//取显示数据11111101
delay(1000);
P2 = 0xff;
delay(1000);
}
___疯子鱼敬上
QQ:328292074
// else if((sum>123)&&(sum <=127))//如果电压为36V时,LED(相对的LED)亮
else if((sum>126)&&(sum <128) )
{
P2=0xf9;//取显示数据11111001
}
// else if((sum>127)&&(sum <=131))//如果电压为38V时,LED(相对的LED)亮
else if((sum>130)&&(sum <132) )
{
P2=0xf1;//取显示数据11110001
}
//else if((sum>131)&&(sum <=135))//如果电压为40V时,LED(相对的LED)亮
else if((sum>134)&&(sum <136) )
{
P2=0xe1;//取显示数据11100001
}
//else if((sum>135)&&(sum <=138) )//如果电压为42V时,LED(相对的LED)亮
else if((sum>137)&&(sum <=138) )
{
P2=0xc1;//取显示数据11000001
}
else{;}
delay(1); //扫描间隙延时,根据单片机调整,延时1ms即可
//}
}
//////////////////////////////////////////////////////
void disp_on(void)//充电时的状况如果P1^0口为高电平时开始此模块
{
if(inpe == 0)
{
___疯子鱼敬上
QQ:328292074
P2=0xff;//取显示数据11111101
delay(1000);
P2=0xfd;//取显示数据11111101
delay(1000);
P2=0xf9;//取显示数据11111001
delay(1000);
P2=0xf1;//取显示数据11110001
delay(1000);
P2=0xe1;//取显示数据11100001
delay(1000);
P2=0xc1;//取显示数据11000001
delay(1000);
}
else //当检测到P1^1口为高电平时显示的LED都亮充电完毕进行放电检测
{
disp();
}
}
///////////////////////////////////////////////////////
void main (void)
{
EA=1; //开总中断
init_t0(); //初始化定时器
init_t1();
inpe = 1;
TR0=1; //定时器开始工作
TR1=0;
ET1=1;
ET0=1; //开T0中断
___疯子鱼敬上
QQ:328292074
while(1)
{
if(int_flag==1)
{
int_flag=0;
sum=TL1+TH1*256+T1count*65536; //计算1秒内的脉冲个数
int_count=0x00;
T1count=0;
TH1=0x00;
TL1=0x00;
TR1=1;
}
disp_on();
}
}
//定时器0中断服务程序
void int_t0(void) interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
int_count++;
if(int_count==20)
{
TR1=0;
int_flag=1;
int_count=0x00;
}
}
//定时器1中断服务程序
void int_t1(void) interrupt 3
{
T1count++;
___疯子鱼敬上
QQ:328292074
}
此方案由疯子鱼(QQ:328292074)进行设计与仿真,此为理论上的设计(因个人能力有限,存在错误还希望大家能告诉我),个人根据自己的实际需要可更改相关参数与程序.TKS!
____疯子敬上2012.6.25。