PIC18F2680的CAN总线设计

发布者:平和思绪最新更新时间:2016-09-08 来源: eefocus关键字:PIC18F2680  CAN总线 手机看文章 扫描二维码
随时随地手机看文章
硬件: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;
 }
  }
}

关键字:PIC18F2680  CAN总线 引用地址:PIC18F2680的CAN总线设计

上一篇:PIC16F74的12864点阵液晶驱动(不带字库)
下一篇:基于PIC的LIN总线设计

推荐阅读最新更新时间:2024-03-16 15:08

基于车联网的车辆信息远程搜集数据系统
车联网,是指装载在车辆上的电子标签通过无线射频等识别技术,实现在信息网络平台上对所有车辆的属性信息和静、动态信息进行提取和有效利用,并根据不同的功能需求对所有车辆的运行状态进行有效的监管和提供综合服务。 车联网的概念在20世纪60年代已经先后出现在美国、欧洲与日本等发达国家和地区,并先后发展起ITS、IVHS、RTI、VICS等车联网系统。在国内,全国第四届GPS运营商大会,车联网的概念被首次提出,得到广大专业人士的认同;在无锡举行的中国国际物联网大会上,国家将车联网列为我国重大专项第三专项中的重要项目,中国的车联网由此起步。到现今,一些供应商所提供的车载系统中,已经基本实现智能导航、保养预约、咨询查询等功能,更方便车辆出行,在一
[嵌入式]
基于μPD780822单片机及其CAN总线模块实现车灯节点的设计
1、引言 CAN (Controller Area Network)是德国 Bosch 公司最先提出的,是目前汽车控制器局域网中最流行、最常用的总线。它的主要特点是:CAN总线为多主站总线,各节点均可在任意时刻主动向网络上的其他节点发送信息,不分主从,通信灵活;CAN总线采用独特的非破坏性总线仲裁技术,优先级高的节点先传送数据,能满足实时性要求;CAN总线具有点对点、一点对多点及全局广播传送数据的功能;CAN总线上每帧有效字节数最多为8个,并有CRC及其他校验措施,数据出错率极低,某个节点出现严重错误,可自动脱离总线,总线上的其他操作不受影响;CAN总线只有2条导线,系统扩充时可直接将新节点挂在总线上,因此走线少,系统容易扩充
[汽车电子]
基于μPD780822单片机及其<font color='red'>CAN总线</font>模块实现车灯节点的设计
DS80C390双CAN总线分层分布式监控系的设计
  1 引言   CAN总线的全称是ControllerAreaNetworkBus,简称控制器局部网总线,它是现场总线的一种,是一种有效支持分布式控制或实时控制的串行通信网络。CAN网络的拓扑结构采用两级总线式结构,两级总线之间采用转发器进行连接,这种结构比环型结构信息吞吐率低,并且无源抽头连接,通信介质用双绞线,系统可靠性高。经过二十年的发展,CAN总线凭借其卓越的特性、极高的可靠性和独特的设计,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。CAN总线具有高可靠性、实时性和灵活性,它的特点如下:(1)方便地构成分布式监控系统,可以多主方式工作,而不分主从,通信方式灵活。(2)通信距离最远可达10km,通信速率最高
[工业控制]
基于CAN 总线的智能传感器网络
前 言 随着自动化程度的提高和信息的网络化进程, 所需要的测控点和测控参量越来越多, 使得一个自动控制系统日益庞大而复杂。对于一个系统来说, 需要的传感器数目成倍增加。为了使各智能仪表与上位机能实时、高速、准确地通信, 选择较理想的现场总线则是很关键的。现场总线是开放型控制系统, 是用于现场总线仪表与控制室之间的一种全数字化、串行、双向、多站的通讯网络 。CAN 是其中很有发展前景的一种现场总线。在网络化的系统中, 每只传感器作为一个智能节点挂接在CAN 总线上, 整个系统如图1所示。 图1 CAN 总线系统框图 1 CAN 总线的技术特点 a) CAN 通信速率为(5kB/s)/10km、(1MB/s)/40m ,其节点数
[嵌入式]
基于K线/CAN总线的KWP2000协议分析及协议栈的开发测试
1 前言 在汽车故障诊断领域,针对诊断设备和汽车ECU之间的数据交换,各大汽车公司几乎都制订了相关的标准和协议。其中,欧洲汽车领域广泛使用的一种车载诊断协议标准是KWP2000(Keyword Protocol 2000),该协议实现了一套完整的车载诊断服务,并且满足E-OBD(European On Board Diagnose)标准。KWP2000最初是基于K线的诊断协议,由于K线物理层和数据链路层在网络管理和通讯速率上的局限性,使得K线无法满足日趋复杂的车载诊断网络的需求。而CAN网络(Controller Area Network)由于其非破坏性的网络仲裁机制、较高的通讯速率(可达1M bps)和灵活可靠的通讯方式,在车载
[嵌入式]
CAN总线在中央空调控制系统中的应用
    摘要: 介绍了基于CAN总线的中央空调控制系统,并对系统的总体设计方案及软、硬件设计进行了分析及讨论。该系统能实现高精度温度、湿度的自动控制。     关键词: 现场总线 CAN总线 单片机 控制系统 中央空调控制系统是智能建筑中不可缺少的组成部分。传统的控制方法是采用DDC(直接数字控制器)方式,将各个温度、湿度检测点和控制点连接到一台或多台DDC上,实行多点实时监控。由于现代智能建筑楼层较多,多个空调风机位于不同楼层,温、湿度检测点分布于各个房间,采用DDC方式进行控制具有引线过长、施工不便、系统通信的实时性和可靠性不高等缺点。 在各种通信方式中,面向工业控制的现场总线技术是目前解决工业控制现
[工业控制]
CAN总线解决方案在小儿尿裤包装机的应用
  尿裤生产线是一个对系统的协调性要求很高的一种机械设备,要求控制系统能够提供很好的协调能力,协调各个伺服之间的动作流程,不能出现系统动作间断的情况,同时还要求伺服系统具有很好的反应能力,及时处理来自PLC的命令,以达到很高的生产效率。我们所做的这套系统是用来包装尿裤的,同时也可以用来包装卫生巾,系统各方面要求很高,整个系统控制工艺复杂,控制设备繁多,各个电机之间要求很高的协调性.该系统采用5套伺服电机控制,而每套伺服电机间均有数据交换,且数据通讯也要求很强的实时性,也就是要求系统具有总线通讯能力,这样就要求伺服驱动器拥有非常强大的功能才能满足控制要求,而Kinco伺服驱动器则能满足此类系统控制要求,下面是我们驱动器的一些功能特点:
[嵌入式]
基于CAN总线的重型卡车嵌入式车载仪表系统设计
重型卡车因其具有运输量大、运输成本低等特点,在工程建设、货物运输、城市垃圾清运等方面得到了越来越多的应用。但近年来重型卡车行车时引起的交通事故频繁发生,给人民生命财产安全造成了巨大损失。随着汽车电子技术的快速发展,基于CAN总线的重型卡车车载网络技术已成为保证重型卡车可靠、安全运行的一种有效技术措施 。采用分布式网络控制,不仅可以减少线束,而且能够提高各电子控制系统的运行可靠性,实现各子系统之间的资源共享和在线故障诊断。     目前,国外基于CAN总线技术和J1939协议标准的重型卡车网络系统的研究己经进入商用化阶段,取得了显著的社会经济效益 。在国内,一汽、上汽和中国重汽等集团公司相继都在其不同型号的重卡上采用CAN总线技术。
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved