PIC单片机C语言编程实例五
PAGE
PAGE 163
第9章 PIC16F87X在CAN通信中的应用9.3 软件清单// ========CAN通信程序======= #include#include#include// MCP2510寄存器定义 // =========常数和变量定义========= #defineREAD0x03// 读MCP2510指令代码 #defineWRITE0x02// 写MCP2510指令代码 #defineRESET0xC0// 复位MCP2510指令代码 #defineRTS0x80// MCP2510请求发送指令代码 #defineSTA25100xA0// 读MCP2510状态指令代码 #defineBITMOD0x05// MCP2510位修改指令代码 inta[12];// SPI发送或接收数据寄存器intb[8];// 发送或接收的数据intc[8];// 发送或接收的数据inti;// 临时变量intcount;// 发送接收计数器intcount1=0;// for testintRecID_H=0;intRecID_L=0;intDLC=8;void SPIINT();void TMR1INT();void CCP1INT();void SPIEXCHANGE(int count);void WAIT_SPI();void RESET2510();int RD2510(int adress,int n);void WR2510(int adress,int n);void RTS2510(int RTSn);int GETS2510();void BM2510(int adress,int mask,int data);void SETNORMAL();void TXCOMPLETE(int adress);void TXMSG(int DLC);int RXMSG();void INIT2510();void INIT877();void INITSPI();void ACK();void wait();// ========主程序======= main(void){int l,detect=0;SSPIE=1;TMR1IE=1;CCP1IE=1;CCP2IE=1;PEIE=1;ei();// 开中断 INIT877();// 初始化PIC16F877芯片 INITSPI();// 初始化SPI接口 INIT2510();// 初始化MCP2510芯片 flag1=0;flag2=0;CCP1CON=0x05;CCP2CON=0x04;while(1){RXMSG();TXMSG(8);}}// ========中断服务程序======= // SPI中断服务子程序 void SPIINT(){SSPIF=0;a[i++]=SSPBUF;// 数据暂存a[]中 count-=1;if(count>0) SSPBUF=a[i];// 未发送完,继续 else RE2=1;// 否则,片选信号置高电平 return;}// TMR1中断服务子程序 void TMR1INT(){TMR1IF=0;T1CON=0;if(!flag1){TMR1H=0xfe;// 512 μs 脉冲宽度TMR1L=0x00;T1CON=0x01;PORTD=0xff;// 输出所有通道flag1=1;}else{flag1=0;PORTD=0;T1CON=0;}return;}// CCP1中断服务子程序 void CCP1INT(){CCP1IF=0;T1CON=0x01;return;}// CCP2中断服务子程序 void CCP2INT(){CCP2IF=0;T1CON=0x01;return;}// 中断入口,保护现场,判中断类型 void interrupt INTS(){di();if(TMR1IF) TMR1INT();// 定时器TMR1中断 e