⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainprog.c

📁 单体电容测试仪源码程序 可测电压、有A/D转换等。
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -