#include "pic18.h" char CAN_Adress_H,CAN_Adress_L; //CAN标识符高低字节 char CAN_Adress_EH,CAN_Adress_EL; //CAN扩展标识符高低字节 int CAN_FLAG; //=1接收到CAN数据,=0未接收到数据 unsigned int CAN_Delay_count=0; //间隔一定时间发送CAN数据
void initial() { INTCON=0x00; ADCON1=0x07; PIE1=0; PIE2=0; PIE3=0; }
void initcan() { TRISB=(TRISB|0x08)&0xFB; CANCON=0x80; while((CANSTAT&0x80)==0) { ;
} BRGCON1=0x01; BRGCON2=0x90; BRGCON3=0x42;
TXB0CON=0x03; TXB0SIDL=CAN_Adress_L&0xE0; TXB0SIDH=CAN_Adress_H; TXB0DLC=0x08; TXB0D0=0x00; TXB0D1=0x01; TXB0D2=0x02; TXB0D3=0x03; TXB0D4=0x04; TXB0D5=0x05; TXB0D6=0x06; TXB0D7=0x07; RXB0SIDL=CAN_Adress_L&0xE0; RXB0SIDH=CAN_Adress_H; RXB0CON=0x20; RXB0DLC=0x08; RXB0D0=0x02; RXB0D1=0x03; RXB0D2=0x04; RXB0D3=0x05; RXB0D4=0x00; RXB0D5=0x00; RXB0D6=0x00; RXB0D7=0x00; RXF0SIDH=CAN_Adress_H; RXF0SIDL=CAN_Adress_L; RXM0SIDH=0xFF; RXM0SIDL=0xE0;
CANCON=0x40; while((CANSTAT&0x40)!=0) { ;
}
PIR3=0x00; PIE3=PIE3|0x01; IPR3=IPR3|0x01; }
void CAN_deal() { CAN_FLAG=0; TXB0CON=TXB0CON&0xF7; TXB0D0=RXB0D0+1; TXB0D1=RXB0D1+1; TXB0D2=RXB0D2+1; TXB0D3=RXB0D3+1; TXB0D4=RXB0D4+1; TXB0D5=RXB0D5+1; TXB0D6=RXB0D6+1; TXB0D7=RXB0D7+1; }
void interrupt HI_ISR() { if(RXB0IF==1) { CAN_FLAG=1; RXB0IF=0; RXB0FUL=0; } }
main () { initial(); CAN_Adress_H=0x33; CAN_Adress_L=0xEE; initcan(); IPEN=1; INTCON=INTCON|0xC0; while(1) { if(CAN_FLAG==1)CAN_deal(); else if(CAN_Delay_count>0x2FE) { TXB0CON=TXB0CON|0x08; CAN_Delay_count=0; break; } else CAN_Delay_count++; } } 这是一个自检方式下的例子,为什么运行的不对啊,请高手指点,谢谢 |