数码之家

标题: 最省成本搞定笔记本电池解锁的分析,部分资料收集 [打印本页]

作者: 破天一见    时间: 2023-5-15 23:04
标题: 最省成本搞定笔记本电池解锁的分析,部分资料收集
只适合有一点续航需求的,像我这种在成都有时候给粉丝修法系车要用到检测仪,笔记本完全没电的话比较痛苦,并不适合笔记本当台式机在用的情况,没有必要修电池。

首先防患于未然,在没有完全坏时候及时换电芯。

然后,最好多并联两三组,直接固化在背面,一般有三个小时续航就行了,

当你的电池锁了后。一般就是cp2112解锁,最省成本就是洞洞板飞线直接买芯片自己焊接,或买成品板,现在二十多块钱。已经可以买了。

更好方案就是各种ev2300.2400山寨的,现在七八十块钱。

然后就是em2works4.52破解版就行。这个家元不够我还没有下。

通常拿回来cp2112立即把靠近供电那个电容夹掉,不用。原理懂得都懂。


然后只需要接出地线和sda scl线。


然后直接从低到高提前焊接好电池。

一般就是第二天找不到电池,解决方法,找到12-14v输出口,用外接电源或笔记本电池的电怼一下,就有识别了。

如果是烧了保护保险的,用别人帖子里经验或直接无视先恢复装好电池。先认出电池,有相关命令解锁不让自毁的mos启动。(这个等具体遇见再实践)

基本上不用买mos。除非真的坏了。烧毁保险并不是真的板子坏了。
解锁一般是学习命令行,有个网站英文的。适合一定基础的,(基本上就是能读但写不出解锁命令代码最终放弃了)

基本上几十块成本可以试一下。不行就不修了。

外挂4串16v或5串电池直接给笔记本通电,
或者12v升压18v模块,亲测电流不够不是很好用,但还是可以开机的,再配合外挂电池,检修外出用够了。


以上全部是搞着玩儿研究,正经修车修车量大直接用新电池
最后和我一起鄙视所有笔记本电池的保护设计。
部分资料收集。共享出来,谁有新的解锁软件可以私信发我344638286@qq.com
[attach]1824073[/attach]
[attach]1824074[/attach]
[attach]1824077[/attach]
[attach]1824078[/attach]
[attach]1824079[/attach]
[attach]1824086[/attach]
[attach]1824087[/attach]
[attach]1824088[/attach]
[attach]1824089[/attach]
[attach]1824090[/attach]

贴出部分资料,
[attach]1824076[/attach]只为探讨,
[attach]1824072[/attach]
最后图根本不需要那么贵
[attach]1824091[/attach]
只是他的软件可直接解锁比e2works好用,目前没找到同款。如果有找到同款,买个cp2112就行了,可以无视并不并联再换电池,让做电池的奸商挖的坑少害人。

目前为止正在找便宜的芯片。找到就用洞洞板飞线做。话说粮草未动,思想先行

作者: 破天一见    时间: 2023-5-15 23:07
家元-55不是我设置的啊,象征性10家元,找了一下午的资料完整版,可以直接飞线做不需要板子,
作者: 破天一见    时间: 2023-5-15 23:18
这是我准备研究的电池。大概就是新笔记本,d257上网本,用了两次,觉得屏幕小放了10年,然后这两天翻出来换成固态,想做个法系专修电脑,2g内存换4g和8g根本点不亮,固态换上前几天才修复的放了一年的神储as2258点序主控,

啥都能用,就是电池最开始几分钟显示18%充电,然后0%,已接通,正在充电一直0%

然后电池发现漏液和没电坏了,前两天如果直接换好电芯也行不需要解锁,

然后并联上测试电芯,,一直显示未充电,,

逃不过的命运,被迫走上学修电池的路,有家元估计下吗


作者: ww5223017240    时间: 2023-5-16 00:05
我觉得吧换电芯解锁啥的不算最难的,最难的是怎么修复外壳
作者: csbestwish    时间: 2023-5-16 00:15
资料不少,楼主辛苦了!谢谢分享!
作者: 破天一见    时间: 2023-5-16 00:20
ww5223017240 发表于 2023-5-16 00:05
我觉得吧换电芯解锁啥的不算最难的,最难的是怎么修复外壳

没发觉多少破坏啊,多拆几个就有了
作者: 骠佧    时间: 2023-5-16 07:22
用烂两个笔记本了,没出过电池锁的问题
作者: m3132427    时间: 2023-5-16 09:55
不错收藏了肯定回用的到
作者: hzw6834    时间: 2023-5-16 10:53
可能会用得上,谢谢分享。
作者: zpkun    时间: 2023-5-16 11:34
最麻烦的感觉是密码,没有芯片的密码啥操作都做不下去
作者: xuyaz    时间: 2023-5-18 07:52
好多外壳难无损拆开
作者: 破天一见    时间: 2023-5-21 13:58
能实现smbus协议的芯片或板子,听说用stc15w104和tm1861就能模拟?

目前还没有买到合适的cp2112,准备找替代芯片。

有知道相关芯片能实现smbus的,麻烦说一下型号。

帖子有1000个浏览量了,都只学经验看了不说?下次我也跟着做
作者: snake007    时间: 2023-5-22 15:43
一直想学,楼主最好整个懒人包,手把手教。
作者: hongo    时间: 2023-5-22 20:58
网站的手续费很高
作者: 破天一见    时间: 2023-5-28 16:09
snake007 发表于 2023-5-22 15:43
一直想学,楼主最好整个懒人包,手把手教。

没有包,电芯还没有找到合适的,就不急解锁了,还停留在买cp2112芯片回来自己飞线阶段,麻蛋乱写价的太多了,芯片单独敢写35一个,慢慢找吧,,有这些的私信了都不发出来或者已读不回或不在线。也不能强人所难做不愿意的事情。
作者: 破天一见    时间: 2023-5-28 16:09
hongo 发表于 2023-5-22 20:58
网站的手续费很高

网站手续费确实不利于交流。一起去反应一下
作者: zzbinfo    时间: 2023-5-29 15:59
资料罗列的很多,不过关键的软件、芯片资料和解密指令意义等都太少了。个人操作还是很有风险的。如果只是玩玩,还是用单片机模拟SMBUS,跟上位机通过串口通讯来的简单。资料太少,可操作性太差是维修电池不成功的关键。
作者: 破天一见    时间: 2023-5-29 16:07
zzbinfo 发表于 2023-5-29 15:59
资料罗列的很多,不过关键的软件、芯片资料和解密指令意义等都太少了。个人操作还是很有风险的。如果只是玩 ...

通讯软件应该好找,就是单片机模拟smbus还不会。最接近能操作的就是stc15f104w加tm1651,但是没有固件,,,没软件搞不了,我看他们讨论是stc和tm之间只需要三根线,而1651怎么接没人说,也许tm1650,和stc15w104s也能用
作者: zzbinfo    时间: 2023-5-29 16:21
破天一见 发表于 2023-5-29 16:07
通讯软件应该好找,就是单片机模拟smbus还不会。最接近能操作的就是stc15f104w加tm1651,但是没有固件, ...

tm1651只是个显示,其实我们就是用上位机直接通讯控制就行。我这里有能用的stc15w104的代码,网上也有https://github.com/laszlodaniel/SmartBatteryHack 可以参考
作者: zzbinfo    时间: 2023-5-29 16:29
鉴于很多网友没有足够的积分下载,我试试直接把代码贴到这里,这个是我测试通过的,用stc15F104E读取电量信息,电压信息等。主要还是要知道芯片的一些寄存器地址才能操作。
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15Fxx 系列 软件模拟串口举例----------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
  7. /* --- Web: www.STCMCU.com --------------------------------------------*/
  8. /* --- Web: www.GXWMCU.com --------------------------------------------*/
  9. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
  10. /* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
  11. /*---------------------------------------------------------------------*/

  12. //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
  13. //若无特别说明,工作频率一般为11.0592MHz


  14. #include "reg51.h"
  15. #include <intrins.h>  //包含_nop_()函数定义的头文件
  16. #include<stdio.h>
  17. #include "math.h"
  18. #include<string.h>
  19. //-----------------------------------------
  20. //define baudrate const
  21. //BAUD = 65536 - FOSC/3/BAUDRATE/M (1T:M=1; 12T:M=12)
  22. //NOTE: (FOSC/3/BAUDRATE) must be greater then 98, (RECOMMEND GREATER THEN 110)

  23. //#define BAUD  0xF400                  // 1200bps [url=home.php?mod=space&uid=3057940]@[/url] 11.0592MHz
  24. //#define BAUD  0xFA00                  // 2400bps @ 11.0592MHz
  25. //#define BAUD  0xFD00                  // 4800bps @ 11.0592MHz
  26. #define BAUD  0xFE80                  // 9600bps @ 11.0592MHz
  27. //#define BAUD  0xFF40                  //19200bps @ 11.0592MHz
  28. //#define BAUD  0xFFA0                    //38400bps @ 11.0592MHz

  29. //#define BAUD  0xEC00                  // 1200bps @ 18.432MHz
  30. //#define BAUD  0xF600                  // 2400bps @ 18.432MHz
  31. //#define BAUD  0xFB00                  // 4800bps @ 18.432MHz
  32. //#define BAUD  0xFD80                  // 9600bps @ 18.432MHz
  33. //#define BAUD  0xFEC0                  //19200bps @ 18.432MHz
  34. //#define BAUD    0xFF60                //38400bps @ 18.432MHz

  35. //#define BAUD  0xE800                  // 1200bps @ 22.1184MHz
  36. //#define BAUD  0xF400                  // 2400bps @ 22.1184MHz
  37. //#define BAUD  0xFA00                  // 4800bps @ 22.1184MHz
  38. //#define BAUD  0xFD00                  // 9600bps @ 22.1184MHz
  39. //#define BAUD  0xFE80                  //19200bps @ 22.1184MHz
  40. //#define BAUD  0xFF40                  //38400bps @ 22.1184MHz
  41. //#define BAUD  0xFF80                  //57600bps @ 22.1184MHz

  42. sfr AUXR = 0x8E;
  43. sbit RXB = P3^0;                        //define UART TX/RX port
  44. sbit TXB = P3^1;

  45. typedef bit BOOL;
  46. typedef unsigned char BYTE;
  47. typedef unsigned int WORD;
  48. #define uchar unsigned char
  49. #define uint unsigned int
  50. #define ulong unsigned long
  51. #define MAX_SIZE  32  //定义缓存空间


  52. BYTE TBUF,RBUF;
  53. BYTE TDAT,RDAT;
  54. BYTE TCNT,RCNT;
  55. BYTE TBIT,RBIT;
  56. BOOL TING,RING;
  57. BOOL TEND,REND;

  58. void UART_INIT();
  59. void putchar0(BYTE dat);
  60. uchar SMbus_GetCrc8(uchar previous,uchar dat);
  61. uchar PEC_cal(uchar pec[],uchar n);
  62. void Delay30us();
  63. void Delay200us();
  64. void Delay15us();
  65. void AT24C04_Start();
  66. void AT24C04_Stop();
  67. void AT24C04_SendACK(bit ack);
  68. bit AT24C04_RecvACK();
  69. void AT24C04_SendByte(uchar dat);
  70. uchar AT24C04_RecvByte();
  71. bit AT24C04_ReadPage(uchar adress,bit IsBlock);
  72. void AT24C04_WritePage(uchar address,uchar dat[],uchar len);

  73. BYTE t, r;

  74. sbit SDA=P3^2;        //数据接口
  75. sbit SCL=P3^3;           //时钟接口
  76. uchar  Receive_Buffer[MAX_SIZE]=0;      //接收数据缓冲区
  77. uchar  Buf_Index;
  78. uchar  BUF[MAX_SIZE]={0};                   //数据缓存区        idata


  79. uchar  a_SM_PecTable[16]={0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D};
  80. /***********************************************
  81. 函数名称: SMbus_GetCrc8
  82. 函数功能: 计算CRC的值
  83. 输入参数: previous,上一个数据的CRC值,用于多个数据的CRC运算,
  84.                                                 单个CRC运算无作用,值要设成0
  85. 输出参数:  CRC8
  86. 备                注:
  87. ***********************************************/
  88. uchar SMbus_GetCrc8(uchar previous, uchar  dat)
  89. {
  90.         uchar crc=0;
  91.         crc = 0;
  92.   dat = previous ^ dat;
  93.   crc = (crc << 4) ^ a_SM_PecTable[((crc ^ dat) >> 4) & 0x0F];
  94.   dat <<= 4;//准备下一个位域,域宽4
  95.   crc = (crc << 4) ^ a_SM_PecTable[((crc ^ dat) >> 4) & 0x0F];
  96.   return crc;
  97. }

  98. uchar PEC_cal(uchar pec[],uchar n)
  99. {
  100.            uchar crc=0;
  101.            uchar i;
  102.            for(i=0;i<n;i++)
  103.                 {
  104.                  crc = SMbus_GetCrc8(crc,pec[i]);
  105.                 }
  106.                 return crc;
  107. }
  108. /**************************************
  109. 向AT24C04写1页(16字节)数据
  110. 将TESTDATA开始的16个测试数据写如设备的00~0F地址中
  111. **************************************/
  112. void AT24C04_WritePage(uchar address,uchar dat[],uchar len)
  113. {
  114.     uchar i,pec[MAX_SIZE];
  115.            pec[0]=0x16;;
  116.         pec[1]=address;
  117.     AT24C04_Start();            //起始信号
  118.         AT24C04_Stop();             //停止信号
  119.         AT24C04_Start();
  120.     AT24C04_SendByte(0x16);     //发送设备地址+写信号
  121.     AT24C04_SendByte(address);     //发送存储单元地址
  122.     for (i=0; i<len; i++)
  123.     {
  124.         AT24C04_SendByte(dat[i]);
  125.                 pec[i+2]=dat[i];
  126.     }
  127.          AT24C04_SendByte(PEC_cal(pec,len+2));
  128.      AT24C04_Stop();             //停止信号
  129. }

  130. /**************************************
  131. 从电池中读取指定地址的数据到BUF中

  132. **************************************/
  133. bit AT24C04_ReadPage(uchar adress,bit IsBlock)
  134. {
  135.     uchar i,pec[MAX_SIZE],Pecreg,k;
  136.         uchar Num;
  137.     pec[0]=0x16;
  138.         pec[1]=adress;
  139.         pec[2]=0x17;
  140.     for (k=0; k<3; k++)
  141.     {         
  142.     AT24C04_Start();            //起始信号
  143.         AT24C04_Stop();             //停止信号
  144.         AT24C04_Start();
  145.     AT24C04_SendByte(0x16);     //发送设备地址+写信号
  146.     AT24C04_SendByte(adress);     //发送存储单元地址
  147.     AT24C04_Start();            //起始信号
  148.     AT24C04_SendByte(0x17);     //发送设备地址+读信号
  149.         BUF[0] = AT24C04_RecvByte();
  150.         AT24C04_SendACK(0); //回应ACK
  151.         if(IsBlock)
  152.           {
  153.           Num=BUF[0]+1;
  154.           }
  155.           else
  156.           {
  157.           Num=2;          
  158.           }
  159.         pec[3]=BUF[0];
  160.     for (i=1; i<Num+1; i++)
  161.     {
  162.         BUF[i] = AT24C04_RecvByte();
  163.                 pec[i+3]=BUF[i];
  164.         if (i == Num)
  165.         {
  166.             AT24C04_SendACK(1); //最后一个数据需要会NAK
  167.         }
  168.         else
  169.         {
  170.             AT24C04_SendACK(0); //回应ACK
  171.         }
  172.     }
  173.     AT24C04_Stop();             //停止信号
  174.            Pecreg=PEC_cal(pec,Num+3);
  175.         if(Pecreg==BUF[Num])
  176.          {
  177.           return 1;
  178.           break;
  179.          }
  180.    Delay30us();
  181.    }
  182.   return 0;
  183. }
  184. /**************************************
  185. 延时5微秒(STC12C5A60S2@12M)
  186. 不同的工作环境,需要调整此函数
  187. 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
  188. 实际延时有8us
  189. n=20 30us                        10khz
  190. **************************************/
  191. void Delay30us()                //@11.0592MHz           stc15F104E
  192. {
  193.         unsigned char i;

  194.         i = 80;
  195.         while (--i);
  196. }

  197. void Delay15us()                //@11.0592MHz
  198. {
  199.         unsigned char i;

  200.         _nop_();
  201.         _nop_();
  202.         i = 38;
  203.         while (--i);
  204. }

  205. void Delay200us()                //@11.0592MHz
  206. {
  207.         unsigned char i, j;

  208.         _nop_();
  209.         _nop_();
  210.         i = 3;
  211.         j = 34;
  212.         do
  213.         {
  214.                 while (--j);
  215.         } while (--i);
  216. }


  217. /**************************************
  218. 起始信号
  219. **************************************/
  220. void AT24C04_Start()
  221. {
  222.     Delay30us();//
  223.     SDA = 1;                    //拉高数据线
  224.         Delay30us();
  225.     SCL = 1;                    //拉高时钟线
  226.     Delay30us();                 //延时
  227.     SDA = 0;                    //产生下降沿
  228.     Delay30us();                 //延时
  229.     SCL = 0;                    //拉低时钟线
  230.         Delay30us(); //
  231. }

  232. /**************************************
  233. 停止信号
  234. **************************************/
  235. void AT24C04_Stop()
  236. {
  237.     Delay30us();//
  238.     SCL = 0;                  
  239.     Delay30us();
  240.     SDA = 0;                    //拉低数据线
  241.         Delay30us();
  242.     SCL = 1;                    //拉高时钟线
  243.     Delay30us();                 //延时
  244.     SDA = 1;                    //产生上升沿
  245.     Delay30us();                 //延时
  246. }

  247. /**************************************
  248. 发送应答信号
  249. 入口参数:ack (0:ACK 1:NAK)
  250. **************************************/
  251. void AT24C04_SendACK(bit ack)
  252. {
  253.     SDA = ack;                  //写应答信号
  254.         Delay30us();
  255.     SCL = 1;                    //拉高时钟线
  256.     Delay30us();                 //延时
  257.     SCL = 0;                    //拉低时钟线
  258.     Delay30us();                 //延时
  259. }


  260. /**************************************
  261. 接收应答信号
  262. **************************************/
  263. bit AT24C04_RecvACK()
  264. {       
  265.         bit Y;
  266.         Delay30us();
  267.         SDA = 1;   
  268.         Delay30us();         
  269.         SCL = 0;
  270.         Delay30us();
  271.     SCL = 1;                    //拉高时钟线
  272.     Delay30us();                 //延时
  273.     Y = SDA;                   //读应答信号
  274.         Delay30us(); //
  275.     SCL = 0;                    //拉低时钟线
  276.     Delay30us();                 //延时

  277.     return Y;
  278. }

  279. /**************************************
  280. 向IIC总线发送一个字节数据
  281. **************************************/
  282. void AT24C04_SendByte(uchar dat)
  283. {
  284.     uchar i;
  285.         Delay15us();
  286.     for (i=0; i<8; i++)         //8位计数器
  287.     {
  288.         if((dat<<i)&0x80)
  289.             SDA = 1;
  290.         else     //移出数据的最高位
  291.         SDA = 0;               //送数据口
  292.                 Delay15us();
  293.         SCL = 1;                //拉高时钟线
  294.         Delay30us();             //延时
  295.         SCL = 0;                //拉低时钟线
  296.         Delay15us();             //延时
  297.     }
  298.         i=0;
  299.         Delay200us();//block一定要延时200us才能正确返回
  300. while((AT24C04_RecvACK()==1)&&(i<250))
  301.         {
  302.      i++;
  303.          Delay15us();
  304.         }

  305. }

  306. /**************************************
  307. 从IIC总线接收一个字节数据
  308. **************************************/
  309. uchar AT24C04_RecvByte()
  310. {

  311.     uchar i;
  312.     uchar dat = 0;
  313.     SDA = 1;                    //使能内部上拉,准备读取数据
  314.         Delay15us();
  315.     for (i=0; i<8; i++)         //8位计数器
  316.     {
  317.         dat <<= 1;
  318.         SCL = 1;                //拉高时钟线
  319.         Delay15us();             //延时
  320.         dat |= SDA;             //读数据
  321.                 Delay15us(); //
  322.         SCL = 0;                //拉低时钟线
  323.         Delay30us();             //延时
  324.     }

  325.     return dat;
  326. }
  327. //

  328. void Check()
  329. {
  330. uchar i;
  331. uchar buffer[MAX_SIZE];
  332.   switch(Receive_Buffer[0])
  333.     {
  334.         case 0x72://        'r'查询状态
  335.           {
  336.           switch(Receive_Buffer[1])
  337.            {
  338.            case 0x21:
  339.            case 0x20:
  340.            case 0x22:
  341.            case 0x23:
  342.            case 0x2F:
  343.              {
  344.            if(AT24C04_ReadPage(Receive_Buffer[1],1))
  345.              {
  346.                   for(i=0;i<BUF[0]+2;i++)
  347.                     {
  348.                         putchar0(BUF[i]);
  349.                         }
  350.                   }else
  351.                       putchar0(0xee);                 
  352.                  }
  353.                  break;
  354.            default:
  355.             {
  356.            if(AT24C04_ReadPage(Receive_Buffer[1],0))
  357.              {
  358.                   for(i=0;i<3;i++)
  359.                     {
  360.                         putchar0(BUF[i]);
  361.                         }
  362.                   }else
  363.                       putchar0(0xee);
  364.                  }
  365.                  break;
  366.            }
  367.           }
  368.           break;
  369.    case 0x73:
  370.       {
  371.           switch(Receive_Buffer[1])
  372.            {
  373.            case 0x01:
  374.            case 0x02:
  375.            case 0x03:
  376.            case 0x04:
  377.            case 0x3C:
  378.            case 0x3D:
  379.            case 0x3E:
  380.            case 0x3F:
  381.                {
  382.                 memcpy(buffer,&Receive_Buffer[3],Receive_Buffer[2]);
  383.                 AT24C04_WritePage(Receive_Buffer[1],buffer,Receive_Buffer[2]);
  384.                     break;
  385.                    }
  386.           default :
  387.               {
  388.                    putchar0(0xee);
  389.                    break;
  390.                   }
  391.            }
  392.           }
  393.           break;
  394.         default :
  395.           break;
  396.         }

  397. }

  398. //

  399. void putchar0(BYTE dat)
  400. {

  401.   while (!TEND);
  402.   TEND = 0;
  403.   TBUF = dat;
  404.   TING = 1;
  405.   

  406. }

  407. /****************************************************************************
  408. 函数功能:uart0发送字符串数据
  409. 入口参数:*s
  410. 出口参数:
  411. ****************************************************************************/
  412. void puts0(char *s)
  413. {
  414.         while (*s)
  415.         {
  416.                 putchar0(*s);
  417.                 s++;
  418.         }
  419. }
  420. //

  421. void main()
  422. {
  423.     TMOD = 0x00;                        //timer0 in 16-bit auto reload mode
  424.     AUXR = 0x80;                        //timer0 working at 1T mode
  425.     TL0 = BAUD;
  426.     TH0 = BAUD>>8;                      //initial timer0 and set reload value
  427.     TR0 = 1;                            //tiemr0 start running
  428.     ET0 = 1;                            //enable timer0 interrupt
  429.     PT0 = 1;                            //improve timer0 interrupt priority
  430.     EA = 1;                             //open global interrupt switch

  431.     UART_INIT();

  432.     while (1)
  433.     {                                   //user's function
  434.         if (REND)
  435.         {
  436.             REND = 0;
  437.             //BUF[r++ & 0x0f] = RBUF;
  438.                         if(RBUF == 0x68)//0x68 作为帧头
  439.                           {
  440.                                   Buf_Index = 0;
  441.                           }else {
  442.                             Receive_Buffer[Buf_Index++ & 0x0f] = RBUF;
  443.                                 }

  444.                         if((Receive_Buffer[0]==0x72)&&(Buf_Index==2))
  445.               {
  446.                            Check();//
  447.                           }
  448.                         if((Receive_Buffer[0]==0x73)&&(Buf_Index==Receive_Buffer[2]+3))
  449.                    {
  450.                         Check();               //                                                                                                                                            
  451.                        }
  452.         }
  453.     }
  454. }

  455. //-----------------------------------------
  456. //Timer interrupt routine for UART

  457. void tm0() interrupt 1
  458. {
  459.     if (RING)
  460.     {
  461.         if (--RCNT == 0)
  462.         {
  463.             RCNT = 3;                   //reset send baudrate counter
  464.             if (--RBIT == 0)
  465.             {
  466.                 RBUF = RDAT;            //save the data to RBUF
  467.                 RING = 0;               //stop receive
  468.                 REND = 1;               //set receive completed flag

  469.             }
  470.             else
  471.             {
  472.                 RDAT >>= 1;
  473.                 if (RXB) RDAT |= 0x80;  //shift RX data to RX buffer
  474.             }
  475.         }
  476.     }
  477.     else if (!RXB)
  478.     {
  479.         RING = 1;                       //set start receive flag
  480.         RCNT = 4;                       //initial receive baudrate counter
  481.         RBIT = 9;                       //initial receive bit number (8 data bits + 1 stop bit)
  482.     }

  483.     if (--TCNT == 0)
  484.     {
  485.         TCNT = 3;                       //reset send baudrate counter
  486.         if (TING)                       //judge whether sending
  487.         {
  488.             if (TBIT == 0)
  489.             {
  490.                 TXB = 0;                //send start bit
  491.                 TDAT = TBUF;            //load data from TBUF to TDAT
  492.                 TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)
  493.             }
  494.             else
  495.             {
  496.                 TDAT >>= 1;             //shift data to CY
  497.                 if (--TBIT == 0)
  498.                 {
  499.                     TXB = 1;
  500.                     TING = 0;           //stop send
  501.                     TEND = 1;           //set send completed flag
  502.                 }
  503.                 else
  504.                 {
  505.                     TXB = CY;           //write CY to TX port
  506.                 }
  507.             }
  508.         }
  509.     }
  510. }

  511. //-----------------------------------------
  512. //initial UART module variable

  513. void UART_INIT()
  514. {
  515.     TING = 0;
  516.     RING = 0;
  517.     TEND = 1;
  518.     REND = 0;
  519.     TCNT = 0;
  520.     RCNT = 0;
  521. }

复制代码

作者: 破天一见    时间: 2023-5-29 16:30
zzbinfo 发表于 2023-5-29 16:21
tm1651只是个显示,其实我们就是用上位机直接通讯控制就行。我这里有能用的stc15w104的代码,网上也有htt ...

大佬关注了,看来有希望了,就是打不开,那就是不需要1651只做个stc代码也行是吧。
作者: zzbinfo    时间: 2023-5-29 16:35
破天一见 发表于 2023-5-29 16:30
大佬关注了,看来有希望了,就是打不开,那就是不需要1651只做个stc代码也行是吧。 ...

链接:https://pan.baidu.com/s/1dLRRg_f-ugW0P2TgsdErTg?pwd=isvq
提取码:isvq

打不开可以到我网盘下载
作者: 破天一见    时间: 2023-5-29 16:36
zzbinfo 发表于 2023-5-29 16:29
鉴于很多网友没有足够的积分下载,我试试直接把代码贴到这里,这个是我测试通过的,用stc15F104E读取电量信 ...

就是说假如芯片对应的不是bq8050,是其他bq系列,具体的设计的主板定义有轻微区别,还是不能直接用代码,

或者说stc,这个模拟smbus,是可以的,适合一个型号的电池量产出来批量生产同一款电池,换了别的电池就还得重新把代码里的一些参数修改,并不能直接用。

还是说,,别偷懒了直接用cp2112硬件模拟好了,跳过代码的痛苦,专心研究,be2works的指令更有效率是吧
作者: zzbinfo    时间: 2023-5-29 16:40
破天一见 发表于 2023-5-29 16:36
就是说假如芯片对应的不是bq8050,是其他bq系列,具体的设计的主板定义有轻微区别,还是不能直接用代码, ...

如果是be2work支持的芯片,那用cp2112+be2work当然是最好的,少走弯路。我之前的是正好这个软件不支持我的芯片,芯片是企业定制的,那就只能自己找资料,照着数据手册,对寄存器进行读写。stc的这个代码是通用的,你只要能找到芯片的数据手册,照着寄存器应该都是能读写的。
作者: 破天一见    时间: 2023-5-29 16:41
zzbinfo 发表于 2023-5-29 16:35
链接:https://pan.baidu.com/s/1dLRRg_f-ugW0P2TgsdErTg?pwd=isvq
提取码:isvq


从零开始,我需要做的就是,买个你说的同款stc单片机然后编译代码,再用网盘的软件,就极有希望了
作者: zzbinfo    时间: 2023-5-29 16:42
破天一见 发表于 2023-5-29 16:41
从零开始,我需要做的就是,买个你说的同款stc单片机然后编译代码,再用网盘的软件,就极有希望了 ...

不用买同型号的单片机,你手上有啥型号就用啥型号就行。
作者: 破天一见    时间: 2023-5-29 16:42
be2works新一点的谁有,来个网盘?
作者: zzbinfo    时间: 2023-5-29 16:43
破天一见 发表于 2023-5-29 16:36
就是说假如芯片对应的不是bq8050,是其他bq系列,具体的设计的主板定义有轻微区别,还是不能直接用代码, ...

可以参考这个帖子。
作者: 破天一见    时间: 2023-6-6 15:48
目前厂家报价cp2112单独芯片要25,严重超过预算了。没法整了,等有人转手没有锁死pid的芯片板再研究吧。我买个还能救的电池大概10块钱,没办法这破芯片居然是雪糕刺客的价格。加上上网本内存和屏幕比较小,用得少,还有别的笔记本用,就先不搞了。
作者: tianduo123    时间: 2023-6-14 11:29
这儿都是高手,给你点赞并学习。
作者: CRIZYMAN123    时间: 2023-7-24 13:52
想自己恢复一个笔记本电脑电池,现在先四处学习,感谢楼主
作者: 免费的吧    时间: 2023-10-9 16:03
不知道楼主现在进行到什么阶段了,有了cp2112也要有最新的be2works 5.X版本
作者: loopback    时间: 2023-10-27 12:23
em2works4.52 好像需要这个解密码
作者: a295224872    时间: 2024-1-17 21:03

想自己恢复一个笔记本电脑电池
感谢楼主
作者: 1588858    时间: 2024-1-18 22:46

不知道楼主现在进行到什么阶段了,有了cp2112也要有最新的be2works 5.X版本
作者: 破天一见    时间: 2024-1-21 23:35
1588858 发表于 2024-1-18 22:46
不知道楼主现在进行到什么阶段了,有了cp2112也要有最新的be2works 5.X版本

没得软件,硬件小板焊接了,还没有通电,电池不够用,这个需要小的18650,。用外接电池代替了先用着。在忙别的
作者: o759    时间: 2024-1-23 16:00
ww5223017240 发表于 2023-5-16 00:05
我觉得吧换电芯解锁啥的不算最难的,最难的是怎么修复外壳

那互换一下心得咯。外壳我拆过几个,都做不到无损。总结出来的经验就是有使用毛巾包住再铁锤敲。斯文一点的办法就上台钳,也是暴力把外壳夹爆。一般都是超声波焊接的塑料外壳,找准结合的部位夹出一个破口之后插进刀片去切割。
作者: ww5223017240    时间: 2024-1-23 17:01
o759 发表于 2024-1-23 16:00
那互换一下心得咯。外壳我拆过几个,都做不到无损。总结出来的经验就是有使用毛巾包住再铁锤敲。斯文一点 ...

拆不难啊,台钳撬棒之类的总能弄开,要基本无损也不过是小心仔细点的事,问题是弄开以后怎么修复的问题,401胶水可能可以,但是时间久了还是会发白发脆之类的问题吧,颜控,修复的不好看的我宁愿不修买新的了
作者: kaojinni    时间: 2025-3-10 13:06
这个贴不赞,对不住贴主。
作者: kaojinni    时间: 2025-3-14 08:48
内容丰富,资料简单易懂。
作者: 水瓶座    时间: 2025-5-13 11:41
宏碁AS10D61笔记本电池 BQ20Z955主控再次来个电池成功解锁帖
https://www.mydigit.cn/forum.php ... amp;fromuid=1201931
(出处: 数码之家)
没家园无法购买观看




欢迎光临 数码之家 (https://www.mydigit.cn/) Powered by Discuz! X3.4