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

📄 main.c

📁 这是一整套USB2.0试验程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		PCACPAL[i+BDBegin] = random;
		PCACPAH[i+BDBegin] = random>>8;
		PointSum += random;
		random = (float)random/k+0.5;	
	}
	//判断调整
	while(RangePoint != PointSum)
	{
		if(PointSum>RangePoint)										
		{
			dis = (PointSum-RangePoint);
			if(dis >= Tn)//多出的比最小周期要大,先去掉一个最小周期
			{
				PointSum -= Tn;
				n--;
				PCACPAL[BDBegin+n] = 0;
				PCACPAH[BDBegin+n] = 0;		
			}
			else
			{
				dis /= n;

				if(dis>0)											//误差可以平均到每一个转速脉冲半周期
				{
					PointSum = 0;
					for(i=0;i<n;i++)
					{
						TempPoint = PCACPAH[i+BDBegin]<<8;
						TempPoint += PCACPAL[i+BDBegin];
						TempPoint -= dis;
						PointSum += TempPoint;
						PCACPAL[i+BDBegin] = TempPoint;
						PCACPAH[i+BDBegin] = TempPoint>>8;
					}
				}
				else
				{
					dis = PointSum-RangePoint;
					for(i=0;i<dis;i++)
					{
						TempPoint = PCACPAH[i+BDBegin]<<8;
						TempPoint += PCACPAL[i+BDBegin];
						TempPoint--;
						PointSum--;
						PCACPAL[i+BDBegin] = TempPoint;
						PCACPAH[i+BDBegin] = TempPoint>>8;
					}
				}
			}
		}
		else 
		{
			dis = (RangePoint-PointSum);
			if(dis >= Tn)//少的比最小周期要大,先加上一个最小周期
			{
				PointSum += Tn;
				PCACPAL[BDBegin+n] = Tn;
				PCACPAH[BDBegin+n] = Tn>>8;
				n++;
			}
			else
			{
				dis /= n;
				if(dis>0)
				{
					PointSum = 0;
					for(i=0;i<n;i++)
					{
						TempPoint = PCACPAH[i+BDBegin]<<8;
						TempPoint += PCACPAL[i+BDBegin];
						TempPoint += dis;
						PointSum += TempPoint;
						PCACPAL[i+BDBegin] = TempPoint;
						PCACPAH[i+BDBegin] = TempPoint>>8;
					}
				}
				else
				{
					dis = RangePoint-PointSum;
					for(i=0;i<dis;i++)
					{
						TempPoint = PCACPAH[i+BDBegin]<<8;
						TempPoint += PCACPAL[i+BDBegin];
						TempPoint++;
						PointSum++;
						PCACPAL[i+BDBegin] = TempPoint;
						PCACPAH[i+BDBegin] = TempPoint>>8;
					}
				}
			}
		}	
	}
	//加上2500转的点数
	StepCounter[0] = BDBegin+n;
	PCACPAL[StepCounter[0]] = TUp; //8294
	PCACPAH[StepCounter[0]] = TUp>>8;//3000转
	StepCounter[0]++;	
	BDEnd = StepCounter[0];
	//至此加速过程结束
	//3秒钟内从2500转加到3000转再回来
	HalfSpeedTime = 0.5f;//3秒钟的一半
	RangePoint = HalfSpeedTime*PCADRVCLOCK+0.5;
	DownSpeed = 2500;
	UpSpeed = 3000;
	T0 = 120/CYLINDERNUMBER/DownSpeed/2*PCADRVCLOCK+0.5;
	Tn = 120/CYLINDERNUMBER/UpSpeed/2*PCADRVCLOCK+0.5;
	k = (float)(RangePoint-Tn)/(RangePoint-T0);
	random = T0;
	i = 0;
	while(1)//求n算法
	{
		i++;
		TempPoint = random;		
		random = (float)random/k+0.5;//random=T0/k的i次方
//		random /= k;
		if(random <= Tn)
		{
			//判断这个和上一个谁更近
			if((TempPoint-Tn) < (Tn-random))
				i--;
			break;
		}			
	}
	n = i+1;
	random = T0;
	PointSum = 0;
	i = 0;
	for(i=0;i<n;i++)
	{		
		PCACPAL[i+StepCounter[0]] = random;
		PCACPAH[i+StepCounter[0]] = random>>8;
		PointSum += random;
		random = (float)random/k+0.5;
	}
	//------------------------------------------------------
	StepCounter[0] += n;
//	stepCounter[0]--;//The last one is empty! 
	StepCounter[1] =  StepCounter[0]*2-1;                       
//	stepCounter[2] = stepCounter[0]+stepCounter[1];

}
uchar ReadKeyBoard(void)
{
	uchar ScanCode,i;
	uchar ReturnCode=0;
	P7 &= 0x0f;//全零扫描
	DelayM(100);
	if((P7&0x0f) != 0x0f)//有键按下
	{
		ScanCode = P7;
		DelayM(100);
		if((P7&0x0f) != 0x0f)//有键按下
		{
			if(P7 == ScanCode)//如果键值稳定开始扫描
			{
				ScanCode = 0xef;
				for(i=0;i<4;i++)
				{
					P7 |= 0xf0;
					P7 &= ScanCode;
					DelayM(100);
					if((P7&0x0f) != 0x0f)
					{
						ReturnCode = P7;
						ReturnCode &= 0x0f;
						ReturnCode |= 0xf0;
						P7 = 0x0f;
						return((~ScanCode)+(~ReturnCode));
					}
					else
					{
						ScanCode >>=4;
						ScanCode = (ScanCode<<1)|0x01;
						ScanCode &= 0x0f;
						ScanCode = ScanCode<<4;
						ScanCode |= 0x0f;
					}
				}
			}
		}
	}
	P7 = 0x0f;
	return 0;

}
void AnswerKeyBoard(uchar key)
{
	switch (key)
	{
		case KeyNum0:
			OnNumber(0);		
			break;
		case KeyNum1:
			OnNumber(1);
			break;
		case KeyNum2:
			OnNumber(2);
			break;
		case KeyNum3:
			OnNumber(3);
			break;
		case KeyNum4:
			OnNumber(4);
			break;
		case KeyNum5:
			OnNumber(5);
			break;
		case KeyNum6:
			OnNumber(6);
			break;
		case KeyNum7:
			OnNumber(7);
			break;
		case KeyNum8:
			OnNumber(8);
			break;
		case KeyNum9:
			OnNumber(9);
			break;
		case KeyUp://Up Arrow
			OnUp();
			break;
		case KeyDown://Down Arrow
			OnDown();
			break;
		case KeyLeft:
			OnLeft();
			break;
		case KeyRight:
			OnRight();
			break;
		case KeyEsc:
			OnEsc(); 
			break;
		case KeyEnter:
			OnEnter();
			break;
		default:
			break;
	}
}
//以毫秒为单位延时
void DelayM(ulong n)
{
//	DelayCounter=n;
//	while(DelayCounter>0);
	while(n)
		n--;
}
void DisplayOneNumber(uchar x,uchar y,uchar number,uchar counter)
{
	if(counter == InputCounterInt-1)
	{
		Putstr(x+counter,y,".",0,0);
		Locatexy(x+counter+1,y+16,0);
	}
	else
	{
		Put_uint(x+counter,y,1,number,0,0);
		Locatexy(x+counter+1,y+16,0);
	}
}
void DeleteOneNumber(uchar x,uchar y,uchar counter)
{
	Putstr(x+counter-1,y,"#",0,0);
	Locatexy(x+counter-1,y+16,0);
}

//--------------------一行内的区域清屏--------------------

//显示欢迎界面
void DisplayStart()
{
	PutLogo(1,2,0);
	Putstr(16,50,"FDJJ-1型",1,0);
	PutHz_32(0,104,"发动机检测仪检定装置",1);
//	PutHz_12(4,188,"深圳市安车科技有限公司济南分公司",1);
	Putstr(4,188,"深圳市安车科技有限公司济南分公司",1,0);
//	PutHz_12(4,220,"地址:济南市高新区新宇路751号大学科技园B-103",0);
//	PutHz_12(12,208,"电话:0531-88878803",1);
	Putstr(12,218,"电话:0531-88558884",1,0);
//	PutHz_12(4,208,"深圳市安车科技有限公司济南分公司",0);
	Linexy(0,0,0,239,1);       
    Linexy(0,0,319,0,1);
    Linexy(0,239,319,239,1);
    Linexy(319,0,319,239,1);
}//
void DisplayMainMenu(uchar func,uchar oldfunc)
{
	if(func == 0)
	{
		PutHz_24(12,MainZoneTop,"请选择功能",0);
		Putstr(LeftItem,MainZoneTop+24+16,"1.转速",0,1);
		Putstr(LeftItem,MainZoneTop+24+16+24,"2.加速时间",0,0);
		Putstr(LeftItem,MainZoneTop+24+16+24+24,"3.闭合角",0,0);
		Putstr(LeftItem,MainZoneTop+24+16+24+24+24,"4.缸压提前角",0,0);
//		Putstr(6,164,"5.提前角",0,0);
		Putstr(RightItem,MainZoneTop+24+16,"5.起动系",0,0);
		Putstr(RightItem,MainZoneTop+24+16+24,"6.充电系",0,0);
		Putstr(RightItem,MainZoneTop+24+16+24+24,"7.闪光提前角",0,0);//
//		Putstr(32,10,"缸量=",0,0);//汉字“数”的区位码总是不正常,疑与KEIL有关,用“量”的代替
//		Put_uint(37,10,2,CYLINDERNUMBER,0,0);
//		Putstr(26,140,"9.频率",0,0);
		PutLogo(1,2,0);
		Putstr(32,7,"Ver2.9",0,0);
		Linexy(ScreenLeft,ScreenBottom-56,ScreenRight,ScreenBottom-56,1);
		Putstr(15,ScreenBottom-54,"*操作提示*",0,0);//
		Putstr(8,ScreenBottom-36,"贱腚键或量字键移动光标",0,0);
		Putstr(10,ScreenBottom-18,"确认键进入选定项目",0,0);

		Linexy(ScreenLeft,ScreenTop,ScreenLeft,ScreenBottom,1);       
		Linexy(ScreenLeft,ScreenTop,ScreenRight,ScreenTop,1);
		Linexy(ScreenLeft,ScreenBottom,ScreenRight,ScreenBottom,1);
		Linexy(ScreenRight,ScreenTop,ScreenRight,ScreenBottom,1);

	}
	else
	{
		switch (oldfunc)
		{
			case 0:
			case 1:
				Putstr(LeftItem,MainZoneTop+24+16,"1.转速",0,0);
				break;
			case 2:
				Putstr(LeftItem,MainZoneTop+24+16+24,"2.加速时间",0,0);
				break;
			case 3:
				Putstr(LeftItem,MainZoneTop+24+16+24+24,"3.闭合角",0,0);
				break;
			case 4:
				Putstr(LeftItem,MainZoneTop+24+16+24+24+24,"4.缸压提前角",0,0);
				break;
			case 5:
				Putstr(RightItem,MainZoneTop+24+16,"5.起动系",0,0);
				break;
			case 6:
				Putstr(RightItem,MainZoneTop+24+16+24,"6.充电系",0,0);
				break;
			case 7:
				Putstr(RightItem,MainZoneTop+24+16+24+24,"7.闪光提前角",0,0);
				break;

			default:
				break;
		}
		switch (func)
		{
			case 1:
				Putstr(LeftItem,MainZoneTop+24+16,"1.转速",0,1);
				break;
			case 2:
				Putstr(LeftItem,MainZoneTop+24+16+24,"2.加速时间",0,1);
				break;
			case 3:
				Putstr(LeftItem,MainZoneTop+24+16+24+24,"3.闭合角",0,1);
				break;
			case 4:
				Putstr(LeftItem,MainZoneTop+24+16+24+24+24,"4.缸压提前角",0,1);
				break;
			case 5:
				Putstr(RightItem,MainZoneTop+24+16,"5.起动系",0,1);
				break;
			case 6:
				Putstr(RightItem,MainZoneTop+24+16+24,"6.充电系",0,1);
				break;
			case 7:
				Putstr(RightItem,MainZoneTop+24+16+24+24,"7.闪光提前角",0,1);
				break;

			default:
				break;
		}
	}
}
void DisplayItem(uchar func)
{
//	uint temp;
	Linexy(ScreenLeft,ScreenTop,ScreenLeft,ScreenBottom,1);       
	Linexy(ScreenLeft,ScreenTop,ScreenRight,ScreenTop,1);
	Linexy(ScreenLeft,ScreenBottom,ScreenRight,ScreenBottom,1);
	Linexy(ScreenRight,ScreenTop,ScreenRight,ScreenBottom,1);
	switch (func)
	{
		case 1:
//			P3 = 0;
			WRITHE = 100;
			Putstr(16,4,"转速检定",0,0);    
//			Linexy(ScreenLeft,22,ScreenRight,22,1);
			
			Putstr(10,36,"转速值:",0,0);
			Putf(17,36,"62",fSpeed,0);
			Putstr(25,36,"转/分",0,0);
			Linexy(ScreenLeft,66,ScreenRight,66,1);

			CYLINDERNUMBER = 4;
			Putstr(2,68,"缸量",0,0);
			Put_uint(6,68,2,CYLINDERNUMBER,0,0);
			Putstr(11,68,"转速",0,0);
			Put_uint(15,68,4,WRITHE,0,0);
			Putstr(21,68,"转速选择",0,0);
			Putstr(31,68,"缸量选择",0,0);
			Linexy(ScreenLeft,85,ScreenRight,85,1);
			Linexy(80,66,80,85,1);
			Linexy(160,66,160,239,1);
			Linexy(240,66,240,239,1);
			Put_uint(23,87,4,100,0,1);
			Put_uint(34,87,2,3,0,0);
			Put_uint(23,106,4,300,0,0);
			Put_uint(34,106,2,4,0,0);
			Put_uint(23,125,4,400,0,0);
			Put_uint(34,125,2,6,0,0);
			Put_uint(23,144,4,1200,0,0);
			Put_uint(34,144,2,8,0,0);
			Put_uint(23,163,4,2400,0,0);
			Putstr(33,163,"输入",0,0);
			Put_uint(23,182,4,5000,0,0);
//			Linexy(240,184,319,184,1);
			Putstr(33,182,"标定",0,0);
			Put_uint(23,201,4,7200,0,0);
			Putstr(33,201,"退出",0,0);
			Putstr(23,220,"输入",0,0);

			PromptX1 = 5;
			PromptY1 = 87;
			PromptX2 = 1;
			PromptY2 = 116;
			PromptX3 = 1;
			PromptY3 = 135;
			PromptX4 = 1;
			PromptY4 = 154;
		   	Putstr(PromptX1,PromptY1,"*操作提示*",0,0);
			//此处可以不与右边选项平齐,以便表示区别
			Putstr(PromptX2,PromptY2,"空贱腚键移动光标空",0,0);
			Putstr(PromptX3,PromptY3,"空确认键设定转速空",0,0);

			DisplayCounter = 0;

			CylinderCounter = 0;
			CylinderNumberEnd = CYLINDERNUMBER;//+100;

			MaxSubMenuCode = 15;							//子菜单数目
			LeftSubMenuCode = 8;							//左边子菜单数目

			ParaFlag = 12;								//用电压的标志区分转速档位
			fSpeedParaMul = 100/fPara[ParaFlag];
			fSpeedParaAdd = 0.0f;
			SetWrithe();

			//用TIMER4捕捉并计算转速,因为它的中断优先级较低于pca
			COUNTER = 0;
			TIMER4DRVCLOCK = SYSCLOCK;///12;
			Timer4Overflow = 0;
//			CKCON &= 0xb8; //Timer4使用系统时钟/12
			CKCON |= 0x40; //Timer4使用系统时钟	  
			T4CON = 0x0d;//允许并工作在捕捉方式,系统时钟/12
			EIE2 |= 0x04;//允许中断
			EIP2 |= 0x20;//Timer4优先级置高
			break;
		case 2:
			fSpeedTime = 0;
			Putstr(14,4,"加速时间检定",0,0);    
			
			Putstr(10,36,"转速值:",0,0);
			Putf(17,36,"62",fSpeed,0);
			Putstr(25,36,"转/分",0,0);

			Putstr(9,68,"加速时间:",0,0);
			Putf(18,68,"62",fSpeedTime,0);
			Putstr(27,68,"毫秒",0,0);

 			

			Putstr(1,102,"加速时间设定0200ms",0,0);
			Putstr(24,102,"加速时间选择",0,0);
			Linexy(ScreenLeft,100,ScreenRight,100,1);		
			Linexy(ScreenLeft,120,ScreenRight,120,1);
			Linexy(160,100,160,239,1);
//			Linexy(80,100,80,120,1);
			Linexy(240,120,240,239,1);

		    PromptX1 = 5;

⌨️ 快捷键说明

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