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

📄 can.txt

📁 can通信,可用于工控领域的数据传输
💻 TXT
字号:
                         采集版程序


void CAN_init(void):初始化CAN
void CAN_send(void):CAN发送数据
变量:unsigned char LsStatA[8],LsStatB[8];  //模块状态帧
     unsigned char LsOrderA[8],LsOrderB[8];//联锁命令帧
	 unsigned char AddrA;        //模块地址
	 unsigned char LedCount;     //LED通讯指示灯点亮计时
	 unsigned int OrderStopCount;//通讯中断计时
     unsigned char CommStat;//收到新命令标识 0x55代表收到新命令,其它表示未收到新命令
	           
常量:(CANBT1)Baud_BT1;(CANBT2)Baud_BT2;(CANBT3)Baud_BT3;
PG0控制通讯灯
void set_band(void)
{
  CANBT1=Baud_BT1;
  CANBT2=Baud_BT2;
  CANBT3=Baud_BT3;
}
//初始化参CAN 
void CAN_init(void)
{ 
  CANGCON |= (1<<SWRES);   //设置为复位模式 
  //---------设置波特率-----------
  set_band();  
  //----------CAN使能---------------  
  //设置接收MOB(mob0)
  CANPAGE = 0x00;
  CANSTMOB = 0x00;
  CANCDMOB = 0x08;
  //初始化标识码寄存器CANIDT 
  CANIDT4 = 0x00;
  CANIDT3 = 0x00;
  CANIDT2 = 0x00;
  CANIDT1 = AddrA;
  //初始化标识码屏蔽寄存器CANIDM
  CANIDM4=0x00;
  CANIDM3=0x00;
  CANIDM2=0x00;
  CANIDM1=0xFF;
  //设置发送MOB(mob1)
  CANPAGE = 0x10;
  CANSTMOB = (1 << TXOK);
  CANCDMOB = 0x08;
  //初始化标识码寄存器CANIDT 
  CANIDT4 = 0x00;
  CANIDT3 = 0x00;
  CANIDT2 = 0x80;
  CANIDT1 = AddrA;
  //初始化标识码屏蔽寄存器CANIDM
  CANIDM4=0x00;
  CANIDM3=0x00;
  CANIDM2=0xFF;
  CANIDM1=0xFF;

  CANGIE = 0xA0;      //使能接收中断
//CANEN1 = 0x00;
//CANEN2 = 0x01;
  CANIE1 = 0x00;
  CANIE2 = 0x01;

  CANPAGE = 0x00;
  CANCDMOB = 0x88;     //CAN MOB接收使能,CAN报文数据长度为8字节
  CANGCON = 0x02; 	//设置CAN使能
}

/***********canit中断服务程序**************/
#pragma interrupt_handler canit_isr:iv_CAN  
void canit_isr(void)   
{
  unsigned int i,data;
  CANGIE &= ~(1 << ENRX);                  //关接收中断
  CANPAGE = 0x00;
  data = CANSIT2;
  if(data & (1 << 0))//若是收到信息MOB0中断
  {
	  for(i = 0;i < 8; i++)
		  LsOrderA[i] = CANMSG;
	  
  }
  else
  {
	  CANGIE |= (1 << ENRX); 	//设置CAN使能
	  return;
  }
  for(i = 0;i < 8; i++)
	  LsOrderB[i] = LsOrderA[i];
  CANSTMOB &= ~(1 << RXOK);         //清中断标志
  PORTG &= ~(1 << PG0);       //PG0清零,通信灯亮
  LedCount = 0;					//计数器清零
  OrderStopCount=0;           //通讯中断计时
  CommStat = 0x55;        
   
   //更新标识码寄存器CANIDT
  CANIDT4 = 0x00;
  CANIDT3 = 0x00;
  CANIDT2 = 0x00;
  CANIDT1 = AddrA;
   //更新标识码屏蔽寄存器CANIDM
  CANIDM4=0x00;
  CANIDM3=0x00;
  CANIDM2=0x00;
  CANIDM1=0xFF;
   
  CANGIE |= (1 << ENRX); 	//设置CAN使能
  CANCDMOB = 0x88; 
}

void CAN_send(void)
{
  unsigned int i;
  if(CommStat!=0x55)			//判断是否通信处理
  	{
	  return;
	}
  CommStat=0xaa;
  //-----------发送-----------------
  CANGIE &= ~(1 << ENRX);
  CANPAGE = 0x10;
  //CANCDMOB = 0x08;
  for(i = 0; i < 8; i++)
	  CANMSG =  LsStatA[i];
  CANCDMOB = 0x48;
  for(i = 0; i < 5000; i++)
  {
	  if(CANSTMOB&(1<<TXOK))
	  {
		  CANSTMOB&=~(1<<TXOK);
		  break;
	  }
  }
  CANCDMOB = 0x00;

   //更新标识码寄存器CANIDT
  CANIDT4 = 0x00;
  CANIDT3 = 0x00;
  CANIDT2 = 0x00;
  CANIDT1 = AddrA;
  CANGIE |= (1 << ENRX); 	//设置CAN使能
}

⌨️ 快捷键说明

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