📄 can_self.lst
字号:
176 ///////////////////////////////////////////////
177 //函数:rxd_deal
178 //说明:接收处理程序;检测接收标志状态位,
179 // 如果置位则进行接收处理
C51 COMPILER V6.12 CAN_SELF 06/19/2008 15:31:11 PAGE 4
180 //入口:无
181 //返回:无
182 ///////////////////////////////////////////////
183 void rxd_deal(void)
184 {
185 1 if( RXD_flag ) //RXD_flag=0说明无数据可以接收,RXD_flag=1说明有数据可以接收
186 1 {
187 2 EA = 0; //关闭CPU中断
188 2 RXD_flag = 0; //RXD_flag清零,以便下次查询
189 2 Rxd_data = RX_buffer[5]; //CAN总线要接收的数据,也是要在数码管3-4位置显示的数据
190 2 EA = 1; //重新开启CPU中断
191 2 }
192 1 }
193
194
195 ///////////////////////////////////////////////
196 //函数:txd_deal
197 //说明:发送处理程序;检测发送标志状态位,
198 // 如果置位则进行发送数据处理
199 //入口:无
200 //返回:无
201 ///////////////////////////////////////////////
202 void txd_deal(void)
203 {
204 1 if( TXD_flag ) //若TXD_flag=1,要求进行数据的发送处理
205 1 {
206 2 _nop_();
207 2 TXD_flag = 0; //RXD_flag清零,以便下次查询
208 2 can_txd(); //发送数据帧
209 2 _nop_();
210 2 _nop_();
211 2 } //发送数据帧后,SJA1000将产生接收中断
212 1 }
213
214
215
216 ///////////////////////////////////////////////
217 //函数:can_txd
218 //说明:发送扩展数据帧
219 //入口:无
220 //返回:无
221 ///////////////////////////////////////////////
222 void can_txd(void)
223 {
224 1 uchar state;
225 1 uchar TX_buffer[ N_can ] ; //N_can=13,TX_buffer数组为待传送的数据帧
226 1
227 1 //初始化标识码头信息
228 1 TX_buffer[0] = 0xc8; //.7=0--扩展帧;.6=1--远程传送请求;
229 1 TX_buffer[1] = 0x11; //本帧信息的ID
230 1 TX_buffer[2] = 0x22;
231 1 TX_buffer[3] = 0x33;
232 1 TX_buffer[4] = 0x44;
233 1
234 1 //初始化发送数据单元
235 1 TX_buffer[5] = Txd_data; //发送的第1个字节数据,也是数码管要显示的数据(计数结果)
236 1 TX_buffer[6] = 0x22; //2
237 1 TX_buffer[7] = 0x33; //3
238 1 TX_buffer[8] = 0x44; //4
239 1 TX_buffer[9] = 0x55; //5
240 1 TX_buffer[10] = 0x66; //6
241 1 TX_buffer[11] = 0x77; //7
C51 COMPILER V6.12 CAN_SELF 06/19/2008 15:31:11 PAGE 5
242 1 TX_buffer[12] = 0x88; //8
243 1
244 1 //初始化数据信息
245 1 EA = 0; //关中断
246 1
247 1 //查询SJA1000是否处于接收状态,当SJA1000不处于接收状态时才可继续执行
248 1 do
249 1 {
250 2 state = SR; //SR为SJA1000的状态寄存器
251 2 LED_RED = 0; //点亮LED1
252 2 }
253 1 while( state & 0x10 ); //SR.4=1 正在接收,等待
254 1
255 1 //查询SJA1000是否处于发送完毕状态
256 1 do
257 1 {
258 2 state = SR;
259 2 LED_RED = 0; //点亮LED1
260 2 }
261 1 while(!(state & 0x08)); //SR.3=0,发送请求未处理完,等待直到SR.3=1
262 1
263 1 //查询发送缓冲器状态
264 1 do
265 1 {
266 2 state = SR;
267 2 LED_RED = 0; //点亮LED1
268 2 }
269 1 while(!(state & 0x04)); //SR.2=0,发送缓冲器被锁。等待直到SR.2=1
270 1
271 1 LED_RED = !LED_RED; //熄灭LED1
272 1 LED_GRE = !LED_GRE; //点亮LED2
273 1
274 1 //将待发送的一帧数据信息存入SJA1000的相应寄存器中
275 1 TBSR0 = TX_buffer[0];
276 1 TBSR1 = TX_buffer[1];
277 1 TBSR2 = TX_buffer[2];
278 1 TBSR3 = TX_buffer[3];
279 1 TBSR4 = TX_buffer[4];
280 1 TBSR5 = TX_buffer[5];
281 1 TBSR6 = TX_buffer[6];
282 1 TBSR7 = TX_buffer[7];
283 1 TBSR8 = TX_buffer[8];
284 1 TBSR9 = TX_buffer[9];
285 1 TBSR10 = TX_buffer[10];
286 1 TBSR11 = TX_buffer[11];
287 1 TBSR12 = TX_buffer[12];
288 1
289 1 CMR = 0x01; //置位发送请求
290 1 EA = 1; //重新开启中断
291 1 }
292
293 ///////////////////////////////////////////////
294 //函数:delay
295 //说明:延时子函数
296 //入口:uchar time:延时时间time us
297 //返回:无
298 ///////////////////////////////////////////////
299 void delay(uchar time)
300 {
301 1 while(time--);
302 1 }
303
C51 COMPILER V6.12 CAN_SELF 06/19/2008 15:31:11 PAGE 6
304 ///////////////////////////////////////////////
305 //函数:led_show
306 //说明:数码管显示函数
307 // 注意控制P2口的高4位时,不要影响P2口的低4位值
308 //入口:uchar wela: wela=1--高两位显示发送数据
309 // wela=0--低两位显示接收数据
310 // uchar number: 要显示的数据
311 //返回:无
312 ///////////////////////////////////////////////
313 void led_show(uchar wela,uchar number)
314 {
315 1 uchar digit;
316 1 uchar temp;
317 1
318 1 if(wela) //高位显示,即数码管1-2
319 1 {
320 2 temp = 0x7b; //temp=01111011B
321 2 }
322 1 else //低位显示,即数码管3-4
323 1 {
324 2 temp = 0xde; //temp=11011110B
325 2 }
326 1
327 1 //数码管个位显示
328 1 digit = number%10;
329 1 P0 = led[digit];
330 1 P2 = (temp | 0x0f) & P2; //开个位
331 1 delay(5);
332 1 P2 = 0xff;
333 1 P0 = 0xff; //关闭个位
334 1 //数码管十位显示
335 1 number /= 10;
336 1 digit = number%10;
337 1 P2 = ((temp << 4) | 0x0f) & P2; //开十位
338 1 P0 = led[digit];
339 1 delay(5);
340 1 P2 = 0xff; //关闭十位
341 1 P0 = 0xff;
342 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 526 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 28 21
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -