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