分享一個由PIC16F1938單片機芯片和AD623構成的電池容量測試儀.
電路原理圖如下:
DSC_0015.JPG (1.79 MB, 下載次數: 137)
下載附件
2018-5-17 06:27 上傳
0.png (49.2 KB, 下載次數: 134)
下載附件
2018-5-17 18:53 上傳
電池容量測試儀的pic單片機源碼:
- #include "main.h"
- //------------------------32MHZ----------------------------------------------
- __CONFIG(FOSC_INTOSC & CLKOUTEN_OFF & BOREN_ON & PWRTE_ON & CPD_OFF
- &CP_ON & MCLRE_ON & LVP_OFF & WDTE_ON ); //此處有關32MHz的設置與1829不同,PLL使能位必須在寄存器OSCCON里面設置SPLLEN
- //而不是在配置字里面設置PLLEN_ON
- /***eeprom 數據存儲地址分配**************
- 0X00 0X01 充電電流
- 0X02 0X03 充電截止電壓
- 0X04 0X05 放電電流
- 0X06 0X07 放電截止電壓
- 0X08 循環次數
- 0X09 充滿多久后放電
- 0X0A 已循環次數
- 0X0B 0X0C 充電時間
- 0X0D 0X0E 放電時間
- 0X0F 0X10 總容量
- 0xf0 掉電前的狀態:0放電/1充電
- ******************************************/
-
- //---------非精確延時1ms函數------------
- void delay_ms(uint16_t time)
- {
- uint16_t k, j=0;
- for(k=0;k<189;k++)
- {
- for(;j<time;j++)
- {CLRWDT();}
- }
- }
- //--------端口及時鐘初始化--------------
- void Init(void)
- {
- asm("CLRWDT");
- PORTA=0X00;
- LATA=0X00;
- TRISA=0B00000111;
- ANSELA=0B00000111;//RA0 RA1 RA2作為模擬輸入,其余為數字輸出
- PORTB=0X00;
- LATB=0X00;
- TRISB=0B00111100;
- ANSELB=0B00000000;
- PORTC=0X00;
- TRISC=0B00000000;
- LATC=0X00;
-
- screen_status=4;
- i=0;
- j=0;
- FLAG_RUN=0;
- }
- //-------------串口初始化------------------
- void Init_Uart(void)
- {
- TRISC6=0;
- //TRISC7=1;
- SPBRG=0xcf;
- BRG16=1;
- BRGH=0;
-
- TX9=0;
- SYNC=0;
- SPEN=1;
- TXEN=1;
-
- TXIF=0;
- TXIE=0;
- CREN=1;
- SYNC=0;
-
- RCIF=0;
- RCIE=0;
-
- GIE=1;
- PEIE=1;
-
- }
- void putch(unsigned char byte)
- {
- /* output one byte */
- //CLRWDT();
- while(!TXIF) /* set when register is empty */
- continue;
- TXREG = byte;
- }
- void Set32MHZ(void)
- {
- SCS1=0; //配置字中若已經設置了FOSC<2:0> 那么在此必須將SCS<1:0>=00
- SCS0=0;
- IRCF3=1; //16MHZ分頻后得到8MHZ再4倍頻到32MHZ
- IRCF2=1;
- IRCF1=1;
- IRCF0=0;
- OSTS=0;
- PLLR=1;
- HFIOFS=1;
- SPLLEN=1;//必須在此處設置此位,否則系統時鐘頻率不為8MHz
- }
- void interrupt isr(void)
- {
- //-----------TMER0中斷--------------------
- if((TMR0IF)&&(TMR0IE))
- {
- TMR0=0x07;
- TMR0IF=0; //0.25ms
- }
- //-----------TMER1中斷-------------------
- if((TMR1IF)&&(TMR1IE))//定時50ms
- {
- TMR1H=0x3C;
- TMR1L=0xB5;
- TMR1IF=0;
- second--;
- if(second==0)
- {
- second=20;
- FLAG_SECOND=1;
- }
- if(second==10||second==20)
- {
- flag_work=1;
- }
- if(WORKING&&loop_temp<loop_times)
- {
-
- if(second==20)
- {LATB7=1;}
- else if(FLAG_RUN)
- {
- if(second==10)
- {LATB7=1;}
- else if(!FLAG_CHARGE&&(second==5||second==15))
- {LATB7=1;}
- else
- {LATB7=0;}
- }
- else
- {LATB7=0;}
- }
- /*if(++count1>99)
- {
-
- count1=0;
- printf("%d \r\n",bat_voltage);
- }*/
- }
- //--------------------TMER4中斷-----------
- if((TMR4IF)&&(TMR4IE))
- {
- TMR4=0x57;
- TMR4IF=0; //0.5ms
- }
- if((TMR6IF)&&(TMR6IE))
- {
- TMR6=0x6F;//1ms進入中斷一次
- TMR6IF=0;
- if((FLAG_RUN)&&(screen_status==0)&&(loop_temp<loop_times))
- {
- if(++keydelay1>1000)
- {
- keydelay1=0;
- m++;
- if(m>3)
- {
- m=0;
- lcd_write_char(12,0,' ');
- lcd_write_char(13,0,' ');
- lcd_write_char(14,0,' ');
- }
- else
- {lcd_write_char(11+m,0,'.');}
- lcd_write_char(15,0,' ');
- }
- }
-
- if(KEYDOWNING)
- {
- if(++keydelay>10)
- {
- keydelay=0;
- KEYDOWNING=0;
- }
- }
-
- }
- }
- //-----------判斷按鍵狀態-------------------------
- unsigned char getkey(void)
- {
- unsigned char keytemp;
- keytemp=LATB;//不能用keytemp=PORTB;
- return (~keytemp) & 0X3C;
- }
- //------------按鍵初始化-----------------
- void Keyinit(void)
- {
- KEY_MAIN.KEY_BIT.ReadData_ON_OFF=(ON_OFF^1);
- KEY_MAIN.KEY_BIT.ReadData_DEC=(DEC^1);
- KEY_MAIN.KEY_BIT.ReadData_ADD=(ADD^1);
- KEY_MAIN.KEY_BIT.ReadData_MENU=(MENU^1);
- 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);
- KEY_MAIN.KEY_BIT.TRG_DEC=KEY_MAIN.KEY_BIT.ReadData_DEC & (KEY_MAIN.KEY_BIT.ReadData_DEC ^ KEY_MAIN.KEY_BIT.COUT_DEC);
- KEY_MAIN.KEY_BIT.TRG_ADD=KEY_MAIN.KEY_BIT.ReadData_ADD & (KEY_MAIN.KEY_BIT.ReadData_ADD ^ KEY_MAIN.KEY_BIT.COUT_ADD);
- KEY_MAIN.KEY_BIT.TRG_MENU=KEY_MAIN.KEY_BIT.ReadData_MENU & (KEY_MAIN.KEY_BIT.ReadData_MENU ^ KEY_MAIN.KEY_BIT.COUT_MENU);
- KEY_MAIN.KEY_BIT.COUT_ON_OFF=KEY_MAIN.KEY_BIT.ReadData_ON_OFF;
- KEY_MAIN.KEY_BIT.COUT_DEC=KEY_MAIN.KEY_BIT.ReadData_DEC;
- KEY_MAIN.KEY_BIT.COUT_ADD=KEY_MAIN.KEY_BIT.ReadData_ADD;
- KEY_MAIN.KEY_BIT.COUT_MENU=KEY_MAIN.KEY_BIT.ReadData_MENU;
-
- }
- //-------按鍵掃描-------------------------
- unsigned char KeyScan(void)
- {
- Keyinit();
- if(KEY_MAIN.KEY_ALL_BITS==0X0007) //ON/OFF
- {
- return 1;
- }
- else if(KEY_MAIN.KEY_ALL_BITS==0X0038) //DEC
- {
- return 2;
- }
- else if(KEY_MAIN.KEY_ALL_BITS==0X01C0) //ADD
- {
- return 3;
- }
- else if(KEY_MAIN.KEY_ALL_BITS==0X0E00) //MENU
- {
- return 4;
- }
- return 0;
- }
- void KeyProcess(void)
- {
- if(getkey())//判斷有按鍵按下
- {
- if(!KEYDOWNING)
- {
- KEYDOWNING = 1;
- keyvalue=KeyScan();//提取具體按鍵值
- }
- }
- else
- {
- KEYDOWNING = 0;
- }
- if(keyvalue)
- {
- if(STARTUP)
- count=60;
- if(keyvalue==1) //ON_OFF
- {
- switch(screen_status)
- {
- case 0: screen_status=2;
- i=0;
- read_data();
- menu_2(); break;
- case 1: if(i==0)
- {
- FLAG_RUN=1;
- WORKING=1;
- finish_discharge=0;
- finish_charge=0;
- screen_status=0;
- i=0;
- lcd_write_com_busy(0x01);
- menu_0(); break;
- }
- else if(i==1)
- {
- screen_status=3;
- i=0;
- read_data();
- menu_3(); break;
- }
- else if(i==2)
- {
- read_data();
- screen_status=5;
- i=0;
- menu_5(); break;
- }
- case 2: if(i==0)
- {
- FLAG_RUN=0;
- WORKING=0;
- LATB7=0;
- PWM_WIDE=0;
- PWM_Size(PWM_WIDE);
- PWM5_Size(PWM_WIDE);
- screen_status=1;
- i=0;
- menu_1(); break;
- }
- else if(i==8)
- {
- for(k=16;k<36;k++)
- {cap_data[k-16]=eeprom_read(k);}
- screen_temp=screen_status;
- screen_status=7;
- i=0;
- menu_7();break;
- }
- else
- {
- screen_status=2;
- menu_2(); break;
- }
- case 3: if(i==0)
- {
- for(k=10;k<36;k++)
- {eeprom_write(k,0);}
- read_data();
- screen_status=1;
- i=0;
- menu_1(); break;
- }
- else if(i==8)
- {
- for(k=16;k<36;k++)
- {cap_data[k-16]=eeprom_read(k);}
- screen_temp=screen_status;
- screen_status=7;
- i=0;
- menu_7();break;
- }
- else
- {
- screen_status=3;
- menu_3(); break;
- }
- case 4: if(i==0)
- {
- screen_status=0;
- i=0;
- lcd_write_com_busy(0x01);
- menu_0();
- STARTUP=0;
- WORKING=1;
- FLAG_RUN=1;break;
- }
- else
- {
- screen_status=1;
- i=0;
- menu_1();
- STARTUP=0;
- FLAG_RUN=0; break;
- }
- case 5: screen_status=6;
- i=0;
- menu_6(); break;
- case 6: if(i==0)//需要保存設置的數據
- {
- for(k=0;k<10;k++)
- {eeprom_write(k,datatab[k]);}
- read_data();//此處讀取各個參數數值
- screen_status=1;
- i=0;
- menu_1(); break;
- }
- else//不保存,則采用之前的數據
- {
- screen_status=1;
- i=0;
- menu_1(); break;
- }
- default: break;
- }
- }
- else if(keyvalue==2)//ADD
- {
- if((screen_status==5)&&(!FLAG_RUN))
- {
- switch(i)
- {
- case 0: temp=(datatab[0]<<8)|datatab[1];
- temp+=10;//此處增加限制電流增加的上限
- if(temp>2000)
- {temp=10;}
- datatab[1]=(unsigned char)temp;
- datatab[0]=(temp>>8)&0xff;
- break;
- case 1: temp=(datatab[2]<<8)|datatab[3];
- temp+=50;//此處增加限制電壓增加的上限
- if(temp>4500)
- {temp=3500;}
- datatab[2]=(temp>>8)&0xff;
- datatab[3]=temp&0xff;break;
- case 2: temp=(datatab[4]<<8)|datatab[5];
- temp+=10;//此處增加限制電流增加的上限
- if(temp>3000)
- {temp=10;}
- datatab[4]=(temp>>8)&0xff;
- datatab[5]=temp&0xff;break;
- case 3: temp=(datatab[6]<<8)|datatab[7];
- temp+=50;//此處增加限制電流增加的上限
- if(temp>4000)
- {temp=2500;}
- datatab[6]=(temp>>8)&0xff;
- datatab[7]=temp&0xff;break;
- case 4: temp=datatab[8];
- temp++;//此處增加限制電流增加的上限
- if(temp>50)
- {temp=1;}
- datatab[8]=temp;break;
- case 5: temp=datatab[9];
- temp+=5;//此處增加限制電流增加的上限
- if(temp>30)
- {temp=0;}
- datatab[9]=temp;break;
- }
- menu_5();
- }
- else if(screen_status==2)
- {
- i++;
- if(i>(menu2_num-1))
- {i=0;}
- menu_2();
- }
- else if((screen_status==1)&&(!FLAG_RUN))
- {
- i++;
- if(i>(menu1_num-1))
- {i=0;}
- menu_1();
- }
- else if((screen_status==3)&&(!FLAG_RUN))
- {
- i++;
- if(i>(menu3_num-1))
- {i=0;}
- menu_3();
- }
- else if(screen_status==7)
- {
- i++;
- if(i>9)
- {i=0;}
- menu_7();
- }
- }
- else if(keyvalue==3)//DEC
- {
- if((screen_status==5)&&(!FLAG_RUN))
- {
- switch(i)
- {
- case 0: temp=(datatab[0]<<8)|datatab[1];
- temp-=10;//此處增加限制電流增加的上限
- if(temp==0)
- {temp=2000;}
- datatab[1]=(unsigned char)temp;
- datatab[0]=(temp>>8)&0xff;
- break;
- case 1: temp=(datatab[2]<<8)|datatab[3];
- temp-=50;//此處增加限制電壓增加的上限
- if(temp<3500)
- {temp=4500;}
- datatab[2]=(temp>>8)&0xff;
- datatab[3]=temp&0xff;break;
- case 2: temp=(datatab[4]<<8)|datatab[5];
- temp-=10;//此處增加限制電流增加的上限
- if(temp>3000)
- {temp=3000;}
- datatab[4]=(temp>>8)&0xff;
- datatab[5]=temp&0xff;break;
- case 3: temp=(datatab[6]<<8)|datatab[7];
- temp-=50;//此處增加限制電流增加的上限
- if(temp<2500)
- {temp=4000;}
- datatab[6]=(temp>>8)&0xff;
- datatab[7]=temp&0xff;break;
- case 4: temp=datatab[8];
- temp--;//此處增加限制電流增加的上限
- if(temp==0)
- {temp=50;}
- datatab[8]=temp;break;
- case 5: temp=datatab[9];
- temp-=5;//此處增加限制電流增加的上限
- if(temp>30)
- {temp=30;}
- datatab[9]=temp;break;
- }
- menu_5();
- }
- else if(screen_status==2)
- {
- i--;
- if(i>(menu2_num-1))
- {i=menu2_num-1;}
- menu_2();
- }
- else if((screen_status==1)&&(!FLAG_RUN))
- {
- i--;
- if(i>(menu1_num-1))
- {i=menu1_num-1;}
- menu_1();
- }
- else if((screen_status==3)&&(!FLAG_RUN))
- {
- i--;
- if(i>(menu3_num-1))
- {i=menu3_num-1;}
- menu_3();
- }
- else if(screen_status==7)
- {
- i--;
- if(i>9)
- {i=9;}
- menu_7();
- }
- }
- else if(keyvalue==4)//MENU 選擇項目 菜單循環顯示
- {
- switch(screen_status)
- {
-
- case 2: screen_status=0;
- i=0;
- lcd_write_com_busy(0x01);
- menu_0(); break;
- case 3: screen_status=1;
- i=0;
- menu_1(); break;
- case 4: i++;
- if(i>(menu4_num-1))
- {i=0;}
- menu_4(); break;
- case 5: i++;
- if(i>5)
- {i=0;}
- menu_5(); break;
- case 6: i++;
- if(i>1)
- {i=0;}
- menu_6(); break;
- case 7: screen_status=screen_temp;
- i=0;
- if(screen_temp==2)
- {menu_2();}
- else
- {menu_3();}
- break;
- }
- }
- keyvalue=0;
- }
- }
- //-------------------------------------------------------
- //從eeprom中讀取數據
- //-----------------------------------------------------
- void read_data(void)
- {
- for(k=0;k<15;k++)
- {datatab[k]=eeprom_read(k);}
-
- charge_current=(datatab[0]<<8)|datatab[1];
- charge_voltage=(datatab[2]<<8)|datatab[3];
- discharge_current=(datatab[4]<<8)|datatab[5];
- discharge_voltage=(datatab[6]<<8)|datatab[7];
- loop_times=datatab[8];
- loop_temp=datatab[10];
- charge_time=(datatab[11]<<8)|datatab[12];
- discharge_time=(datatab[13]<<8)|datatab[14];
- }
- //------------------------------------------------------
- //時間記錄函數
- //-----------------------------------------------------
- void time_record(void)
- {
- if(FLAG_CHARGE)
- {
- charge_time++;
- eeprom_write(0x0c,(unsigned char)charge_time);
- eeprom_write(0x0b,0xff&(charge_time>>8));
- }
- else if(!FLAG_CHARGE)
- {
- discharge_time++;
- eeprom_write(0x0e,(unsigned char)discharge_time);
- eeprom_write(0x0d,0xff&(discharge_time>>8));
- }
- }
- //-----------------------------------------------------
- //電池容量累計(放電)
- //------------------------------------------------------
- void capacity_record(void)
- {
- capacity_temp+=Current;
- if(capacity_temp>7200)
- {
- bat_cap++;
- if((loop_temp>=0)&&(loop_temp<10))
- {
- eeprom_write(17+loop_temp*2,(unsigned char)bat_cap);
- eeprom_write(16+loop_temp*2,bat_cap>>8);
- }
- else if((loop_temp>9)&&(loop_temp<20))
- {
- eeprom_write(17+(loop_temp%10)*2,(unsigned char)bat_cap);
- eeprom_write(16+(loop_temp%10)*2,bat_cap>>8);
- }
- else if((loop_temp>19)&&(loop_temp<30))
- {
- eeprom_write(17+(loop_temp%20)*2,(unsigned char)bat_cap);
- eeprom_write(16+(loop_temp%20)*2,bat_cap>>8);
- }
- else if((loop_temp>29)&&(loop_temp<40))
- {
- eeprom_write(17+(loop_temp%30)*2,(unsigned char)bat_cap);
- eeprom_write(16+(loop_temp%30)*2,bat_cap>>8);
- }
- else if((loop_temp>39)&&(loop_temp<50))
- {
- eeprom_write(17+(loop_temp%40)*2,(unsigned char)bat_cap);
- eeprom_write(16+(loop_temp%40)*2,bat_cap>>8);
- }
- capacity_temp=capacity_temp%7200;
- }
- }
- //-------充電電流檢測---------------------------------
- //Current:充電電流值 mA
- //-------------------------------------------------
- void Current_Check(void)
- {
- unsigned int ADC_temp2;
- unsigned int ADC_temp3;
-
- ADC_Channel(1);
- ADC_temp2=ADC_Convert();
- ADC_temp3=ADC_Convert();
- ADC_temp2=ADC_temp2*3/10+ADC_temp3*7/10;
- Current=(ADC_temp2*10)/4;
- }
- //-------電池電壓檢測函數-------------------------------
- //bat_voltage:電池電壓值 mV
- //采用平均值濾波
- //-------------------------------------------------------
- void bat_voltage_check(void)
- {
- unsigned int ADC_temp2=0;
- unsigned char ADC_temp3;
-
- ADC_Channel(0);
- Uvalue_buff[count2]=ADC_Convert();
- if(Uvalue_buff[7]!=0)
- {
- for(ADC_temp3=0;ADC_temp3<8;ADC_temp3++)
- {ADC_temp2+=Uvalue_buff[ADC_temp3];}
- bat_voltage=(ADC_temp2*5)>>3;
- }
- else
- {
- bat_voltage=Uvalue_buff[count2]*5;
- }
- count2++;
- if(count2>7)
- {count2=0;}
- }
- //--------放電電流檢測函數------------------------
- //--------采用了中值濾波--------------------------
- //------------------------------------------------
- void discharge_current_check(void)
- {
- unsigned int ADC_temp2;
- unsigned char ADC_temp3;
- unsigned char ii,jj;
- ADC_Channel(2);
- for(ii=0;ii<5;ii++)
- {Cvalue_buff[ii]=ADC_Convert();}
- for (jj=0;jj<5;jj++)
- {
- for (ii=0;ii<5-jj;ii++)
- {
- if (Cvalue_buff[ii]>Cvalue_buff[ii+1] )
- {
- ADC_temp2 = Cvalue_buff[ii];
- Cvalue_buff[ii] = Cvalue_buff[ii+1];
- Cvalue_buff[ii+1] = ADC_temp2;
- }
- }
- }
- Current=Cvalue_buff[2]*10;
- }
- //--------充電函數--------------------------------
- //函數說明:調用充電電流及電池電壓檢測函數
- // Current:充電電流(mA) bat_voltage:電池電壓
- // charge_voltage:充電限制電壓 charge_current:恒流充電電流
- // error_charge:充電錯誤(電壓低于1V或者大于充電限制電壓+300,報錯)標志位,有誤為1;
- // finish_charge:充電完成標志位,為1充電完成;
- //------------------------------------------------
- void chargeing(void)
- {
- Current_Check();
- delay_ms(1);
- bat_voltage_check();
-
- if((bat_voltage>(charge_voltage+300))||(bat_voltage<1000))//電壓低于1V或者大于充電限制電壓+300,報錯
- {
- PWM_WIDE=0;
- error_charge=1;
- }
- else if((1000<bat_voltage)&&(bat_voltage<3000)&&(!finish_charge))//預充電
- {PWM_WIDE=30;}
- else if((3000<bat_voltage)&&(bat_voltage<(charge_voltage+50))&&(!finish_charge))//恒流充電
- {
- error_charge=0;
- if(bat_voltage<(charge_voltage-50))
- {
- if((Current+50)<charge_current)
- {PWM_WIDE+=20;}
- else if(((Current+50)>charge_current)&&((Current+20)<charge_current))
- {PWM_WIDE+=5;}
- else if(((Current+20)>charge_current)&&(charge_current>Current+3))
- {PWM_WIDE++;}
- else if(Current>(charge_current+5))
- {PWM_WIDE--;}
- }
-
- else if((bat_voltage>(charge_voltage-50))&&(bat_voltage<(charge_voltage+30)))
- {
- if((bat_voltage>(charge_voltage-50))&&(bat_voltage<(charge_voltage-30)))
- {PWM_WIDE++;}
- else if(bat_voltage>charge_voltage||Current>(charge_current+5))
- {PWM_WIDE--;}
- }
- if(PWM_WIDE>=0X3FF)
- {PWM_WIDE=0X3FF;}
- }
-
- if((PWM_WIDE<19)&&(!error_charge))//電流過小,充電完成。
- {
- count=eeprom_read(0x09)*60;
- finish_charge=1;
- PWM_WIDE=0;
- FLAG_CHARGE=0;
- eeprom_write(0xf0,0);
- FLAG_RUN=0;
- }
- }
- //--------放電函數----------------------
- //函數說明:調用充電電流及電池電壓檢測函數
- // Current:放電電流(mA) bat_voltage:電池電壓
- // discharge_voltage:充電限制電壓 discharge_current:恒流充電電流
- // error_discharge:充電錯誤(電壓低于1V或者大于充電限制電壓+300,報錯)標志位,有誤為1;
- // finish_discharge:充電完成標志位,為1充電完成;
- //------------------------------------------------
- void discharge(void)
- {
- discharge_current_check();
- bat_voltage_check();
- if(bat_voltage<1000)
- {
- PWM_WIDE=0;
- //error_discharge=1;
- }
- else if(bat_voltage>=discharge_voltage)
- {
- //error_discharge=0;
- if((Current+100)<discharge_current)
- {PWM_WIDE+=50;}
- else if(((Current+100)>discharge_current)&&(Current+50)<discharge_current)
- {PWM_WIDE+=50;}
- else if(((Current+50)>discharge_current)&&(Current+15)<discharge_current)
- {PWM_WIDE++;}
- else if(Current>(discharge_current+50))
- {PWM_WIDE-=5;}
- else if(Current>(discharge_current+10))
- {PWM_WIDE--;}
- if(PWM_WIDE>=0X3FF)
- {PWM_WIDE=0X3FF;}
- }
- else if(bat_voltage<discharge_voltage)
- {
- count=10;//36000;//放電完成后,轉入到充電的時間count s
- finish_discharge=1;
- PWM_WIDE=0;
- FLAG_CHARGE=1;
- eeprom_write(0xf0,1);
- FLAG_RUN=0;
- loop_temp++;
- eeprom_write(0x0a,loop_temp);
- }
- }
- //--------主函數-------------------------
- void main(void)
- {
- Init();
- Set32MHZ();
- Init_Uart();
- read_data();
- InitTIME0();
- InitTIME1();
- InitTIME246();
- InitPWM();
- InitADC();
- lcd_init();
- if(eeprom_read(0x08)>eeprom_read(0x0A))
- {
- menu_4();
- }
- else
- {
- screen_status=1;
- i=0;
- menu_1();
- STARTUP=0;
- FLAG_RUN=0;
- }
- while(1)
- {
- asm("CLRWDT");
- KeyProcess();
- if(STARTUP&&count==0)
- {
- STARTUP=0;
- screen_status=0;
- i=0;
- lcd_write_com_busy(0x01);
- menu_0();
- FLAG_RUN=1;
- WORKING=1;
- }
- else if(WORKING)
- {
- if(loop_temp<loop_times)
- {
- if(FLAG_RUN&flag_work)
- {
- if(FLAG_CHARGE)
- {
- chargeing();
- PWM_Size(PWM_WIDE);
- }
-
- else if(!FLAG_CHARGE)
- {
- discharge();
- PWM5_Size(PWM_WIDE);
- capacity_record();//容量累加
- }
- flag_work=0;
- if(screen_status==0)
- menu_0();
- }
-
- else if(count==0)//倒計時結束,
- {
- if(finish_discharge&&FLAG_CHARGE)//開始充電
- {
- lcd_write_com_busy(0x01);
- finish_discharge=0;
- second_count=0;
- charge_time=0;//充電時間清零
- eeprom_write(0x0b,0);
- eeprom_write(0x0c,0);
- FLAG_RUN=1;
- }
- else if(finish_charge&&FLAG_CHARGE==0)//開始放電
- {
- lcd_write_com_busy(0x01);
- finish_charge=0;
- second_count=0;
- discharge_time=0;
- eeprom_write(0x0d,0);//放電時間清零
- eeprom_write(0x0e,0);
-
- bat_cap=0;
- capacity_temp=0;
- FLAG_RUN=1;
- }
- }
- }
- else if(loop_temp==loop_times&&flag_work)
- {
- LATB7=1;
- if(screen_status==0)//測試循環結束
- {
- lcd_write_com_busy(0x01);
- menu_0();
- }
- flag_work=0;
- }
- }
- if(FLAG_SECOND)
- {
- FLAG_SECOND=0;
- second_count++;
- count--;
- if(second_count>59)
- {
- second_count=0;
- if(FLAG_RUN)// 在工作狀態,一分鐘時間到,時間累加
- {
- time_record();
- }
- }
-
- }
- }
- }
- //-----------------------------------------------------
- void menu_0(void)
- {
- if(FLAG_RUN&&(loop_temp<loop_times))
- {
- lcd_write_char(15,0,' ');
- if(FLAG_CHARGE)
- {DisplayListChar(4,0,menu0[0]);}
- else if(!FLAG_CHARGE)
- {DisplayListChar(1,0,menu0[1]);}
- lcd_write_char(0,1,'U');
- lcd_write_char(8,1,'I');
- lcd_write_char(1,1,':');
- lcd_write_char(9,1,':');
-
- lcd_write_char(3,1,'.');
- lcd_write_char(6,1,'V');
- lcd_write_char(2,1,(bat_voltage/1000+'0'));
- lcd_write_char(4,1,((bat_voltage%1000)/100+'0'));
- lcd_write_char(5,1,((bat_voltage%100)/10+'0'));
-
- lcd_write_char(11,1,'.');
- lcd_write_char(14,1,'A');
- lcd_write_char(10,1,(Current/1000+'0'));
- lcd_write_char(12,1,((Current%1000)/100+'0'));
- lcd_write_char(13,1,((Current%100)/10+'0'));
- }
- else if(loop_temp==loop_times)
- {
- lcd_write_com_busy(0x01);
- DisplayListChar(2,0,menu0[2]);
- }
- else if(finish_charge&&(loop_temp<loop_times))
- {
- lcd_write_com_busy(0x01);
- DisplayListChar(1,0,menu0[3]);
- }
- else if(finish_discharge&&(loop_temp<loop_times))
- {
- lcd_write_com_busy(0x01);
- DisplayListChar(0,0,menu0[4]);
- }
- }
- //--------------------------------------------------
- void menu_1(void)
- {
- lcd_write_com_busy(0x01);
- //顯示第一行
- DisplayListChar(0, 0, menu1[i]);
- lcd_write_char(15,0,'<');
- j=i+1;
- //顯示第二行
- if(j>(menu1_num-1))
- {j=0;}
- DisplayListChar(0, 1, menu1[j]);
- }
- //---------------------------------------------------
- void menu_3(void)
- {
- lcd_write_com_busy(0x01);
- //顯示第一行
- switch(i)
- {
- case 1: databuf1=(datatab[0]<<8)|datatab[1];break;
- case 2: databuf1=(datatab[2]<<8)|datatab[3];break;
- case 3: databuf1=(datatab[11]<<8)|datatab[12];break;
- case 4: databuf1=(datatab[4]<<8)|datatab[5];break;
- case 5: databuf1=(datatab[6]<<8)|datatab[7];break;
- case 6: databuf1=(datatab[13]<<8)|datatab[14];break;
- case 7: databuf1=datatab[10];break;
- }
- DisplayListChar(0, 0, menu3[i]);
- if((i==1)||(i==2)||(i==4)||(i==5))
- {
- if((i==1)||(i==4))
- {lcd_write_char(12,0,'A');}
- if((i==2)||(i==5))
- {lcd_write_char(12,0,'V');}
- lcd_write_char(9,0,'.');
- lcd_write_char(8,0,(databuf1/1000+'0'));
- lcd_write_char(10,0,(databuf1%1000)/100+'0');
- lcd_write_char(11,0,(databuf1%100)/10+'0');
- }
- else if((i==3)||(i==6)||(i==7))
- {
- if((i==3)||(i==6))
- {lcd_write_char(12,0,'M');}
- else if(i==7)
- {lcd_write_char(12,0,'t');}
- lcd_write_char(8,0,(databuf1/1000+'0'));
- lcd_write_char(9,0,(databuf1%1000)/100+'0');
- lcd_write_char(10,0,(databuf1%100)/10+'0');
- lcd_write_char(11,0,(databuf1%10)+'0');
- }
- lcd_write_char(15,0,'<');
-
- j=i+1;
- //顯示第二行
- if(j>(menu3_num-1))
- {j=0;}
- switch(j)
- {
- case 1: databuf2=(datatab[0]<<8)|datatab[1];break;
- case 2: databuf2=(datatab[2]<<8)|datatab[3];break;
- case 3: databuf2=(datatab[11]<<8)|datatab[12];break;
- case 4: databuf2=(datatab[4]<<8)|datatab[5];break;
- case 5: databuf2=(datatab[6]<<8)|datatab[7];break;
- case 6: databuf2=(datatab[13]<<8)|datatab[14];break;
- case 7: databuf2=datatab[10];break;
- }
- DisplayListChar(0, 1, menu3[j]);
- if((j==1)||(j==2)||(j==4)||(j==5))
- {
- if((j==1)||(j==4))
- {lcd_write_char(12,1,'A');}
- else if((j==2)||(j==5))
- {lcd_write_char(12,1,'V');}
-
- lcd_write_char(9,1,'.');
- lcd_write_char(8,1,(databuf2/1000+'0'));
- lcd_write_char(10,1,(databuf2%1000)/100+'0');
- lcd_write_char(11,1,(databuf2%100)/10+'0');
- }
- else if((j==3)||(j==6)||(j==7))
- {
- if((j==3)||(j==6))
- {lcd_write_char(12,1,'M');}
- else if(j==7)
- {lcd_write_char(12,1,'t');}
- lcd_write_char(8,1,(databuf2/1000+'0'));
- lcd_write_char(9,1,(databuf2%1000)/100+'0');
- lcd_write_char(10,1,(databuf2%100)/10+'0');
- lcd_write_char(11,1,(databuf2%10)+'0');
- }
- }
- //-----------------------------------------------
- void menu_4(void)
- {
- //--------------------------
- lcd_write_com_busy(0x01);
- STARTUP=1;
- FLAG_CHARGE=eeprom_read(0XF0);//讀取充電放電標志位,1:充電 0:放電
- //顯示第一行
- if(FLAG_CHARGE)
- {
- DisplayListChar(4, 0, menu0[0]); //charging
- }
- else
- {
- DisplayListChar(2, 0, menu0[1]);// discharging
- }
- //顯示第二行
- DisplayListChar(0, 1, menu4[0]);
- DisplayListChar(10, 1, menu4[1]);
- if(i==0)
- { lcd_write_char(8,1,'<'); }
- else
- { lcd_write_char(14,1,'<'); }
- }
- void menu_5(void)
- {
- lcd_write_com_busy(0x01);
- //顯示第一行
- switch(i)
- {
- case 0: DisplayListChar(0, 0, menu5[i]);
- lcd_write_char(12,0,'A');
- databuf1=(datatab[0]<<8)|datatab[1];break;
- case 1: DisplayListChar(0, 0, menu5[i]);
- lcd_write_char(12,0,'V');
- databuf1=(datatab[2]<<8)|datatab[3];break;
- case 2: DisplayListChar(0, 0, menu5[i+1]);
- lcd_write_char(12,0,'A');
- databuf1=(datatab[4]<<8)|datatab[5];break;
- case 3: DisplayListChar(0, 0, menu5[i+1]);
- lcd_write_char(12,0,'V');
- databuf1=(datatab[6]<<8)|datatab[7];break;
- case 4: DisplayListChar(0, 0, menu5[i+2]);
- lcd_write_char(12,0,'t');
- databuf1=datatab[8];break;
- case 5: DisplayListChar(0, 0, menu5[i+3]);
- lcd_write_char(12,0,'M');
- databuf1=datatab[9];break;
- }
- if(i<=3)
- {
- lcd_write_char(9,0,'.');
- lcd_write_char(8,0,(databuf1/1000+'0'));
- lcd_write_char(10,0,(databuf1%1000)/100+'0');
- lcd_write_char(11,0,(databuf1%100)/10+'0');
- }
- else
- {
- //lcd_write_char(8,0,(databuf1/1000+'0'));
- //lcd_write_char(9,0,(databuf1%1000)/100+'0');
- lcd_write_char(10,0,(databuf1%100)/10+'0');
- lcd_write_char(11,0,(databuf1%10)+'0');
- }
- lcd_write_char(15,0,'<');
-
- j=i+1;
- //顯示第二行
- if(j>5)
- {j=0;}
- switch(j)
- {
- case 0: DisplayListChar(0, 1, menu5[j]);
- lcd_write_char(12,1,'A');
- databuf2=(datatab[0]<<8)|datatab[1];break;
- case 1: DisplayListChar(0, 1, menu5[j]);
- lcd_write_char(12,1,'V');
- databuf2=(datatab[2]<<8)|datatab[3];break;
- case 2: DisplayListChar(0, 1, menu5[j+1]);
- lcd_write_char(12,1,'A');
- databuf2=(datatab[4]<<8)|datatab[5];break;
- case 3: DisplayListChar(0, 1, menu5[j+1]);
- lcd_write_char(12,1,'V');
- databuf2=(datatab[6]<<8)|datatab[7];break;
- case 4: DisplayListChar(0, 1, menu5[j+2]);
- lcd_write_char(12,1,'t');
- databuf2=datatab[8];break;
- case 5: DisplayListChar(0, 1, menu5[j+3]);
- lcd_write_char(12,1,'M');
- databuf2=datatab[9];break;
- }
-
- if(j<=3)
- {
- lcd_write_char(9,1,'.');
- lcd_write_char(8,1,(databuf2/1000+'0'));
- lcd_write_char(10,1,(databuf2%1000)/100+'0');
- lcd_write_char(11,1,(databuf2%100)/10+'0');
- }
- else
- {
- //lcd_write_char(8,1,(databuf2/1000+'0'));
- //lcd_write_char(9,1,(databuf2%1000)/100+'0');
- lcd_write_char(10,1,(databuf2%100)/10+'0');
- lcd_write_char(11,1,(databuf2%10)+'0');
- }
- }
- void menu_2(void)
- {
- lcd_write_com_busy(0x01);
- //顯示第一行
- switch(i)
- {
- case 1: databuf1=(datatab[0]<<8)|datatab[1];break;
- case 2: databuf1=(datatab[2]<<8)|datatab[3];break;
- case 3: databuf1=(datatab[11]<<8)|datatab[12];break;
- case 4: databuf1=(datatab[4]<<8)|datatab[5];break;
- case 5: databuf1=(datatab[6]<<8)|datatab[7];break;
- case 6: databuf1=(datatab[13]<<8)|datatab[14];break;
- case 7: databuf1=datatab[10];break;
- }
- DisplayListChar(0, 0, menu2[i]);
- if((i==1)||(i==2)||(i==4)||(i==5))
- {
- if((i==1)||(i==4))
- {lcd_write_char(12,0,'A');}
- else if((i==2)||(i==5))
- {lcd_write_char(12,0,'V');}
- lcd_write_char(9,0,'.');
-
- lcd_write_char(8,0,(databuf1/1000+'0'));
- lcd_write_char(10,0,(databuf1%1000)/100+'0');
- lcd_write_char(11,0,(databuf1%100)/10+'0');
- }
- else if((i==3)||(i==6)||(i==7))
- {
- if((i==3)||(i==6))
- {lcd_write_char(12,0,'M');}
- else if(i==7)
- {lcd_write_char(12,0,'t');}
- lcd_write_char(8,0,(databuf1/1000+'0'));
- lcd_write_char(9,0,(databuf1%1000)/100+'0');
- lcd_write_char(10,0,(databuf1%100)/10+'0');
- lcd_write_char(11,0,(databuf1%10)+'0');
- }
- lcd_write_char(15,0,'<');
-
- j=i+1;
- //顯示第二行
- if(j>(menu2_num-1))
- {j=0;}
- switch(j)
- {
- case 1: databuf2=(datatab[0]<<8)|datatab[1];break;
- case 2: databuf2=(datatab[2]<<8)|datatab[3];break;
- case 3: databuf2=(datatab[11]<<8)|datatab[12];break;
- case 4: databuf2=(datatab[4]<<8)|datatab[5];break;
- case 5: databuf2=(datatab[6]<<8)|datatab[7];break;
- case 6: databuf2=(datatab[13]<<8)|datatab[14];break;
- case 7: databuf2=datatab[10];break;
- }
-
- DisplayListChar(0, 1, menu2[j]);
- if((j==1)||(j==2)||(j==4)||(j==5))
- {
- if((j==1)||(j==4))
- {lcd_write_char(12,1,'A');}
- else if((j==2)||(j==5))
- {lcd_write_char(12,1,'V');}
- lcd_write_char(9,1,'.');
- lcd_write_char(8,1,(databuf2/1000+'0'));
- lcd_write_char(10,1,(databuf2%1000)/100+'0');
- lcd_write_char(11,1,(databuf2%100)/10+'0');
- //lcd_write_char(11,1,(databuf2%10)+'0');
- }
- else if((j==3)||(j==6)||(j==7))
- {
- if((j==3)||(j==6))
- {lcd_write_char(12,1,'M');}
- else if(j==7)
- {lcd_write_char(12,1,'t');}
- lcd_write_char(8,1,(databuf2/1000+'0'));
- lcd_write_char(9,1,(databuf2%1000)/100+'0');
- lcd_write_char(10,1,(databuf2%100)/10+'0');
- lcd_write_char(11,1,(databuf2%10)+'0');
- }
- }
- void menu_6(void)
- {
- lcd_write_com_busy(0x01);
- //顯示第一行
- DisplayListChar(4, 0, menu6);
- //顯示第二行
- DisplayListChar(0, 1, menu60[0]);
- DisplayListChar(8, 1, menu60[1]);
- if(i==0)
- {lcd_write_char(6,1,'<');}
- else
- {lcd_write_char(13,1,'<');}
- }
- void menu_7(void)
- {
- lcd_write_com_busy(0x01);
-
- //顯示CAP
- DisplayListChar(0,0,menu70);
- DisplayListChar(0,1,menu70);
- //顯示 :
- lcd_write_char(4,0,':');
- lcd_write_char(4,1,':');
- //顯示mah
- DisplayListChar(12,0,menu_mah);
- DisplayListChar(12,1,menu_mah);
- //顯示0-9數字
- lcd_write_char(3,0,i+'0');
-
- j=i+1;
- if(j>9)
- {j=0;}
- lcd_write_char(3,1,j+'0');
-
- switch(i)
- {
- case 0: databuf1=(cap_data[0]<<8)|cap_data[1];break;
- case 1: databuf1=(cap_data[2]<<8)|cap_data[3];break;
- case 2: databuf1=(cap_data[4]<<8)|cap_data[5];break;
- case 3: databuf1=(cap_data[6]<<8)|cap_data[7];break;
- case 4: databuf1=(cap_data[8]<<8)|cap_data[9];break;
- case 5: databuf1=(cap_data[10]<<8)|cap_data[11];break;
- case 6: databuf1=(cap_data[12]<<8)|cap_data[13];break;
- case 7: databuf1=(cap_data[14]<<8)|cap_data[15];break;
- case 8: databuf1=(cap_data[16]<<8)|cap_data[17];break;
- case 9: databuf1=(cap_data[18]<<8)|cap_data[19];break;
- }
- lcd_write_char(8,0,(databuf1/1000+'0'));
- lcd_write_char(9,0,(databuf1%1000)/100+'0');
- lcd_write_char(10,0,(databuf1%100)/10+'0');
- lcd_write_char(11,0,(databuf1%10)+'0');
-
- switch(j)
- {
- case 0: databuf2=(cap_data[0]<<8)|cap_data[1];break;
- case 1: databuf2=(cap_data[2]<<8)|cap_data[3];break;
- case 2: databuf2=(cap_data[4]<<8)|cap_data[5];break;
- case 3: databuf2=(cap_data[6]<<8)|cap_data[7];break;
- case 4: databuf2=(cap_data[8]<<8)|cap_data[9];break;
- case 5: databuf2=(cap_data[10]<<8)|cap_data[11];break;
- case 6: databuf2=(cap_data[12]<<8)|cap_data[13];break;
- case 7: databuf2=(cap_data[14]<<8)|cap_data[15];break;
- case 8: databuf2=(cap_data[16]<<8)|cap_data[17];break;
- case 9: databuf2=(cap_data[18]<<8)|cap_data[19];break;
- }
- lcd_write_char(8,1,(databuf2/1000+'0'));
- lcd_write_char(9,1,(databuf2%1000)/100+'0');
- lcd_write_char(10,1,(databuf2%100)/10+'0');
- lcd_write_char(11,1,(databuf2%10)+'0');
- }
復制代碼
QQ截圖20180517063301.jpg (48.18 KB, 下載次數: 139)
下載附件
2018-5-17 06:33 上傳
全部資料51hei下載地址:
battery_test4.zip
(919.63 KB, 下載次數: 132)
2018-5-17 06:28 上傳
點擊文件名下載附件
源程序 下載積分: 黑幣 -5
|