单片机
返回首页

PIC18F2680的CAN总线设计

2016-09-08 来源:eefocus

硬件:18F2680,CAN收发芯片MCP2551

1.自测模式

//* ****************************************************************
//** 功能描述: CAN自测试收发编程,CAN发送邮箱0以一定的时间间隔发送数据,接收到数据后,将接收数据加1作为下一次的发送数据
//*************************************************************** 
#include 'pic18.h'        //PIC18系列的头文件 */
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数据 */
 
// ****************************************************************
//** 函 数 名: initial()
//** 功能描述: 系统初始化子程序,放在程序首部
//*************************************************************** */
void initial()
{
    SWDTEN=0;                       //关看门狗
 INTCON=0x00;     // bit7-bit0:关总中断 */
 ADCON1=0X07;     // 设置数字输入输出口 */
 PIE1=0;          // PIE1 的中断不使能 */ 
 PIE2=0;       // PIE2 的中断不使能 */ 
 PIE3=0;       // PIE3 的中断不使能 */ 
    TRISB7=0;                       // RB7为输出端口
    RB7=0;
}
//********************************************
//延时函数
//********************************************
void delay(unsigned int asd)
{
  unsigned int i;
  for(i=0;i   {}
}

//* ****************************************************************
//** 函 数 名: initcan()
//** 功能描述: CAN初始化子程序,采用标准标识符,自测试模式
//*************************************************************** */
void initcan()
{
 // ************设置对CAN进行配置***************  */
 TRISB=(TRISB|0X08)&0XFB;  //设置CANRX/RB3输入,CANTX/RB2输出*/
 CANCON=0X80;     // CANCON,bit7-5:1XX请求配置 */
 while((CANSTAT&0X80)==0)  // CAN状态寄存器。bit7-5:100配置方式 */
 {       
  ;
 }        // 等待进入CAN配置模式OPMODE=100 */

 //  ***********波特率设置 ************************** */
 BRGCON1=0X01;     // Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,
//则TQ=((2*(BRP+1))/Fosc=4/4M=1us */
    BRGCON2=0X90;    //bit7=1自由编程,bit6=0总线在采样点采样1
//次;Phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ*/
 BRGCON3=0X42;    // 设置Phase_Seg2(bit2-0)=3TQ */
// 标称位时间=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
//=(1+1+3+3)TQ=8TQ,    位率=1/(8*1U)=0.125MHz */

 //  ******设置发送邮标识符号和初始发送的数据*****  */
 TXB0CON=0X03;     // bit1-0:发送优先级,设置TXB0为最高优先级3 */
 TXB0SIDL=CAN_Adress_L&0xe0; // bit3=0标准标识符,bit7-5:标准标识符2-0位 */
 TXB0SIDH=CAN_Adress_H;   // 标准标识符的10-3位 */
 TXB0DLC=0X08;     // 设置数据长度为8个字节 */
 TXB0D0=0X00;     // 写发送缓冲器数据区数据初值 */
 TXB0D1=0X01;     // 写发送缓冲器数据区数据初值 */
 TXB0D2=0X02;
 TXB0D3=0X03;
 TXB0D4=0X04;
 TXB0D5=0X05;
 TXB0D6=0X06;
 TXB0D7=0X07;

 // *******设置接收邮箱0的标识符和初始化数据********** */
 RXB0SIDL=CAN_Adress_L&0xe0; // bit3=0标准标识符,bit7-5:标准标识符2-0位*/
 RXB0SIDH=CAN_Adress_H;   // 标准标识符的10-3位 */
 RXB0CON=0X20;     // bit6-5=01只接收有效的标准标识符信息 */
 RXB0DLC=0X08;     // 设置接收缓冲器0的数据区长度8个字节 */
 RXB0D0=0X02;     // 初始化接收缓冲器0的数据区数据 */
 RXB0D1=0X03;     // 初始化接收缓冲器0的数据区数据 */
 RXB0D2=0X04;
 RXB0D3=0X05;
 RXB0D4=0X00;
 RXB0D5=0X00;
 RXB0D6=0X00;
 RXB0D7=0X00;

 // *******初始化接收滤波器0和接收屏蔽**************** */
 RXF0SIDH=CAN_Adress_H;  
 RXF0SIDL=CAN_Adress_L;  // 本字节高3位为标识符低3位,低5位是配置 */
 RXM0SIDH=0Xff;
 RXM0SIDL=0Xe0;    // 11个1表示接收11位标识符进行滤波,标识符
//不同不接收;若全为0,若正确信息,全部接收*/

 // *******设置CAN工作模式**************************** */
 CANCON=0X40;    // bit6:=1进入自测试模式;=0,正常操作模式 */
 while((CANSTAT&0X40)!=0)  // 检测CAN配置完成 */
 {
  ;
 }
 
 // 初始化CAN的中断,PIR3为CAN的外围中断标志寄存器 */
 PIR3=0X00;     // 清所有CAN中断标志 */
 PIE3=PIE3|0X01;    // 使能接收缓冲器0的接收中断 */
 IPR3=IPR3|0X01;    // 接收缓冲器0的接收中断为最高优先级 */
}

/*  **************************************************************
** 函 数 名: CAN_deal()
** 功    能:CAN接收数据后处理子程序:接收数据加1为下次发送的数据
****************************************************************** */ 
void CAN_deal()
{
    RB7=1;
    delay(1000);
 CAN_FLAG=0;    // 清接收到标志 */
 TXB0CON=TXB0CON&0xf7; // TXB0REQ=0,禁止发送请求 */
 TXB0D0=RXB0D0+1;   // 用接收数据加1来更新发送数据 */
 TXB0D1=RXB0D1+1;
 TXB0D2=RXB0D2+1;
 TXB0D3=RXB0D3+1;
 TXB0D4=RXB0D4+1;
 TXB0D5=RXB0D5+1;
 TXB0D6=RXB0D6+1;
 TXB0D7=RXB0D7+1;
}

/* ****************************************************************
** 函 数 名: interrupt HI_ISR()
** 功能描述: 高优先级中断子程序:RXB0接收邮箱0接收中断子程序
*************************************************************** */
void interrupt HI_ISR()
{
 if(RXB0IF==1)    // RXB0接收邮箱0接收中断 */
 {
     CAN_FLAG=1;   // 置接收到 CAN 数据 */
  RXB0IF=0;    /// 清接收中断标志 */
  RXB0FUL=0;    //bit7=0打开接收缓冲器接收新信息 */
 }
}

main() 
{
 initial();     // 系统初始化子程序 */
 CAN_Adress_H=0x33;   // CAN高地址为33,低地址为3 */
 CAN_Adress_L=0xe0;   // 接收和发送邮箱标识符:00110011111=0x019F*/
 initcan();     // CAN设置初始化 */
 IPEN=1;      // 使能中断高低优先级 */
 INTCON=INTCON|0xc0;  // 开总中断、开外围接口中断 */
 while(1)
 {
  if(CAN_FLAG==1)CAN_deal(); // 接收到CAN信息,处理 */
  else if(CAN_Delay_count>0x2fe) // 间隔一定时间发送CAN数据 */
  {
            RB7=0;
            delay(65535);
   TXB0CON=TXB0CON|0x08;// bit3(TXREQ)=1,请求发送 */
            while(TXB0REQ)       //等待发送完毕退出!!
            {
              ;                  //等待发送结束
            } 
   CAN_Delay_count=0;  // 间隔一定时间发送CAN数据计时器清0 */
  }
  else CAN_Delay_count++;  // 不到CAN间隔发送时间,继续延时 */
 }
}

2.正常通信模式

定义:CANsend.c 接收上位机发送的八个数据后,通过CAN发送到另一个节点,CANslave.c接收CAN数据后进行+1操作后把数据通过CAN发送出去,CANsend.c 接收数据再送到上位机!

CANsend.c

*
   CAN总线程序(包括发送任务和接收任务)
程序:  CANsend.c
版本号:V1.0
功能:  能够接收上位机发送的串口数据
     同时把接收的上位机程序通过CAN总线发送出去
        发送数据到CAN上后间听总线,准备接收另一个CAN节点发送数据,并把数据返回上位机 
MCU:    PIC18F2680
公司:  RESUN
编译器:Hi-tech PICC 18 v9.50PL3
*/
#include
unsigned char CAN_TX_Adress_H;       //CAN发送高地址寄存器
unsigned char CAN_TX_Adress_L;       //CAN发送低地址寄存器
unsigned char CAN_RX_Adress_H;       //CAN接收高地址寄存器
unsigned char CAN_RX_Adress_L;       //CAN接收低地址寄存器
unsigned char Counter;               //计数器
unsigned char UartFlage;             //串口数据接收标志
unsigned char CanrecFlage;           //CAN数据接收标志

unsigned char Uartdata[8];           //接收数据,PC-MCU
unsigned char Senddata[8];           //发送数据,MCU-PC
//-----------函数定义-------------
void uartint(void);
void picint(void);
void canint(void);
void Work1(void);
void Work2(void);
void Delay(unsigned int asd);

//********************************
//单片机初始化
//********************************
void picint()    //PIC初始化!
{                
  INTCON=0;      //禁止总中断
  ADCON1=0x07;   //AD端口设置为通用IO口
  PIE1=0;        //禁止外设中断
  PIE2=0;        
  PIE3=0;        
                 
  TRISB7=0;      //RB7输出引脚,用于调试程序
  RB7=0;         //输出0

  UartFlage=0;
  CanrecFlage=0;
  Counter=0;    //计数器清0
}
//********************************
//串口初始化程序(与PC通信)
//********************************
void uartint()
{
  SPBRG=25;      //设置波特率为9600
  TXSTA=0x04;    //高速波特率4M晶振
  RCSTA=0x80;  //USART串口使能
  TRISC6=1;      //设置UART端口,RC6是数据发送,RC7是数据接收
  TRISC7=1;
  
  RCIP=0;        //串口接收设置为低优先级中断
  RCIE=1;        //允许接收中断
  TXIE=0;        //禁止发送中断
  CREN=1;      //允许串口接收数据 
}
//********************************
//延时函数
//********************************
void Delay(unsigned int asd)
{
  unsigned int i;
  for(i=0;i   {}
}
//********************************
//CAN接口初始化
//********************************
void canint()    //CAN接口初始化
{
   // ************设置对CAN进行配置***************  
 TRISB=(TRISB|0X08)&0XFB;  //设置CANRX/RB3输入,CANTX/RB2输出
 CANCON=0X80;     // CANCON,bit7-5:1XX请求配置 
 while((CANSTAT&0X80)==0)  // CA
// ****************************************************************
//** 函 数 名: initcan()
//** 功能描述: CAN初始化子程序,采用标准标识符N状态寄存器。bit7-5:100配置方式 
 {       
  ;
 }        // 等待进入CAN配置模式OPMODE=100 
 // ************设置对CAN进行配置*************** 

 //  ***********波特率设置 ************************** 
 BRGCON1=0X01;    // Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,
        //则TQ=((2*(BRP+1))/Fosc=4/4M=1us 
 BRGCON2=0X90;   //bit7=1自由编程,bit6=0总线在采样点采样1
//次;phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ
 BRGCON3=0X42;   // 设置Phase_Seg2(bit2-0)=3TQ 
 // 标称位时间=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
//=(1+1+3+3)TQ=8TQ,    位率=1/(8*1U)=0.125MHz */
 // 设置发送邮箱0标识符 :00110011111=0x019F */
 CAN_TX_Adress_H=0x33;      //CAN高地址标识符,应与接收方标识符相同
 CAN_TX_Adress_L=0xe0;      //CAN低地址标识符
 CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;

 // 设置接收邮箱0标识符 :10011001010=0x04CA */
 CAN_RX_Adress_H=0x99;      //CAN高地址标识符
 CAN_RX_Adress_L=0x55;      //CAN低地址标识符,应与发送方标识符相同
 CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;

 //  ******设置发送邮箱0和初始发送的数据*****  */
 TXB0CON=0X03;     // bit1-0:发送优先级,设置TXB0为最高优先级3 */
 TXB0SIDL=CAN_TX_Adress_L&0xe0;  // bit3=0标准标识符,bit7-5:标准标识符2-0位*/
 TXB0SIDH=CAN_TX_Adress_H;     // 标准标识符的10-3位*/
 TXB0DLC=0X08;     // 设置数据长度为8个字节 */
 TXB0D0=0X00;     // 写发送缓冲器数据区数据初值 */
 TXB0D1=0X01;     // 写发送缓冲器数据区数据初值 */
 TXB0D2=0X02;
 TXB0D3=0X03;
 TXB0D4=0X04;
 TXB0D5=0X05;
 TXB0D6=0X06;
 TXB0D7=0X07;

 RXB0SIDL=CAN_RX_Adress_L&0xe0;      // bit3=0标准标识符,bit7-5:标准标识符2-0位*/
 RXB0SIDH=CAN_RX_Adress_H;      // 标准标识符的10-3位 */
 RXB0CON=0X20;      // bit6-5=01只接收带有标准标识符的有效报文 */
 RXB0DLC=0X08;      // 设置接收缓冲器0数据区长度8个字节 */
 RXB0D0=0X02;      // 初始化接收缓冲器0的数据区数据 */
 RXB0D1=0X03;      // 初始化接收缓冲器0的数据区数据 */
 RXB0D2=0X04;
 RXB0D3=0X05;
 RXB0D4=0X00;
 RXB0D5=0X00;
 RXB0D6=0X00;
 RXB0D7=0X00;

 // *******初始化接收滤波器0和接收屏蔽**************** */
 RXF0SIDH=CAN_RX_Adress_H;  
 RXF0SIDL=CAN_RX_Adress_L&0xe0; //高3位为标识符低3位,低5位是配置 */
 RXM0SIDH=0Xff;
 RXM0SIDL=0Xe0;        // 11个1表示接收11位标识符进行滤波,标识符
//不同不接收;若全为0,若正确信息,全部接收*/
  
 // *******设置CAN工作模式**************************** */
 CANCON=0X00;     //=0X40,进入自测试模式;=0x00,正常操作模式
 while((CANSTAT&0XE0)!=0)  // 检测CAN配置完成 */
 {
  ;
 }

 // 初始化CAN的中断,PIR3为CAN的外围中断标志寄存器 */
 PIR3=0X00;     // 清所有CAN中断标志*/
 PIE3=PIE3|0X01;    // 使能接收缓冲器0的接收中断 */
 IPR3=IPR3|0X01;    // 接收缓冲器0的接收中断为最高优先级 */                         
}
//*********************************
//高优先级中断程序
//*********************************
void interrupt HI_ISR()
{
 if(RXB0IF==1)                   //接收缓冲器1接收到新数据
 {
       RB7=1;
      CanrecFlage=1;    // 置接收到 CAN 数据 */
       RXB0IF=0;     // 清接收中断标志 */
    RXB0FUL=0;     // bit7=0,打开接收缓冲器接收新信息 */
 }
}
//*********************************
//低优先级中断程序
//*********************************
void interrupt low_priority  LOW_ISR()
{
  if(RCIF==1)                     //判断是不是串口中断
  {
    Uartdata[Counter]=RCREG;
    Counter++;
    if(Counter>7)
    {
      Counter=0;
      UartFlage=1;                //有串行数据接收
    }
  }
}
//*********************************
//处理函数1
//*********************************
void Work1()
{
   TXB0CON=TXB0CON&0xf7;    //bit3:TXREQ=0, 关请求发送
   UartFlage=0;                //清标志
   TXB0D0=Uartdata[0];         //CAN发送数据更新(用串口接收来的数据)
   TXB0D1=Uartdata[1];
   TXB0D2=Uartdata[2];
   TXB0D3=Uartdata[3];
   TXB0D4=Uartdata[4];
   TXB0D5=Uartdata[5];
   TXB0D6=Uartdata[6];
   TXB0D7=Uartdata[7];
   TXB0CON=TXB0CON|0x08;   //请求发送,bit3:TXREQ=1
  // RB7=1;
   while(TXB0REQ)           //等待发送完毕
   {
    ;
   }
   Delay(10000);
}
//*********************************
//处理函数2
//*********************************
void Work2()                  //接收数据返回PC机
{
  unsigned char i;
  Senddata[0]=RXB0D0;
  Senddata[1]=RXB0D1;
  Senddata[2]=RXB0D2;
  Senddata[3]=RXB0D3;
  Senddata[4]=RXB0D4;
  Senddata[5]=RXB0D5;
  Senddata[6]=RXB0D6;
  Senddata[7]=RXB0D7;
  //RCEN=0;                     //接收禁止
  TXEN=1;                     //使能串口发送
  for(i=0;i<8;i++)            //串口数据发送
  {
    TXREG=Senddata[i];
    while(1)
    {
     if(TXIF==1) break;
    }
    Delay(100);
  }
  //RCEN=1;                     //接收使能
  TXEN=0;                     //禁止数据发送
}
//*********************************
//主程序
//*********************************
void main()
{
 SWDTEN=0;                         //软件关闭看门狗
 picint();                         
 canint();                         
 uartint();                        
 IPEN=1;                           //使能高低中断优先级
 INTCON=INTCON|0xc0;      //开总中断、开外围接口中断 
 TXB0REQ=0;                        //禁止CAN发送
 while(1)                          //主循环
 {                                 
   if(UartFlage)                //接收到串口数据
   {                               
     UartFlage=0;               
     Work1();                   
     //RB7=0;                      
   }
                               
   if(CanrecFlage)                 //接收到CAN总线数据
   {                               
     CanrecFlage=0;                
     Work2();                      
   }
                               
 }                                 
}                                 

CANslave.c

/*
   CAN总线程序(包括发送任务和接收任务)
程序:  CANslave.c
版本号:V1.0
功能:  
     同时把接收的CAN数据通过CAN总线发送出去
        供别的节点进行接收
MCU:    PIC18F2680
公司:  RESUN
编译器:Hi-tech PICC 18 v9.50PL3
*/
#include
unsigned char CAN_TX_Adress_H;       //CAN发送高地址寄存器
unsigned char CAN_TX_Adress_L;       //CAN发送低地址寄存器
unsigned char CAN_RX_Adress_H;       //CAN接收高地址寄存器
unsigned char CAN_RX_Adress_L;       //CAN接收低地址寄存器
unsigned char CAN_FLAG;

//------------函数定义------------
void picint(void);
void canint(void);
void delay(unsigned int asd);
//************************************
//延时函数
//************************************
void delay(unsigned int asd)
{
  unsigned int i;
  for(i=0;i   {}
}
//************************************
//单片机初始化函数
//************************************
void picint()
{
  INTCON=0;      //禁止总中断
  ADCON1=0x07;   //AD端口设置为通用IO口
  PIE1=0;        //禁止外设中断
  PIE2=0;        
  PIE3=0;

  TRISB7=0;      //RB7输出引脚,用于调试程序
  RB7=0;         //输出0
}
//************************************
//CAN总线初始化函数
//************************************
void canint()
{
  // 设置发送邮箱0标识符 :10011001010=0x04CA */
 CAN_TX_Adress_L=0x55;  //CAN低地址标识符
 CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;
 CAN_TX_Adress_H=0x99;  //CAN高地址标识符,应与发送方标识符相同

 // 设置接收邮箱0标识符 :00110011111=0x019F */
 CAN_RX_Adress_H=0x33;  //CAN高地址标识符
 CAN_RX_Adress_L=0xe0;  //CAN低地址标识符,应与发送方标识符相同
 CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;

 // ************设置对CAN进行配置***************  */
 TRISB=(TRISB|0X08)&0XFB; // 设置CANRX/RB3输入,CANTX/RB2输出 */
 CANCON=0X80;    // CANCON,bit7-5:1XX请求配置 */
 while((CANSTAT&0X80)==0) // CAN状态寄存器。bit7-5:100配置方式 */
 {       
  ;
 }       // 等待进入CAN配置模式OPMODE=100 */

 //  ***********波特率设置 ************************** */
 BRGCON1=0X01;    /* Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,
        则TQ=((2*(BRP+1))/Fosc=4/4M=1us */
 BRGCON2=0X90;    /*bit7=1自由编程,bit6=0总线在采样点采样1
次;phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ*/
 BRGCON3=0X42;    /* 设置Phase_Seg2(bit2-0)=3TQ */
 // 标称位时间=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
//=(1+1+3+3)TQ=8TQ,    位率=1/(8*1U)=0.125MHz */

 //  ******设置发送邮箱0和初始发送的数据*****  */
 TXB0CON=0X03;    // bit1-0:发送优先级,设置TXB0为最高优先级3 */
 TXB0SIDL=CAN_TX_Adress_L&0xe0; //bit3=0标准标识符,bit7-5:标准标识符2-0位*/
 TXB0SIDH=CAN_TX_Adress_H;  // 标准标识符的10-3位*/
 TXB0DLC=0X08;     // 设置数据长度为8个字节 */
 TXB0D0=0X00;     // 写发送缓冲器数据区数据初值 */
 TXB0D1=0X01;     // 写发送缓冲器数据区数据初值 */
 TXB0D2=0X02;
 TXB0D3=0X03;
 TXB0D4=0X04;
 TXB0D5=0X05;
 TXB0D6=0X06;
 TXB0D7=0X07;

 RXB0SIDL=CAN_RX_Adress_L&0xe0; //bit3=0标准标识符,bit7-5:标准标识符2-0位*/
 RXB0SIDH=CAN_RX_Adress_H;  // 标准标识符的10-3位 */
 RXB0CON=0X20;     // bit6-5=01只接收有效的标准标识符信息 */
 RXB0DLC=0X08;     // 设置接收缓冲器0数据区长度8个字节 */
 RXB0D0=0X02;     // 初始化接收缓冲器0的数据区数据 */
 RXB0D1=0X03;     // 初始化接收缓冲器0的数据区数据 */
 RXB0D2=0X04;
 RXB0D3=0X05;
 RXB0D4=0X00;
 RXB0D5=0X00;
 RXB0D6=0X00;
 RXB0D7=0X00;

 // *******初始化接收滤波器0和接收屏蔽**************** */
 RXF0SIDH=CAN_RX_Adress_H;  
 RXF0SIDL=CAN_RX_Adress_L&0xe0; //高3位为标识符低3位,低5位是配置 */
 RXM0SIDH=0Xff;
 RXM0SIDL=0Xe0;    // 11个1表示接收11位标识符进行滤波,标识符
//不同不接收;若全为0,若正确信息,全部接收*/
 
 // *******设置CAN工作模式**************************** */
 CANCON=0X00;    //=0X40,进入自测试模式;=0x00,正常操作模式
 while((CANSTAT&0XE0)!=0)  // 检测CAN配置完成 */
 {
  ;
 }

 // 初始化CAN的中断,PIR3为CAN的外围中断标志寄存器 */
 PIR3=0X00;       // 清所有CAN中断标志 */
 PIE3=PIE3|0X01;              // 使能接收缓冲器0的接收中断 */
 IPR3=IPR3|0X01;              // 接收缓冲器0的接收中断为最高优先级 */
}
//************************************
//中断函数
//************************************
void interrupt HI_ISR()
{
 if(RXB0IF==1)
 {
    CAN_FLAG=1;    // 置接收到 CAN 数据 */
  RXB0IF=0;     // 清接收中断标志 */
  RXB0FUL=0;     // bit7=0打开接收缓冲器接收新信息 */
 }
}
//************************************
//主函数
//************************************
void main()
{
 SWDTEN=0;                      //软件关闭看门狗
 picint();
 canint();
 IPEN=1;      // 使能中断高低优先级 */
 INTCON=INTCON|0xc0;   // 开总中断、开外围接口中断 */
 TXB0REQ=0;      // 关发送,TXB0REQ=0; */
 while(1)
 {
 if(CAN_FLAG==1)
 {
        RB7=!RB7;
  CAN_FLAG=0;    // 清接收到标志 */
  TXB0CON=TXB0CON&0xf7; // TXB0REQ=0关发送 */
  TXB0D0=RXB0D0+1;  // 用接收数据加1来更新发送数据 */
  TXB0D1=RXB0D1+1;
  TXB0D2=RXB0D2+1;
  TXB0D3=RXB0D3+1;
  TXB0D4=RXB0D4+1;
  TXB0D5=RXB0D5+1;
  TXB0D6=RXB0D6+1;
  TXB0D7=RXB0D7+1; 
  TXB0CON=TXB0CON|0x08;  // bit3(TXREQ)=1请求发送 */
        while(TXB0REQ)              //等待发送完毕
        {
          ;
        }
        delay(10000);
        RB7=0;
 }
  }
}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

    相关电子头条文章