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

📄 can 通信.txt

📁 基于pic单片机的can 通信程序
💻 TXT
字号:
 以下是我的C源代码,用HTSOFT 的PICC18编译器,用PC机的串口控制CAN发射模块送08H或09H到CAN接收模块,是比照白兄的汇编代码改过来的

电路是参照AN212的图,用20M晶振,串口波特率9600,CAN口波特率为19.53125K

PC机送01H到发送模块,然后发送模块送08H到CAN接收

PC机送02H到发送模块,然后发送模块送09H到CAN接收

 

 

发送模块:

#include 
#include 

//define configure bit of PIC18F248
__CONFIG(1, HS & OSCSDIS);
__CONFIG(2, PWRTEN & BORV20 & BORDIS & WDTPS128 & WDTDIS);
__CONFIG(4, BKBUGEN & LVPDIS & STVREN);
__CONFIG(5, UNPROTECT);
__CONFIG(7, TRU);

//define bit instruction
#define bitset(var,bitno) ((var)|=1<<(bitno))
#define bitclr(var,bitno) ((var)&=~(1<<(bitno)))

volatile char DATA;

 

void interrupt low_priority LOW_ISR(void);
void interrupt HI_ISR(void);


void main(void)
{

    DATA=0;
    
    LVDEN=0;
    ADCON1=0xF7;
    TRISA=0x00;
    RA0=0;
    RA1=1;
    RA2=1;
    RA3=1;

    IPEN=1;
    INTCON=0xC0;
    PIE3=0xFF;
    IPR3=0x00;

    PORTB=0x00;
    LATB=0x00;    
    TRISB=0x08;

    REQOP2=1;
    ENDRHI=1;
    CANCAP=0;

//AUSART initial
    RCIE=1;
    RCIP=1;

 

    SPBRG=129;
    BRGH=1;
    SPEN=1;
    RX9=0;
    CREN=1;
    ADDEN=0;
    TRISC7=1;
    TRISC6=0;
    TXIE=0;
    TX9=0;
    SYNC=0;
    TXEN=1;
    
    TXREG=0xEB;
    NOP();
    while (!TXIF);
    TXREG=0x90;
    NOP();
    while (!TXIF);

    


//TXB0

    TXB0PRI1=1;
    TXB0PRI0=1;
    TXB0SIDH=0b10101111;
    TXB0SIDL=0b11100000;
    TXB0DLC=00000001;
    
//RXB0
    RXB0M1=0;
    RXB0M0=0;
    RXF0SIDH=0b10101111;
    RXF0SIDL=0b11100000;
    RXM0SIDH=0xFF;
    RXM0SIDL=0xFF;
    
//BAUDRAT
    BRGCON1=0b00111110;
    BRGCON2=0b10010000;
    BRGCON3=0b00000010;
    

    
//NORMAL MODE
    REQOP2=0;
    REQOP1=0;
    REQOP0=0;
    ABAT=0;

LOOP:
    if (DATA==0x01) 
    {
     DATA=0x00;
     TXB0D0=0x08;
     TXB0REQ=1;  
    }
    if (DATA==0x02) 
    {
     DATA=0x00;
     TXB0D0=0x09;
     TXB0REQ=1;  
    }    
    goto LOOP;

}

void interrupt HI_ISR(void)
{
    if((RCIE)&&(RCIF)&&(RCIP))
    {
     DATA=RCREG; 
 if(DATA==0x01)
 {
             RA2=1;
       RA1=0;
 }
 if(DATA==0x02)
 {
             RA2=0;
             RA1=1;
 }
    }
}

void interrupt low_priority LOW_ISR(void)
{
    RA3=0;
             
    TXB0IF=0;
}


 

 

接受模块:

#include 
#include 

//define configure bit of PIC18F248
__CONFIG(1, HS & OSCSDIS);
__CONFIG(2, PWRTEN & BORV20 & BORDIS & WDTPS128 & WDTDIS);
__CONFIG(4, BKBUGEN & LVPDIS & STVREN);
__CONFIG(5, UNPROTECT);
__CONFIG(7, TRU);

//define bit instruction
#define bitset(var,bitno) ((var)|=1<<(bitno))
#define bitclr(var,bitno) ((var)&=~(1<<(bitno)))


void interrupt low_priority LOW_ISR(void);
void interrupt HI_ISR(void);


void main(void)
{
    LVDEN=0;
    ADCON1=0xF7;
    TRISA=0x00;
    RA0=0;
    RA1=1;
    RA2=1;
    RA3=1;

    IPEN=1;
    INTCON=0xC0;
    PIE3=0xFF;
    IPR3=0x00;

    PORTB=0x00;
    LATB=0x00;    
    TRISB=0x08;

    REQOP2=1;
    ENDRHI=1;
    CANCAP=0;
    RXB0FUL=0;

//RXB0
    RXB0M1=0;
    RXB0M0=0;
    RXF0SIDH=0b10101111;
    RXF0SIDL=0b11100000;
    RXM0SIDH=0xFF;
    RXM0SIDL=0xFF;
    
//BAUDRAT
    BRGCON1=0b00111110;
    BRGCON2=0b10010000;
    BRGCON3=0b00000010;
    
//DATA
//    TXB0D0=0x09;
    
//NORMAL MODE
    REQOP2=0;
    REQOP1=0;
    REQOP0=0;
    ABAT=0;
    
    
//    TXB0REQ=1;
LOOP:
    goto LOOP;

}


void interrupt low_priority LOW_ISR(void)
{
    RXB0FUL=0;
    RXB0IF=0;

    if (RXB0D0==0x08) 
    {
     RA2=1;
     RA1=0;
    }
    if (RXB0D0==0x09) 
    {
     RA1=1;
     RA2=0;
    }


}
 
 
 

⌨️ 快捷键说明

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