📄 can1.lst
字号:
C51 COMPILER V7.50 CAN1 12/06/2006 11:41:26 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE CAN1
OBJECT MODULE PLACED IN CAN1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe CAN1.c DB OE
line level source
1 //------------------------------------------------------------------------------
2 // CAN1.c
3 //------------------------------------------------------------------------------
4 //
5 //
6 // DEVICE: C8051F040
7 //
8 // AUTHOR: LS
9 //
10 // TOOLS: Keil C-compiler and Silicon Labs IDE
11 //
12 //
13 // CAN1.c and CAN2.c are a simple example of configuring a CAN network to
14 // transmit and receive data on a CAN network, and how to move information to
15 // and from CAN RAM message objects. Each C8051F040-TB CAN node is configured
16 // to send a message when it's P3.7 button is depressed/released, with a 0x11
17 // to indicate the button is pushed, and 0x00 when released. Each node also has
18 // a message object configured to receive messages. The C8051 tests the
19 // received data and will turn on/off the target board's LED. When one target
20 // is loaded with CAN2.c and the other is loaded with CAN1.c, one target
21 // board's push-button will control the other target board's LED, establishing
22 // a simple control link via the CAN bus and can be observed directly on the
23 // target boards.
24 ////////////////////////////////////////////////////////////////////////////////
25
26 ////////////////////////////////////////////////////////////////////////////////
27 // Includes
28 ////////////////////////////////////////////////////////////////////////////////
29
30 #include <c8051f040.h> // SFR declarations
31
32 // CAN Protocol Register Index for CAN0ADR, from TABLE 18.1 of the C8051F040
33 // datasheet
34 ////////////////////////////////////////////////////////////////////////////////
35 #define CANCTRL 0x00 //Control Register
36 #define CANSTAT 0x01 //Status register
37 #define ERRCNT 0x02 //Error Counter Register
38 #define BITREG 0x03 //Bit Timing Register
39 #define INTREG 0x04 //Interrupt Low Byte Register
40 #define CANTSTR 0x05 //Test register
41 #define BRPEXT 0x06 //BRP Extension Register
42 ////////////////////////////////////////////////////////////////////////////////
43 //IF1 Interface Registers
44 ////////////////////////////////////////////////////////////////////////////////
45 #define IF1CMDRQST 0x08 //IF1 Command Rest Register
46 #define IF1CMDMSK 0x09 //IF1 Command Mask Register
47 #define IF1MSK1 0x0A //IF1 Mask1 Register
48 #define IF1MSK2 0x0B //IF1 Mask2 Register
49 #define IF1ARB1 0x0C //IF1 Arbitration 1 Register
50 #define IF1ARB2 0x0D //IF1 Arbitration 2 Register
51 #define IF1MSGC 0x0E //IF1 Message Control Register
52 #define IF1DATA1 0x0F //IF1 Data A1 Register
53 #define IF1DATA2 0x10 //IF1 Data A2 Register
54 #define IF1DATB1 0x11 //IF1 Data B1 Register
55 #define IF1DATB2 0x12 //IF1 Data B2 Register
C51 COMPILER V7.50 CAN1 12/06/2006 11:41:26 PAGE 2
56 ////////////////////////////////////////////////////////////////////////////////
57 //IF2 Interface Registers
58 ////////////////////////////////////////////////////////////////////////////////
59 #define IF2CMDRQST 0x20 //IF2 Command Rest Register
60 #define IF2CMDMSK 0x21 //IF2 Command Mask Register
61 #define IF2MSK1 0x22 //IF2 Mask1 Register
62 #define IF2MSK2 0x23 //IF2 Mask2 Register
63 #define IF2ARB1 0x24 //IF2 Arbitration 1 Register
64 #define IF2ARB2 0x25 //IF2 Arbitration 2 Register
65 #define IF2MSGC 0x26 //IF2 Message Control Register
66 #define IF2DATA1 0x27 //IF2 Data A1 Register
67 #define IF2DATA2 0x28 //IF2 Data A2 Register
68 #define IF2DATB1 0x29 //IF2 Data B1 Register
69 #define IF2DATB2 0x2A //IF2 Data B2 Register
70 ////////////////////////////////////////////////////////////////////////////////
71 //Message Handler Registers
72 ////////////////////////////////////////////////////////////////////////////////
73 #define TRANSREQ1 0x40 //Transmission Rest1 Register
74 #define TRANSREQ2 0x41 //Transmission Rest2 Register
75
76 #define NEWDAT1 0x48 //New Data 1 Register
77 #define NEWDAT2 0x49 //New Data 2 Register
78
79 #define INTPEND1 0x50 //Interrupt Pending 1 Register
80 #define INTPEND2 0x51 //Interrupt Pending 2 Register
81
82 #define MSGVAL1 0x58 //Message Valid 1 Register
83 #define MSGVAL2 0x59 //Message Valid 2 Register
84
85 ////////////////////////////////////////////////////////////////////////////////
86 //Global Variables
87 ////////////////////////////////////////////////////////////////////////////////
88 char MsgNum;
89 char status;
90 int i;
91 int MOTwoIndex = 0;
92 int MOOneIndex = 0;
93 int StatusCopy;
94 int RXbuffer [4];
95 int TXbuffer [8];
96 int MsgIntNum;
97 int Temperature;
98 sbit BUTTON = P2^0;
99 sbit BUTTON1= P2^1;
100 sbit BUTTON2= P2^2;
101 sbit BUTTON3= P2^3;
102 sbit LED = P1^6;
103 sfr16 CAN0DAT = 0xD8;
104
105
106
107 ////////////////////////////////////////////////////////////////////////////////
108 // Function PROTOTYPES
109 ////////////////////////////////////////////////////////////////////////////////
110
111 // Initialize Message Object
112 void clear_msg_objects (void);
113 void init_msg_object_TX (char MsgNum);
114 void init_msg_object_RX (char MsgNum);
115 void start_CAN (void);
116 void transmit_turn_LED_ON (char MsgNum);
117 void transmit_turn_LED_OFF (char MsgNum);
C51 COMPILER V7.50 CAN1 12/06/2006 11:41:26 PAGE 3
118 void receive_data (char MsgNum);
119 void external_osc (void);
120 void config_IO (void);
121 void flash_LED (void);
122 void test_reg_write (char test);
123 void stop_CAN (void);
124 void delay(int tim);
125
126 void delay(int tim)
127 { int i,j;
128 1 for(i=0;i<tim;i++)
129 1 {for(j=0;j<i;j++);}
130 1 }
131
132 ////////////////////////////////////////////////////////////////////////////////
133 // MAIN Routine
134 ////////////////////////////////////////////////////////////////////////////////
135 void main (void) {
136 1 char vid;
137 1 // disable watchdog timer
138 1 WDTCN = 0xde;
139 1 WDTCN = 0xad;
140 1
141 1 //configure Port I/O
142 1 config_IO();
143 1
144 1 // switch to external oscillator
145 1 external_osc();
146 1
147 1
148 1 ////////////////////////////////////////////////////////////////////////////////
149 1 // Configure CAN communications
150 1 //
151 1 // IF1 used for procedures calles by main program
152 1 // IF2 used for interrupt service procedure receive_data
153 1 //
154 1 // Message Object assignments:
155 1 // 0x02: Used to transmit commands to toggle its LED, arbitration number 1
156 1 //
157 1 ////////////////////////////////////////////////////////////////////////////////
158 1
159 1 // Clear CAN RAM
160 1 clear_msg_objects();
161 1
162 1 // Initialize message object to transmit data
163 1 init_msg_object_TX (0x02);
164 1
165 1 // Initialize message object to receive data
166 1 init_msg_object_RX (0x01);
167 1
168 1 // Enable CAN interrupts in CIP-51
169 1 EIE2 = 0x20;
170 1
171 1 //Function call to start CAN
172 1 start_CAN();
173 1
174 1 //Global enable 8051 interrupts
175 1 EA = 1;
176 1
177 1 //Loop and wait for interrupts
178 1 while (1)
179 1 {
C51 COMPILER V7.50 CAN1 12/06/2006 11:41:26 PAGE 4
180 2 if(BUTTON==0){delay(500);if(BUTTON==0){
181 4 if(vid==0){transmit_turn_LED_ON(0x02);vid=1;}
182 4 else{transmit_turn_LED_OFF(0x02);vid=0;}
183 4 }
184 3 }
185 2 if(BUTTON1==0){delay(500);if(BUTTON1==0){if(vid==0){transmit_turn_LED_ON(0x02);vid=1;}
186 4 else{transmit_turn_LED_OFF(0x02);vid=0;}
187 4 }
188 3 }
189 2 if(BUTTON2==0){delay(500);if(BUTTON2==0){if(vid==0){transmit_turn_LED_ON(0x02);vid=1;}
190 4 else{transmit_turn_LED_OFF(0x02);vid=0;}
191 4 }
192 3 }
193 2 if(BUTTON3==0){delay(500);if(BUTTON3==0){if(vid==0){transmit_turn_LED_ON(0x02);vid=1;}
194 4 else{transmit_turn_LED_OFF(0x02);vid=0;}
195 4 }
196 3 }
197 2 }
198 1 }
199
200
201 ////////////////////////////////////////////////////////////////////////////////
202 // Set up C8051F040
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -