📄 mainprog.c
字号:
print("Vs:");
disp_float_votage(start_votage,2); //显示当前电压
print("V1:");
disp_float_votage(Votage_record,2); //显示当前电压
print("V2:");
disp_float_votage(Curent_Votage,2); //显示当前电压
print("ΔV:");
disp_float_votage(Curent_Votage-Votage_record,2); //显示当前电压
print("I:");
disp_float_votage(current,1); //显示当前电流
print("R:");
disp_float_votage(float_temp,3); //显示电阻(单位:欧姆)
printh(0x0d);printh(0x0a);
Mesure_state=stop_state;
}
break;
//28V电容内阻测量_停止
case stop_state:
break;
case voltage_current_disp_28V_start: //电压电流曲线
break;
case voltage_current_disp_28V: //电压电流曲线
break;
}
*/
}
//键盘扫描
void JP_SM(void)
{
if (UP==0) {
if (Display_state==adc_display) {
Display_state=votage_display;
ClearDisplay();
}
}
if (DOWN==0) {
if (Display_state==votage_display){
Display_state=adc_display;
ClearDisplay();
}
if ((Display_state==charge_28V_display) || (Display_state==discharge_28V_display)){
P2=0; //关闭充放电通道
DisplayChar(3,0x11); //--表示停止充放电
DisplayChar(4,0x11);
}
}
if (OPEN==0){ //开始充电
ClearDisplay();
DisplayChar(0,0x0c); //CD表示充电
DisplayChar(1,0x0d);
P2=0; //关闭充放电通道
SW7=1; //打开充电通道
ADC1_open=1; //adc1打开控制
ADC3_open=1; //adc3打开控制
Display_state=charge_28V_display;
}
if (FEE==0){ //开始放电
ClearDisplay();
DisplayChar(0,0x0F); //FD表示放电
DisplayChar(1,0x0d);
P2=0; //关闭充放电通道
//等待20毫秒
flag_10ms_1=0;
// while (flag_10ms_1==0) {} //
flag_1ms_adc=0;
// while (flag_10ms_1==0) {}
//读取3通道起始起始电压
read_start_votage();
P2=0; //关闭充放电通道,由-
//P2=0x03; //打开0、1放电通道
//P2=0x0; //打开3放电通道
ADC1_open=1; //adc1打开控制
ADC3_open=1; //adc3打开控制
Display_state=discharge_28V_start;
}
if (BILL==0){ //开始放电
Display_state=cap_test_start;
ADC1_open=1; //adc1打开控制
ADC3_open=1; //adc3打开控制
}
}
//读取中断ADC值
void read_intr_adc(void)
{
EA=0; //关闭总中断
ADC_result1=ADC_result_intr1;
ADC_result2=ADC_result_intr2;
ADC_result3=ADC_result_intr3;
ADC1_accumulate=ADC1_accumulate_intr; //1通道累加值
EA=1; //打开中断
}
//读取3通道起始起始电压
void read_start_votage(void)
{
read_intr_adc(); //读取中断ADC值
start_votage=ADC_result3*ADC3_coefficient; //充电起始电压
//清累计电荷量
EA=0; //关闭总中断
ADC1_accumulate_intr=0; //充电总电荷
EA=1; //打开中断
}
//计算电容值
void Calculate_Capacitance(void)
{
read_intr_adc(); //读取中断ADC值
Curent_Votage=ADC_result3*ADC3_coefficient; //当前电压(毫伏)
if ((start_votage-Curent_Votage)>0) {
Votage=(start_votage-Curent_Votage)/1000; //电压差(伏)
charge=((float)ADC1_accumulate*ADC1_coefficient/1000)*500/75; //累加电荷(库仑)
Capacitance=charge/Votage; //电容(法拉)
}
else {
Votage=0; //电压没有变化
Capacitance=0;
}
}
//14.7456M晶体时16个字符+16个特殊段显示共需3.8毫秒
void Display (void)
{
unsigned char i;
float temp_float;
switch (Display_state) {
case Display_stop:
Display_state=votage_display;
break;
/* case Display_test_start:
ClearDisplay();
RefreshDisplay_0d1s = 0;
Display_state=adc_speed_start;
break;
case Display_test:
//定时刷屏
if(RefreshDisplay_0d1s==0) return;
RefreshDisplay_0d1s = 0;
if (++Display_counter<128) {
Display_Exe(1,0,Display_counter/8);//显示特殊字符
Display_Exe(1,1,Display_counter/8);//显示特殊字符
DisplayChar(Display_counter/4,8);//显示8
}
if (++Display_counter>=128+16) {
Display_counter=0;
ClearDisplay();
}
break;
case Display_speed_start:
if(RefreshDisplay_0d1s==0) return;
RefreshDisplay_0d1s=0;
ADC_counter=0;
Display_counter=0;
Display_state=Display_speed;
break;
case Display_speed:
for (i=16;i<32;i++){
Display_Exe(1,1,i-16);//显示特殊字符
DisplayChar(i,8);//显示8
}
if (Display_counter<10) ADC_counter++;
if(RefreshDisplay_0d1s==0) return;
RefreshDisplay_0d1s = 0;
if (++Display_counter>10) {
ClearDisplay();
disp_long_decimal(2,ADC_counter); //以十进制方式显示长整形数
Display_counter=0;
RefreshDisplay_0d1s = 0;
Display_state=Display_speed_start;
}
break;
case adc_speed_start:
if(RefreshDisplay_0d1s==0) return;
RefreshDisplay_0d1s=0;
ADC_counter=0;
Display_counter=0;
Display_state=adc_speed;
break;
case adc_speed:
//ADC_filter(0); //测量电压
if (Display_counter<10) ADC_counter++;
if(RefreshDisplay_0d1s==0) return;
RefreshDisplay_0d1s = 0;
if (++Display_counter>10) {
ClearDisplay();
disp_long_decimal(2,ADC_counter); //以十进制方式显示长整形数
Display_counter=0;
RefreshDisplay_0d1s = 0;
Display_state=adc_speed_start;
}
break;
*/
case votage_display:
if(RefreshDisplay_1s==0) return;
RefreshDisplay_1s = 0;
//ADC0_coefficient=(float)2485/ADC_result_intr0; //最大5.3V
//ADC1_coefficient=((float)2485/ADC_result_intr0)/100; //实际电阻为100K/1K倍,最大0.053V
//ADC2_coefficient=((float)2485/ADC_result_intr0)*3578/10000; //实际电阻为10K/3.3K倍,最大1.606
//ADC3_coefficient=((float)2485/ADC_result_intr0)*200/26; //实际电阻为2.6K/20K倍,最大40.77V
DisplayChar(0,0x18); //U表示电压
disp_float_max65536(7,ADC_result_intr0*ADC0_coefficient/10); Display_Exe(1,0,8); //第1行小数点
disp_float_max65536(15,ADC_result_intr1*ADC1_coefficient*100); Display_Exe(1,0,13);//第2行小数点
disp_float_max65536(20,ADC_result_intr2*ADC2_coefficient/10); Display_Exe(1,1,9); //第3行第1小数点(从左到右)
disp_float_max65536(27,ADC_result_intr3*ADC3_coefficient/10); Display_Exe(1,1,1); //第3行第4小数点(从左到右)
if (DOWN==0) {
Display_state=adc_display;
ClearDisplay();
}
break;
case adc_display:
if(RefreshDisplay_1s==0) return;
RefreshDisplay_1s = 0;
DisplayChar(0,0x0A); //ADC表示AD值
DisplayChar(1,0x0d);
disp_int(7,ADC_result_intr0);
disp_int(15,ADC_result_intr1);
disp_int(20,ADC_result_intr2);
disp_int(27,ADC_result_intr3);
if (UP==0) {
Display_state=votage_display;
ClearDisplay();
}
break;
case charge_28V_display:
if(RefreshDisplay_1s==0) return;
RefreshDisplay_1s = 0;
//读取中断ADC值
read_intr_adc();
disp_float_max65536(27,ADC_result3*ADC3_coefficient/10); Display_Exe(1,1,1); //第3行第4小数点(从左到右)
current=0;
break;
case discharge_28V_start:
P2=0; //关闭充放电通道
if(RefreshDisplay_1s<3) return;
RefreshDisplay_1s = 0;
resistance_measure_1ms=0;
while (resistance_measure_1ms<100) {}
resistance_measure_1ms=0;
//读取中断ADC值
read_intr_adc();
start_votage=ADC_result3*ADC3_coefficient;
current=0;
P2=0x7f; //打开放电通道
Display_state=discharge_28V_display;
break;
case discharge_28V_display:
resistance_measure_1ms=0;
while (resistance_measure_1ms<20) {
//读取中断ADC值
read_intr_adc();
temp_float=ADC_result1*ADC1_coefficient*500/75;
if (temp_float>current) {
current=temp_float;
Votage=ADC_result3*ADC3_coefficient;
}
}
//if(RefreshDisplay_1s==0) return;
//RefreshDisplay_1s = 0;
//计算电容值
//Calculate_Capacitance();
//disp_float_max65536(7,Capacitance*100); Display_Exe(1,0,8); //第1行小数点
disp_float_max65536(7,Votage/10); Display_Exe(1,0,8); //第1行小数点
disp_float_max65536(0,current); //最大电流
//disp_float_max65536(20,charge); //test
disp_float_max65536(20,start_votage/10); //单位10mV
//显示电流(安培)
//disp_float_max65536(13,(ADC_result1*ADC1_coefficient)*500/75); //单位:安培
disp_float_max65536(13,(start_votage-Votage)/current); //单位:安培
//显示电压
disp_float_max65536(27,ADC_result3*ADC3_coefficient/10); Display_Exe(1,1,1); //第3行第4小数点(从左到右)
//Display_state=discharge_28V_start;
break;
case cap_test_start:
ClearDisplay();
DisplayChar(0,0x0c); //CD表示充电
DisplayChar(1,0x0d);
P2=0; //关闭充放电通道
SW7=1; //打开充电通道
Display_state=cap_test_charge;
break;
case cap_test_charge:
//读取中断ADC值
read_intr_adc();
Votage=ADC_result3*ADC3_coefficient; //电容器电压
//if (Votage>28000) {
if (Votage>20000) {
DisplayChar(0,0x0F); //FD表示放电
DisplayChar(1,0x0d);
RefreshDisplay_1s=0; //test
P2=0; //关闭充放电通道
ADC1_open=0; //adc1关闭
ADC3_open=0; //adc3打开关闭
Display_state=resistance_measure_28V_start;
disp_float_max65536(27,ADC_result3*ADC3_coefficient/10); Display_Exe(1,1,1); //第3行第4小数点(从左到右)
return;
}
if(RefreshDisplay_1s==0) return;
RefreshDisplay_1s=0;
disp_float_max65536(27,ADC_result3*ADC3_coefficient/10); Display_Exe(1,1,1); //第3行第4小数点(从左到右)
break;
//28V电容内阻测量开始(短路放电法)
case resistance_measure_28V_start:
if(RefreshDisplay_1s<3) {
ADC_filter(3); //测量电压
disp_float_max65536(27,ADC_result_intr*ADC3_coefficient/10);
return;
}
RefreshDisplay_1s = 0;
//等待10毫秒起始时刻
resistance_measure_1ms=0;
while (resistance_measure_1ms<10) {}
//读取中断ADC值
read_intr_adc();
Votage=ADC_result3*ADC3_coefficient; //电容器电压
if (Votage<(float)28000*80/100) { //放到90%开始测电阻
temp_float=0;
for (i=0;i<64;i++){
//电阻测量,返回1电阻测量有效
if (resistance_measure()){
temp_float+=resistance;
}
else {
DisplayChar(23,0x11); //FD表示放电
DisplayChar(24,0x11);
DisplayChar(25,0x11); //-r表示厕内阻
DisplayChar(26,0x11);
Display_Exe(0,0,8); //清第2行小数点
return;
}
resistance=temp_float/64;
}
//显示
disp_float_max65536(7,start_votage/10); Display_Exe(1,0,8); //第1行小数点
//disp_float_max65536(15,current*100); Display_Exe(1,0,13);//第2行小数点
disp_float_max65536(15,current*100); Display_Exe(1,0,13);//第2行小数点
disp_float_max65536(27,Curent_Votage/10); Display_Exe(1,1,9); //第3行第1小数点(从左到右)
disp_float_max65536(21,resistance); Display_Exe(1,0,8);//第2行小数点
DisplayChar(0,0x0F); //FD表示放电
DisplayChar(1,0x0d);
DisplayChar(2,0x11); //-r表示厕内阻
DisplayChar(3,0x15);
}
break;
case cap_test_discharge_start:
read_intr_adc();
Votage=ADC_result3*ADC3_coefficient; //电容器电压
if (Votage<(float)28000*80/100) { //放到80%开始测电容量
//if (Votage<22400) { //放到80%开始测电容量
DisplayChar(0,0x0F); //FD表示放电
DisplayChar(1,0x0d);
DisplayChar(2,0x11); //-
DisplayChar(3,0xC); //C表示充电
//读取3通道起始起始电压
read_start_votage();
Display_state=cap_test_discharge;
}
if(RefreshDisplay_1s==1){
RefreshDisplay_1s = 0;
//显示电流
disp_float_max65536(15,(ADC_result1*ADC1_coefficient)*500/75); Display_Exe(1,0,13);//第2行小数点
disp_float_max65536(27,ADC_result3*ADC3_coefficient/10); Display_Exe(1,1,1); //第3行第4小数点(从左到右)
}
break;
case cap_test_discharge:
read_intr_adc();
Votage=ADC_result3*ADC3_coefficient; //电容器电压
if (Votage<28000/2) { //放到1/2额定电压测电容量
DisplayChar(0,0x0c); //C-OK表示测量完毕
DisplayChar(1,0x11); //
DisplayChar(2,0x14);
DisplayChar(3,0x1a);
//关闭充放电通道
P2=0;
Display_state=stop_state;
RefreshDisplay_1s=1; //重新刷新一次
}
if(RefreshDisplay_1s==1){
RefreshDisplay_1s = 0;
//计算电容值
Calculate_Capacitance();
disp_float_max65536(7,Capacitance*100); Display_Exe(1,0,8); //第1行小数点
//显示电流
disp_float_max65536(15,(ADC_result1*ADC1_coefficient)*500/75); Display_Exe(1,0,13);//第2行小数点
disp_float_max65536(27,ADC_result3*ADC3_coefficient/10); Display_Exe(1,1,1); //第3行第4小数点(从左到右)
}
break;
//停止
case stop_state:
break;
}
}
//电阻测量,返回1电阻测量有效
bit resistance_measure(void)
{
ADC0_open=0; //adc0打开控制
ADC1_open=0; //adc1打开控制
ADC2_open=0; //adc2打开控制
ADC3_open=0; //adc3打开控制
//等待10毫秒起始时刻
resistance_measure_1ms=0;
while (resistance_measure_1ms<1) {}
P2=0x7f; //打开0、1放电通道
resistance_measure_1ms=0;
while (resistance_measure_1ms<10) {}
ADC_filter(1); //测量电流
//current=ADC_result_intr*ADC1_coefficient*50/75; //50安培分流器
current=ADC_result_intr*ADC1_coefficient*500/75; //1000安培分流器
ADC_filter(3); //测量电压
start_votage=ADC_result_intr*ADC3_coefficient; //电容器电压
//关闭充放电通道
P2=0;
//等待10ms
resistance_measure_1ms=0;
while (resistance_measure_1ms<10) {
/*
//串口发送缓冲区满测试
if (SendBufFullFlag==0){ //发送缓冲区未满
read_intr_adc(); //读取中断ADC值
pinint_float_decimal(ADC_result3*ADC3_coefficient); //电压(mv)
}
else {
SendBufFullFlag=0;
break;
} */
}
if (current<1) return 0; //电流<1安培,不测试
ADC_filter(3); //测量电压
Curent_Votage=ADC_result_intr*ADC3_coefficient; //电容器电压
Votage=Curent_Votage-start_votage; //电压差(mv)
if (Votage<10) return 0; //压差<10毫伏,不测试
resistance=Votage/current; //电阻(毫欧)
return 1;
}
/*
36 18.57 70 .2
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -