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

📄 pic18f4580_mcp2515_rs232_picc8.35.c

📁 采用PIC18F4580和MCP2512实现can通信。
💻 C
📖 第 1 页 / 共 2 页
字号:
//Input(输入参数类型):void                                              //
//Output(输出参考类型):void                                             //
//Return(返回信息):无                                                   //
//////////////////////////////////////////////////////////////////////////
void InitUSART(void)
{
 TRISC6 = 0;                 //RC6-TX
 TRISC7 = 1;                 //RC7-RX
 BAUDCON=0x00;          //8位波特率发生器
 SPBRG = ((Fosc/BAUDRATE)/64)-1; //8位,异步,低速
 TXSTA = 0b00100010;    //异步模式,8位发送,发送使能,低速
 RCSTA = 0b10010000;    //使能串口,8位接收,使能连续接收
 RCIF = 0;              //串口接收中断标志清零
 RCIE = 1;              //使能串口接收中断
 RCIP = 0;              //低优先级
 NOP(); 
}
//************************************************************************


//////////////////////////////////////////////////////////////////////////
//                             子函数                                   //
//Function name(函数名称):InitTMR0                                      //
//Create date(创建日期):2007.8.1                                        //
//created by(创建人):夏红峰                                             //
//E-mail:master_0722@sina.com/master_0722@yahoo.com                     //
//Function(函数功能):用于确定串口数据流的长度                           //
//Input(输入参数类型):void                                              //
//Output(输出参考类型):void                                             //
//Return(返回信息):无                                                   //
//////////////////////////////////////////////////////////////////////////
void InitTMR0(void)
{
 //禁止TMR0,8位定时器/计数器,内部指令周期时钟,使用前分频器,1:128分频
 T0CON = 0b01010110;    
 TMR0IF = 0;            //TMR0中断标志位清零
 TMR0IE = 1;            //TMR0中断使能
 TMR0IP = 1;            //TMR0中断优先级高
 TMR0 = TMR0data;       //延时3个串口接收到的字节
 NOP(); 
}
//************************************************************************


//////////////////////////////////////////////////////////////////////////
//                             子函数                                   //
//Function name(函数名称):InitSPI                                       //
//Create date(创建日期):2007.8.1                                        //
//created by(创建人):夏红峰                                             //
//E-mail:master_0722@sina.com/master_0722@yahoo.com                     //
//Function(函数功能):SPI接口初始化                                      //
//Input(输入参数类型):void                                              //
//Output(输出参考类型):void                                             //
//Return(返回信息):无                                                   //
//////////////////////////////////////////////////////////////////////////
void InitSPI(void)
{
 TRISC5 = 0;            //RC5/SDO输出
 TRISC4 = 1;            //RC4/SDI输入
 TRISC3 = 0;            //RC3/SCK输出
 TRISA5 = 0;            //RA5/SS输出
 SSPCON1 = 0b00100000;  //使能SPI,时钟低电平为空闲状态,时钟为Fosc/4
 SSPSTAT = 0b01000000;  //中间采样,时钟上升沿发送数据
 SSPIF = 0;             //清除SSPIF标志
 NOP(); 
}
//************************************************************************


//////////////////////////////////////////////////////////////////////////
//                             子函数                                   //
//Function name(函数名称):InitINT0                                      //
//Create date(创建日期):2007.8.1                                        //
//created by(创建人):夏红峰                                             //
//E-mail:master_0722@sina.com/master_0722@yahoo.com                     //
//Function(函数功能):外部中断0初始化,用于产生CAN数据接收中断           //
//Input(输入参数类型):void                                              //
//Output(输出参考类型):void                                             //
//Return(返回信息):无                                                   //
//////////////////////////////////////////////////////////////////////////
void InitINT0(void)
{	  
 TRISB0 = 1;  //外部中断0输入
 INT0IE = 1;  //开放外部INT0中断
 INT0IF = 0;  //外部INT0中断标志位清零
 INTEDG0 = 0; //外部中断0下降沿中断
 NOP(); 
}
//************************************************************************


//////////////////////////////////////////////////////////////////////////
//                            主程序                                    //
//////////////////////////////////////////////////////////////////////////
void main(void)
{   
 unsigned char sendnum;
 NOP(); 
 Initial();                  //IO口初始化
 InitUSART();                //串口初始化
 InitTMR0();                 //定时器0初始化
 InitSPI();                  //SPI接口初始化
 Init_MCP2515();             //MCP2515初始化
 InitINT0 ();			     //外部中断0初始化
 IPEN = 1;					 //使能中断优先级
 INTCON |= 0xC0;		     //开放所有高低优先级中断   
 while(1)
	  {
	   if(RD0 == 0)          //如有S1按键按下,发送标准帧
	     {
		  while(RD0 == 0);   //等待S1按键释放
          write_MCP2515(TXB0CTRL,0x03);//设置为发送最高优先级
	      write_MCP2515(TXB0SIDH,0xFF);//SID10--SID3
	      write_MCP2515(TXB0SIDL,0xE0);//SID2--SID0
	      write_MCP2515(TXB0DLC,0x08); //发送数据长度为8字节
	      write_MCP2515(TXB0D0,0x00);  //发送的数据 
	      write_MCP2515(TXB0D1,0x11);
	      write_MCP2515(TXB0D2,0x22);
	      write_MCP2515(TXB0D3,0x33);
	      write_MCP2515(TXB0D4,0x44);
	      write_MCP2515(TXB0D5,0x55);
	      write_MCP2515(TXB0D6,0x66);
	      write_MCP2515(TXB0D7,0x77);
          send_TXB0();                 //请求发送
          while((read_MCP2515(TXB0CTRL) & 0x08) == 0x08);  //等待发送完毕
		  RD1 = 1;         	           //发送成功,则点亮RD1
		  DelayNmSec(100);             //延时0.1s
		  RD1 = 0;                     //熄灭RD1
	     }
	     
	   if(RC0 == 0)          //如有S2按键按下,发送扩展帧
	     {
		  while(RC0 == 0);   //等待S2按键释放
          write_MCP2515(TXB0CTRL,0x03);//设置为发送最高优先级
	      write_MCP2515(TXB0SIDH,0xFF);//EID28--21
	      write_MCP2515(TXB0SIDL,0xEB);//EID20--EID18,扩展帧使能,EID17--EID16
	      write_MCP2515(TXB0EID8,0xFF);//EID15--EID8
	      write_MCP2515(TXB0EID0,0xFF);//EID7--EID0
	      write_MCP2515(TXB0DLC,0x08);//发送数据长度为8字节
	      write_MCP2515(TXB0D0,0x00); //发送的数据
	      write_MCP2515(TXB0D1,0x11);
	      write_MCP2515(TXB0D2,0x22);
	      write_MCP2515(TXB0D3,0x33);
	      write_MCP2515(TXB0D4,0x44);
	      write_MCP2515(TXB0D5,0x55);
	      write_MCP2515(TXB0D6,0x66);
	      write_MCP2515(TXB0D7,0x77);
          send_TXB0();                 //请求发送
          while((read_MCP2515(TXB0CTRL) & 0x08) == 0x08); //等待发送完毕
		  RC1 = 1;         	      //发送成功,则点亮RC1
		  DelayNmSec(100);        //延时0.1s
		  RC1 = 0;                //熄灭RC1
	     }
	     
	   if(USARTreceive_flag == 1) //接收到符合要求的串口数据流 
		 {		
		  USARTreceive_flag = 0;       //串口转发再允许 
		  pointer = &receive232[1];
		  write_MCP2515(TXB0CTRL,0x03);//设置为发送最高优先级
	      write_MCP2515(TXB0SIDH,*pointer++);//EID28--21
	      write_MCP2515(TXB0SIDL,*pointer++);//EID20--EID18,扩展帧使能,EID17--EID16
	      write_MCP2515(TXB0EID8,*pointer++);//EID15--EID8
	      write_MCP2515(TXB0EID0,*pointer++);//EID7--EID0
	      write_MCP2515(TXB0DLC,*pointer++);//发送数据长度为8字节
	      write_MCP2515(TXB0D0,*pointer++); //发送的数据
	      write_MCP2515(TXB0D1,*pointer++);
	      write_MCP2515(TXB0D2,*pointer++);
	      write_MCP2515(TXB0D3,*pointer++);
	      write_MCP2515(TXB0D4,*pointer++);
	      write_MCP2515(TXB0D5,*pointer++);
	      write_MCP2515(TXB0D6,*pointer++);
	      write_MCP2515(TXB0D7,*pointer++);
          send_TXB0();                      //请求发送
          while((read_MCP2515(TXB0CTRL) & 0x08) == 0x08); //等待发送完毕	      	      		 
		  if((receive232[2]&0x08) == 0x00)  //如果是标准帧
		    {
		     RD1 = 1;         	       //发送成功,则点亮RD1
		     DelayNmSec(100);          //延时0.1s
		     RD1 = 0;                  //熄灭RD1				    
			}
		  if((receive232[2]&0x08) == 0x08)  //如果是扩展帧
		    {
		     RC1 = 1;         	       //发送成功,则点亮RC1
		     DelayNmSec(100);          //延时0.1s
		     RC1 = 0;                  //熄灭RC1				    
			}		  				 
		 }
		 	     
	   if(CANreceive_flag == 1)		   //接收到来自CAN总线的数据 
		 {		   
		  CANreceive_flag = 0;  	   //接收标志位清零
		  bit_modify_MCP2515(CANINTF, 0x01,0x00);//接收缓冲器0满中断标志位清零		    	  
          send232[0] = read_MCP2515(RXB0SIDH);       //接收到的标准标识符高字节
          send232[1] = read_MCP2515(RXB0SIDL);       //接收到的标准标识符低字节
          send232[2] = read_MCP2515(RXB0EID8);       //接收到的扩展标识符高字节(看RXB0EXID而定)
          send232[3] = read_MCP2515(RXB0EID0);       //接收到的扩展标识符低字节(看RXB0EXID而定)
          send232[4] = read_MCP2515(RXB0DLC);        //接收到的数据长度
          send232[5] = read_MCP2515(RXB0D0);         //接收到的数据
		  send232[6] = read_MCP2515(RXB0D1);
		  send232[7] = read_MCP2515(RXB0D2);
		  send232[8] = read_MCP2515(RXB0D3);
		  send232[9] = read_MCP2515(RXB0D4);
		  send232[10] = read_MCP2515(RXB0D5);
		  send232[11] = read_MCP2515(RXB0D6);
		  send232[12] = read_MCP2515(RXB0D7);		  
		  if((send232[1]&0x08) == 0x00)          //标准帧的话
		    {
             RD1 = 1;         	       //接收成功,则点亮RD1
		     DelayNmSec(100);          //延时0.1s
		     RD1 = 0;                  //熄灭RD1	
		    }
		  if((send232[1]&0x08) == 0x08)          //扩展帧的话
		    {
             RC1 = 1;         	       //接收成功,则点亮RC1
		     DelayNmSec(100);          //延时0.1s
		     RC1 = 0;                  //熄灭RC1	
		    }		  
          send_count=13;               //串口转发13字节
          for(sendnum=0;sendnum<send_count;sendnum++) //转发到串口
             {
	          TXREG = send232[sendnum];	
              while(TRMT == 0);        //等待串口发送完一字节
             }	        		 
		 }      	     
	  }

}
//************************************************************************


//////////////////////////////////////////////////////////////////////////
//                             子函数                                   //
//Function name(函数名称):DelayNmSec                                    //
//Create date(创建日期):2007.8.1                                        //
//created by(创建人):夏红峰                                             //
//E-mail:master_0722@sina.com/master_0722@yahoo.com                     //
//Function(函数功能): 延时N*1ms,最大65.5秒                             //
//Input(输入参数类型):unsigned int N                                    //
//Output(输出参考类型):void                                             //
//Return(返回信息):无                                                   //
//////////////////////////////////////////////////////////////////////////
void DelayNmSec(unsigned int N)
{
 unsigned int j;
 while(N--)
 	   for(j=0;j<MILLISEC;j++);
}
//************************************************************************

⌨️ 快捷键说明

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