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

📄 ddcjc.c

📁 电动车测试平台控制系统。自动测量电动车各项参数
💻 C
📖 第 1 页 / 共 3 页
字号:

#include "DDCJC.h"

void Delay(uint time1, uint time2) 
{ 
	 uint data i, j;
	 for (i=0; i<time1; i++)
	      for (j=0; j<time2; j++);
	 return;
}

void ClearAllData (void)
{
	 PulseCount = 0;
	 DisPulse = 0;
	 Distance = 0;
	 PerTime = 0;

	 KilDistance = 0;
	 Distance = 0;
	 uLength = 0;

	 //Rev = 0;
	 Rate = 0;
	 OldRate = 0;
	 Voltage = 0;
	 Current = 0;

	 MaxRate = 0;
	 RateVoltage = 0;
	 RateCurrent = 0;
	 MinVoltage = 0;
	 MaxCurrent = 0;

	 StartTime = 0;
	 DispPause = 0;

	 bPause = FALSE;
	 bPauseOver = FALSE;

	 //Uindex = 0;
	 
	 bDistAlarm = FALSE;    //里程报警
     bRateAlarm = FALSE;    //速度报警
     bVoltAlarm = FALSE;    //电压报警
     bCurrAlarm = FALSE;    //电流报警

	 bStartTime = FALSE;
	 bStartFlag = FALSE;

	 bSaved = FALSE; 
}

/*
uchar BCDToBin (uchar uBCD)
{
	 return ((uBCD & 0xF0) >> 4) * 10 + (uBCD & 0x0F);
}

uchar BinToBCD (uchar uBin)   
{
      
	  return (((uBin/10)<<4) + (uBin%10));
}
*/

uchar GetYear (uchar uBCD)     //得到年份
{
	 return (uBCD & 0xC0) >> 6;
}

uchar GetDate (uchar uBCD)     //得到日期
{
	 return uBCD & 0x3F;
}

/*
uchar GetWeekday (uchar uBCD)  //得到星期
{
	 return (uBCD & 0xE0) >> 5;
}
*/

uchar GetMonth (uchar uBCD)    //得到月份   
{
     return uBCD & 0x1F;
}

void ReadParam ()    //读各设置的参数
{
	 WordType idata Convert;
	 Get8583Data (DIS_ALARM, UartBuf, 18);
	 //里程
	 Convert.b[0] = UartBuf[0];
	 Convert.b[1] = UartBuf[1];
	 OptDistance = Convert.w;
	 OptKilDis = OptDistance / 100;
	 OptDis = (OptDistance % 100) * 10;
	 //车速
	 Convert.b[0] = UartBuf[2];
	 Convert.b[1] = UartBuf[3];
	 OptRate = Convert.w;
	 //电流
	 Convert.b[0] = UartBuf[4];
	 Convert.b[1] = UartBuf[5];
	 OptCurrent = Convert.w;
	 //电压
	 Convert.b[0] = UartBuf[6];
	 Convert.b[1] = UartBuf[7];
	 OptVoltage = Convert.w;
	 //轮子直径
	 BikeIndex = UartBuf[8];
     GetBike (); 
	 //N值
	 Convert.b[0] = UartBuf[9];
	 Convert.b[1] = UartBuf[10];
	 NValue = Convert.w;
	 //后轮直径
	 Convert.b[0] = UartBuf[11];
	 Convert.b[1] = UartBuf[12];
	 Dia = Convert.w;
	 //记录编号
	 Convert.b[0] = UartBuf[13];
	 Convert.b[1] = UartBuf[14];
	 RecordIndex = Convert.w;

	 //模式设置
	 ModeIndex = UartBuf[15];
	 CheckStatus = END_STATUS;
     
	 //打印设置
	 PrinterIndex = UartBuf[16];
	 //电池容量
	 Battery = UartBuf[17];
}

void DispMode()     //显示模式
{
     switch (ModeIndex)
	 {
	 case 0:
	       	DispBuf[8] = 0x07;
			/*
		    START_LED = FALSE;
			UNDER_LED = FALSE;	   
			OVER_LED = FALSE;
	        */
			break;
	 case 1:
	        DispBuf[8] = 0x05;
			/*
			START_LED = FALSE;
		    UNDER_LED = TRUE;	   
			OVER_LED = FALSE;	
	        */
			break;
	 case 2:
	        DispBuf[8] = 0x03;
			/*	
		    START_LED = FALSE;
			UNDER_LED = FALSE;	 
			OVER_LED = TRUE;
	        */
			break;
	 case 3:
	        DispBuf[8] = 0x01;
			/*
		    START_LED = FALSE;
			UNDER_LED = TRUE;  
			OVER_LED = TRUE;
	        */
			break;
	 default:
	        DispBuf[8] = 0x00;
			/*	
		    START_LED = TRUE;	   //熄灯
			UNDER_LED = TRUE;	
			OVER_LED = TRUE;
	        */
			break; 
	 } 
}

void WriteParam ()  //写参数设置
{
	 WordType idata Convert;
	 
	 //里程
	 Convert.w = OptDistance;
	 UartBuf[0] = Convert.b[0];
	 UartBuf[1] = Convert.b[1];
	 
	 //车速
	 Convert.w = OptRate;
	 UartBuf[2] = Convert.b[0];
	 UartBuf[3] = Convert.b[1];
	 
	 //电流
	 Convert.w = OptCurrent;
	 UartBuf[4] = Convert.b[0];
	 UartBuf[5] = Convert.b[1];
	 
	 //电压 
	 Convert.w = OptVoltage;
	 UartBuf[6] = Convert.b[0];
	 UartBuf[7] = Convert.b[1];
	
	 //轮子直径
	 UartBuf[8] = BikeIndex;

	 //N值	  
	 Convert.w = NValue;
	 UartBuf[9] = Convert.b[0];
	 UartBuf[10] = Convert.b[1];

	 //滚筒直径  
	 Convert.w = Dia;
	 UartBuf[11] = Convert.b[0];
	 UartBuf[12] = Convert.b[1];
	 
	 //记录编号		
	 Convert.w = RecordIndex;
	 UartBuf[13] = Convert.b[0];
	 UartBuf[14] = Convert.b[1];

	 //模式设置
	 UartBuf[15] = ModeIndex;
	 //打印设置
	 UartBuf[16] = PrinterIndex;
	 //电池容量
	 UartBuf[17] = Battery;

	 Set8583Data (DIS_ALARM, UartBuf, 18);
}

void SaveRecord ()
{
     WordType idata Convert; 
	 //记录编号		
	 Convert.w = RecordIndex;
	 UartBuf[0] = Convert.b[0];
	 UartBuf[1] = Convert.b[1];   
	 //车速
	 Convert.w = Rate;
	 UartBuf[2] = Convert.b[0];
	 UartBuf[3] = Convert.b[1];
	 //后轮转速
	 //Convert.w = Rev;
	 //UartBuf[4] = Convert.b[0];
	 //UartBuf[5] = Convert.b[1];
	 //电压
	 Convert.w = Voltage;
	 UartBuf[6] = Convert.b[0];
	 UartBuf[7] = Convert.b[1];
	 //电流
	 Convert.w = Current;
	 UartBuf[8] = Convert.b[0];
	 UartBuf[9] = Convert.b[1];
	 //里程
	 Convert.w = KilDistance;
	 UartBuf[10] = Convert.b[0];
	 UartBuf[11] = Convert.b[1];
	 Convert.w = Distance;
	 UartBuf[12] = Convert.b[0];
	 UartBuf[13] = Convert.b[1];
	 //启动时间
	 Convert.w = StartTime;
	 UartBuf[14] = Convert.b[0];
	 UartBuf[15] = Convert.b[1];

	 //Set8583Data (RECORD, UartBuf, 16);
}

void GetBike ()    //轮子直径
{
     switch (BikeIndex)
	 {
     case 0:
	       Bike = 406;  //16英寸
	       break;
	 case 1:
	       Bike = 457;  //18英寸
	       break;
	 case 2:
	       Bike = 508;  //20英寸
	       break;
	 case 3:
	       Bike = 559;  //22英寸
	       break;
	 case 4:
	       Bike = 610;  //24英寸
	       break;
	 }
}
 
void InitSys ()
{
	 //uchar uBaseYear = 4;

	 //初始化各引脚
	 TRIP_PIN =FALSE;	  
     DAT_595 = HIGH;
     CLK_595 = HIGH;
     STB_595 = HIGH;
	 SEL_595 = HIGH;

	 ClearAllData ();

	 ReadParam ();

	 //初始化定时器0,1
     TMOD = 0x11;
	
	 //定时器0,方式1
     TH0 = TH0_VAL;
     TL0 = TH0_VAL; 
	 TR0 = TRUE;
	 ET0 = FALSE;  
     		
	 //定时器1,方式1,用于显示
     TH1 = TH1_VAL;
     TL1 = TL1_VAL;
     TR1 = TRUE;
	 ET1 = TRUE;

	 IsOption = FALSE;
			    
	 /*
	 //初始化外中断0
     IT0 = TRUE; //边沿触发方式
     EX0 = TRUE;
	 */

	 //初始化外中断1
     IT1 = TRUE; //边沿触发方式
	 PX1 = TRUE; 
     EX1 = FALSE;
	 
	 //初始化系统时钟	 
	 //Init8583 (PCF8583_CTR, 0x00);	  
	 
     //NValue = NVALUE;
	 Wheel = GetWheel (); 
	 DisplaySysTime ();
	 
	 EA  = TRUE;

	 //测试DA
	 I2CSend (MAX517_ADDR, 0x00, 0x80);
	 
	 //Delay (500, 255);

	
}

void ClearLED ()     //清除屏幕
{
     uchar i;

	 for (i=0; i<18; i++)
	      DispBuf[i] = 0;
}

uint GetWheel ()  //得到轮子周长
{
     uint Temp;

	 Temp = PI * (dword)Dia / 100;

	 if ((PI * (dword)Dia % 100) > 44)
	     Temp = Temp + 1;
	 return Temp;
}

void DisplaySysTime ()     //显示系统时间
{
     uchar cTemp, cBaseYear;
	 //显示
     Get8583Data(BASE_YEAR, &cBaseYear, 1); 
	 Get8583Data (HUNSEC, UartBuf, 6);
	 cTemp = GetYear (UartBuf[4]) + cBaseYear*4;	//年
	 DispBuf[0] = LED_CODE[2];   
	 DispBuf[1] = LED_CODE[0];
	 DispBuf[2] = LED_CODE[(cTemp>>4) & 0x0F];   
	 DispBuf[3] = LED_CODE[ cTemp & 0x0F];
	 cTemp = GetMonth (UartBuf[5]);		            //月
	 DispBuf[4] = LED_CODE[cTemp>>4 & 0x0F];
	 DispBuf[5] = LED_CODE[cTemp & 0x0F];
	 cTemp = GetDate (UartBuf[4]);				    //日
	 DispBuf[6] = LED_CODE[cTemp>>4 & 0x0F];	 
	 DispBuf[7] = LED_CODE[cTemp & 0x0F];
	 DispBuf[9] = 0x00;
	 DispBuf[10] = LED_CODE[UartBuf[3]>>4 & 0x0F];  //时	 
	 DispBuf[11] = LED_CODE[UartBuf[3] & 0x0F];
	 DispBuf[12] = 0x00;
	 DispBuf[13] = LED_CODE[UartBuf[2]>>4 & 0x0F];  //分	 
	 DispBuf[14] = LED_CODE[UartBuf[2] & 0x0F];
	 DispBuf[15] = LED_CODE[UartBuf[1]>>4 & 0x0F];  //秒	 
	 DispBuf[16] = LED_CODE[UartBuf[1] & 0x0F];
	 DispBuf[17] = 0x00;
}


void WriteDateTime()
{
     uchar uYear;
	 //计算BCD码
	 UartBuf[0] = (UartBuf[16] << 4) | UartBuf[17];	 //秒
	 UartBuf[1] = (UartBuf[14] << 4) | UartBuf[15];  //分
	 UartBuf[2] = (UartBuf[12] << 4) | UartBuf[13];  //时
	 uYear = UartBuf[5] * 10 + UartBuf[6];
	 UartBuf[3] = ((uYear%4)<<6) | (UartBuf[10] << 4) | UartBuf[11];  //年日
	 UartBuf[4] = (UartBuf[7] << 4) | UartBuf[9];	 //月
	 Set8583Byte (PCF8583_CTR, 0x80);
	 Set8583Data (SECOND, UartBuf, 5);               //写日期时间
	 Set8583Byte (PCF8583_CTR, 0x00);
	 Set8583Byte (BASE_YEAR, uYear/4);			     
	 Set8583Byte (CMP_YEAR, uYear%4);
}


uint GetResult (uchar uLen)
{
     uint Data = 0;
	 uchar i;

	 for (i=uLen; i<4; i++)
	      Data = Data * 10 + CodeIndex[i];
	 return Data;
}

void InitCodeIndex (uint Data)
{
     uchar i;
	 for (i=0; i<4; i++)
	 {
	      CodeIndex[3-i] = Data % 10;
	      Data = Data / 10;
	 }
	 DataIndex = CodeIndex[0];
}

uchar ReadKey ()     //读键盘
{
	 //WordType idata Convert;

	 switch (~P2)
	 {
	 case 0x01:		  //设置 
	      bDispTime = FALSE;
	      IsOption = TRUE;    
		  ShiftIndex = 4;
	      ClearLED ();
	      DispBuf[0] = LED_CODE[10];
		  DispBuf[1] = LED_CODE[16];
		  DispBuf[2] = LED_CODE[OptIndex];   
		  IsShine = TRUE;
		  switch (OptIndex)
		  {
		  case 0:
		         //显示当前记录编号
				 IntToLED (RecordIndex, 3, 3, FALSE, FALSE, 4);
				 InitCodeIndex(RecordIndex);
				 break;
		  case 1:  
		         //计算当前记录编号
				 RecordIndex = GetResult(0);
				 //记录编号		
	             //Convert.w = RecordIndex;
	             //Set8583Data (RCORDINDEX, Convert.b, 2);
				 WriteParam ();
				 DispBuf[7] = LED_CODE[ModeIndex];
		         break;
		  case 2:
				 //保存模式
				 //Set8583Byte (MODE_INDEX, ModeIndex);
				 WriteParam ();
				 IntToLED (OptDistance, 3, 2, TRUE, FALSE, 4);	  //显示
	             //换算得到当前值的下标
				 InitCodeIndex (OptDistance);
		         break;
		  case 3:
		         //计算设置行程
				 OptDistance = GetResult(0);
				 OptKilDis = OptDistance / 100;
				 OptDis = (OptDistance % 100) * 10;
				 
				 //里程
				 //Convert.w = OptDistance;
				 //Set8583Data (DIS_ALARM, Convert.b, 2);
				 WriteParam ();
				 ShiftIndex ++;
				 IntToLED (OptRate, 2, 1, TRUE, FALSE, 5);
				 //换算得到当前值的下标
				 InitCodeIndex(OptRate);
		         break;
		  case 4: 
		         //计算报警速度
				 OptRate = GetResult(1);
				 
				 //车速
	             //Convert.w = OptRate;
				 //Set8583Data (RATE_ALARM, Convert.b, 2);
				 WriteParam ();
		         IntToLED (OptVoltage, 3, 1, TRUE, FALSE, 4);
				 //换算得到当前值的下标
				 InitCodeIndex(OptVoltage);
		         break;
		  case 5:
		         //计算欠压电压
				 OptVoltage = GetResult(0);

				 //电压 
	             //Convert.w = OptVoltage;
				 //Set8583Data (VOL_ALARM, Convert.b, 2);
				 WriteParam ();
				 ShiftIndex ++;
		         IntToLED (OptCurrent, 2, 1, TRUE, FALSE, 5);
				 //换算得到当前值的下标
				 InitCodeIndex(OptCurrent);
		         break;
		  case 6:
		         //计算过载电流
				 OptCurrent = GetResult(1); 

				 //电流
	             //Convert.w = OptCurrent;
				 //Set8583Data (CURR_ALARM, Convert.b, 2);
				 WriteParam ();
				 //打印模式
				 DispBuf[7] = LED_CODE[PrinterIndex];				 
		         break;
		  case 7:
		         //保存打印模式
				 //Set8583Byte (PRINT_INDEX, PrinterIndex);
				 WriteParam ();
				 ShiftIndex = 6;
				 //电池容量	
				 IntToLED (Battery, 1, 1, FALSE, FALSE, 6); 
				 //换算得到当前值的下标
				 InitCodeIndex(Battery);
		         break;
		  case 8:
		         Battery = GetResult(2);

				 //保存电池容量
				 //Set8583Byte (BATTERY, Battery);
				 WriteParam ();
				 //显示当前N
				 IntToLED (NValue, 3, 3, FALSE, FALSE, 4);
		         //换算得到当前值的下标
				 InitCodeIndex(NValue);
		         break;
		  case 9:
		         //计算N值
				 NValue = GetResult(0);

				 //N值	  
	             //Convert.w = NValue;
				 //Set8583Data (N_VALUE, Convert.b, 2);
				 WriteParam ();
				 ShiftIndex ++;
				 //显示滚筒直径
				 IntToLED (Dia, 2, 2, FALSE, FALSE, 5);
				 //换算得到当前值的下标
				 InitCodeIndex(Dia);
		         break;
		  case 10:
		         //计算滚筒直径
		         Dia = GetResult(1);

				 //滚筒直径
				 //Convert.w = Dia;
				 //Set8583Data (WHEEL_DIA, Convert.b, 2);
				 WriteParam ();
 				 Wheel = GetWheel (); 
				 IntToLED (DIA_SEL[BikeIndex], 3, 3, FALSE, TRUE, 4);   
		         break;
		  case 11: 
		         //保存轮子直径
				 //Set8583Byte (BIKE_DIA, BikeIndex);
				 WriteParam ();
				 //显示时间
				 ShiftIndex ++;
			     GetDateTime ();
		         break;
		  case 12:
		         //保存日期
				 WriteDateTime();
				 //保存其他参数
		         //WriteParam (); 
		         break;
		  default: 
		         //退出设置
		         return ~P2;
		  }
		  OptIndex ++;
		  OptIndex %= 13;
	      break;  
	 case 0x02:		  //置数
	      bDispTime = FALSE;
	      if (IsOption)
		  {
		      switch (OptIndex)
		      {
			  case 1:
		      case 3:
		      case 4:
		      case 5:
		      case 6:
			  case 8:
			  case 9:
			  case 10:
		             DataIndex ++;
		             DataIndex %= 10;
		             DispBuf[ShiftIndex] = LED_CODE[DataIndex] | (DispBuf[ShiftIndex] & 0x80); 
		             CodeIndex[ShiftIndex - 4] = DataIndex;
		             break;
			  case 7:
			         PrinterIndex ++;
					 PrinterIndex %= 2; 
					 DispBuf[7] = LED_CODE[PrinterIndex];
			         break;
			  case 2:
			         ModeIndex ++;
					 ModeIndex %= 4; 
					 DispBuf[7] = LED_CODE[ModeIndex];
					 DispMode();
					 break;
			  case 11:
			         BikeIndex ++;
		             BikeIndex %= 5;
				     DispBuf[6] = LED_CODE[DIA_SEL[BikeIndex]/10];
				     DispBuf[7] = LED_CODE[DIA_SEL[BikeIndex]%10];
					 GetBike (); 
		             break;
			  case 12:
			         DataIndex ++;
		             DataIndex %= 10;
		             DispBuf[ShiftIndex] = LED_CODE[DataIndex] | (DispBuf[ShiftIndex] & 0x80); 
		             UartBuf[ShiftIndex] = DataIndex;
		             break;
		      }
		  }
	      break;  
	 case 0x04:		  //移位
	      bDispTime = FALSE;
	      if (IsOption)
		  {
	          if (OptIndex != 7 &&
			      OptIndex != 2 &&
				  OptIndex != 11&&
				  OptIndex != 0)
		      {
	              IsShine = TRUE;	 
	              ShiftIndex ++;
				  switch(OptIndex)
				  {
				  case 1:
				  case 3:
				  case 5:
				  case 9:

⌨️ 快捷键说明

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