dxw1234 发表于 2025-2-21 14:25

大有电池的事儿

买了个二手5401裸机,没配电池,本来也是打算玩儿,对于电池破解几个事情。
1:19年数码之家有破解,随机销声匿迹。
2:22年又有人破解了代码,说是用分析仪读出来的波形,用单片机做了个板子,接上就行了。代码我转帖在二楼,发帖的伙计早联系不上了。
3:有套件,45块,自己配电池组装。
4:有转接座儿,20块,但是似乎反应质量差点意思,其它品牌无协议的转接座7-10块,带协议的就19+。
5:我开始也没打算组电池,我的想法是做个通用电池包,用软线xt9接口插接连到设备上,不限于大有,家里电动工具全部用这一个,统一了。对于5401直接从根子上把控制板和开关换了,大概看了下电动工具都是电池过来2跟线到控制板,控制板输出3根线到电机,然后有一个8/9线的插座接到开关上,9线比8线多一个LED灯。
6:再议。

dxw1234 发表于 2025-2-21 14:26

#include <stc15F104e.h> #define DATAPIN P33 const char sequence={0,0,1,0,1,0,1,0,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,0,0};void Delay200us() //@5.5296MHz {         unsigned char i,j;         i=2;         j=29;         do         {               while(--j);         }         while(--i); }/*void Delay200ma() //@5.5296MHz {         unsigned char i,j,k;         i=5;         j=52;         k=195;         do         {               do               {                         while(--k);               }         while(--j);         }         while(--i); }*/void sendBit(char x) {         //start         DATAPIN=0;         Delay200us();         //send bit         DATAPIN=x;         Delay200us();         Delay200us();         //end         DATAPIN=1;         Delay200us(); }void Start() {         DATAPIN=0;         Delay200us();         Delay200us();         Delay200us(); }void End() {         DATAPIN=1;         Delay200us();         Delay200us();         Delay200us(); }void main() {         char i=0;         //send data 500ms         while(1)         {               Start();               for(i=0;i<25;i++);               {                         sendBit (sequence);               }               End();               Delay200us();         } }

dxw1234 发表于 2025-2-21 14:28

代码我也看不懂,用豆包问了一下,

dxw1234 发表于 2025-2-21 14:29

1. 整体功能概述:这段代码基于stc15F104e单片机,主要功能是通过P33引脚发送特定的二进制序列。该序列定义在sequence数组中,通过特定的时序,以一位一位的方式发送出去。2. 代码详细分析:• 头文件和宏定义: #include <stc15F104e.h> #define DATAPIN P33 const char sequence={0,0,1,0,1,0,1,0,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,0,0}; • #include <stc15F104e.h>:引入stc15F104e单片机的头文件,包含了该单片机寄存器定义等相关信息。• #define DATAPIN P33:定义DATAPIN为P33引脚,后续对DATAPIN的操作实际就是对P33引脚的操作。• const char sequence:定义一个常量数组sequence,包含25个元素,这些元素构成了要发送的二进制序列。• 延时函数: void Delay200us() //@5.5296MHz {   unsigned char i,j;   i=2;   j=29;   do   {         while(--j);   }   while(--i); } • Delay200us函数实现了大约200微秒的延时。在5.5296MHz的晶振频率下,通过两层嵌套循环,根据i和j的初始值以及递减操作来控制延时时间。• 注释掉的Delay200ma函数,从函数名推测应该是想实现200毫秒延时,但函数内部循环控制逻辑有误,缺少一层while循环的结束括号,实际无法正确实现200毫秒延时功能。• 发送位函数: void sendBit(char x) {   //start   DATAPIN=0;   Delay200us();   //send bit   DATAPIN=x;   Delay200us();   Delay200us();   //end   DATAPIN=1;   Delay200us(); } • sendBit函数用于发送一个二进制位。• 首先将DATAPIN拉低,延时200微秒,作为起始信号。• 然后根据传入的参数x(0或1)设置DATAPIN的值,再延时400微秒(两个200微秒),发送该位数据。• 最后将DATAPIN拉高,延时200微秒,作为结束信号。• 起始和结束函数: void Start() {   DATAPIN=0;   Delay200us();   Delay200us();   Delay200us(); }void End() {   DATAPIN=1;   Delay200us();   Delay200us();   Delay200us(); } • Start函数用于发送起始信号,将DATAPIN拉低并延时600微秒(三个200微秒)。• End函数用于发送结束信号,将DATAPIN拉高并延时600微秒。• 主函数: void main() {   char i=0;   //send data 500ms   while(1)   {         Start();         for(i=0;i<25;i++);         {             sendBit (sequence);         }         End();         Delay200us();   } } • 在main函数中,进入一个无限循环。• 每次循环先调用Start函数发送起始信号。• 然后通过for循环遍历sequence数组,调用sendBit函数逐个发送数组中的二进制位。这里for循环后面多了一个分号;,会导致for循环体为空,实际只有一次sendBit (sequence)操作(这里sequence越界,因为数组有效索引是0到24),应该去掉该分号。• 发送完所有位后,调用End函数发送结束信号,再延时200微秒,然后开始下一轮循环。3. 改进建议:• 修正Delay200ma函数的语法错误,确保其能正确实现200毫秒延时功能。• 去掉main函数中for循环后的多余分号,保证能正确发送整个sequence数组中的数据。• 可以考虑添加注释,使代码逻辑更加清晰,特别是对一些关键操作和函数的功能进行详细说明。通过上述分析,希望能帮助你更好地理解这段代码的功能和实现细节。如果还有其他疑问,请随时提问。

dxw1234 发表于 2025-2-21 14:30

从提供的代码来看,它并非精确的毫秒级循环断续发送信号 ,原因如下:• 发送周期分析:• 每次完整发送包含起始信号、25位数据和结束信号。• 起始信号 Start 函数延时600微秒(3个200微秒)。• 每个数据位发送 sendBit 函数,每个数据位发送过程约800微秒(起始200微秒 + 数据位400微秒 + 结束200微秒),25 位数据发送总时长约25 * 800微秒 = 20000微秒。• 结束信号 End 函数延时600微秒(3个200微秒)。• 最后还有额外的200微秒延时。• 一次完整发送周期约为600 + 20000 + 600 + 200 = 21400微秒,即21.4毫秒 。• 非精确毫秒级:• 代码中延时函数 Delay200us 是基于特定晶振频率(5.5296MHz)的固定延时,通过简单循环实现,这种方式受晶振精度、单片机运行环境等因素影响,无法保证绝对精确的时间。• 代码中没有对发送周期进行精确的毫秒级定时控制,例如使用定时器中断等更精确的定时方式。所以,该代码是以约21.4毫秒为周期循环发送信号,但不是精确的毫秒级控制,且时间精度受多种因素影响。

dxw1234 发表于 2025-2-21 14:30

可以用脉冲发生器代替么?

dxw1234 发表于 2025-2-21 14:31

该代码实现的功能可以用脉冲发生器替代,以下是具体分析:功能相似性• 代码通过对 DATAPIN 引脚的操作,按照特定的序列发送信号,本质上是产生了一种特定规律的脉冲信号。脉冲发生器也可以产生各种不同频率、占空比和波形的脉冲信号,能够模拟代码中产生的信号。精度和稳定性• 代码中的信号发送依赖于软件延时函数,精度受晶振精度等因素影响。而专业的脉冲发生器通常具有更高的时间精度和稳定性,能产生更精确的脉冲宽度和周期。灵活性• 代码中信号的序列和参数在程序中固定,若要修改需重新编写和烧录程序。脉冲发生器则可通过面板操作或外部控制接口,方便快捷地实时调整脉冲的各种参数,如频率、占空比、脉冲数等,具有更高的灵活性。成本和复杂度• 使用脉冲发生器可能会增加硬件成本,特别是一些高精度、多功能的脉冲发生器价格较高。而原代码基于单片机实现,只需单片机及相关的最小系统电路,成本相对较低。不过,从开发复杂度来看,使用脉冲发生器无需编写复杂的代码,降低了软件开发的难度和工作量。

dxw1234 发表于 2025-2-21 14:46

可调占空比发生器到手,问几个人电池中间脚电压多少,没一个人愿意量一下,早已习惯了,问豆包,中间脚电压2.8-4.2V。
先用这个模拟吧,大概意思代码是以后200毫秒的50赫兹持续循环信号。占空比50%高低电位4.2-2.8,频率50赫兹整起再说。
以我的电子小白认知为什么没有三方品牌复制呢?如果通讯协议是数字信号,读取复制早就破解了,需要苦之久已么?如果是模拟信号也早模拟出来了,玩家高手如云怎么可能是个难点?我先用模拟来试吧,如果行不通直接换控制板,原装控制板卖了换钱。
电池不打算用21700了,电池包要有电池包的特色6串33140铁锂走起。
电动工具的保护板貌似都有缺陷,典型第一个问题饿死电池,第二个充电保护电压不到位,放电倒是其次没电电钻就不转了,不用就不放电了。牧田款出了typeC的双向充电口,充电有60瓦放电20瓦,还没有大面积铺开,另外有人文宇创新做了主动均衡保护板,也没啥反响啊。没那手艺还是单买均衡板外接吧。

yang9845 发表于 2025-2-21 15:05

买原装电池吧,你这瞎弄省不了几个钱不说,充电还得麻烦。原装的可是充放都保护完善的。另外,尽量别想着用其它带有MOS管的电池来代用,强力工作MOS管顶不住的。
页: [1]
查看完整版本: 大有电池的事儿