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

📄 can1.c

📁 51系列单片机CAN多点通信C语言源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//------------------------------------------------------------------------------
// CAN1.c
//------------------------------------------------------------------------------
//
//
// DEVICE: C8051F040

////////////////////////////////////////////////////////////////////////////////
// Includes
////////////////////////////////////////////////////////////////////////////////

#include <c8051f040.h>                          // SFR declarations

// CAN Protocol Register Index for CAN0ADR, from TABLE 18.1 of the C8051F040
// datasheet
////////////////////////////////////////////////////////////////////////////////
#define CANCTRL            0x00                 //Control Register
#define CANSTAT            0x01                 //Status register
#define ERRCNT             0x02                 //Error Counter Register
#define BITREG             0x03                 //Bit Timing Register
#define INTREG             0x04                 //Interrupt Low Byte Register
#define CANTSTR            0x05                 //Test register
#define BRPEXT             0x06                 //BRP Extension         Register
////////////////////////////////////////////////////////////////////////////////
//IF1 Interface Registers
////////////////////////////////////////////////////////////////////////////////
#define IF1CMDRQST         0x08                 //IF1 Command Rest      Register
#define IF1CMDMSK          0x09                 //IF1 Command Mask      Register
#define IF1MSK1            0x0A                 //IF1 Mask1             Register
#define IF1MSK2            0x0B                 //IF1 Mask2             Register
#define IF1ARB1            0x0C                 //IF1 Arbitration 1     Register
#define IF1ARB2            0x0D                 //IF1 Arbitration 2     Register
#define IF1MSGC            0x0E                 //IF1 Message Control   Register
#define IF1DATA1           0x0F                 //IF1 Data A1           Register
#define IF1DATA2           0x10                 //IF1 Data A2           Register
#define IF1DATB1           0x11                 //IF1 Data B1           Register
#define IF1DATB2           0x12                 //IF1 Data B2           Register
////////////////////////////////////////////////////////////////////////////////
//IF2 Interface Registers
////////////////////////////////////////////////////////////////////////////////
#define IF2CMDRQST         0x20                 //IF2 Command Rest      Register
#define IF2CMDMSK          0x21                 //IF2 Command Mask      Register
#define IF2MSK1            0x22                 //IF2 Mask1             Register
#define IF2MSK2            0x23                 //IF2 Mask2             Register
#define IF2ARB1            0x24                 //IF2 Arbitration 1     Register
#define IF2ARB2            0x25                 //IF2 Arbitration 2     Register
#define IF2MSGC            0x26                 //IF2 Message Control   Register
#define IF2DATA1           0x27                 //IF2 Data A1           Register
#define IF2DATA2           0x28                 //IF2 Data A2           Register
#define IF2DATB1           0x29                 //IF2 Data B1           Register
#define IF2DATB2           0x2A                 //IF2 Data B2           Register
////////////////////////////////////////////////////////////////////////////////
//Message Handler Registers
////////////////////////////////////////////////////////////////////////////////
#define TRANSREQ1          0x40                 //Transmission Rest1 Register
#define TRANSREQ2          0x41                 //Transmission Rest2 Register

#define NEWDAT1            0x48                 //New Data 1            Register
#define NEWDAT2            0x49                 //New Data 2            Register

#define INTPEND1           0x50                 //Interrupt Pending 1   Register
#define INTPEND2           0x51                 //Interrupt Pending 2   Register

#define MSGVAL1            0x58                 //Message Valid 1       Register
#define MSGVAL2            0x59                 //Message Valid 2       Register

////////////////////////////////////////////////////////////////////////////////
//Global Variables
////////////////////////////////////////////////////////////////////////////////
char MsgNum;
char status;
int i;
int MOTwoIndex = 0;
int MOOneIndex = 0;
int StatusCopy;
int RXbuffer [4];
int TXbuffer [8];
int MsgIntNum;
int Temperature;
sbit BUTTON = P2^0;
sbit BUTTON1= P2^1;
sbit BUTTON2= P2^2;
sbit BUTTON3= P2^3;
sbit LED = P1^6;
sfr16 CAN0DAT = 0xD8;



////////////////////////////////////////////////////////////////////////////////
// Function PROTOTYPES
////////////////////////////////////////////////////////////////////////////////

// Initialize Message Object
void clear_msg_objects (void); //将所有消息清0

void init_msg_object_TX (char MsgNum);  //初始化消息对象发送
void init_msg_object_RX (char MsgNum);  //初始化消息对象接收

void start_CAN (void);
void transmit_turn_LED_ON (char MsgNum);
void transmit_turn_LED_OFF (char MsgNum);
void receive_data (char MsgNum);

void external_osc (void);     //系统时钟设置
void config_IO (void);        //IO口设置              
void flash_LED (void);
void test_reg_write (char test);

void stop_CAN (void);
void delay(int tim);

void delay(int tim)
{ int i,j;
  for(i=0;i<tim;i++)
  {for(j=0;j<i;j++);}
}

////////////////////////////////////////////////////////////////////////////////
// MAIN Routine
////////////////////////////////////////////////////////////////////////////////
void main (void) {
  char vid;
  // disable watchdog timer
  WDTCN = 0xde;
  WDTCN = 0xad;

  //configure Port I/O
  config_IO();     //IO口设置

  // switch to external oscillator
  external_osc();  //系统时钟设置

  // Clear CAN RAM
  clear_msg_objects(); //将所有消息清0

  // Initialize message object to transmit data
  init_msg_object_TX (0x02); //初始化消息对象发送消息号为0x02

  // Initialize message object to receive data
  init_msg_object_RX (0x01); //初始化消息对象接收消息号为0x01

  // Enable CAN interrupts in CIP-51
  EIE2 = 0x20; // bit5=1 CAN中断开启

  //Function call to start CAN
  start_CAN();

  //Global enable 8051 interrupts
  EA = 1; // IE的bit7位

  //Loop and wait for interrupts
  while (1)
{
      if(BUTTON==0)   // sbit BUTTON = P2^0;
	  {
	    delay(500);
	    if(BUTTON==0)
	      {
	            if(vid==0)
				 {
					transmit_turn_LED_ON(0x02);vid=1;
				 }
	            else
				 {
					transmit_turn_LED_OFF(0x02);vid=0;
				 }
		  }
       }

      if(BUTTON1==0)
	   {
	       delay(500);
		   if(BUTTON1==0)
		     {
			   if(vid==0)
			     {
				   transmit_turn_LED_ON(0x02);vid=1;
			     }
	           else
			     {
				   transmit_turn_LED_OFF(0x02);vid=0;
				  }
			 }
        }

       if(BUTTON2==0)
	    {
		   delay(500);
		   if(BUTTON2==0)
		    {
		    if(vid==0)
			  {
			    transmit_turn_LED_ON(0x02);vid=1;
			  }
	        else
			   {
			     transmit_turn_LED_OFF(0x02);vid=0;
			   }
		    }
         }

       if(BUTTON3==0)
	   {
		  delay(500);
		  if(BUTTON3==0)
		  {
		    if(vid==0)
			  {
			    transmit_turn_LED_ON(0x02);vid=1;
			  }
	        else
			  {
			    transmit_turn_LED_OFF(0x02);vid=0;
			  }
		  }
        }
   }//对应while
}//对应main

////////////////////////////////////////////////////////////////////////////////
// Set up C8051F040
////////////////////////////////////////////////////////////////////////////////

// Switch to external oscillator
void external_osc (void)
{
  int n;                        // local variable used in delay FOR loop.
  SFRPAGE = CONFIG_PAGE;        // switch to config page to config oscillator

⌨️ 快捷键说明

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