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

📄 main.c

📁 C51 CAN开发测试软件和驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	  	FlightLed4=0;ClearLed4=0; 
	}
  }
}

 //按确认键后进入下一小项处理
void      EnterNext(void)  
{
	unsigned	char i;
   FlightLed3=1;
   FlightLed4=0;ClearLed4=0;
   MoveFlag=0;
   i=ReadSjaReg(REG_TxBuffer1+DispBuf[2]);
   DispBuf[2]++;
   DispBuf[3]=i>>4;
   DispBuf[4]=i&0x0f;
}

//发送键处理
void      CanSendKey(void)						//发送键
{
	if((ReadSjaReg(REG_CONTROL)&0x01)==0)
	{
     	BCAN_CMD_PRG(TR_CMD);
	}
	else
	{
		Write_DispBuf(0,0x0E,0x12,0x0f,0x0d);//在复位模式
	}
}

//
void  InitCPU(void)
{
 EA         =1;
 IT0        =1;
 EX0        =1;
 PX0        =1; 
 InitUart();        //初始化串口 
}                                             

////
uchar  Config_SJA(void)
{ 
  uchar  data   status=0;
  Delay_50us(100) ;
  TimeOut_Start(20);
  BandRateBuf = ByteRate_1000k;
  BCAN_ENTER_RETMODEL();
  if(BCAN_CREATE_COMMUNATION())//
    {
    status = CAN_INTERFACE_ERR;
    return(status);
  }
  if(BCAN_SET_BANDRATE(BandRateBuf))//初始化系统默认值波特率1000kbps
   {
    status = CAN_INITBTR_ERR ;
    return(status);
  }
  if(BCAN_SET_OBJECT(0xaa,0xff))
  {
    status =CAN_INITOBJECT_ERR;
    return(status);
  }
  
  if(BCAN_SET_OUTCLK(0xaa,0x48))
  {
    status =CAN_INITOUTCTL_ERR;
    return(status);
  }
  if(BCAN_QUIT_RETMODEL())
  {
    status = CAN_QUITRESET_ERR;
    return(status);
  }
  
  SJA_BCANAdr=REG_CONTROL;
  *SJA_BCANAdr=0X1E;
  
  return  status; 
}

//
void   CanRcv_Prg(void)
{
  uchar  data buf[10],status;
   if(BCAN_DATA_RECEIVE(buf))					//接收数据
   {status=0xe9;
    Error_disp(status);
   }
  else
  {  
    if(BCAN_CMD_PRG(0x04))
      Error_disp(0xe8);
	
	if((buf[1]&0x10)!=0)
	{
      switch(buf[1]&0x0f){						//远程帧处理
	    case  0:								//请求发送命令字为0c1h的命令帧
		      buf[1]=(buf[1]&0xe0)|0x06;
  			  buf[2]=0xc1;
              BCAN_DATA_WRITE(buf);				//将编辑的数据发送到can总线
              BCAN_CMD_PRG(TR_CMD);
			  break;
		case  1:
		      buf[1]=(buf[1]&0xe0)|0x06;
  			  buf[2]=0xc2;
              BCAN_DATA_WRITE(buf);				//将编辑的数据发送到can总线
              BCAN_CMD_PRG(TR_CMD);
			  break;
		case  2:
		      buf[1]=(buf[1]&0xe0)|0x06;
  			  buf[2]=0xc3;
              BCAN_DATA_WRITE(buf);				//将编辑的数据发送到can总线
              BCAN_CMD_PRG(TR_CMD);
			  break;
        case  3:
              buf[1]=(buf[1]&0xe0)|0x06;
  			  buf[2]=0xc4;
              BCAN_DATA_WRITE(buf);				//将编辑的数据发送到can总线
              BCAN_CMD_PRG(TR_CMD);
			  break;	
		case  4:
		      buf[1]=(buf[1]&0xe0)|0x06;
  			  buf[2]=0xc5;
              BCAN_DATA_WRITE(buf);				//将编辑的数据发送到can总线
              BCAN_CMD_PRG(TR_CMD);
			  break;
		case  5:
		      buf[1]=(buf[1]&0xe0)|0x06;
  			  buf[2]=0xc6;
              BCAN_DATA_WRITE(buf);				//将编辑的数据发送到can总线
              BCAN_CMD_PRG(TR_CMD);
			  break;
		case  6:
		case  7:
		case  8:
		case  9:
		default:
		      break;
	  }
	}
	else
    switch(buf[2])
    {
	  case 0xc1:    							//直通显示
	       DrecDisplay(&buf[3]);
		   break;
	  case 0xc2:								//消隐命令
	       ClearDispPrg(&buf[3]);
		   break;
	  case 0xc3:    							//测试命令
	       TestDispPrg();
		   break;
	  case 0xc4:								//左循环命令
	       LiftCrcDispPrg(&buf[3]);
		   break;
	  case 0xc5:    							//右循环命令
	       RightCrcDispPrg(&buf[3]);
           break;
	  case 0xc6:								//闪烁
	       FlightDispPrg(&buf[3]);            
	       break;
	  case 0xc9:								//改变总线波特率命令
	  default:
	       break;
	}
  }
}

//
void   DrecDisplay(uchar *databuf)	//直通显示
{
   ClearDispAttr();
   memcpy(&DispBuf[1],&databuf[1],4);
   switch(databuf[0])
   {  
    case   0:
	       DispFlag|=0xe0;
           break;
	case   1:
	       DispFlag|=0xd0;
           break;
    case   2:
	       DispFlag|=0xb0;
           break;
	case   3:
	       DispFlag|=0x70;
           break;
	case   4:
	       DispFlag|=0xc0;
           break;
	case   5:
	       DispFlag|=0xa0;
           break;
	case   6:
	       DispFlag|=0x60;
           break;
	case   7:
	       DispFlag|=0x90;
           break;
	case   8:
	       DispFlag|=0x50;
           break;
	case   9:
	       DispFlag|=0x30;
           break;
	case   10:
	       DispFlag|=0x80;
           break;
	case   11:
	       DispFlag|=0x40;
           break;
	case   12:
	       DispFlag|=0x10;
           break;
	case   13:
	       DispFlag|=0x20;
           break;
	case   14:
	       DispFlag=0;
           break;
    default:
	       break;
   }

}

//测试处理函数
void   TestDispPrg(void)                       //测试处理函数
{
   uchar i;
   DispFlag=0;
   DispFlag|=0x0f;
   for(i=1;i<5;i++) DispBuf[i]=0x08;        
      
}
//消隐处理函数
void   ClearDispPrg(uchar *databuf)						//消隐处理函数
{
   ClearDispAttr();
   memcpy(&DispBuf[1],&databuf[1],4);
   DispFlag=0;
  switch(databuf[0])
   {  
    case   0:
	       DispFlag|=0x10;
           break;
	case   1:
	       DispFlag|=0x20;
           break;
    case   2:
	       DispFlag|=0x40;
           break;
	case   3:
	       DispFlag|=0x80;
           break;
	case   4:
	       DispFlag|=0x30;
           break;
	case   5:
	       DispFlag|=0x50;
           break;
	case   6:
	       DispFlag|=0x90;
           break;
	case   7:
	       DispFlag|=0x60;
           break;
	case   8:
	       DispFlag|=0xa0;
           break;
	case   9:
	       DispFlag|=0xc0;
           break;
	case   10:
	       DispFlag|=0x70;
           break;
	case   11:
	       DispFlag|=0xb0;
           break;
	case   12:
	       DispFlag|=0xe0;
           break;
	case   13:
	       DispFlag|=0xd0;
           break;
	case   14:
	       DispFlag|=0xf0;
           break;
    default:
	       break;
   }
}

//
void   FlightDispPrg(uchar *databuf)  					//闪烁处理函数	
{  
   ClearDispAttr();
   memcpy(&DispBuf[1],&databuf[1],4);
   DispFlag=0;
  switch(databuf[0])
   {  
    case   0:
	       DispFlag|=0x01;
           break;
	case   1:
	       DispFlag|=0x02;
           break;
    case   2:
	       DispFlag|=0x04;
           break;
	case   3:
	       DispFlag|=0x08;
           break;
	case   4:
	       DispFlag|=0x03;
           break;
	case   5:
	       DispFlag|=0x05;
           break;
	case   6:
	       DispFlag|=0x09;
           break;
	case   7:
	       DispFlag|=0x06;
           break;
	case   8:
	       DispFlag|=0x0a;
           break;
	case   9:
	       DispFlag|=0x0c;
           break;
	case   10:
	       DispFlag|=0x07;
           break;
	case   11:
	       DispFlag|=0x0b;
           break;
	case   12:
	       DispFlag|=0x0e;
           break;
	case   13:
	       DispFlag|=0x0d;
           break;
	case   14:
	       DispFlag|=0x0f;
           break;
    default:
	       break;
   }
}

//
void   LiftCrcDispPrg(uchar *databuf)           //左循环显示处理
{
   ClearDispAttr();
   memcpy(&DispBuf[1],&databuf[1],4);
   LiftCrcDispFlag=1;RightCrcDispFlag=0;
}
void   RightCrcDispPrg(uchar *databuf)          //右循环显示处理
{
  ClearDispAttr();
  memcpy(&DispBuf[1],&databuf[1],4);
  LiftCrcDispFlag=0;RightCrcDispFlag=1;
}

//
void   CanSend_Prg(void)         				//can发送数据
{
	if(AutoSendFlag)
	{
		if((DispBuf[1]==0x05)&&(DispBuf[2]==0x0d))	//
		{
			DispBuf[3]=	(unsigned char )TestSendData>>4;
			DispBuf[4]=	((unsigned char )TestSendData)&0x0f;
		}	
	}
}
void   CanErr_Prg(void) 	                    //发现错误后处理
{
	DispBuf[1]=0;
	DispBuf[2]=0;
   	Config_SJA();									//
	Error_disp(CAN_BUS_ERR); 
}
void   CanDtOver_Prg(void)                      //超载处理
{
//  BCAN_CMD_PRG(COS_CMD);
}
void   CanWui_Prg(void)                     	//唤醒中断处理
{
  
}

//
void   UartRcv_Prg(void)						//串口接收到数据处理
{
    BCAN_DATA_WRITE(RcvBuf);				    //将编辑的数据发送到can总线
    BCAN_CMD_PRG(TR_CMD);
}

//自动发送
void   AutoSendDataToCanBus(void)
{
	
	if(AutoSendFlag)
	{
		if((ReadSjaReg(REG_CONTROL)&0x01)==0)
		{
			AutoSendFrameID >>=5;
			AutoSendFrameID++;
			if(AutoSendFrameID>0x0fe00)
			{
				AutoSendFrameID=0;	
			}
			AutoSendFrameID <<=5;
			TestSendData++;
			WriteSjaReg(REG_TxBuffer1,AutoSendFrameID>>8);
			WriteSjaReg(REG_TxBuffer2,((unsigned char)AutoSendFrameID&0xf0)|0x06);
			WriteSjaReg(REG_TxBuffer3,0xc1);
			WriteSjaReg(REG_TxBuffer4,14);
			WriteSjaReg(REG_TxBuffer5,(unsigned char)(TestSendData>>12));
			WriteSjaReg(REG_TxBuffer6,(unsigned char)((TestSendData>>8)&0x0f));
			WriteSjaReg(REG_TxBuffer7,((unsigned char)TestSendData>>4));
			WriteSjaReg(REG_TxBuffer8,((unsigned char)TestSendData&0x0f));
			BCAN_CMD_PRG(TR_CMD);
		}
		else
		{	
			AutoSendFlag=0;
			Write_DispBuf(0,0x0E,0x12,0x0f,0x0d);//在复位模式
		}
	}
  
}

//提取波特率的对应值
unsigned	char	ValueToBandRate(void)
{
	unsigned	char	i;
	unsigned	int		BandRate;	
	BCAN_ENTER_RETMODEL();
	i = ReadSjaReg(REG_BTR0);
	BandRate=(unsigned	int)(i<<8);
	i = ReadSjaReg(REG_BTR1);
	BandRate +=i;
	BCAN_QUIT_RETMODEL();
	switch(BandRate)
	{
		case	0xbfff:						//;5KBPS的预设值
			i =0;
			break;
		case	0x672f:						//;10KBPS的预设值
			i =1;
			break;
    	case	0x532F:		               //;20KBPS的预设值
			i =2;
			break;
    	case	0x87FF:                     //;40KBPS的预设值
			i =3;
			break;
    	case	0x472F:                     //;50KBPS的预设值
			i =4;
			break;
    	case	0x83FF:                     //;80KBPS的预设值
			i =5;
			break;
    	case	0x432f:                     //;100KBPS的预设值
			i =6;
			break;
    	case	0x031c:                     //;125KBPS的预设值
			i =7;
			break;
    	case	0x81fa:                     //;200KBPS的预设值
			i =8;
			break;
    	case	0x011c:                     //;250KBPS的预设值
			i =9;
			break;
    	case	0x80fa:                     //;400KBPS的预设值
			i =10;
			break;
    	case	0x001c:                     //;500KBPS的预设值
			i =11;
			break;
    	case	0x80b6:                     //;666KBPS的预设值
			i =12;
			break;
    	case	0x0016:                    //;800KBPS的预设值
			i =13;
			break;
    	case	0x0014:                      //;1000KBPS的预设值
			i =14;
			break;
		default:
			i=0xff;
			break;
	}
	return	i;
}

⌨️ 快捷键说明

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