找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5211|回复: 11
收起左侧

STC12C5A60S2单片机制作的锂电池容量测试源程序

  [复制链接]
ID:353874 发表于 2019-6-18 22:49 | 显示全部楼层 |阅读模式
去年做了一个89C52+ad0804的锂电池容量测试仪,没有成功,今年新买入了12C5A60S2,自带AD,开始着手再次制作。学习了很多论坛里高手的程序,由于水平有限,没有运用中断,只会利用1S延时,在开发板实验成功。放电可以仿照LM358电子负载+锂电池充电板,这样电路可以简单一些。
程序很简单,鉴于水平有限,如有问题还请各位多多指教。
  1. /*--------------------------------------------------------------*/
  2. #include <STC12C5A60S2.H>
  3. #include "LCD5510_V3.H"
  4. #include "STC12ADC.C"

  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. #define ulong unsigned long


  8. //定义变量
  9. char a[10]={'0','1','2','3','4','5','6','7','8','9'};
  10. int dianya, ge, shi, bai, qian, c=800;           //c设定最小电流
  11. float cap4=0, cap5=0, cap6=0, cap7=0;
  12. uint tims=0, cur;
  13. //ulong cap;
  14. /*--------------------------------------------------------------*/

  15. //时间显示函数
  16. void displaytime(uint dat)
  17. {
  18.         uint tims1,tims2,timm1,timm2,timh; //定义秒1秒2,分1分2,时
  19.         timh=dat/3600;
  20.         timm2=(dat-timh*3600)/600;
  21.         timm1=(dat-timh*3600)/60%10;
  22.         tims2=(dat-timh*3600-timm2*600-timm1*60)/10;
  23.         tims1=dat%10;
  24.         LCD_prints(0, 5, "RUN");
  25.         LCD_printc(7, 5, a[timh]);
  26.         LCD_prints(8, 5, ":");
  27.         LCD_printc(9, 5, a[timm2]);
  28.         LCD_printc(10, 5, a[timm1]);
  29.         LCD_prints(11, 5, ":");
  30.         LCD_printc(12, 5, a[tims2]);
  31.         LCD_printc(13, 5, a[tims1]);        
  32. }

  33. /*
  34. //容量显示函数
  35. void displaycap(uint dat)
  36. {
  37.         LCD_printc(8, 1, a[dat/1000]);
  38.         LCD_printc(9, 1, a[dat/100%10]);
  39.         LCD_printc(10, 1, a[dat/10%10]);
  40.         LCD_printc(11, 1, a[dat%10]);        
  41. }
  42. */

  43. //表头显示函数
  44. void displaybiaotou()
  45. {
  46.         LCD_prints(0, 0, "No");
  47.         LCD_prints(3, 0, "I-mA");
  48.         LCD_prints(8, 0, "CY-mAH");
  49.         LCD_prints(1, 1, "1");
  50.         LCD_prints(1, 2, "2");
  51.         LCD_prints(1, 3, "3");
  52.         LCD_prints(1, 4, "4");
  53. }

  54. /*
  55. //5ms定时器中断函数
  56. void InitTimer0(void)
  57. {
  58.     TMOD = 0x01;
  59.     TH0 = 0x15;
  60.     TL0 = 0x0A0;
  61.     EA = 1;
  62.     ET0 = 1;
  63.     TR0 = 1;
  64. }
  65. */

  66. //1S延时函数
  67. void delay1s(void)   //误差 -0.000000000056us
  68. {
  69.     uchar a,b,c,n;
  70.     for(c=70;c>0;c--)
  71.         for(b=168;b>0;b--)
  72.             for(a=249;a>0;a--);                         //a=249,每10分钟快1秒;a=250,每6分钟慢1秒,每10分钟慢1.4秒
  73.     for(n=1;n>0;n--);
  74. }

  75. void delay1ms(void)   //误差 0us
  76. {
  77.     unsigned char a,b;
  78.     for(b=129;b>0;b--)
  79.         for(a=45;a>0;a--);
  80. }


  81. //主函数
  82. void main()
  83. {
  84.         LCD5510_Init();                  //5110初始化
  85.         Init_ADC();               //ADC初始化
  86.         displaybiaotou();         //显示表头
  87.         
  88.         while(1)
  89.                 {
  90.                 uchar lu;
  91.                         for(lu=4;lu<8;)
  92.                         {
  93.                                  Get_ADC_Result(lu);  //开始转换
  94.                                 
  95. //**********以下为放电电流显示语句*********************                                                               
  96.                                 dianya = Count(lu)*1000;
  97.                                 LCD_printn(3, lu-3, dianya, 5);

  98. //**********以下为电池容量语句*********************
  99.                                 if(lu == 4)
  100.                                 {
  101.                                         if(dianya > c)                         //最小电流,假设电阻为1欧姆5W,电压与电流数值相同
  102.                                         {
  103.                                                 cap4 = (float)dianya/3600 + cap4;
  104.                                         }
  105.                                         else
  106.                                         {
  107.                                                 cap4 = cap4;
  108.                                         }
  109.                                         LCD_printn(8, lu-3, cap4, 4);
  110.                                 }

  111.                                 if(lu == 5)
  112.                                 {
  113.                                         if(dianya > c)
  114.                                         {
  115.                                                 cap5 = (float)dianya/3600 + cap5;
  116.                                         }
  117.                                         else
  118.                                         {
  119.                                                 cap5 = cap5;
  120.                                         }
  121.                                         LCD_printn(8, lu-3, cap5, 4);
  122.                                 }

  123.                                 if(lu == 6)
  124.                                 {
  125.                                         if(dianya > c)
  126.                                         {
  127.                                                 cap6 = (float)dianya/3600 + cap6;
  128.                                         }
  129.                                         else
  130.                                         {
  131.                                                 cap6 = cap6;
  132.                                         }
  133.                                         LCD_printn(8, lu-3, cap6, 4);
  134.                                 }

  135.                                 if(lu == 7)
  136.                                 {
  137.                                         if(dianya > c)
  138.                                         {
  139.                                                 cap7 = (float)dianya/3600 + cap7;
  140.                                         }
  141.                                         else
  142.                                         {
  143.                                                 cap7 = cap7;
  144.                                         }
  145.                                         LCD_printn(8, lu-3, cap7, 4);
  146.                                 }

  147.                                 lu++;
  148.                         }
  149.                         
  150.                         displaytime(tims);
  151.                         tims++;
  152.                         delay1s();
  153.                         delay1ms();         //加入延时,每10分钟慢0.6秒
  154.                 }
  155. }
复制代码
0.png

全部资料51hei下载地址:
5110锂电池容量测试仪.rar (57.61 KB, 下载次数: 110)

评分

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

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2019-6-18 23:23 | 显示全部楼层
好东东,不过没有原理图 楼主能介绍下电路吗?
回复

使用道具 举报

ID:353874 发表于 2019-6-19 08:59 | 显示全部楼层
STC12C5A60S2,P1.4—1.7作为ADC转换,用5110液晶屏,电子负载参考“数码之家”中stdzlqz的电路图, 1.jpg
回复

使用道具 举报

ID:415539 发表于 2019-8-9 22:11 | 显示全部楼层
好东东,不过没有原理图 楼主能介绍下电路吗?
回复

使用道具 举报

ID:48413 发表于 2019-8-27 20:04 | 显示全部楼层
学习一下谢谢楼主
回复

使用道具 举报

ID:732567 发表于 2020-4-19 23:58 来自手机 | 显示全部楼层
楼主能发一下完整的电路图吗
回复

使用道具 举报

ID:746837 发表于 2020-5-8 13:22 | 显示全部楼层
请问楼主有没有仿真图呢?
回复

使用道具 举报

ID:305511 发表于 2020-5-31 09:08 | 显示全部楼层
好东西,如果有原理图就更好了!
回复

使用道具 举报

ID:238730 发表于 2020-6-5 01:18 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:105698 发表于 2020-6-5 15:13 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:687469 发表于 2020-10-13 23:57 | 显示全部楼层
求电路图
回复

使用道具 举报

ID:143767 发表于 2020-10-14 11:09 | 显示全部楼层
不错的设计如果能用LED数码管显示就好了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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