找回密码
 立即注册

QQ登录

只需一步,快速开始

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

电池容量测试仪电路与源码(PIC16F1938单片机+AD623实现)

[复制链接]
跳转到指定楼层
楼主
分享一个由PIC16F1938单片机芯片和AD623构成的电池容量测试仪.

电路原理图如下:




电池容量测试仪的pic单片机源码:
  1. #include    "main.h"
  2. //------------------------32MHZ----------------------------------------------
  3. __CONFIG(FOSC_INTOSC & CLKOUTEN_OFF & BOREN_ON & PWRTE_ON & CPD_OFF
  4.           &CP_ON & MCLRE_ON & LVP_OFF & WDTE_ON );  //此处有关32MHz的设置与1829不同,PLL使能位必须在寄存器OSCCON里面设置SPLLEN
  5.                                                                         //而不是在配置字里面设置PLLEN_ON      
  6. /***eeprom 数据存储地址分配**************

  7. 0X00 0X01 充电电流
  8. 0X02 0X03 充电截止电压
  9. 0X04 0X05 放电电流
  10. 0X06 0X07 放电截止电压
  11. 0X08      循环次数

  12. 0X09      充满多久后放电
  13. 0X0A      已循环次数
  14. 0X0B 0X0C 充电时间
  15. 0X0D 0X0E 放电时间
  16. 0X0F 0X10 总容量

  17. 0xf0 掉电前的状态:0放电/1充电
  18. ******************************************/  
  19.          
  20. //---------非精确延时1ms函数------------
  21. void delay_ms(uint16_t  time)
  22. {
  23.   uint16_t k, j=0;
  24.   for(k=0;k<189;k++)
  25.   {
  26.     for(;j<time;j++)
  27.      {CLRWDT();}
  28.   }  
  29. }         
  30. //--------端口及时钟初始化--------------
  31. void Init(void)
  32. {
  33. asm("CLRWDT");
  34. PORTA=0X00;
  35. LATA=0X00;
  36. TRISA=0B00000111;
  37. ANSELA=0B00000111;//RA0 RA1 RA2作为模拟输入,其余为数字输出

  38. PORTB=0X00;
  39. LATB=0X00;
  40. TRISB=0B00111100;
  41. ANSELB=0B00000000;

  42. PORTC=0X00;
  43. TRISC=0B00000000;
  44. LATC=0X00;

  45. screen_status=4;
  46. i=0;
  47. j=0;
  48. FLAG_RUN=0;
  49. }

  50. //-------------串口初始化------------------
  51. void Init_Uart(void)
  52. {
  53. TRISC6=0;
  54. //TRISC7=1;
  55. SPBRG=0xcf;
  56. BRG16=1;
  57. BRGH=0;

  58. TX9=0;
  59. SYNC=0;
  60. SPEN=1;
  61. TXEN=1;

  62. TXIF=0;
  63. TXIE=0;
  64. CREN=1;
  65. SYNC=0;

  66. RCIF=0;
  67. RCIE=0;

  68. GIE=1;
  69. PEIE=1;

  70. }

  71. void putch(unsigned char byte)
  72. {
  73.         /* output one byte */
  74.         //CLRWDT();
  75.         while(!TXIF)        /* set when register is empty */
  76.                 continue;
  77.         TXREG = byte;
  78. }

  79. void Set32MHZ(void)
  80. {
  81.   SCS1=0;        //配置字中若已经设置了FOSC<2:0>  那么在此必须将SCS<1:0>=00
  82.   SCS0=0;
  83.   IRCF3=1;      //16MHZ分频后得到8MHZ再4倍频到32MHZ
  84.   IRCF2=1;
  85.   IRCF1=1;
  86.   IRCF0=0;
  87.   OSTS=0;
  88.   PLLR=1;
  89.   HFIOFS=1;
  90.   SPLLEN=1;//必须在此处设置此位,否则系统时钟频率不为8MHz  
  91. }

  92. void interrupt isr(void)               
  93. {
  94. //-----------TMER0中断--------------------        
  95. if((TMR0IF)&&(TMR0IE))           
  96. {
  97.   TMR0=0x07;                    
  98.   TMR0IF=0; //0.25ms  
  99. }
  100. //-----------TMER1中断-------------------
  101. if((TMR1IF)&&(TMR1IE))//定时50ms           
  102. {
  103.   TMR1H=0x3C;            
  104.   TMR1L=0xB5;                    
  105.   TMR1IF=0;
  106.   second--;
  107.   if(second==0)
  108.   {
  109.           second=20;
  110.     FLAG_SECOND=1;
  111.   }

  112.   if(second==10||second==20)
  113.   {
  114.    flag_work=1;
  115.   }
  116.   if(WORKING&&loop_temp<loop_times)
  117.   {
  118.         
  119.           if(second==20)
  120.             {LATB7=1;}
  121.           else if(FLAG_RUN)
  122.           {
  123.             if(second==10)
  124.                   {LATB7=1;}
  125.       else if(!FLAG_CHARGE&&(second==5||second==15))
  126.                   {LATB7=1;}
  127.             else
  128.                     {LATB7=0;}
  129.           }
  130.     else
  131.       {LATB7=0;}
  132.   }
  133.   /*if(++count1>99)
  134.   {
  135.         
  136.           count1=0;
  137.           printf("%d \r\n",bat_voltage);
  138.   }*/
  139. }
  140. //--------------------TMER4中断-----------
  141. if((TMR4IF)&&(TMR4IE))   
  142. {
  143.   TMR4=0x57;                    
  144.   TMR4IF=0; //0.5ms
  145. }
  146. if((TMR6IF)&&(TMR6IE))         
  147. {
  148.   TMR6=0x6F;//1ms进入中断一次
  149.   TMR6IF=0;
  150.     if((FLAG_RUN)&&(screen_status==0)&&(loop_temp<loop_times))
  151.     {
  152.      if(++keydelay1>1000)
  153.      {
  154.           keydelay1=0;
  155.           m++;
  156.           if(m>3)
  157.       {
  158.            m=0;
  159.        lcd_write_char(12,0,' ');
  160.        lcd_write_char(13,0,' ');
  161.        lcd_write_char(14,0,' ');
  162.       }
  163.       else
  164.       {lcd_write_char(11+m,0,'.');}
  165.       lcd_write_char(15,0,' ');
  166.      }
  167.     }
  168.    
  169.   if(KEYDOWNING)
  170.    {
  171.     if(++keydelay>10)
  172.     {
  173.          keydelay=0;
  174.      KEYDOWNING=0;
  175.     }
  176.    }
  177.   
  178. }
  179. }
  180. //-----------判断按键状态-------------------------
  181. unsigned char getkey(void)
  182. {        
  183.         unsigned char keytemp;
  184.         keytemp=LATB;//不能用keytemp=PORTB;
  185.         return (~keytemp) & 0X3C;        
  186. }
  187. //------------按键初始化-----------------
  188. void Keyinit(void)
  189. {
  190.      KEY_MAIN.KEY_BIT.ReadData_ON_OFF=(ON_OFF^1);
  191.      KEY_MAIN.KEY_BIT.ReadData_DEC=(DEC^1);
  192.      KEY_MAIN.KEY_BIT.ReadData_ADD=(ADD^1);
  193.      KEY_MAIN.KEY_BIT.ReadData_MENU=(MENU^1);
  194.      KEY_MAIN.KEY_BIT.TRG_ON_OFF=KEY_MAIN.KEY_BIT.ReadData_ON_OFF & (KEY_MAIN.KEY_BIT.ReadData_ON_OFF ^ KEY_MAIN.KEY_BIT.COUT_ON_OFF);
  195.      KEY_MAIN.KEY_BIT.TRG_DEC=KEY_MAIN.KEY_BIT.ReadData_DEC & (KEY_MAIN.KEY_BIT.ReadData_DEC ^ KEY_MAIN.KEY_BIT.COUT_DEC);
  196.      KEY_MAIN.KEY_BIT.TRG_ADD=KEY_MAIN.KEY_BIT.ReadData_ADD & (KEY_MAIN.KEY_BIT.ReadData_ADD ^ KEY_MAIN.KEY_BIT.COUT_ADD);
  197.      KEY_MAIN.KEY_BIT.TRG_MENU=KEY_MAIN.KEY_BIT.ReadData_MENU & (KEY_MAIN.KEY_BIT.ReadData_MENU ^ KEY_MAIN.KEY_BIT.COUT_MENU);
  198.      KEY_MAIN.KEY_BIT.COUT_ON_OFF=KEY_MAIN.KEY_BIT.ReadData_ON_OFF;
  199.      KEY_MAIN.KEY_BIT.COUT_DEC=KEY_MAIN.KEY_BIT.ReadData_DEC;
  200.      KEY_MAIN.KEY_BIT.COUT_ADD=KEY_MAIN.KEY_BIT.ReadData_ADD;   
  201.      KEY_MAIN.KEY_BIT.COUT_MENU=KEY_MAIN.KEY_BIT.ReadData_MENU;
  202.       
  203. }
  204. //-------按键扫描-------------------------
  205. unsigned char  KeyScan(void)
  206. {
  207. Keyinit();
  208. if(KEY_MAIN.KEY_ALL_BITS==0X0007)  //ON/OFF
  209. {
  210.   return 1;
  211. }
  212. else if(KEY_MAIN.KEY_ALL_BITS==0X0038)  //DEC
  213. {
  214.   return 2;
  215. }
  216. else if(KEY_MAIN.KEY_ALL_BITS==0X01C0)  //ADD
  217. {
  218.   return 3;
  219. }
  220. else if(KEY_MAIN.KEY_ALL_BITS==0X0E00)  //MENU
  221. {
  222.   return 4;
  223. }
  224. return 0;
  225. }
  226. void KeyProcess(void)
  227. {
  228. if(getkey())//判断有按键按下
  229.   {
  230.    if(!KEYDOWNING)
  231.           {
  232.             KEYDOWNING = 1;
  233.             keyvalue=KeyScan();//提取具体按键值
  234.           }
  235.   }
  236. else
  237.   {
  238.           KEYDOWNING = 0;
  239.   }
  240. if(keyvalue)   
  241.   {
  242.    if(STARTUP)        
  243.            count=60;
  244.    if(keyvalue==1) //ON_OFF
  245.     {
  246.      switch(screen_status)
  247.      {
  248.       case 0:     screen_status=2;
  249.                   i=0;
  250.                   read_data();
  251.                   menu_2(); break;
  252.       case 1:    if(i==0)
  253.                  {
  254.                   FLAG_RUN=1;
  255.                   WORKING=1;
  256.                   finish_discharge=0;
  257.                   finish_charge=0;
  258.                   screen_status=0;
  259.                   i=0;
  260.                   lcd_write_com_busy(0x01);
  261.                   menu_0(); break;
  262.                  }
  263.                  else if(i==1)
  264.                  {
  265.                   screen_status=3;
  266.                   i=0;
  267.                   read_data();
  268.                   menu_3(); break;
  269.                  }
  270.                  else if(i==2)
  271.                  {
  272.                   read_data();
  273.                   screen_status=5;
  274.                   i=0;
  275.                   menu_5(); break;
  276.                  }
  277.       case 2:    if(i==0)
  278.                  {
  279.                   FLAG_RUN=0;
  280.                   WORKING=0;
  281.                   LATB7=0;
  282.                   PWM_WIDE=0;
  283.                   PWM_Size(PWM_WIDE);
  284.                   PWM5_Size(PWM_WIDE);
  285.                   screen_status=1;
  286.                   i=0;
  287.                   menu_1(); break;
  288.                  }
  289.                  else if(i==8)
  290.                  {
  291.                    for(k=16;k<36;k++)
  292.                      {cap_data[k-16]=eeprom_read(k);}
  293.                    screen_temp=screen_status;
  294.                    screen_status=7;
  295.                    i=0;
  296.                    menu_7();break;
  297.                  }
  298.                  else
  299.                  {
  300.                    screen_status=2;
  301.                    menu_2(); break;
  302.                  }
  303.       case 3:    if(i==0)
  304.                  {
  305.                   for(k=10;k<36;k++)
  306.                     {eeprom_write(k,0);}
  307.                   read_data();
  308.                   screen_status=1;
  309.                   i=0;
  310.                   menu_1(); break;
  311.                  }
  312.                  else if(i==8)
  313.                  {
  314.                    for(k=16;k<36;k++)
  315.                      {cap_data[k-16]=eeprom_read(k);}
  316.                    screen_temp=screen_status;
  317.                    screen_status=7;
  318.                    i=0;
  319.                    menu_7();break;
  320.                  }
  321.                  else
  322.                  {
  323.                   screen_status=3;
  324.                   menu_3(); break;
  325.                  }
  326.       case 4:    if(i==0)
  327.                  {
  328.                   screen_status=0;
  329.                   i=0;
  330.                   lcd_write_com_busy(0x01);
  331.                   menu_0();
  332.                   STARTUP=0;
  333.                   WORKING=1;
  334.                   FLAG_RUN=1;break;
  335.                  }
  336.                  else
  337.                  {
  338.                   screen_status=1;
  339.                   i=0;
  340.                   menu_1();
  341.                   STARTUP=0;
  342.                   FLAG_RUN=0; break;
  343.                  }  
  344.       case 5:    screen_status=6;
  345.                  i=0;
  346.                  menu_6(); break;
  347.       case 6:    if(i==0)//需要保存设置的数据
  348.                  {
  349.                    for(k=0;k<10;k++)
  350.                      {eeprom_write(k,datatab[k]);}
  351.                                    read_data();//此处读取各个参数数值
  352.                                    screen_status=1;
  353.                    i=0;
  354.                    menu_1(); break;
  355.                  }
  356.                  else//不保存,则采用之前的数据
  357.                  {
  358.                    screen_status=1;
  359.                    i=0;
  360.                    menu_1(); break;
  361.                  }
  362.        default: break;  
  363.       }
  364.     }
  365.    else if(keyvalue==2)//ADD
  366.     {
  367.      if((screen_status==5)&&(!FLAG_RUN))
  368.      {
  369.         switch(i)
  370.         {
  371.          case 0: temp=(datatab[0]<<8)|datatab[1];
  372.                  temp+=10;//此处增加限制电流增加的上限
  373.                  if(temp>2000)
  374.                          {temp=10;}
  375.                  datatab[1]=(unsigned char)temp;
  376.                  datatab[0]=(temp>>8)&0xff;
  377.                                  break;
  378.          case 1: temp=(datatab[2]<<8)|datatab[3];
  379.                  temp+=50;//此处增加限制电压增加的上限
  380.                  if(temp>4500)
  381.                          {temp=3500;}
  382.                  datatab[2]=(temp>>8)&0xff;
  383.                  datatab[3]=temp&0xff;break;
  384.          case 2: temp=(datatab[4]<<8)|datatab[5];
  385.                  temp+=10;//此处增加限制电流增加的上限
  386.                  if(temp>3000)
  387.                          {temp=10;}
  388.                  datatab[4]=(temp>>8)&0xff;
  389.                  datatab[5]=temp&0xff;break;
  390.          case 3: temp=(datatab[6]<<8)|datatab[7];
  391.                  temp+=50;//此处增加限制电流增加的上限
  392.                  if(temp>4000)
  393.                          {temp=2500;}
  394.                  datatab[6]=(temp>>8)&0xff;
  395.                  datatab[7]=temp&0xff;break;   
  396.          case 4: temp=datatab[8];
  397.                  temp++;//此处增加限制电流增加的上限
  398.                  if(temp>50)
  399.                          {temp=1;}
  400.                  datatab[8]=temp;break;
  401.          case 5: temp=datatab[9];
  402.                  temp+=5;//此处增加限制电流增加的上限
  403.                  if(temp>30)
  404.                          {temp=0;}
  405.                  datatab[9]=temp;break;                    
  406.         }
  407.        menu_5();   
  408.      }
  409.      else if(screen_status==2)
  410.      {
  411.        i++;
  412.        if(i>(menu2_num-1))
  413.        {i=0;}
  414.        menu_2();         
  415.      }
  416.      else if((screen_status==1)&&(!FLAG_RUN))
  417.      {
  418.              i++;
  419.         if(i>(menu1_num-1))
  420.         {i=0;}
  421.         menu_1();
  422.      }
  423.      else if((screen_status==3)&&(!FLAG_RUN))
  424.      {
  425.              i++;
  426.         if(i>(menu3_num-1))
  427.         {i=0;}
  428.         menu_3();
  429.      }
  430.      else if(screen_status==7)
  431.      {
  432.              i++;
  433.              if(i>9)
  434.                {i=0;}
  435.              menu_7();
  436.      }
  437.     }
  438.    else if(keyvalue==3)//DEC
  439.     {
  440.      if((screen_status==5)&&(!FLAG_RUN))
  441.      {
  442.       switch(i)
  443.         {
  444.          case 0: temp=(datatab[0]<<8)|datatab[1];
  445.                  temp-=10;//此处增加限制电流增加的上限
  446.                  if(temp==0)
  447.                          {temp=2000;}
  448.                  datatab[1]=(unsigned char)temp;
  449.                  datatab[0]=(temp>>8)&0xff;
  450.                                  break;
  451.          case 1: temp=(datatab[2]<<8)|datatab[3];
  452.                  temp-=50;//此处增加限制电压增加的上限
  453.                  if(temp<3500)
  454.                          {temp=4500;}
  455.                  datatab[2]=(temp>>8)&0xff;
  456.                  datatab[3]=temp&0xff;break;
  457.          case 2: temp=(datatab[4]<<8)|datatab[5];
  458.                  temp-=10;//此处增加限制电流增加的上限
  459.                  if(temp>3000)
  460.                          {temp=3000;}
  461.                  datatab[4]=(temp>>8)&0xff;
  462.                  datatab[5]=temp&0xff;break;
  463.          case 3: temp=(datatab[6]<<8)|datatab[7];
  464.                  temp-=50;//此处增加限制电流增加的上限
  465.                  if(temp<2500)
  466.                          {temp=4000;}
  467.                  datatab[6]=(temp>>8)&0xff;
  468.                  datatab[7]=temp&0xff;break;   
  469.          case 4: temp=datatab[8];
  470.                  temp--;//此处增加限制电流增加的上限
  471.                  if(temp==0)
  472.                          {temp=50;}
  473.                  datatab[8]=temp;break;
  474.          case 5: temp=datatab[9];
  475.                  temp-=5;//此处增加限制电流增加的上限
  476.                  if(temp>30)
  477.                          {temp=30;}
  478.                  datatab[9]=temp;break;                    
  479.         }
  480.        menu_5();  
  481.      }
  482.      else if(screen_status==2)
  483.      {
  484.        i--;
  485.        if(i>(menu2_num-1))
  486.        {i=menu2_num-1;}
  487.        menu_2();         
  488.      }
  489.      else if((screen_status==1)&&(!FLAG_RUN))
  490.      {
  491.              i--;
  492.         if(i>(menu1_num-1))
  493.         {i=menu1_num-1;}
  494.         menu_1();
  495.      }
  496.      else if((screen_status==3)&&(!FLAG_RUN))
  497.      {
  498.              i--;
  499.         if(i>(menu3_num-1))
  500.         {i=menu3_num-1;}
  501.         menu_3();
  502.      }
  503.      else if(screen_status==7)
  504.      {
  505.              i--;
  506.              if(i>9)
  507.                {i=9;}
  508.              menu_7();
  509.      }
  510.     }
  511.    else if(keyvalue==4)//MENU  选择项目 菜单循环显示
  512.     {
  513.      switch(screen_status)
  514.      {
  515.       
  516.       case 2:    screen_status=0;
  517.                  i=0;
  518.                  lcd_write_com_busy(0x01);
  519.                  menu_0(); break;
  520.       case 3:    screen_status=1;
  521.                  i=0;
  522.                  menu_1(); break;
  523.       case 4:    i++;
  524.                  if(i>(menu4_num-1))
  525.                  {i=0;}
  526.                  menu_4();  break;     
  527.       case 5:    i++;
  528.                  if(i>5)
  529.                  {i=0;}
  530.                  menu_5();  break;   
  531.       case 6:    i++;
  532.                  if(i>1)
  533.                  {i=0;}
  534.                  menu_6();  break;                                                   
  535.      case 7:     screen_status=screen_temp;
  536.                               i=0;
  537.                               if(screen_temp==2)
  538.                                       {menu_2();}
  539.                               else
  540.                                  {menu_3();}
  541.                               break;
  542.      }
  543.     }
  544.    keyvalue=0;      
  545.   }
  546. }
  547. //-------------------------------------------------------
  548. //从eeprom中读取数据
  549. //-----------------------------------------------------
  550. void read_data(void)
  551. {
  552.         for(k=0;k<15;k++)
  553.         {datatab[k]=eeprom_read(k);}
  554.         
  555.         charge_current=(datatab[0]<<8)|datatab[1];
  556.         charge_voltage=(datatab[2]<<8)|datatab[3];
  557.         discharge_current=(datatab[4]<<8)|datatab[5];
  558.         discharge_voltage=(datatab[6]<<8)|datatab[7];
  559.         loop_times=datatab[8];
  560.         loop_temp=datatab[10];
  561.         charge_time=(datatab[11]<<8)|datatab[12];
  562.         discharge_time=(datatab[13]<<8)|datatab[14];
  563. }

  564. //------------------------------------------------------
  565. //时间记录函数
  566. //-----------------------------------------------------
  567. void time_record(void)
  568. {
  569.         if(FLAG_CHARGE)
  570.         {
  571.                 charge_time++;
  572.                 eeprom_write(0x0c,(unsigned char)charge_time);
  573.                 eeprom_write(0x0b,0xff&(charge_time>>8));
  574.         }
  575.         else if(!FLAG_CHARGE)
  576.         {
  577.                 discharge_time++;
  578.                 eeprom_write(0x0e,(unsigned char)discharge_time);
  579.                 eeprom_write(0x0d,0xff&(discharge_time>>8));
  580.         }
  581. }

  582. //-----------------------------------------------------
  583. //电池容量累计(放电)
  584. //------------------------------------------------------
  585. void capacity_record(void)
  586. {
  587.         capacity_temp+=Current;
  588.         if(capacity_temp>7200)
  589.         {
  590.                 bat_cap++;
  591.                 if((loop_temp>=0)&&(loop_temp<10))
  592.                 {
  593.                         eeprom_write(17+loop_temp*2,(unsigned char)bat_cap);
  594.                         eeprom_write(16+loop_temp*2,bat_cap>>8);
  595.                 }
  596.                 else if((loop_temp>9)&&(loop_temp<20))
  597.                 {
  598.                         eeprom_write(17+(loop_temp%10)*2,(unsigned char)bat_cap);
  599.                         eeprom_write(16+(loop_temp%10)*2,bat_cap>>8);
  600.                 }
  601.                 else if((loop_temp>19)&&(loop_temp<30))
  602.                 {
  603.                         eeprom_write(17+(loop_temp%20)*2,(unsigned char)bat_cap);
  604.                         eeprom_write(16+(loop_temp%20)*2,bat_cap>>8);
  605.                 }
  606.                 else if((loop_temp>29)&&(loop_temp<40))
  607.                 {
  608.                         eeprom_write(17+(loop_temp%30)*2,(unsigned char)bat_cap);
  609.                         eeprom_write(16+(loop_temp%30)*2,bat_cap>>8);
  610.                 }
  611.                 else if((loop_temp>39)&&(loop_temp<50))
  612.                 {
  613.                         eeprom_write(17+(loop_temp%40)*2,(unsigned char)bat_cap);
  614.                         eeprom_write(16+(loop_temp%40)*2,bat_cap>>8);
  615.                 }
  616.                 capacity_temp=capacity_temp%7200;
  617.         }
  618. }
  619. //-------充电电流检测---------------------------------
  620. //Current:充电电流值 mA
  621. //-------------------------------------------------
  622. void Current_Check(void)
  623. {
  624.   unsigned int ADC_temp2;
  625.   unsigned int ADC_temp3;
  626.   
  627.   ADC_Channel(1);
  628.   ADC_temp2=ADC_Convert();
  629.   ADC_temp3=ADC_Convert();

  630.   ADC_temp2=ADC_temp2*3/10+ADC_temp3*7/10;
  631.   Current=(ADC_temp2*10)/4;
  632. }
  633. //-------电池电压检测函数-------------------------------
  634. //bat_voltage:电池电压值 mV
  635. //采用平均值滤波
  636. //-------------------------------------------------------
  637. void bat_voltage_check(void)
  638. {
  639.   unsigned int ADC_temp2=0;
  640.   unsigned char ADC_temp3;
  641.   
  642.   ADC_Channel(0);
  643.   Uvalue_buff[count2]=ADC_Convert();
  644.   if(Uvalue_buff[7]!=0)
  645.   {
  646.           for(ADC_temp3=0;ADC_temp3<8;ADC_temp3++)
  647.           {ADC_temp2+=Uvalue_buff[ADC_temp3];}
  648.           bat_voltage=(ADC_temp2*5)>>3;
  649.   }
  650.   else
  651.   {
  652.             bat_voltage=Uvalue_buff[count2]*5;
  653.   }
  654.   count2++;
  655.   if(count2>7)
  656.           {count2=0;}
  657. }

  658. //--------放电电流检测函数------------------------
  659. //--------采用了中值滤波--------------------------
  660. //------------------------------------------------
  661. void discharge_current_check(void)
  662. {
  663.   unsigned int ADC_temp2;
  664.   unsigned char ADC_temp3;
  665.   unsigned char ii,jj;
  666.   ADC_Channel(2);
  667.   for(ii=0;ii<5;ii++)
  668.     {Cvalue_buff[ii]=ADC_Convert();}
  669.   for (jj=0;jj<5;jj++)
  670.   {
  671.    for (ii=0;ii<5-jj;ii++)
  672.    {
  673.     if (Cvalue_buff[ii]>Cvalue_buff[ii+1] )
  674.     {
  675.       ADC_temp2 = Cvalue_buff[ii];
  676.       Cvalue_buff[ii] = Cvalue_buff[ii+1];
  677.       Cvalue_buff[ii+1] = ADC_temp2;
  678.     }
  679.    }
  680.   }
  681.   Current=Cvalue_buff[2]*10;
  682. }
  683. //--------充电函数--------------------------------
  684. //函数说明:调用充电电流及电池电压检测函数
  685. //                        Current:充电电流(mA)       bat_voltage:电池电压
  686. //                        charge_voltage:充电限制电压  charge_current:恒流充电电流
  687. //                        error_charge:充电错误(电压低于1V或者大于充电限制电压+300,报错)标志位,有误为1;
  688. //                        finish_charge:充电完成标志位,为1充电完成;
  689. //------------------------------------------------
  690. void chargeing(void)
  691. {
  692.         Current_Check();
  693.     delay_ms(1);
  694.     bat_voltage_check();
  695.         
  696.         if((bat_voltage>(charge_voltage+300))||(bat_voltage<1000))//电压低于1V或者大于充电限制电压+300,报错
  697.         {
  698.                 PWM_WIDE=0;
  699.                 error_charge=1;
  700.         }        
  701.         else if((1000<bat_voltage)&&(bat_voltage<3000)&&(!finish_charge))//预充电
  702.                 {PWM_WIDE=30;}
  703.         else if((3000<bat_voltage)&&(bat_voltage<(charge_voltage+50))&&(!finish_charge))//恒流充电
  704.         {
  705.                 error_charge=0;
  706.                 if(bat_voltage<(charge_voltage-50))
  707.                 {
  708.                         if((Current+50)<charge_current)
  709.                                 {PWM_WIDE+=20;}
  710.                         else if(((Current+50)>charge_current)&&((Current+20)<charge_current))
  711.                                 {PWM_WIDE+=5;}
  712.                         else if(((Current+20)>charge_current)&&(charge_current>Current+3))
  713.                                 {PWM_WIDE++;}
  714.                         else if(Current>(charge_current+5))
  715.                                 {PWM_WIDE--;}
  716.                 }
  717.                         
  718.                 else if((bat_voltage>(charge_voltage-50))&&(bat_voltage<(charge_voltage+30)))
  719.                 {        
  720.                         if((bat_voltage>(charge_voltage-50))&&(bat_voltage<(charge_voltage-30)))
  721.                                 {PWM_WIDE++;}
  722.                         else if(bat_voltage>charge_voltage||Current>(charge_current+5))
  723.                                 {PWM_WIDE--;}
  724.                 }
  725.                 if(PWM_WIDE>=0X3FF)
  726.                         {PWM_WIDE=0X3FF;}        
  727.         }
  728.         
  729.         if((PWM_WIDE<19)&&(!error_charge))//电流过小,充电完成。
  730.         {
  731.                 count=eeprom_read(0x09)*60;
  732.                 finish_charge=1;
  733.                 PWM_WIDE=0;
  734.                 FLAG_CHARGE=0;
  735.                 eeprom_write(0xf0,0);
  736.                 FLAG_RUN=0;
  737.         }

  738. }

  739. //--------放电函数----------------------
  740. //函数说明:调用充电电流及电池电压检测函数
  741. //                        Current:放电电流(mA)       bat_voltage:电池电压
  742. //                        discharge_voltage:充电限制电压  discharge_current:恒流充电电流
  743. //                        error_discharge:充电错误(电压低于1V或者大于充电限制电压+300,报错)标志位,有误为1;
  744. //                        finish_discharge:充电完成标志位,为1充电完成;
  745. //------------------------------------------------
  746. void discharge(void)
  747. {
  748.         discharge_current_check();
  749.     bat_voltage_check();
  750.     if(bat_voltage<1000)
  751.     {
  752.             PWM_WIDE=0;
  753.             //error_discharge=1;
  754.     }
  755.     else if(bat_voltage>=discharge_voltage)
  756.     {
  757.             //error_discharge=0;
  758.             if((Current+100)<discharge_current)
  759.                     {PWM_WIDE+=50;}
  760.             else if(((Current+100)>discharge_current)&&(Current+50)<discharge_current)
  761.                     {PWM_WIDE+=50;}
  762.             else if(((Current+50)>discharge_current)&&(Current+15)<discharge_current)
  763.                     {PWM_WIDE++;}
  764.             else if(Current>(discharge_current+50))
  765.                     {PWM_WIDE-=5;}
  766.             else if(Current>(discharge_current+10))
  767.                     {PWM_WIDE--;}
  768.         if(PWM_WIDE>=0X3FF)
  769.                     {PWM_WIDE=0X3FF;}
  770.     }
  771.     else if(bat_voltage<discharge_voltage)
  772.     {
  773.             count=10;//36000;//放电完成后,转入到充电的时间count s
  774.             finish_discharge=1;
  775.             PWM_WIDE=0;
  776.             FLAG_CHARGE=1;
  777.             eeprom_write(0xf0,1);
  778.             FLAG_RUN=0;
  779.             loop_temp++;
  780.             eeprom_write(0x0a,loop_temp);
  781.     }
  782. }
  783. //--------主函数-------------------------
  784. void main(void)
  785. {         
  786. Init();
  787. Set32MHZ();
  788. Init_Uart();
  789. read_data();
  790. InitTIME0();
  791. InitTIME1();
  792. InitTIME246();
  793. InitPWM();
  794. InitADC();        
  795. lcd_init();
  796. if(eeprom_read(0x08)>eeprom_read(0x0A))
  797. {
  798.    menu_4();
  799. }
  800. else
  801. {
  802.    screen_status=1;
  803.    i=0;
  804.    menu_1();
  805.    STARTUP=0;
  806.    FLAG_RUN=0;
  807. }
  808. while(1)
  809. {               
  810.   asm("CLRWDT");  
  811.   KeyProcess();
  812.   if(STARTUP&&count==0)
  813.   {
  814.    STARTUP=0;
  815.    screen_status=0;
  816.    i=0;
  817.    lcd_write_com_busy(0x01);
  818.    menu_0();
  819.    FLAG_RUN=1;
  820.    WORKING=1;
  821.   }  
  822.   else if(WORKING)
  823.   {
  824.           if(loop_temp<loop_times)
  825.           {
  826.                   if(FLAG_RUN&flag_work)
  827.                    {
  828.                      if(FLAG_CHARGE)
  829.                      {
  830.                        chargeing();
  831.                        PWM_Size(PWM_WIDE);
  832.                      }
  833.                      
  834.                          else if(!FLAG_CHARGE)
  835.                          {
  836.                           discharge();
  837.                           PWM5_Size(PWM_WIDE);
  838.                           capacity_record();//容量累加
  839.                          }
  840.                          flag_work=0;
  841.                          if(screen_status==0)
  842.                             menu_0();
  843.                    }
  844.         
  845.               else if(count==0)//倒计时结束,
  846.                      {
  847.                       if(finish_discharge&&FLAG_CHARGE)//开始充电
  848.                       {
  849.                               lcd_write_com_busy(0x01);
  850.                               finish_discharge=0;
  851.                               second_count=0;
  852.                               charge_time=0;//充电时间清零
  853.                               eeprom_write(0x0b,0);
  854.                               eeprom_write(0x0c,0);
  855.                               FLAG_RUN=1;
  856.                       }
  857.                       else if(finish_charge&&FLAG_CHARGE==0)//开始放电
  858.                       {
  859.                               lcd_write_com_busy(0x01);
  860.                               finish_charge=0;
  861.                               second_count=0;
  862.                               discharge_time=0;
  863.                               eeprom_write(0x0d,0);//放电时间清零
  864.                               eeprom_write(0x0e,0);
  865.                               
  866.                               bat_cap=0;
  867.                               capacity_temp=0;
  868.                               FLAG_RUN=1;
  869.                       }
  870.               }
  871.           }
  872.           else if(loop_temp==loop_times&&flag_work)
  873.           {
  874.                   LATB7=1;
  875.                   if(screen_status==0)//测试循环结束
  876.               {
  877.                        lcd_write_com_busy(0x01);
  878.                        menu_0();
  879.               }
  880.             flag_work=0;
  881.           }   
  882.   }

  883.   if(FLAG_SECOND)
  884.   {
  885.    FLAG_SECOND=0;
  886.    second_count++;
  887.    count--;   
  888.    if(second_count>59)
  889.    {
  890.     second_count=0;
  891.     if(FLAG_RUN)// 在工作状态,一分钟时间到,时间累加
  892.     {
  893.             time_record();
  894.     }            
  895.    }
  896.          
  897.   }
  898. }  
  899. }
  900. //-----------------------------------------------------
  901. void menu_0(void)
  902. {
  903. if(FLAG_RUN&&(loop_temp<loop_times))
  904. {
  905.           lcd_write_char(15,0,' ');
  906.          if(FLAG_CHARGE)
  907.             {DisplayListChar(4,0,menu0[0]);}
  908.          else if(!FLAG_CHARGE)
  909.                  {DisplayListChar(1,0,menu0[1]);}
  910.          lcd_write_char(0,1,'U');
  911.          lcd_write_char(8,1,'I');
  912.          lcd_write_char(1,1,':');
  913.          lcd_write_char(9,1,':');
  914.         
  915.          lcd_write_char(3,1,'.');
  916.          lcd_write_char(6,1,'V');
  917.          lcd_write_char(2,1,(bat_voltage/1000+'0'));
  918.          lcd_write_char(4,1,((bat_voltage%1000)/100+'0'));
  919.          lcd_write_char(5,1,((bat_voltage%100)/10+'0'));
  920.          
  921.          lcd_write_char(11,1,'.');
  922.          lcd_write_char(14,1,'A');
  923.          lcd_write_char(10,1,(Current/1000+'0'));
  924.          lcd_write_char(12,1,((Current%1000)/100+'0'));
  925.          lcd_write_char(13,1,((Current%100)/10+'0'));
  926. }
  927. else if(loop_temp==loop_times)
  928.         {
  929.                 lcd_write_com_busy(0x01);
  930.                 DisplayListChar(2,0,menu0[2]);
  931.         }
  932. else if(finish_charge&&(loop_temp<loop_times))
  933.          {
  934.                  lcd_write_com_busy(0x01);
  935.                  DisplayListChar(1,0,menu0[3]);
  936.         }
  937. else if(finish_discharge&&(loop_temp<loop_times))
  938.          {
  939.                  lcd_write_com_busy(0x01);
  940.                  DisplayListChar(0,0,menu0[4]);
  941.         }
  942. }
  943. //--------------------------------------------------
  944. void menu_1(void)
  945. {
  946. lcd_write_com_busy(0x01);
  947. //显示第一行
  948. DisplayListChar(0, 0, menu1[i]);
  949. lcd_write_char(15,0,'<');
  950. j=i+1;
  951. //显示第二行
  952. if(j>(menu1_num-1))
  953. {j=0;}
  954. DisplayListChar(0, 1, menu1[j]);

  955. }
  956. //---------------------------------------------------
  957. void menu_3(void)
  958. {
  959. lcd_write_com_busy(0x01);
  960. //显示第一行
  961. switch(i)
  962. {
  963.   case 1: databuf1=(datatab[0]<<8)|datatab[1];break;
  964.   case 2: databuf1=(datatab[2]<<8)|datatab[3];break;
  965.   case 3: databuf1=(datatab[11]<<8)|datatab[12];break;
  966.   case 4: databuf1=(datatab[4]<<8)|datatab[5];break;   
  967.   case 5: databuf1=(datatab[6]<<8)|datatab[7];break;
  968.   case 6: databuf1=(datatab[13]<<8)|datatab[14];break;
  969.   case 7: databuf1=datatab[10];break;
  970. }
  971. DisplayListChar(0, 0, menu3[i]);

  972. if((i==1)||(i==2)||(i==4)||(i==5))
  973. {
  974.   if((i==1)||(i==4))
  975.          {lcd_write_char(12,0,'A');}
  976.   if((i==2)||(i==5))
  977.          {lcd_write_char(12,0,'V');}

  978.   lcd_write_char(9,0,'.');
  979.   lcd_write_char(8,0,(databuf1/1000+'0'));            
  980.   lcd_write_char(10,0,(databuf1%1000)/100+'0');           
  981.   lcd_write_char(11,0,(databuf1%100)/10+'0');           
  982. }
  983. else if((i==3)||(i==6)||(i==7))
  984. {
  985.   if((i==3)||(i==6))
  986.          {lcd_write_char(12,0,'M');}
  987.   else if(i==7)
  988.          {lcd_write_char(12,0,'t');}

  989.   lcd_write_char(8,0,(databuf1/1000+'0'));            
  990.   lcd_write_char(9,0,(databuf1%1000)/100+'0');           
  991.   lcd_write_char(10,0,(databuf1%100)/10+'0');           
  992.   lcd_write_char(11,0,(databuf1%10)+'0');  
  993. }
  994. lcd_write_char(15,0,'<');

  995. j=i+1;
  996. //显示第二行
  997. if(j>(menu3_num-1))
  998. {j=0;}
  999. switch(j)
  1000. {
  1001.   case 1: databuf2=(datatab[0]<<8)|datatab[1];break;
  1002.   case 2: databuf2=(datatab[2]<<8)|datatab[3];break;
  1003.   case 3: databuf2=(datatab[11]<<8)|datatab[12];break;
  1004.   case 4: databuf2=(datatab[4]<<8)|datatab[5];break;   
  1005.   case 5: databuf2=(datatab[6]<<8)|datatab[7];break;
  1006.   case 6: databuf2=(datatab[13]<<8)|datatab[14];break;
  1007.   case 7: databuf2=datatab[10];break;
  1008. }
  1009. DisplayListChar(0, 1, menu3[j]);
  1010. if((j==1)||(j==2)||(j==4)||(j==5))
  1011. {
  1012.   if((j==1)||(j==4))
  1013.          {lcd_write_char(12,1,'A');}
  1014.   else if((j==2)||(j==5))
  1015.          {lcd_write_char(12,1,'V');}
  1016.   
  1017.   lcd_write_char(9,1,'.');
  1018.   lcd_write_char(8,1,(databuf2/1000+'0'));            
  1019.   lcd_write_char(10,1,(databuf2%1000)/100+'0');           
  1020.   lcd_write_char(11,1,(databuf2%100)/10+'0');           
  1021. }
  1022. else if((j==3)||(j==6)||(j==7))
  1023. {
  1024.   if((j==3)||(j==6))
  1025.          {lcd_write_char(12,1,'M');}
  1026.   else if(j==7)
  1027.          {lcd_write_char(12,1,'t');}

  1028.   lcd_write_char(8,1,(databuf2/1000+'0'));            
  1029.   lcd_write_char(9,1,(databuf2%1000)/100+'0');           
  1030.   lcd_write_char(10,1,(databuf2%100)/10+'0');           
  1031.   lcd_write_char(11,1,(databuf2%10)+'0');   
  1032. }
  1033. }
  1034. //-----------------------------------------------

  1035. void menu_4(void)
  1036. {
  1037. //--------------------------
  1038.   lcd_write_com_busy(0x01);
  1039.   STARTUP=1;
  1040.   FLAG_CHARGE=eeprom_read(0XF0);//读取充电放电标志位,1:充电 0:放电
  1041. //显示第一行
  1042. if(FLAG_CHARGE)
  1043. {
  1044.   DisplayListChar(4, 0, menu0[0]); //charging
  1045. }
  1046. else
  1047. {
  1048.   DisplayListChar(2, 0, menu0[1]);// discharging
  1049. }
  1050. //显示第二行
  1051. DisplayListChar(0, 1, menu4[0]);
  1052. DisplayListChar(10, 1, menu4[1]);
  1053. if(i==0)
  1054. { lcd_write_char(8,1,'<'); }
  1055. else
  1056. { lcd_write_char(14,1,'<'); }
  1057. }
  1058. void menu_5(void)
  1059. {
  1060. lcd_write_com_busy(0x01);
  1061. //显示第一行
  1062. switch(i)
  1063. {
  1064.   case 0: DisplayListChar(0, 0, menu5[i]);
  1065.           lcd_write_char(12,0,'A');
  1066.           databuf1=(datatab[0]<<8)|datatab[1];break;
  1067.   case 1: DisplayListChar(0, 0, menu5[i]);
  1068.           lcd_write_char(12,0,'V');
  1069.           databuf1=(datatab[2]<<8)|datatab[3];break;
  1070.   case 2: DisplayListChar(0, 0, menu5[i+1]);
  1071.           lcd_write_char(12,0,'A');
  1072.           databuf1=(datatab[4]<<8)|datatab[5];break;
  1073.   case 3: DisplayListChar(0, 0, menu5[i+1]);
  1074.           lcd_write_char(12,0,'V');
  1075.           databuf1=(datatab[6]<<8)|datatab[7];break;   
  1076.   case 4: DisplayListChar(0, 0, menu5[i+2]);
  1077.           lcd_write_char(12,0,'t');
  1078.           databuf1=datatab[8];break;
  1079.   case 5: DisplayListChar(0, 0, menu5[i+3]);
  1080.           lcd_write_char(12,0,'M');
  1081.           databuf1=datatab[9];break;                       
  1082. }

  1083. if(i<=3)
  1084. {
  1085.   lcd_write_char(9,0,'.');
  1086.   lcd_write_char(8,0,(databuf1/1000+'0'));            
  1087.   lcd_write_char(10,0,(databuf1%1000)/100+'0');           
  1088.   lcd_write_char(11,0,(databuf1%100)/10+'0');           
  1089. }
  1090. else
  1091. {
  1092.   //lcd_write_char(8,0,(databuf1/1000+'0'));            
  1093.   //lcd_write_char(9,0,(databuf1%1000)/100+'0');           
  1094.   lcd_write_char(10,0,(databuf1%100)/10+'0');           
  1095.   lcd_write_char(11,0,(databuf1%10)+'0');   
  1096. }
  1097. lcd_write_char(15,0,'<');

  1098. j=i+1;
  1099. //显示第二行
  1100. if(j>5)
  1101. {j=0;}
  1102. switch(j)
  1103. {
  1104.   case 0: DisplayListChar(0, 1, menu5[j]);
  1105.           lcd_write_char(12,1,'A');
  1106.           databuf2=(datatab[0]<<8)|datatab[1];break;
  1107.   case 1: DisplayListChar(0, 1, menu5[j]);
  1108.           lcd_write_char(12,1,'V');
  1109.           databuf2=(datatab[2]<<8)|datatab[3];break;
  1110.   case 2: DisplayListChar(0, 1, menu5[j+1]);
  1111.           lcd_write_char(12,1,'A');
  1112.           databuf2=(datatab[4]<<8)|datatab[5];break;
  1113.   case 3: DisplayListChar(0, 1, menu5[j+1]);
  1114.           lcd_write_char(12,1,'V');
  1115.           databuf2=(datatab[6]<<8)|datatab[7];break;   
  1116.   case 4: DisplayListChar(0, 1, menu5[j+2]);
  1117.           lcd_write_char(12,1,'t');
  1118.           databuf2=datatab[8];break;
  1119.   case 5: DisplayListChar(0, 1, menu5[j+3]);
  1120.           lcd_write_char(12,1,'M');
  1121.           databuf2=datatab[9];break;                       
  1122. }

  1123. if(j<=3)
  1124. {
  1125.   lcd_write_char(9,1,'.');
  1126.   lcd_write_char(8,1,(databuf2/1000+'0'));            
  1127.   lcd_write_char(10,1,(databuf2%1000)/100+'0');           
  1128.   lcd_write_char(11,1,(databuf2%100)/10+'0');           
  1129. }
  1130. else
  1131. {
  1132.   //lcd_write_char(8,1,(databuf2/1000+'0'));            
  1133.   //lcd_write_char(9,1,(databuf2%1000)/100+'0');           
  1134.   lcd_write_char(10,1,(databuf2%100)/10+'0');           
  1135.   lcd_write_char(11,1,(databuf2%10)+'0');   
  1136. }
  1137. }
  1138. void menu_2(void)
  1139. {

  1140. lcd_write_com_busy(0x01);
  1141. //显示第一行
  1142. switch(i)
  1143. {
  1144.   case 1: databuf1=(datatab[0]<<8)|datatab[1];break;
  1145.   case 2: databuf1=(datatab[2]<<8)|datatab[3];break;
  1146.   case 3: databuf1=(datatab[11]<<8)|datatab[12];break;
  1147.   case 4: databuf1=(datatab[4]<<8)|datatab[5];break;   
  1148.   case 5: databuf1=(datatab[6]<<8)|datatab[7];break;
  1149.   case 6: databuf1=(datatab[13]<<8)|datatab[14];break;
  1150.   case 7: databuf1=datatab[10];break;
  1151. }
  1152. DisplayListChar(0, 0, menu2[i]);
  1153. if((i==1)||(i==2)||(i==4)||(i==5))
  1154. {
  1155.   if((i==1)||(i==4))
  1156.          {lcd_write_char(12,0,'A');}
  1157.   else if((i==2)||(i==5))
  1158.          {lcd_write_char(12,0,'V');}
  1159.   lcd_write_char(9,0,'.');
  1160.   
  1161.   lcd_write_char(8,0,(databuf1/1000+'0'));            
  1162.   lcd_write_char(10,0,(databuf1%1000)/100+'0');           
  1163.   lcd_write_char(11,0,(databuf1%100)/10+'0');           
  1164. }
  1165. else if((i==3)||(i==6)||(i==7))
  1166. {
  1167.   if((i==3)||(i==6))
  1168.          {lcd_write_char(12,0,'M');}
  1169.   else if(i==7)
  1170.          {lcd_write_char(12,0,'t');}
  1171.   lcd_write_char(8,0,(databuf1/1000+'0'));            
  1172.   lcd_write_char(9,0,(databuf1%1000)/100+'0');           
  1173.   lcd_write_char(10,0,(databuf1%100)/10+'0');           
  1174.   lcd_write_char(11,0,(databuf1%10)+'0');  
  1175. }
  1176. lcd_write_char(15,0,'<');

  1177. j=i+1;
  1178. //显示第二行
  1179. if(j>(menu2_num-1))
  1180. {j=0;}
  1181. switch(j)
  1182. {
  1183.   case 1: databuf2=(datatab[0]<<8)|datatab[1];break;
  1184.   case 2: databuf2=(datatab[2]<<8)|datatab[3];break;
  1185.   case 3: databuf2=(datatab[11]<<8)|datatab[12];break;
  1186.   case 4: databuf2=(datatab[4]<<8)|datatab[5];break;   
  1187.   case 5: databuf2=(datatab[6]<<8)|datatab[7];break;
  1188.   case 6: databuf2=(datatab[13]<<8)|datatab[14];break;
  1189.   case 7: databuf2=datatab[10];break;
  1190. }

  1191. DisplayListChar(0, 1, menu2[j]);
  1192. if((j==1)||(j==2)||(j==4)||(j==5))
  1193. {
  1194.   if((j==1)||(j==4))
  1195.          {lcd_write_char(12,1,'A');}
  1196.   else if((j==2)||(j==5))
  1197.          {lcd_write_char(12,1,'V');}
  1198.   lcd_write_char(9,1,'.');
  1199.   lcd_write_char(8,1,(databuf2/1000+'0'));            
  1200.   lcd_write_char(10,1,(databuf2%1000)/100+'0');           
  1201.   lcd_write_char(11,1,(databuf2%100)/10+'0');           
  1202.   //lcd_write_char(11,1,(databuf2%10)+'0');  
  1203. }
  1204. else if((j==3)||(j==6)||(j==7))
  1205. {
  1206.   if((j==3)||(j==6))
  1207.          {lcd_write_char(12,1,'M');}
  1208.   else if(j==7)
  1209.          {lcd_write_char(12,1,'t');}

  1210.   lcd_write_char(8,1,(databuf2/1000+'0'));            
  1211.   lcd_write_char(9,1,(databuf2%1000)/100+'0');           
  1212.   lcd_write_char(10,1,(databuf2%100)/10+'0');           
  1213.   lcd_write_char(11,1,(databuf2%10)+'0');   
  1214. }
  1215. }
  1216. void menu_6(void)
  1217. {
  1218. lcd_write_com_busy(0x01);
  1219. //显示第一行
  1220. DisplayListChar(4, 0, menu6);
  1221. //显示第二行
  1222. DisplayListChar(0, 1, menu60[0]);
  1223. DisplayListChar(8, 1, menu60[1]);
  1224. if(i==0)
  1225.   {lcd_write_char(6,1,'<');}
  1226. else
  1227.   {lcd_write_char(13,1,'<');}
  1228. }

  1229. void menu_7(void)
  1230. {
  1231.         lcd_write_com_busy(0x01);
  1232.         
  1233.         //显示CAP
  1234.         DisplayListChar(0,0,menu70);
  1235.            DisplayListChar(0,1,menu70);
  1236.            //显示 :
  1237.            lcd_write_char(4,0,':');
  1238.            lcd_write_char(4,1,':');
  1239.            //显示mah
  1240.            DisplayListChar(12,0,menu_mah);
  1241.            DisplayListChar(12,1,menu_mah);
  1242.            //显示0-9数字
  1243.            lcd_write_char(3,0,i+'0');
  1244.            
  1245.            j=i+1;
  1246.            if(j>9)
  1247.              {j=0;}
  1248.            lcd_write_char(3,1,j+'0');
  1249.            
  1250.             switch(i)
  1251.          {
  1252.           case 0: databuf1=(cap_data[0]<<8)|cap_data[1];break;
  1253.           case 1: databuf1=(cap_data[2]<<8)|cap_data[3];break;
  1254.           case 2: databuf1=(cap_data[4]<<8)|cap_data[5];break;
  1255.           case 3: databuf1=(cap_data[6]<<8)|cap_data[7];break;   
  1256.           case 4: databuf1=(cap_data[8]<<8)|cap_data[9];break;
  1257.           case 5: databuf1=(cap_data[10]<<8)|cap_data[11];break;
  1258.           case 6: databuf1=(cap_data[12]<<8)|cap_data[13];break;
  1259.           case 7: databuf1=(cap_data[14]<<8)|cap_data[15];break;
  1260.           case 8: databuf1=(cap_data[16]<<8)|cap_data[17];break;
  1261.           case 9: databuf1=(cap_data[18]<<8)|cap_data[19];break;
  1262.          }
  1263.          lcd_write_char(8,0,(databuf1/1000+'0'));            
  1264.          lcd_write_char(9,0,(databuf1%1000)/100+'0');           
  1265.          lcd_write_char(10,0,(databuf1%100)/10+'0');           
  1266.          lcd_write_char(11,0,(databuf1%10)+'0');
  1267.          
  1268.          switch(j)
  1269.          {
  1270.           case 0: databuf2=(cap_data[0]<<8)|cap_data[1];break;
  1271.           case 1: databuf2=(cap_data[2]<<8)|cap_data[3];break;
  1272.           case 2: databuf2=(cap_data[4]<<8)|cap_data[5];break;
  1273.           case 3: databuf2=(cap_data[6]<<8)|cap_data[7];break;   
  1274.           case 4: databuf2=(cap_data[8]<<8)|cap_data[9];break;
  1275.           case 5: databuf2=(cap_data[10]<<8)|cap_data[11];break;
  1276.           case 6: databuf2=(cap_data[12]<<8)|cap_data[13];break;
  1277.           case 7: databuf2=(cap_data[14]<<8)|cap_data[15];break;
  1278.           case 8: databuf2=(cap_data[16]<<8)|cap_data[17];break;
  1279.           case 9: databuf2=(cap_data[18]<<8)|cap_data[19];break;
  1280.          }
  1281.          lcd_write_char(8,1,(databuf2/1000+'0'));            
  1282.          lcd_write_char(9,1,(databuf2%1000)/100+'0');           
  1283.          lcd_write_char(10,1,(databuf2%100)/10+'0');           
  1284.          lcd_write_char(11,1,(databuf2%10)+'0');
  1285. }
复制代码


全部资料51hei下载地址:
battery_test4.zip (919.63 KB, 下载次数: 127)



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1016516 发表于 2022-4-9 18:47 | 只看该作者
作者大大,电路原理图还在吗?求
回复

使用道具 举报

板凳
ID:1028227 发表于 2022-5-24 17:51 来自手机 | 只看该作者
好文章。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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