历史上的今天
今天是:2024年10月14日(星期一)
2020年10月14日 | STC12C5A60S2单片机制作的锂电池容量测试源程序
2020-10-14 来源:51hei
去年做了一个89C52+ad0804的锂电池容量测试仪,没有成功,今年新买入了12C5A60S2,自带AD,开始着手再次制作。学习了很多论坛里高手的程序,由于水平有限,没有运用中断,只会利用1S延时,在开发板实验成功。放电可以仿照LM358电子负载+锂电池充电板,这样电路可以简单一些。
程序很简单,鉴于水平有限,如有问题还请各位多多指教。
/*--------------------------------------------------------------*/
#include #include "LCD5510_V3.H" #include "STC12ADC.C" #define uint unsigned int #define uchar unsigned char #define ulong unsigned long //定义变量 char a[10]={'0','1','2','3','4','5','6','7','8','9'}; int dianya, ge, shi, bai, qian, c=800; //c设定最小电流 float cap4=0, cap5=0, cap6=0, cap7=0; uint tims=0, cur; //ulong cap; /*--------------------------------------------------------------*/ //时间显示函数 void displaytime(uint dat) { uint tims1,tims2,timm1,timm2,timh; //定义秒1秒2,分1分2,时 timh=dat/3600; timm2=(dat-timh*3600)/600; timm1=(dat-timh*3600)/60%10; tims2=(dat-timh*3600-timm2*600-timm1*60)/10; tims1=dat%10; LCD_prints(0, 5, "RUN"); LCD_printc(7, 5, a[timh]); LCD_prints(8, 5, ":"); LCD_printc(9, 5, a[timm2]); LCD_printc(10, 5, a[timm1]); LCD_prints(11, 5, ":"); LCD_printc(12, 5, a[tims2]); LCD_printc(13, 5, a[tims1]); } /* //容量显示函数 void displaycap(uint dat) { LCD_printc(8, 1, a[dat/1000]); LCD_printc(9, 1, a[dat/100%10]); LCD_printc(10, 1, a[dat/10%10]); LCD_printc(11, 1, a[dat%10]); } */ //表头显示函数 void displaybiaotou() { LCD_prints(0, 0, "No"); LCD_prints(3, 0, "I-mA"); LCD_prints(8, 0, "CY-mAH"); LCD_prints(1, 1, "1"); LCD_prints(1, 2, "2"); LCD_prints(1, 3, "3"); LCD_prints(1, 4, "4"); } /* //5ms定时器中断函数 void InitTimer0(void) { TMOD = 0x01; TH0 = 0x15; TL0 = 0x0A0; EA = 1; ET0 = 1; TR0 = 1; } */ //1S延时函数 void delay1s(void) //误差 -0.000000000056us { uchar a,b,c,n; for(c=70;c>0;c--) for(b=168;b>0;b--) for(a=249;a>0;a--); //a=249,每10分钟快1秒;a=250,每6分钟慢1秒,每10分钟慢1.4秒 for(n=1;n>0;n--); } void delay1ms(void) //误差 0us { unsigned char a,b; for(b=129;b>0;b--) for(a=45;a>0;a--); } //主函数 void main() { LCD5510_Init(); //5110初始化 Init_ADC(); //ADC初始化 displaybiaotou(); //显示表头 while(1) { uchar lu; for(lu=4;lu<8;) { Get_ADC_Result(lu); //开始转换 //**********以下为放电电流显示语句********************* dianya = Count(lu)*1000; LCD_printn(3, lu-3, dianya, 5); //**********以下为电池容量语句********************* if(lu == 4) { if(dianya > c) //最小电流,假设电阻为1欧姆5W,电压与电流数值相同 { cap4 = (float)dianya/3600 + cap4; } else { cap4 = cap4; } LCD_printn(8, lu-3, cap4, 4); } if(lu == 5) { if(dianya > c) { cap5 = (float)dianya/3600 + cap5; } else { cap5 = cap5; } LCD_printn(8, lu-3, cap5, 4); } if(lu == 6) { if(dianya > c) { cap6 = (float)dianya/3600 + cap6; } else { cap6 = cap6; } LCD_printn(8, lu-3, cap6, 4); }
史海拾趣
|
我现在遇到一个奇怪的问题,如果我将电路中的某个信号赋值给一个输出管脚的话,那么整个电路的逻辑都不对了。(如果不输出的话,通过其它管脚观察时逻辑是正确的) 大家有没有碰到过这种情况?是怎么回事?请高手指点! 注:我是在quartus8.1中用 ...… 查看全部问答> |
|
CPU为32位ARM芯片 Nand flash芯片为三星K9F1G08X0M (X8),有效存储128M + 4M OOB 地址分配如下面所示: IO0 IO1 IO2 ...… 查看全部问答> |
|
公司用捷联的猫传输数据,终端用的33600md,公司总部用捷联的列架猫,终端的猫自动拨号,与列架猫建立连接后(v22bis协议,2400速率,异步),传输终端的数据。每次都是刚开始传输的时候比较正常,但逐渐数据就会延迟,延迟有时可达3分钟,但进入mo ...… 查看全部问答> |
|
收购:现需要收购 SmartARM2400 的包装盒若干个,以及装书的那个硬包装盒若干个,谢谢! 发现 SmartARM 2400 的包装盒装东西非常合适,想弄几个, SmartARM套件中的那个装书的硬纸盒也非常不错,用来整理书架是非常不错的选择,非常想多弄几个。 可以和我邮件联系, rampc@sian.com 不要太贵哦,我明天再把我想要的 ...… 查看全部问答> |
|
我最近使用W77E58,使用了看门狗复位,原先使用正常,但在其他与看门狗无关的地方作了一些程序修改,之后看门狗工作就不正常了,正常喂狗时没什么问题,但我一停止喂狗后,程序会停下来,只不过它没有从头开始.就死在那里了,不知道为什么,哪位帮帮我.我的看 ...… 查看全部问答> |
|
关于STM32 ADC用DMA采多通道时数据错位的问题,之前的错误现象是4.5A变成9A或0.5A,后来对ADC的参数配置加了定时配置后,有很大的改善,但客户现场又用了20多天后,又出现数据错误的现象,电流110A的变30多A? 急!急!急!… 查看全部问答> |
|
我在使用uC/OSII的时候遇到一些问题:使用ICCAVR专业版6.31编译的时候出现如下的信息:C:\\icc\\bin\\imakew -f MainController.mak iccavr -o MainController -LC:\\icc\\lib\\ -g -uc ...… 查看全部问答> |
|
用MSP430G2553做了一个控制板,一个TM1640芯片用作显示,两个595用作显示和继电器控制,但就是过不了群脉冲测试,群脉冲一打上去,显示全乱了,触摸按键也不灵光了,一不打,就好了,我不知道问题出在哪?附件为原理图。… 查看全部问答> |




