📄 can1.c
字号:
//------------------------------------------------------------------------------
// 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 + -