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

📄 cmain.c

📁 用CS5532做的无线吊钩称的接收称重显示器程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	}

	for ( loop = 0; loop < 4; loop++)
	{
		if ( (para.mode.unit&allbit[s_unit]) != 0) break;
		s_unit++;
		if (s_unit > 3) s_unit = 0;
	}
getcap_ret:
	unit = s_unit;
	return;
}

/*
1 lb = 0.45359237 kg
1台斤 = 0.6kg
1港斤 = 0.605kg
1kg = 2.20462262 lb
1kg = 1.66666667 台斤
1kg = 1.65289256 港斤
*/

float code CONVERTUNIT[] = {      1,2.20462262,1.66666667,1.65289265};

unsigned int code CAPACITYCODE[] = {
//			    kg       lb     台斤     港斤
			  1000,    2200,    1700,    1700,			//LoW   0
			  1000,    2200,    1700,    1700,			//LoW   1
		       10000,    2200,    1700,    1700,              //LoW   2   HiGH   0
			 10000,   22000,   17000,   17000,			//HiGH  1
			 10000,   22000,   17000,   17000,			//HiGH  2

			  2000,     440,     330,     330,			//LoW   0
			  2000,    4400,    3300,    3300,			//LoW   1
			  2000,    4400,    3300,    3300,              //LoW   2   HiGH   0
			 20000,    4400,    3300,    3300,			//HiGH  1
			 20000,   44000,   33000,   33000,			//HiGH  2

			   300,     660,     500,     500,			//LoW   0
			  3000,     660,     500,     500,			//LoW   1
			  3000,    6600,    5000,    5000,              //LoW   2   HiGH   0
			  3000,    6600,    5000,    5000,			//HiGH  1
			 30000,    6600,    5000,    5000,			//HiGH  2

			   500,    1100,     830,     830,			//LoW   0
			  5000,    1100,     830,     830,			//LoW   1
			  5000,   11000,    8300,    8300,              //LoW   2   HiGH   0
			  5000,   11000,    8300,    8300,			//HiGH  1
			 50000,   11000,    8300,    8300,			//HiGH  2

			   750,    1700,    1200,    1200,			//LoW   0
			   750,    1700,    1200,    1200,			//LoW   1
			  7500,    1700,    1200,    1200,              //LoW   2   HiGH   0
			  7500,   17000,   12000,   12000,			//HiGH  1
			  7500,   17000,   12000,   12000,			//HiGH  2
 
			  1000,    2200,    1700,    1700,			//LoW   0
			  1000,    2200,    1700,    1700,			//LoW   1
			 10000,    2200,    1700,    1700,              //LoW   2   HiGH   0
			 10000,   22000,   17000,   17000,			//HiGH  1
			 10000,   22000,   17000,   17000			//HiGH  2
						};

  signed char code DIVISIONCODE[] = {
//			    kg       lb     台斤     港斤
//1000kg
			     2,       5,       5,       5,			//LoW   0
			     1,       2,       2,       2,			//LoW   1
			     5,       1,       1,       1,              //LoW   2   HiGH   0
			     2,       5,       5,       5,			//HiGH  1
			     1,       2,       2,       2,			//HiGH  2
//2000kg
			     5,       1,       1,       1,			//LoW   0
			     2,       5,       5,       5,			//LoW   1
			     1,       2,       2,       2,              //LoW   2   HiGH   0
			     5,       1,       1,       1,			//HiGH  1
			     2,       5,       5,       5,			//HiGH  2
//3000kg
			     1,       2,       2,       2,			//LoW   0
			     5,       1,       1,       1,              //LoW   1
			     2,       5,       5,       5,			//LoW   2   HiGH   0
			     1,       2,       2,       2,			//HiGH  1
			     5,       1,       1,       1,              //HiGH  2
//5000kg
			     1,       2,       2,       2,			//LoW   0
			     5,       1,       1,       1,              //LoW   1
			     2,       5,       5,       5,			//LoW   2   HiGH   0
			     1,       2,       2,       2,			//HiGH  1
			     5,       1,       1,       1,              //HiGH  2
//7500kg
			     2,       5,       5,       5,			//LoW   0
			     1,       2,       2,       2,			//LoW   1
			     5,       1,       1,       1,              //LoW   2   HiGH   0
			     2,       5,       5,       5,			//HiGH  1
			     1,       2,       2,       2,			//HiGH  2
//10000kg
			     2,       5,       5,       5,			//LoW   0
			     1,       2,       2,       2,			//LoW   1
			     5,       1,       1,       1,              //LoW   2   HiGH   0
			     2,       5,       5,       5,			//HiGH  1
			     1,       2,       2,       2,			//HiGH  2
};
  signed char code DECIMALCODE[] = {
//			    kg       lb     台斤     港斤
//1000kg
			     0,       0,       0,       0,			//LoW   0
			     0,       0,       0,       0,			//LoW   1
			     1,       0,       0,       0,              //LoW   2   HiGH   0
			     1,       1,       1,       1,			//HiGH  1
			     1,       1,       1,       1,			//HiGH  2
//2000kg
			     0,      -1,      -1,      -1,			//LoW   0
			     0,       0,       0,       0,			//LoW   1
			     0,       0,       0,       0,              //LoW   2   HiGH   0
			     1,       0,       0,       0,			//HiGH  1
			     1,       1,       1,       1,			//HiGH  2
//3000kg
			    -1,      -1,      -1,      -1,			//LoW   0
			     0,      -1,      -1,      -1,			//LoW   1
			     0,       0,       0,       0,              //LoW   2   HiGH   0
			     0,       0,       0,       0,			//HiGH  1
			     1,       0,       0,       0,			//HiGH  2
//5000kg
			    -1,      -1,      -1,      -1,			//LoW   0
			     0,      -1,      -1,      -1,			//LoW   1
			     0,       0,       0,       0,              //LoW   2   HiGH   0
			     0,       0,       0,       0,			//HiGH  1
			     1,       0,       0,       0,			//HiGH  2
//7500kg
			    -1,      -1,      -1,      -1,			//LoW   0
			    -1,      -1,      -1,      -1,			//LoW   1
			     0,      -1,      -1,      -1,              //LoW   2   HiGH   0
			     0,       0,       0,       0,			//HiGH  1
			     0,       0,       0,       0,			//HiGH  2
//10000kg
			    -1,      -1,      -1,      -1,			//LoW   0
			    -1,      -1,      -1,      -1,			//LoW   1
			     0,      -1,      -1,      -1,              //LoW   2   HiGH   0
			     0,       0,       0,       0,			//HiGH  1
			     0,       0,       0,       0,			//HiGH  2
};
extern unsigned char code n_division[];		// = {1,2,5,10,20,50,100,200};
extern unsigned char code n_rang0[];		// = {2,4,10,20,50,100};
//得到量程、分度值、小数点位,均为磅的方式下
// num -- 0 	kg的状态下
// num -- 1		lb
// num -- 2		台斤
// num -- 3		港斤

void getcap(signed char num)
{
	  signed char loop;
	if (para.mode.divisionprecision > 1) para.mode.divisionprecision = 0;
	if (para.mode.change > 2) para.mode.change = 0;
	if (para.mode.capacity > 5) para.mode.capacity = 0;
	loop = para.mode.change;
	if (para.mode.divisionprecision == 1) loop += 2;
//先得到kg的量程
	loop = para.mode.capacity * 20 + 4 * loop;
	capacity_n = CAPACITYCODE[loop];
	decimal_n = DECIMALCODE[loop];
	division_n = DIVISIONCODE[loop];
	if (decimal<0) division_n = division_n * exp_m[-decimal];
	if (num > 3) num = 0;
	loop = loop + num;
	capacity = CAPACITYCODE[loop];
	division = DIVISIONCODE[loop];
	decimal  = DECIMALCODE[loop];
	if (decimal<0)
	{
		division = division * exp_m[-decimal];
		capacity = capacity * exp_m[-decimal];
	}
	fd5 = adf / capacity_n;
	fd5 = fd5 / 2;
}


void InitVar(void)
{
	ClearFlag();		//关闭所有标志位

	w_tare = 0;
	init_s();
	getcap(s_unit);
	
}

unsigned char code OFFTIME[] = {0,5,10,15,30};

////////batt auto protect/////////////
void AutoPower(void)
{
	batt_lcd = 0;
	if (last_min!=shut_min)
	{
		last_min=shut_min;
		if (batt_lcd)
		{
			ReadEeprom(e_min_add,1,(unsigned char xdata*)&min_add);
			min_add++;

			WriteEeprom(e_min_add,1,(unsigned char xdata*)&min_add);
			if (min_add)
			{
				if ((min_add % 5)==0)
				{
					DispStr(d_battlo);
					DelayInter(200);
				}
				if (min_add>=30)
				{
					min_add = 31;
					DispStr(d_battlo);
					DelayInter(200);
					IOPower = 0;
				}
			}
		}
		else
		{
			min_add=0;
			WriteEeprom(e_min_add, 1, (unsigned char xdata*)&min_add);
		}
		if (para.mode.poweroff != 0)
		{
			
			if ( shut_min >= OFFTIME[para.mode.poweroff] )
			{
//				ReadEeprom(e_start, 1, (unsigned char xdata*)&test_start);
//				test_start=~test_start & 0x01; 
				test_start = 0;
				WriteEeprom(e_start, 1, (unsigned char xdata*)&test_start);
				IOBeep = 0;
				delay(2000);
				IOBeep = 1;
				IOPower = 0;	//关机
			}
		}
	}
}



///////////特殊功能寄存器初始化
void InitSfr(void)
{
	EA = 0;
	TMOD=0x11;
	PCON=0x00;
/*	if( commodel == 5 )	//在p cnt2状态下
	{
		SCON=0xf8;		//dibal专用,2位停止位
	}
	else
	{
		SCON=0x70;		//其他正常串口模式下
	}
	*/
	SCON = 0x70;

	IP=0x08;
	TH0=0;
	TL0=0;
	TH1=0xdc;		//0xee;			//0xf7;
	TL1=0x00;
	TR0=0;
	TR1=1;
	IT1=1;
	EX0=0;
	EX1=0;
	ET1=1;
	ET0=0;
	ES=1;
	EA=1;
}


////////测试LCD好坏
bit SelfTest(void)
{  	
	unsigned char loop,iic_char;
	cont_1 = 0xef;
	cont_2 = cont_3 = 0xff;
	bankbuff[1] = bankbuff[2]=bankbuff[3]=bankbuff[4]=bankbuff[5]=bankbuff[6]=0xff;
	unit = 0xff;		//不显示单位
	if( !IOK1 )		//k1为老化模式
	{
		DispStr(disp_full);
		while(1)
		{
			;
		}
	}
	else
	{
		DispStr(version);
	} 
	delay(20000);
	for (loop=0;loop<10;loop++)
	{   
		for (iic_char=0;iic_char<6;iic_char++)
		{
			dispbuff[iic_char]=loop;		//+0x22;
			delay(4000);
		}	
		tran();
		wrlcd();
		if (keyp)
		{
			keyp = FALSE;
			if (kbuf == KEYT_Z) break;
			if (kbuf == KEYUNIT)
			{
				EnterMenu();			//进入菜单设置
				return(FALSE);
			}
		}
		delay(4000); 		
	}
	ClearFlag();

	DispStr(version);
	return(TRUE);
}

//处理串口,得到内码
void DisposeUart(void)
{
	if (!BReq) 
	{
		SendStr(2);
		BReq = TRUE;
		ReqTime = 50;
	}

	if (RdBufData()) 
	{
		ReqTime = 50;
		BReq = TRUE;
		ReqNum = 0;
		BRecData = FALSE;
		BErrData = FALSE;
//		DispDigital((signed long int)ad_out,1);
	}
	if (ReqNum >= 7) 
	{
		BErrData = TRUE;
		unit = 0xff;
		ClearFlag();
		ray_lcd = FALSE;
		if (BRecData) DispStr(err_11);
		else DispStr(err_10);
		
		BRecData = FALSE;
		ReqNum = 0;
	}
}

void InitSendAS(void)
{
	SendStr(2);
	ReqTime = 100;
	BReq = TRUE;
	ReqNum = 0;
	RecCounter =0;
	RdCounter = 0;
	BRecData = FALSE;
}

void inp(void)		//显示内码
{
	InitSendAS();
	for ( ; ; )
	{
		AutoPower();

		DisposeUart();
		if (pick)
		{
			pick = 0;
			stab_lcd = FALSE;
			if (stab) stab_lcd = TRUE;
			if (!BErrData) DispDigital((signed long int)ad_out,0);
		}

		if (keyp)
		{
			keyp = 0;
			if (kbuf == KEYENTER) break;
		}

	}
}
//得到kg单位时的重量
float GetWeightKg(void)
{
	float f_f;
	f_f = (float)((signed long int)ad_out - adz);
	f_f = f_f * capacity_n;
	f_f = f_f /(float)adf;
	if (decimal_n >= 0) f_f = f_f / exp_m[decimal_n];
	else f_f = f_f * exp_m[-decimal_n];
	return(f_f);
}
//获得各个单位的重量
signed long int GetWeightUnit(void)
{
	signed long int li;
	f_w = GetWeightKg();

	f_w = f_w * CONVERTUNIT[s_unit];

	if (decimal >= 0) f_w = f_w * exp_m[decimal];
//				else f_w = f_w / exp_m[-decimal];
	if (f_w >= 0) f_w = f_w + 0.5*((float)division);
	else f_w = f_w - 0.5*((float)division);
	li = (signed long int)f_w;
	li = li / (signed long int)division;
	li = li * division;
	return(li);
}

//检查背光
void CheckBk(void)
{
	if (!BLess20d || !BErrData)
	{		    
		IOBK=1;
		bk_del=500;
		bk_delb=1;          
	}
	else if(bk_delb==0)  
	{
		IOBK=0;
	}
}

////////主程序//////////
void main(void)
{

⌨️ 快捷键说明

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