【毕业设计】13-基于单片机的锂电池管理系统(原理图+源码+仿真工程+论文+PPT)
摘要
电池管理系统的研究与开发应用都涉及到传感器技术,电气控制技术以及智能化控制技术。智能化控制技术是一门综合性的技术性学科,在当代的研究控制领域中也变得越发广泛。在本次设计基于动力锂电池管理系统的设计是一款具前沿科学的锂电池管理控制系统。本系统设计并实现,需要实现系统的电压、电流、温度检测功能。
需要对系统功能规划系统设计完成系统的硬件电路部分、软件编程部分、焊接组装部分、调试测试部分,最终完成本次论文的研究与设计。分别为系统研究背景分析了解当前电池管理方案了解,电池高效管理研发情况掌握当前最新的研发背景;根据功能对系统的方案进行分析确认系统的研发方案,并且对系统的元器件选择,确认传感器、主控芯片、电压、电流检测电路等;确认方案后对系统的硬件电路设计,对系统的各个子电路设计然后分配单片机资源;硬件电路设计然后对系统的软件部分编写,绘制系统程序设计总流程,程序进行模块化设计实现功能分区,再将各个功能驱动调用在主函数中;最后对系统的仿真调试调试,通过仿真软件验证测试,最终评估是否完成系统的设计预期功能。
系统在设计过程中充分考虑到了系统的稳定性和系统的抗干扰能力,是一款合格的动力锂电池管理系统。
研究基本内容
1.了解在以单片机为基础上的动力锂电池管理系统的研究目的、意义及研究现状;
2.利用单片机实动力电池电压、电流、温度检测的功能,并完成电路设计及仿真;
3.设计一套在以单片机为基础上的动力锂电池管理系统,完成相应管理功能;
拟解决的主要问题:
1.确定在以单片机为基础上的动力锂电池管理系统的基本框架及组成。
2.确定论文大致方向,围绕着安全、准确、绿色、节能、节耗、环保为中心,对以单片机为基础的动力锂电池管理系统查找资料文献和后期的论文进展做打算。
3.通过大量查阅资料,了解以单片机为基础的动力锂电池管理系统的主要构成部分,并针对其结构系统的学习每个分支知识点。
设计全套资料
原理图工程文件
源码工程
仿真工程
详细设计说明书,字数:27821。
答辩PPT
源码
sbit K1 = P3^5;//设置键
sbit K2 = P3^6;//加键
sbit K3 = P3^7;//减键
unsigned char pre_key = 0x0f;//记录按键状态
unsigned char key_value = 20;//获取到的按键值
#define DB P0//液晶并行数据接口
sbit RS = P1^2;//液晶指令数据信号
sbit RW = P1^3;//液晶读写信号
sbit E = P1^4;//液晶使能信号
unsigned char curr_menu = 0;//设置参数
unsigned char ucWd=1; //本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
unsigned char ucWd1Update=0; //窗口1更新显示标志
unsigned char ucWd2Update=0; //窗口2更新显示标志
unsigned char ucPart=0;//本程序的核心变量,局部显示变量。类似于二级菜单的变量。代表显示不同的局部。
unsigned char ucWd1Part1Update=0; //在窗口1中,局部1的更新显示标志
unsigned char ucWd1Part2Update=0; //在窗口1中,局部2的更新显示标志
unsigned char ucWd2Part1Update=0; //在窗口2中,局部1的更新显示标志
unsigned char ucWd2Part2Update=0; //在窗口2中,局部2的更新显示标志
unsigned char ucDpyTimeLock=0; //原子锁
unsigned int uiDpyTimeCnt=0; //数码管的闪烁计时器,放在定时中断里不断累加
unsigned char i;//循环变量
unsigned char cnt_100ms = 0,cnt_500ms =0;//100ms计数
unsigned char time_100ms_flag = 0;//100ms标志
unsigned char blank_flg;//闪烁标志
unsigned char blank_tim_cnt;//闪烁计数
sbit CS=P1^5;
sbit CLK=P1^6;
sbit DIO=P1^7;
unsigned int ad_val_a;
unsigned int ad_val_b;
unsigned int v_alarm_tl=40;// 欠压报警器值
unsigned int i_alarm_th=150;// 过流报警值
sbit v_alm=P2^0;//欠压显示灯
sbit i_alm=P2^1;//过流显示灯
void delay_ms(unsigned int cnt)//软件延时1MS
{
unsigned int x;
for( ; cnt>0; cnt--)//通过for循环执行空指令延时
{
for(x=110; x>0; x--);
}
}
void delay_us(unsigned int cnt)//软件延时1us
{
while(--cnt);
}
void time_init(void)//定时器初始化
{
TMOD |= 0x11;//time0 工作方式为1
TH0 = 0xf8;//装载初值
TL0 = 0x2f;//装载初值,为2ms(65535-63535)
TR0 = 1;//开启定时器
ET0 = 1;//打开中断
EA=1;//打开总中断
}
void key_scan(void)//
{
P3 |=0xf0;//P3高两位置高
if (pre_key==(P3&0xf0))return;//按键状态未改变时继续
pre_key = P3&0xf0;//保存当前最新按键状态
if (!K1)//获取第一个按键
{
delay_ms(10);
if(!K1)
{
key_value = 1;
}
}
if (!K2)//获取第二个按键
{
delay_ms(10);
if(!K2)
{
key_value = 2;
}
}
if (!K3)//获取第三个按键
{
delay_ms(10);
if(!K3)
{
key_value = 3;
}
}
}
void lcd_wri_com(unsigned char com)//LCD1602写入命令
{
E = 0;//使能清零
RS = 0;//选择写入命令
RW = 0;//选择写入
DB = com;//把数据送到液晶总线
delay_ms(1);//延时1ms
E = 1;//写入时序
delay_ms(5);//延时5ms
E = 0;
}
void lcd_wri_data(unsigned char dat)//LCD1602写入数据
{
E = 0;//使能清零
RS = 1;//选择写入数据
RW = 0;//选择写入
DB = dat;//把数据送到液晶总线
delay_ms(1);//延时1ms
E = 1;//写入时序
delay_ms(5);//延时5ms
E = 0;
}
void lcd_wri_str(unsigned char y,unsigned char x,unsigned char *p)//LCD1602写入字符串
{
if(y==1)//如果选择第一行
lcd_wri_com(0x80+x);//选中地址
else
lcd_wri_com(0xc0+x);//选中地址
while(*p)
{
lcd_wri_data(*p);//写入数据
p++;
}
}
void lcd_init(void)//LCD初始化子程序
{
lcd_wri_com(0x38);//置功能8位双行
lcd_wri_com(0x0c);//显示开关光标
lcd_wri_com(0x06);//字符进入模式屏幕不动字符后移
delay_ms(5);//延时5ms
lcd_wri_com(0x01); //清屏
}
void key_service(void)//按键设置显示函数
{
switch(ucWd)//在不同的窗口下,设置不同的参数
{
case 1:
{
switch(key_value) //按键服务状态切换
{
case 1://短按设置按键
{
ucPart=1; //
ucWd=2; //
ucWd2Update=1; //局部更新
}
key_value = 0;
break;
}
}
break;
case 2:
{
switch(key_value) //按键服务状态切换
{
case 1://短按设置按键
{
if (ucPart>0)
{
ucPart++;
if (ucPart>2)
{
ucPart=0; //
ucWd=1;
ucWd1Update=1; //窗口1更新显示
}
if (ucPart>1)
{
ucWd2Update=1; //局部更新
}
}
}
key_value = 0;
break;
case 2://加按键
{
switch(ucPart)
{
case 1:
{
if (++v_alarm_tl>40)//加
{
v_alarm_tl = 40;
}
}
break;
case 2:
{
if (++i_alarm_th>190)//加
{
i_alarm_th = 190;
}
}
break;
}
}
key_value = 0;
break;
case 3://减按键
{
switch(ucPart)
{
case 1:
{
if (--v_alarm_tl<10)
{
v_alarm_tl = 10;
}
}
break;
case 2:
{
if (--i_alarm_th<100)//减
{
i_alarm_th = 100;
}
}
break;
}
}
key_value = 0;
break;
}
}
break;
}
}