do.c

来自「2个F040之间的CAN通讯」· C语言 代码 · 共 180 行

C
180
字号
#include "c8051f040.h"
#include "can.h"

//-----------------------------------------------------------------------------
// GLOBAL CONSTANTS
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Functions
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void INT_Init (void);
void CAN_Init (void);
void CAN_Start(void);
void CAN_Transmit_Init (unsigned char MsgNum , unsigned char id);
void CAN_Receive_Init (unsigned char MsgNum , unsigned char id);
void Timer_Init (void);

void CAN_Receive_Interrupt (void);
void INT0_Interrupt (void);
void Timer0_Overflow_Interrupt (void);

//void Get_DO_Address (void);
void Control_DO (void);


void CAN_Transmit(unsigned char MsgNum,unsigned char *p_data );
void CAN_Receive (unsigned char MsgNum ,unsigned char *p);
void CAN_RemoteRqst_Init(unsigned char MsgNum , unsigned char id);  
void CAN_RemoteRqst(unsigned char MsgNum);
void CAN_Remote_Send_Init(unsigned char MsgNum,unsigned char id );
void CAN_Remote_Updata(unsigned char MsgNum,unsigned char *p_data );
void delay1ms(unsigned int time);

//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
sbit            OE = P4^0;             //74HC245 ENABLE
sbit            CANLED = P4^1;         //CANLED 0 MEANS ON
bit 		b_data1=0;	    //  DO_Error_Flag;
bit 		b_data2=0;	    //  DO_Control_Flag;
bit  		b_data3=0;	    //  DO_Message_Req_Flag;

unsigned char   DO_Control_Data0;
unsigned char   DO_Control_Data1;
unsigned char   DO_Control_Data_New0;
unsigned char   DO_Control_Data_New1;
unsigned char   DO_Control_Data_Ordered0;
unsigned char   DO_Control_Data_Ordered1;
unsigned char   temp1, temp2;
unsigned char   temppage,CAN_Status;

//xdata unsigned char ss1[8]={0x1a,0x2a,0x3a,0x4a,0x5a,0x6a,0x7a,0x8a};
//xdata unsigned char ss2[8]={0x1b,0x2b,0x3b,0x4b,0x5b,0x6b,0x7b,0x8b};
//xdata unsigned char ss3[8]={0x1c,0x2c,0x3c,0x4c,0x5c,0x6c,0x7c,0x8c};
xdata unsigned char rr1[8]={0,0,0,0,0,0,0,0}; 
xdata unsigned char rr2[8]={0,0,0,0,0,0,0,0}; 
xdata unsigned char rr3[8]={0,0,0,0,0,0,0,0}; 

void delay1ms(unsigned int time)
{
  unsigned int i;
  unsigned int j;
  for(i=0;i<time;i++)
  {
    for(j=0;j<300;j++);
  }
}


//-----------------------------------------------------------------------------
// Main Routine
//-----------------------------------------------------------------------------
void main ()
{  

 //unsigned char state;  //CANSTAT

  EA = 0;

  WDTCN = 0xDE;              //Disable Watchdog Timer
  WDTCN = 0xAD;

  SYSCLK_Init ();
  PORT_Init ();
  INT_Init ();

  //Get_DO_Address ();

  CAN_Init ();
  CAN_Transmit_Init (1,1);
  CAN_Receive_Init (2,1);
  CAN_Start();
  
  Timer_Init ();

  OE = 0;
  EA = 1;
  TR0 = 1;


  //CAN_Transmit(1,ss);
CAN_RemoteRqst_Init(1,1);
CAN_RemoteRqst_Init(2,2);
CAN_RemoteRqst_Init(3,3);

//P5 =0xaa;
//P5 =0x55;

CAN_RemoteRqst(1);
     while (1) 
     {
	   // if(b_data1){P5=rr1[0];b_data1=0;}
	//	if(b_data2){P5=rr2[0];b_data2=0;}
	//	if(b_data3){P5=rr3[0];b_data3=0;}

     }
  
}

//-----------------------------------------------------------------------------
// CAN_Receive_Interrupt
//-----------------------------------------------------------------------------
void CAN_Receive_Interrupt (void) interrupt 19 
{
   unsigned char temp;
   temppage = SFRPAGE;
   SFRPAGE = CAN0_PAGE;

   CAN_Status = CAN0STA;
   if((CAN_Status & 0x10)!=0)
   {
   	  CAN0STA = CAN_Status & 0xef;
	  CAN0ADR = INTPEND1;
	  temp = CAN0DATL;     //
      
	  if((temp & 0x01)!=0)
	  {
         CAN_Receive(1,rr1);
		 SFRPAGE = 0x0f;
		 P5= rr1[7];
		 P6= rr1[6];
		 SFRPAGE = CAN0STA;
		 delay1ms(10000);
         CAN_RemoteRqst(2);
      }

      if((temp & 0x02)!=0)
	  {
         CAN_Receive(2,rr2);
		 SFRPAGE = 0x0f;
		 P5= rr2[7];
		 P6= rr2[6];
		 SFRPAGE = CAN0STA;
		 delay1ms(10000);
         CAN_RemoteRqst(3);
      }

      if((temp & 0x04)!=0)
	  {
         CAN_Receive(3,rr3);
		 SFRPAGE = 0x0f;
		 P5= rr3[7];
		 P6= rr3[6];
		 SFRPAGE = CAN0STA;
		 delay1ms(10000);
         CAN_RemoteRqst(1);
      }

  }
 
}

void Timer0_Overflow_Interrupt (void) interrupt 1 {
  
}


⌨️ 快捷键说明

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