【毕业设计】13-基于单片机的锂电池管理系统(原理图+源码+仿真工程+论文+PPT)

【毕业设计】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;

                  }
}
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
单片机6位数电子密码锁源码设计是基于单片机控制的密码输入和判断功能,可以实现锁的开关与密码的设置与改变。以下是一个简单的实现过程: 1. 硬件设计:基于该密码锁的电路设计需要包括单片机、键盘接口、显示屏、驱动电路和电源等部分。通过合适的布局设计和连接设计,保证各个模块能够正常工作。 2. 软件设计:基于C语言的单片机编程,通过读取键盘输入、判断输入密码是否正确等操作来实现密码锁的功能。具体步骤如下: a. 初始化:初始化单片机及外设,设置初始密码。 b. 输入密码:通过键盘输入6位数的密码,存储在单片机中。 c. 验证密码:将输入的密码与单片机存储的密码进行比较。如果密码匹配,显示屏显示"密码正确"并打开锁;如果不匹配,显示屏显示"密码错误"并保持锁的关闭状态。 d. 改变密码:在验证密码成功后,可以进入密码修改模式,通过输入新的6位数密码并存储到单片机中来改变密码。 3. PCB设计:基于软件设计和电路要求,通过软件工具进行PCB设计,包括布局、走线、添加电源和连接电路、引脚复用等。确保PCB电路板能够正常工作。 4. 仿真原理图设计:在PCB设计完成后,可以通过仿真软件进行仿真原理图设计。该步骤可以验证原理图的正确性,并通过仿真结果来检查电路是否符合设计需求。 因为字数有限,这里只给出了基本的实现步骤,实际的实现可能还涉及到更多的细节和优化的设计。希望这个回答对您有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值