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 + -
显示快捷键?