找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12758|回复: 17
打印 上一主题 下一主题
收起左侧

51单片机锂电池均衡测试仪的制作 附源程序原理图PCB bms保护板供电

  [复制链接]
跳转到指定楼层
楼主
基于51单片机的锂电池充电相关制作分享
可以用于16Sbms保护板的均衡测试,及供电。总电压为52.4V.可以为16节的BMS供电及测试均衡。

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)



制作出来的实物图如下:

成品:


单片机源程序如下:
  1. #include <REG52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char           
  4. sbit key1=P1^0;                                          //手动启动,自动,停止
  5. sbit key2=P1^1;                                          //上一节
  6. sbit key3=P1^2;                                     //下一节
  7. sbit JKpower=P1^4;                                //继电器供电
  8. sbit beep=P1^5;                                        //蜂鸣器
  9. sbit LED_stop=P3^2;                                //停止状态灯
  10. sbit LED_manual=P3^3;                        //手动模式状态灯
  11. sbit LED_auto=P3^4;                                //自动模式状态灯
  12. uchar mode=0;                                        //停止=0,手动=1,自动=2
  13. uchar current_cell=1,num,ms_20=0,second=0,time_flag=0;                                    
  14. void keyscan();        
  15. void delayms(uint xms)                //延时xms毫秒
  16. {
  17.         uint i,j;
  18.         for(i=xms;i>0;i--)
  19.                 for(j=110;j>0;j--);
  20. }
  21. void init()                                   //初始化
  22. {
  23.         JKpower=1;
  24.         P0=0x00;
  25.         P2=0x00;
  26.         delayms(100);
  27.         JKpower=0;
  28.         EA=1;
  29.         ET0=1;
  30.         TMOD=0x01;
  31.         TH0=(65536-50000)/256;
  32.         TL0=(65536-50000)%256;
  33.         beep=0;
  34.         delayms(500);
  35.         beep=1;                                   
  36. }

  37. void main()                                         
  38. {
  39.         init();
  40.         while(1)
  41.         {        
  42.                 keyscan();                    //调用按键扫描子程序
  43.                 if(mode==0)                        //停止状态
  44.                 {
  45.                         LED_stop=0;LED_manual=1;LED_auto=1;        //状态灯
  46.                         P0=0x00; P2=0x00;                                        //继电器都不通电
  47.                 }
  48.                  if(mode==1)                        //手动状态
  49.                 {
  50.                         LED_stop=1;LED_manual=0;LED_auto=1;        //状态灯
  51.                         switch(current_cell)
  52.                         {
  53.                                 case 1: P0=0x01; P2=0x00;break;
  54.                                 case 2: P0=0x02; P2=0x00;break;
  55.                                 case 3: P0=0x04; P2=0x00;break;
  56.                                 case 4: P0=0x08; P2=0x00;break;
  57.                                 case 5: P0=0x10; P2=0x00;break;
  58.                                 case 6: P0=0x20; P2=0x00;break;
  59.                                 case 7: P0=0x40; P2=0x00;break;
  60.                                 case 8: P0=0x80; P2=0x00;break;
  61.                                 case 9: P0=0x00; P2=0x01;break;
  62.                                 case 10: P0=0x00; P2=0x02;break;
  63.                                 case 11: P0=0x00; P2=0x04;break;
  64.                                 case 12: P0=0x00; P2=0x08;break;
  65.                                 case 13: P0=0x00; P2=0x10;break;
  66.                                 case 14: P0=0x00; P2=0x20;break;
  67.                                 case 15: P0=0x00; P2=0x40;break;
  68.                                 case 16: P0=0x00; P2=0x80;break;
  69.                         }
  70.                         delayms(200);
  71.                 }
  72.                 if(mode==2)                   //自动状态
  73.                 {
  74.                         LED_stop=1;LED_manual=1;LED_auto=0;        //状态灯
  75.                         if(time_flag==1)
  76.                         {
  77.                                 current_cell++;
  78.                                 time_flag=0;
  79.                                 if(current_cell>16)                        //16节自动均衡结束后关定时器,拉低继电器IO口,响蜂鸣器1秒
  80.                                 {
  81.                                         TR0=0;
  82.                                         mode=0;
  83.                                         current_cell=0;
  84.                                         P0=0x00;P2=0x00;
  85.                                         beep=0;
  86.                                         delayms(1000);
  87.                                         beep=1;
  88.                                 }
  89.                         }
  90.                         switch(current_cell)
  91.                         {
  92.                                 case 1: P0=0x01; P2=0x00;break;
  93.                                 case 2: P0=0x02; P2=0x00;break;
  94.                                 case 3: P0=0x04; P2=0x00;break;
  95.                                 case 4: P0=0x08; P2=0x00;break;
  96.                                 case 5: P0=0x10; P2=0x00;break;
  97.                                 case 6: P0=0x20; P2=0x00;break;
  98.                                 case 7: P0=0x40; P2=0x00;break;
  99.                                 case 8: P0=0x80; P2=0x00;break;
  100.                                 case 9: P0=0x00; P2=0x01;break;
  101.                                 case 10: P0=0x00; P2=0x02;break;
  102.                                 case 11: P0=0x00; P2=0x04;break;
  103.                                 case 12: P0=0x00; P2=0x08;break;
  104.                                 case 13: P0=0x00; P2=0x10;break;
  105.                                 case 14: P0=0x00; P2=0x20;break;
  106.                                 case 15: P0=0x00; P2=0x40;break;
  107.                                 case 16: P0=0x00; P2=0x80;break;
  108.                         }
  109.                 }
  110.         }
  111. }

  112. void keyscan()
  113. {
  114.         if(key1==0&&mode==0)        //停止状态下按下启动和停止键
  115.         {
  116.                 delayms(5);
  117.                 if(key1==0)
  118.                 {
  119.                         while(!key1);
  120.                         mode=1;
  121.                         current_cell=1;
  122.                         beep=0;
  123.                         delayms(50);
  124.                         beep=1;        
  125.                 }
  126.         }
  127.         if(key1==0&&mode==1)        //手动状态下按下启动和停止键
  128.         {
  129.                 delayms(5);
  130.                 if(key1==0)
  131.                 {
  132.                         while(!key1);
  133.                         mode=2;
  134.                         current_cell=1;
  135.                         beep=0;
  136.                         delayms(50);
  137.                         beep=1;
  138.                         TR0=1;
  139.                 }
  140.         }
  141.         if(key1==0&&mode==2)        //自动状态下按下启动和停止键
  142.         {
  143.                 delayms(5);
  144.                 if(key1==0)
  145.                 {
  146.                         while(!key1);
  147.                         mode=0;
  148.                         current_cell=1;
  149.                         TR0=0;
  150.                         beep=0;
  151.                         delayms(50);
  152.                         beep=1;                                
  153.                 }
  154.         }
  155.         if(key3==0&&mode==1)        //手动状态下按“下一节”键
  156.         {
  157.                 delayms(5);
  158.                 if(key3==0)
  159.                 {
  160.                         while(!key3);
  161.                         current_cell++;
  162.                         if(current_cell>16)
  163.                                 current_cell=1;
  164.                         beep=0;
  165.                         delayms(50);
  166.                         beep=1;
  167.                 }
  168.         }
  169.         if(key2==0&&mode==1)        //手动状态下按“上一节”键
  170.         {
  171.                 delayms(5);
  172.                 if(key2==0)
  173.                 {
  174.                         while(!key2);
  175.                         current_cell--;
  176.                         if(current_cell<1)
  177.                                 current_cell=16;
  178. ……………………

  179. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
原理图及pcb图纸.rar (9.43 MB, 下载次数: 271)
程序.rar (27.71 KB, 下载次数: 199)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏34 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:503203 发表于 2021-1-27 13:14 | 只看该作者
666,做的可以,还有外壳
回复

使用道具 举报

板凳
ID:880257 发表于 2021-2-8 09:10 | 只看该作者
牛叉的!
回复

使用道具 举报

地板
ID:880257 发表于 2021-2-8 09:10 | 只看该作者
很有技术内涵!
回复

使用道具 举报

5#
ID:147106 发表于 2021-2-20 13:42 | 只看该作者
支持一下,我也是做锂电池保护板的
回复

使用道具 举报

6#
ID:466474 发表于 2021-6-19 17:37 | 只看该作者
膜拜大佬,看一下参考
回复

使用道具 举报

7#
ID:210978 发表于 2021-8-2 15:11 | 只看该作者
请问一下,停止、手动、自动指示灯好像没有看到相关电路。谢谢
回复

使用道具 举报

8#
ID:896794 发表于 2021-8-4 16:55 | 只看该作者
有电感试的吗
回复

使用道具 举报

9#
ID:292518 发表于 2021-8-7 07:59 | 只看该作者

牛叉的!
666,做得漂亮,还有外壳
回复

使用道具 举报

10#
ID:317571 发表于 2021-8-9 14:39 | 只看该作者
板子很漂亮
回复

使用道具 举报

11#
ID:586915 发表于 2022-5-20 09:11 | 只看该作者
疯了用继电器 你好歹也用固态继电器 或者电源管理芯片呀
回复

使用道具 举报

12#
ID:1049892 发表于 2022-10-31 14:29 | 只看该作者
牛叉,学习一下很有技术内涵!
回复

使用道具 举报

13#
ID:951974 发表于 2022-12-12 19:25 | 只看该作者
89C52RC带AD吗?我手上的好像不带AD呀
回复

使用道具 举报

14#
ID:33544 发表于 2023-4-13 15:03 | 只看该作者
我也在找锂电保护板的资料,正好学习一下
回复

使用道具 举报

15#
ID:33544 发表于 2023-4-20 11:13 | 只看该作者
改成三极管输出的板子就小多了
回复

使用道具 举报

16#
ID:57414 发表于 2023-4-20 17:34 | 只看该作者
怎么检测每节电池电压的?
回复

使用道具 举报

17#
ID:1034262 发表于 2023-9-9 21:24 | 只看该作者
锂电池均衡我现在用的是电容式的。
回复

使用道具 举报

18#
ID:1093842 发表于 2024-2-1 17:08 | 只看该作者

板子很漂亮
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表