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

📄 progm.c

📁 这是测量接触电阻的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include 	"mdefine.h"
#include	"IIC_Soft.h"
#include	"Key_Dispose.h"
#include	"Ziku.h"
#include	"Lcd12864.h"
//#include	"PCF8563.h"
#include	"Ad2543.h"
//#include	"Tlc5615.h"
#include	"24c64.h"

const float code  RB = 0.001 ;//标准电阻为100A/100mV,即1000uΩ
const float code VB = 20.000 ;    //电流回路放大器的电阻R20=2.600K
float idata  SHUAIJIAN = 1.00; //信号衰减倍数,此处不衰减
float idata   DIANLIUXIAO = 1.000;//电流校正因子
float idata   DIANZUXIAO3=1.000;//400uΩ以下修正,即VX=100时
float idata   DIANZUXIAO2=1.000;//4000uΩ以下大于400uΩ修正,即VX=10时
float idata   DIANZUXIAO1=1.000;//40000uΩ以下大于4000uΩ修正,即VX=1时
float idata   xiao=1.000;//程序调用到的修正系数
uchar xiaozhen[20];//读入的系数值

uchar idata  UiBuffer[8]={0,0,0,0,0,0,0,0};//电流电阻显示缓冲区,前4位电流
float idata   VX = 1.0;       //电压初始档位,放大倍数=1
ulong 	idata  iZHENGSHU=0;
ulong   idata  iXIAOSHU=0;   /*保存浮点数的整数和小数*/
uchar idata  dian_bit=0;//结果共4位显示,小数点位置=0无小数点,=1小数点后1位,=2后两位,=3后三位

uchar mod_10000( uint* ulTmp)   /*分离出万位数并返回,保留余下的部分*/
{
		uint ult1;
		ult1 = *ulTmp / 10000;
		*ulTmp = *ulTmp % 10000;
		return ult1;
}


uchar mod_1000( uint* ulTmp)   /*分离出千位数并返回,保留余下的部分*/
{
		uint ult1;
		ult1 = *ulTmp / 1000;
		*ulTmp = *ulTmp % 1000;
		return ult1;
}

uchar mod_100( uint* ulTmp)   /*分离出百位数并返回,保留余下的部分*/
{
		uint ult1;
		ult1 = *ulTmp / 100;
		*ulTmp = *ulTmp % 100;
		return ult1;
}

uchar mod_10( uint* ulTmp)     /*分离出十位数并返回,保留余下的部分*/
{
		uint ult1;
		ult1 = *ulTmp / 10;
		*ulTmp = *ulTmp % 10;
		return ult1;
}

void div_u_shuzi(uint ucTmp)		//分离电压数字
{
	uint uctmp;
	uctmp		=	ucTmp;
	UiBuffer[0]	=	mod_1000(&uctmp);
	UiBuffer[1]	=	mod_100(&uctmp);
	UiBuffer[2]	=	mod_10(&uctmp);
	UiBuffer[3]	=	uctmp;
}

void div_i_shuzi(uint ucTmp)		//分离电流数字
{
	uint uctmp;
	uctmp		=	ucTmp;
	UiBuffer[0]	=	mod_1000(&uctmp);
	UiBuffer[1]	=	mod_100(&uctmp);
	UiBuffer[2]	=	mod_10(&uctmp);
	UiBuffer[3]	=	uctmp;
}

void Shipin_U_dispose()        //处理电压读数 显示
{
	uint uiDianya;
	uiDianya	=	(uint)(Read2543(1) * 2.5/4096*1000);//读出的值放大10倍
 	uiDianya	=	(uint)(Read2543(1) * 2.5/4096*1000);
  	div_u_shuzi(uiDianya);
}

void Shipin_I_dispose()        //处理电流读数 显示
{
   uint  uiDianliu;
   uiDianliu	=	(uint)(Read2543(0) *2.5/4096*1000*10);//读出的值放大10倍
   uiDianliu	=	(uint)(Read2543(0) *2.5/4096*1000*10);
   div_i_shuzi(uiDianliu);
}

void diyiping()
{
	df(0,28,13,0);
	df(0,36,14,0);
	df(0,44,16,0);
	df(0,52,6,0);
	df(0,60,1,0);
	df(0,68,0,0);
	df(0,76,4,0);
	dh(0,84,4,0);

	dh(3,8,5,0);
	dh(3,24,6,0);
	dh(3,40,7,0);
	dh(3,56,8,0);
	dh(3,72,9,0);
	dh(3,88,10,0);
	dh(3,104,11,0);

	dh(6,8,12,0);
	dh(6,24,13,0);
	dh(6,40,14,0);
	dh(6,56,15,0);
	dh(6,72,16,0);
	dh(6,88,17,0);
	dh(6,104,18,0);

}

void dierping()
{
	dh(0,0,9,0);
	dh(0,16,10,0);
	dh(0,32,17,0);
	dh(0,48,20,0);
	df(0,64,17,0);

	xs12(2,40,0,0);
	xs12(2,52,1,0);
	xs12(2,64,1,0);
	xs12(2,76,2,0);

	dh(6,24,25,0);//请
	dh(6,40,26,0);//按
	dh(6,56,9,0);//测
	dh(6,72,10,0);//试
	dh(6,88,27,0);//键

}

void disanping()
{
	dh(0,0,21,0);//显示正在测试中
	dh(0,16,22,0);
	dh(0,32,9,0);
	dh(0,48,10,0);
	dh(0,64,28,0);

	dh(2,0,25,0);//请稍侯
	dh(2,16,29,0);
	dh(2,32,30,0);

	dh(2,48,31,0);
	dh(2,64,31,0);
	dh(2,80,31,0);
	dh(2,96,31,0);
	dh(2,112,31,0);
}

void xsdianzu(uchar flag)//根据小数点的位置显示结果
{
	df(flag,34,19,0);//R=xxx.xmΩ
	df(flag,42,20,0);
	df(flag,86,15,0);
	dh(flag,94,19,0);
	switch(dian_bit)
	  {
	  	case 0:
	  			df(flag,50,UiBuffer[4],0);
					df(flag,58,UiBuffer[5],0);
					df(flag,66,UiBuffer[6],0);
					df(flag,74,UiBuffer[7],0);
					break;
	  	case 1:
	  			df(flag,50,UiBuffer[4],0);
					df(flag,58,UiBuffer[5],0);
					df(flag,66,UiBuffer[6],0);
					df(flag,74,21,0);
					df(flag,78,UiBuffer[7],0);
					break;
	    case 2:
	    	  df(flag,50,UiBuffer[4],0);
					df(flag,58,UiBuffer[5],0);
					df(flag,66,21,0);
					df(flag,70,UiBuffer[6],0);
					df(flag,78,UiBuffer[7],0);
					break;
			case 3:
	  		  df(flag,50,UiBuffer[4],0);
	  		  df(flag,58,21,0);
					df(flag,62,UiBuffer[5],0);
					df(flag,70,UiBuffer[6],0);
					df(flag,78,UiBuffer[7],0);
					break;
	  }
}

void showdianliu(uchar flag)//显示电流
{
	df(flag,34,18,0);//I=xxx.xA
	df(flag,42,20,0);
	df(flag,50,UiBuffer[0],0);
	df(flag,58,UiBuffer[1],0);
	df(flag,66,UiBuffer[2],0);
	df(flag,74,21,0);
	df(flag,78,UiBuffer[3],0);
	df(flag,86,10,0);
}

void ds_erro1()//显示接线错误,无电流
{
	lcd_init();
	dh(5,4,32,0);
	dh(5,20,33,0);
	dh(5,36,34,0);
	dh(5,52,35,0);
	dh(5,68,37,0);
	dh(5,76,36,0);
	dh(5,92,7,0);
	dh(5,108,20,0);
}


void cedianliu()//测试电路回路,功能:用于故障判断
{
	uint dd,ff;
	float uiDianliu;
	dd=  Read2543(0);
/*A/D读出电流值除以放大倍数还原原信号,再除以标准电阻得出电流,这里
将A/D数单位0.00061035,放大10倍,是为了去掉小数点,精确到小数点后一位*/
	ff=Read2543(0);
	ff=Read2543(0);
	uiDianliu	=	(float)(ff* 0.0122/(VB*RB)*DIANLIUXIAO);
  //uiDianliu	=	(uint)( Read2543(0)* 0.0061035/(VB*RB));
  if((uiDianliu<850)|(uiDianliu>2500))//电流小于85A,或大于250A,提示接线错误
  {
  	ds_erro1();//若结果异常,显示故障
  	SELC = 1;
		while(1);
  }
  else
  {
  	div_i_shuzi(uiDianliu);//分离转化为BCD数
    showdianliu(4);  //显示电流值,行x=4
  }
}

void ds_erro2()//仪器故障
{
	lcd_init();
	dh(2,16,11,0);
	dh(2,32,38,0);
	dh(2,48,39,0);
	dh(2,64,40,0);
	dh(2,80,41,0);
	dh(2,96,37,0);

	dh(5,4,25,0);
	dh(5,20,42,0);
	dh(5,36,43,0);
	dh(5,52,44,0);
	dh(5,68,45,0);
	dh(5,84,46,0);
	dh(5,100,47,0);
	df(5,116,22,0);
}

void liangcheng()//选择电压回路的量程
{
	uint dushu;
	AV1=AV2=0;//放大倍数为1,最小倍数
	dushu=Read2543(1);
	dushu=Read2543(1);
	if(dushu>3768)//大于2.3V,满量程2.5V
		{
			ds_erro2();//仪器故障
			SELC=1;
			while(1);
		}
	else
		{
			AV2=1;//放大10倍
			delay1ms(200);
			dushu=Read2543(1);
			dushu=Read2543(1);
			if(dushu>3276)//大于4V,满量程5V
				{
					AV2=0;
					VX=1.0;
					xiao=DIANZUXIAO1;//确定该档位的修正因子
					return;
				}
			else
				{
					AV1=1;//放大100倍
					delay1ms(200);
					dushu=Read2543(1);
					dushu=Read2543(1);
					if(dushu>3276)//大于4V,满量程5V
						{
							AV1=0;
							VX=10.0;
							xiao=DIANZUXIAO2;//确定该档位的修正因子
							return;
						}
					else
						{
							VX=100.0;
							xiao=DIANZUXIAO3;//确定该档位的修正因子
							return;
						}
				}
		}

}

/*将浮点数分离成整数和小数,并将小数扩大一千倍*/
void div_zhengshu_xiaoshu(float fdshu)
{
	float fx,fz,ftm;
	ftm = fdshu;
	fx=modf(ftm, &fz);
	iZHENGSHU=(long)fz;
	fx=fx*1000;
	iXIAOSHU=(long)fx;
}

void showdianzu(float Rtemp)//浮点分离电阻值
{
	float Result;
	uint shu_zhen,shu_xiao;
	Result=Rtemp;
	/*将浮点数分离成整数和小数,并将小数扩大一千倍*/
	div_zhengshu_xiaoshu(Result);
	shu_zhen=iZHENGSHU;//整数
	shu_xiao=iXIAOSHU;//小数点后三位被放大1000,成为整数
	if(shu_zhen<10)//小于10,小数点后三位数
		{
			dian_bit=3;
			UiBuffer[4]	=	shu_zhen;
			UiBuffer[5] = mod_100(&shu_xiao);
			UiBuffer[6] = mod_10(&shu_xiao);
			UiBuffer[7] = shu_xiao;
		}
	else if(shu_zhen<100)//小于100,小数点后2位数
				{
					dian_bit=2;
					UiBuffer[4]	=	mod_10(&shu_zhen);
					UiBuffer[5] = shu_zhen;
					UiBuffer[6] = mod_100(&shu_xiao);
					UiBuffer[7] = mod_10(&shu_xiao);
				}
			 else       //大于100,小数点后1位数
			 	{
			 		if(shu_zhen>999)//大于1000,无小数点
			 			{
			 				dian_bit=0;
							UiBuffer[4]	=	mod_1000(&shu_zhen);
							UiBuffer[5] = mod_100(&shu_zhen);
							UiBuffer[6] = mod_10(&shu_zhen);
							UiBuffer[7] = shu_zhen;
			 			}
			 		else
			 			{
			 		 		dian_bit=1;
							UiBuffer[4]	=	mod_100(&shu_zhen);
							UiBuffer[5] = mod_10(&shu_zhen);
							UiBuffer[6] = shu_zhen;
							UiBuffer[7] = mod_100(&shu_xiao);
						}
			 	}
	xsdianzu(6);//显示行x=6
}

//测试电阻
void ceshidianzu()
{
	uchar ucmp=30;
	uint ucItmp;
	float fRx=0.0 , K=0.0,fv=0.0, fi=0.0,rtmp=0.0,ucceshi=0.0 ;
	K = VB*RB/VX ;
	ucceshi=30.0;
	while(ucmp--)
	{
	  ucItmp=Read2543(1);
		ucItmp=Read2543(1);
		fv= (float)ucItmp;
	 	ucItmp=Read2543(0);
	 	ucItmp=Read2543(0);
		fi= (float)ucItmp ;
		rtmp=fv/fi ;       //电压回路电流回路比值
		fRx = fRx + rtmp;      //送数到结果缓冲区,共计30次的累加和
	}
//结果=比值的平均值 * K * 衰减倍数 * 校正因子
	fRx = fRx/ucceshi*K*SHUAIJIAN*DIANLIUXIAO*1000000.0*xiao ;
	showdianzu(fRx);//浮点分离测试数据
}

//测试结果
void showceshijieguo()
{
	lcd_init();
	dh(0,0,9,0);
	dh(0,16,10,0);
	dh(0,32,23,0);
	dh(0,48,24,0);
	df(0,64,17,0);
	showdianliu(3);
	xsdianzu(5);
}

uchar idata ch1[8]={0xb2,0xe2,0xca,0xd4,0xbd,0xe1,0xb9,0xfb};//测试结果
//uchar idata ch2[5]={0xb5,0xe7,0xd7,0xe8,0x3a};//电阻
//uchar idata ch3[5]={0xb5,0xe7,0xc1,0xf7,0x3a};//电流
uchar idata ch4[5]={0xcf,0xb5,0xcd,0xb3,0x3a};//系统:
uchar  idata daRTmpBuf[7] = {0,0,0,0,0,0xa9,0xab};//前5个字节为电阻4位数+1个小数点,后2个字节为mΩ
uchar  idata daiTmpBuf[6] = {0,0,0,0x2e,0,0x41};//前5个字节为电流4位数(含小数点后一位),后1个字节为A
void daima() // 转换打印代码
{
	uchar i;
	for(i=0;i<3;i++)    //电流数字转换打印内码
		  daiTmpBuf[i]=UiBuffer[i]|0x30;
		  daiTmpBuf[4]=UiBuffer[3]|0x30;

	switch(dian_bit)
	 	{
	 		case 0:
	 				daRTmpBuf[0]=UiBuffer[4]|0x30;
	 				daRTmpBuf[1]=UiBuffer[5]|0x30;
	 				daRTmpBuf[2]=UiBuffer[6]|0x30;
	 				daRTmpBuf[3]=UiBuffer[7]|0x30;
	 				daRTmpBuf[4]=0x20;
	 				break;
	 		case 1:
	 				daRTmpBuf[0]=UiBuffer[4]|0x30;
	 				daRTmpBuf[1]=UiBuffer[5]|0x30;
	 				daRTmpBuf[2]=UiBuffer[6]|0x30;
	 				daRTmpBuf[3]=0x2e;
	 				daRTmpBuf[4]=UiBuffer[7]|0x30;
	 				break;
	 		case 2:
	 				daRTmpBuf[0]=UiBuffer[4]|0x30;
	 				daRTmpBuf[1]=UiBuffer[5]|0x30;
	 				daRTmpBuf[2]=0x2e;
	 				daRTmpBuf[3]=UiBuffer[6]|0x30;
	 				daRTmpBuf[4]=UiBuffer[7]|0x30;
	 				break;
	 		case 3:
	 				daRTmpBuf[0]=UiBuffer[4]|0x30;
	 				daRTmpBuf[1]=0x2e;
	 				daRTmpBuf[2]=UiBuffer[5]|0x30;
	 				daRTmpBuf[3]=UiBuffer[6]|0x30;
	 				daRTmpBuf[4]=UiBuffer[7]|0x30;
	 				break;
	 	}
}

/*************串口发送子函数***********/
sprint(unsigned char a)
{
		while(BUSY);
		SBUF=a;
		while(!TI);
		TI=0;
}

void dayin()
{

	int i;
	TH1  = 0xfd;//波特率9600
	TL1  = 0xfd;
	TMOD = 0x20 ;
	SCON = 0x40;//串行口方式1,10位数据,1位起始,8位数据,1位停止
  TR1= 1;
	ES = 1;
	TI = 0;

	sprint(0x1b);sprint(0x40);//初始化打印机
	sprint(0x1b);sprint(0x63);sprint(0x00);//反向打印
	sprint(0x1b);sprint(0x6c);sprint(0x0);//设定左限,居中
	sprint(0x1b);sprint(0x38);sprint(0x04);//选择汉字
//打印“测试结果”
	sprint(0x1b);sprint(0x6c);sprint(0x03);//设定左限,居中
	for(i=0;i<8;i++)
	sprint(ch1[i]);
	sprint(0x0d); //回车
  sprint(0x1b);sprint(0x36);sprint(0x00);//选择字符集1
	sprint(0x1b);sprint(0x6c);sprint(0x00);//设定左限,居左
	for(i=0;i<16;i++)
	sprint(0x2d);//打印“*********”
	sprint(0x0d); //回车

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -