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

📄 main.c

📁 飞思卡尔08单片机程序
💻 C
字号:
/*******************************************************************
  \poject     	智能车底层驱动器(路由部分)
  \author   	young
  \author     	北京理工大学
  \version   	1.1
  \date     	2009/5/3

  * History:
  
  2009/4/28      Start of aplication coding
 
*********************************************************************/
/* Include Files */
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GZ16.h> /* include peripheral declarations */
#include "Sci.h"
#include "Type.h"
#include "MSCAN08.h"
#include "MCU.h"
#pragma MESSAGE DISABLE C2705          /*Disable warning C2705 "possible loss of data"*/ 

/* Prototypes */ 
void MCUInit(void);
void SendMsg(void);
UINT8 CalCheck(UINT8*,UINT8,UINT8);
UINT8 Check(UINT8*,UINT8,UINT8);
void Device_decode(void);

/* Global Variables */
UINT8 CANTxData[3];
UINT8 SCITxData[9];

UINT16 CmdWheelAngle;
UINT8 CmdCarSpeed,CmdCarDir,CmdBreakRapid,StateSensor,CheckByHost;

UINT16 StateLeftAngle,StateRightAngle;
UINT8 StateCarSpeed,StateCarDir,StateBreakRapid,CheckByHub;



void main(void) {
	
  MCUInit();/* System Initalization */
  EnableInterrupts; /* enable interrupts */
  
  for(;;) {/* Main Loop */
   
    __RESET_WATCHDOG(); /* kicks the dog */
   if (SciRxFlag==1){
   		
   		Host_decode();//对工控机发送过来的数据进行解码
   		
   		SendMsg();//对电机控制ECU发送指令
   		  		
   		SciRxFlag=0;
      }
      if (CanRxFlag==1){
   		 Device_decode();//对传感器部分ECU发送过来的数据进行解码
   		 SciTxEnable;//100ms上发一次
   		
   		CanRxFlag=0;
      }
    
	// Device_decode();//对传感器部分ECU发送过来的数据进行解码
	
  } /* loop forever */
}


void MCUInit(void){
	DisableInterrupts;
	PCTL = 0x00;         //禁止锁相环
	CONFIG1=0x09; //初始化配置
	CONFIG2=0x08;	//MSCAN ENABLE ,SCI source =8M
	MSCAN08Init();
	SCIInit();
	TIM1Init();
	IOInit();


}

/*****************************************************************************
 * SendMsg: 对电机控制ECU发送指令
 * Input: 	None
 * Output: None
 * Parameters: None
 *
 ****************************************************************************/
void SendMsg(void){//87 68 32 09 54

	CANTxData[0]=CmdBreakRapid;
	//CANTxData[1]=Check(CANTxData,0,1);
	CAN_SendFrame(ID_Cmd_BreakRapid,DATA_FRAME,1,CANTxData);
	delay(10);

	CANTxData[0]=CmdWheelAngle>>8;
	CANTxData[1]=CmdWheelAngle;
	CANTxData[2]=StateSensor;
	CANTxData[3]=CalCheck(CANTxData,0,2);
	CAN_SendFrame(ID_Cmd_WheelAngle,DATA_FRAME,3,CANTxData);
	delay(10);


	CANTxData[0]=CmdCarSpeed;
	CAN_SendFrame(ID_Cmd_CarSpeed,DATA_FRAME,1,CANTxData);
	delay(10);

}

/*****************************************************************************
 * Device_decode: 对传感器部分ECU发送过来的数据进行解码
 * Input: 	None
 * Output: None
 * Parameters: None
 *
 ****************************************************************************/
void Device_decode(void){
	
	if (MessageID_Real==ID_State_CarSpeed){
	StateCarSpeed=CAN_RX_Data[0];
	}

	if (MessageID_Real==ID_State_WheelAngle){
	
	StateLeftAngle=(CAN_RX_Data[0]<<8)+CAN_RX_Data[1];
	StateRightAngle=(CAN_RX_Data[2]<<8)+CAN_RX_Data[3];
	}
	if (MessageID_Real==ID_State_CarDir){
	StateCarDir=CAN_RX_Data[0];
	}
	
	SCITxData[0]=0xFF;
	SCITxData[1]=0xFF;
	SCITxData[2]=StateLeftAngle>>8;
	SCITxData[3]=StateLeftAngle;
	SCITxData[4]=StateRightAngle>>8;
	SCITxData[5]=StateRightAngle;
	SCITxData[6]=StateCarSpeed;
	SCITxData[7]=StateCarDir+(StateBreakRapid<1);
	SCITxData[8]=CalCheck(SCITxData,0,7);
	
	
}

/*****************************************************************************
 * Host_decode: 对工控机发送过来的数据进行解码
 * Input: 	None
 * Output: None
 * Parameters: None
 *
 ****************************************************************************/
void Host_decode(void){

	
	if(Check(SciRxData,0,4)==RIGHT){
		CmdWheelAngle=((SciRxData[0] & 0x07)<<7) | (SciRxData[1] & 0x7F);
		CmdCarSpeed=SciRxData[2] & 0x7F;
		CmdCarDir=SciRxData[3] & 0x01;
		CmdBreakRapid=(SciRxData[3] & 0x02)>>1;
		StateSensor=(SciRxData[3] & 0x08)>>3;

	}

}
/*****************************************************************************
 * CalCheck: 计算异或校验字节
 * Input: 	data:数组指针	start:校验起始位	end:校验终止位
 * Output: 返回得到的校验字节
 * Parameters: None
 *
 ****************************************************************************/
UINT8 CalCheck(UINT8* data,UINT8 start,UINT8 end){
	UINT8 i=0,checkdata;
	checkdata=*(data+start);
	for(i=start+1;i<end+1;i++){
		checkdata=checkdata^*(data+start+i);

	}
	return checkdata;

}
/*****************************************************************************
 * Check: 验证校验字节
 * Input: 	data:数组指针	start:校验起始位	end:校验终止位
 * Output:返回校验结果
 * Parameters: None
 *
 ****************************************************************************/
UINT8 Check(UINT8* data,UINT8 start,UINT8 end){
	UINT8 i=0,checkdata;
	checkdata=*(data+start);
	for(i=start+1;i<end+1;i++){
		checkdata=checkdata^*(data+start+i);

	}
	
	if (checkdata==0x80){//忽略最高位
	
	return RIGHT;
	
	}
	else return WRONG;
	

}

⌨️ 快捷键说明

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