📄 pic18f458_can_rs232_picc8.35.lst
字号:
327: NOP();
328: }
329: //************************************************************************
330:
331:
332: //////////////////////////////////////////////////////////////////////////
333: // 主程序 //
334: //////////////////////////////////////////////////////////////////////////
335: void main(void)
336: {
337: unsigned char sendnum;
338: NOP();
339: Initial(); //IO口初始化
340: InitUSART(); //串口初始化
341: InitTMR0(); //定时器0初始化
342: InitCAN(); //内部CAN寄存器设置初始化
343: IPEN = 1; //使能中断优先级
344: INTCON |= 0xC0; //开放所有高低优先级中断
345: while(1)
346: {
347: if(RD0 == 0) //如有S1按键按下,发送标准帧
348: {
349: while(RD0 == 0); //等待S1按键释放
350: TXB0CON = 0x03; //设置为发送最高优先级
351: TXB0SIDH = 0xFF; //SID10--SID3
352: TXB0SIDL = 0xE0; //SID2--SID0
353: TXB0DLC = 0x08; //发送数据长度为8字节
354: TXB0D0=0x00; //发送的数据
355: TXB0D1=0x11;
356: TXB0D2=0x22;
357: TXB0D3=0x33;
358: TXB0D4=0x44;
359: TXB0D5=0x55;
360: TXB0D6=0x66;
361: TXB0D7=0x77;
362: TXB0REQ = 1; //请求发送
363: while(TXB0REQ == 1); //等待发送成功
364: RD1 = 1; //发送成功,则点亮RD1
365: DelayNmSec(100); //延时0.1s
366: RD1 = 0; //熄灭RD1
367: }
368:
369: if(RC0 == 0) //如有S2按键按下,发送扩展帧
370: {
371: while(RC0 == 0); //等待S2按键释放
372: TXB0CON = 0x03; //设置为发送最高优先级
373: TXB0SIDH = 0xFF; //EID28--21
374: TXB0SIDL = 0xEB; //EID20--EID18,扩展帧使能,EID17--EID16
375: TXB0EIDH = 0xFF; //EID15--EID8
376: TXB0EIDL = 0xFF; //EID7--EID0
377: TXB0DLC = 0x08; //发送数据长度为8字节
378: TXB0D0=0x00; //发送的数据
379: TXB0D1=0x11;
380: TXB0D2=0x22;
381: TXB0D3=0x33;
382: TXB0D4=0x44;
383: TXB0D5=0x55;
384: TXB0D6=0x66;
385: TXB0D7=0x77;
386: TXB0REQ = 1; //请求发送
387: while(TXB0REQ == 1); //等待发送成功
388: RC1 = 1; //发送成功,则点亮RC1
389: DelayNmSec(100); //延时0.1s
390: RC1 = 0; //熄灭RC1
391: }
392:
393: if(USARTreceive_flag == 1) //接收到符合要求的串口数据流
394: {
395: USARTreceive_flag = 0; //串口转发再允许
396: TXB0CON = 0x03; //设置为发送最高优先级
397: pointer = &receive232[1];
398: TXB0SIDH = *pointer++; //发送的标识符
399: TXB0SIDL = *pointer++;
400: TXB0EIDH = *pointer++;
401: TXB0EIDL = *pointer++;
402: TXB0DLC = *pointer++; //发送的数据长度
403: TXB0D0 = *pointer++; //发送的数据
404: TXB0D1 = *pointer++;
405: TXB0D2 = *pointer++;
406: TXB0D3 = *pointer++;
407: TXB0D4 = *pointer++;
408: TXB0D5 = *pointer++;
409: TXB0D6 = *pointer++;
410: TXB0D7 = *pointer++;
411: TXB0REQ = 1; //请求发送
412: while(TXB0REQ == 1); //等待发送成功
413: if(TXB0EXIDE == 0)//如果是标准帧
414: {
415: RD1 = 1; //发送成功,则点亮RD1
416: DelayNmSec(100); //延时0.1s
417: RD1 = 0; //熄灭RD1
418: }
419: if(TXB0EXIDE == 1)//如果是扩展帧
420: {
421: RC1 = 1; //发送成功,则点亮RC1
422: DelayNmSec(100); //延时0.1s
423: RC1 = 0; //熄灭RC1
424: }
425: }
426:
427: if(CANreceive_flag == 1) //接收到来自CAN总线的数据
428: {
429: CANreceive_flag = 0; //接收标志位清零
430: send232[0] = RXB0SIDH; //接收到的标准标识符高字节
431: send232[1] = RXB0SIDL; //接收到的标准标识符低字节
432: send232[2] = RXB0EIDH; //接收到的扩展标识符高字节(看RXB0EXID而定)
433: send232[3] = RXB0EIDL; //接收到的扩展标识符低字节(看RXB0EXID而定)
434: send232[4] = RXB0DLC; //接收到的数据长度
435: send232[5] = RXB0D0; //接收到的数据
436: send232[6] = RXB0D1;
437: send232[7] = RXB0D2;
438: send232[8] = RXB0D3;
439: send232[9] = RXB0D4;
440: send232[10] = RXB0D5;
441: send232[11] = RXB0D6;
442: send232[12] = RXB0D7;
443: if(RXB0EXID == 0) //标准帧的话
444: {
445: RD1 = 1; //接收成功,则点亮RD1
446: DelayNmSec(100); //延时0.1s
447: RD1 = 0; //熄灭RD1
448: }
449: if(RXB0EXID == 1) //扩展帧的话
450: {
451: RC1 = 1; //接收成功,则点亮RC1
452: DelayNmSec(100); //延时0.1s
453: RC1 = 0; //熄灭RC1
454: }
455: send_count=13; //串口转发13字节
456: for(sendnum=0;sendnum<send_count;sendnum++) //转发到串口
457: {
458: TXREG = send232[sendnum];
459: while(TRMT == 0); //等待串口发送完一字节
460: }
461: }
462: }
463: }
464: //************************************************************************
465:
466:
467: //////////////////////////////////////////////////////////////////////////
468: // 子函数 //
469: //Function name(函数名称):DelayNmSec //
470: //Create date(创建日期):2007.8.1 //
471: //created by(创建人):夏红峰 //
472: //E-mail:master_0722@sina.com/master_0722@yahoo.com //
473: //Function(函数功能): 延时N*1ms,最大65.5秒 //
474: //Input(输入参数类型):unsigned int N //
475: //Output(输出参考类型):void //
476: //Return(返回信息):无 //
477: //////////////////////////////////////////////////////////////////////////
478: void DelayNmSec(unsigned int N)
479: {
480: unsigned int j;
481: while(N--)
482: for(j=0;j<MILLISEC;j++);
483: }
484: //************************************************************************
485:
486:
487:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -