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

📄 can_com.lst

📁 sja1000与stc单片机的硬件程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   CAN_COM                                                               04/13/2008 20:32:50 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE CAN_COM
OBJECT MODULE PLACED IN D:\VW\MY_PRO~1\CAB_BU~1\CAN_LAB\CAN_EASY\CAN_COM.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE D:\VW\MY_PRO~1\CAB_BU~1\CAN_LAB\CAN_EASY\CAN_COM.C DB SB OE

stmt level    source

   1          
   2          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   3          //描述:
   4          //      CAN收发程序                                                            &
   5          //      CAN主要参数:       PeliCAN模式,扩展帧EFF模式                          &
   6          //      29位标示码结构:
   7          //      发送数据结构:0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88
   8          //      接收数据结构: 每次读取8个字节的数据
   9          //      本节点的地址: 0x11,0x22,0x33,0x00;可以接收全部节点的数据
  10          //      目的节点地址:0x01,0x02,0x03,0x00;可以被能接收全部节点数据的节点接收
  11          
  12          //提示:如果CAN通讯不正常,会进入一个死循环,显示也不正常
  13          
  14          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  15          //【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                   &
  16          //【声明】 作者: PIAE小组                                                      &
  17          
  18          #include <reg52.h>
  19          #include <intrins.h>
  20          #include <can_def.h>
  21          
  22          void CAN_RXD( void ) interrupt 2
  23          {//接收数据函数,在中断服务程序中调用
  24   1      
  25   1          uchar data Judge;
  26   1          EA = 0;//关CPU中断
  27   1          IE0 = 0;
  28   1      
  29   1          Judge = IR;
  30   1          if( Judge & 0x01)
  31   1          {//IR.0 = 1 接收中断
  32   2              RX_buffer[0] =  RBSR;
  33   2              RX_buffer[1] =  RBSR1;
  34   2              RX_buffer[2] =  RBSR2;
  35   2              RX_buffer[3] =  RBSR3;
  36   2              RX_buffer[4] =  RBSR4;
  37   2              RX_buffer[5] =  RBSR5;
  38   2              RX_buffer[6] =  RBSR6;
  39   2              RX_buffer[7] =  RBSR7;
  40   2              RX_buffer[8] =  RBSR8;
  41   2              RX_buffer[9] =  RBSR9;
  42   2              RX_buffer[10] =  RBSR10;
  43   2              RX_buffer[11] =  RBSR11;
  44   2              RX_buffer[12] =  RBSR12;
  45   2              RXD_flag = 1;//置有接收标志
  46   2              CMR = 0X04;
  47   2              Judge = ALC;//释放仲裁随时捕捉寄存器
  48   2              Judge = ECC;//释放错误代码捕捉寄存器
  49   2          }
  50   1          IER = 0x01;// .0=1--接收中断使能;
  51   1          EA = 1;//打开CPU中断
  52   1      }
  53          
  54          void main(void)
  55          {
C51 COMPILER V7.06   CAN_COM                                                               04/13/2008 20:32:50 PAGE 2   

  56   1      //CPU初始化
  57   1          EA = 1;
  58   1          EX1 = 1;
  59   1          IT1 = 0;
  60   1      //CPU初始化
  61   1      
  62   1          CAN_init(  ); //SJA1000初始化
  63   1          _nop_();
  64   1          _nop_();
  65   1          while(1)
  66   1          {
  67   2              _nop_();
  68   2              _nop_();
  69   2              Rxd_deal();//接收处理程序
  70   2              Txd_deal();//发送处理程序
  71   2          }
  72   1      
  73   1      }
  74          
  75          
  76          //*********************处理函数********************************
  77          
  78          void Rxd_deal(void)
  79          {//////// 接收处理程序//////////////
  80   1          //uchar data Order;
  81   1          if( RXD_flag )
  82   1          {
  83   2              EA = 0;//关闭CPU中断
  84   2              RXD_flag = 0;
  85   2              TXD_flag = 1;//要求发送处理
  86   2              EA = 1;//打开CPU中断
  87   2           }
  88   1      }//////// 接收处理程序//////////////
  89          
  90          void Txd_deal(void)
  91          {//发送处理函数,主要是准备数据,并且调用发送函数
  92   1          if( TXD_flag == 1 )
  93   1          {
  94   2              _nop_();
  95   2              TXD_flag = 0;
  96   2              CAN_TXD();
  97   2              _nop_();
  98   2              _nop_();
  99   2           }
 100   1      }
 101          
 102          //*********************处理函数********************************
 103          
 104          
 105          //*********************CAN子函数***********************
 106          
 107          void CAN_init( void )
 108          {//SJA1000 的初始化
 109   1          uchar bdata Judge;
 110   1          uchar ACRR[4];
 111   1          uchar AMRR[4];
 112   1          ACRR[0] = 0x11;
 113   1          ACRR[1] = 0x22;
 114   1          ACRR[2] = 0x33;
 115   1          ACRR[3] = 0x44;//接收代码寄存器?
 116   1          AMRR[0] = 0xff;
 117   1          AMRR[1] = 0Xff;
C51 COMPILER V7.06   CAN_COM                                                               04/13/2008 20:32:50 PAGE 3   

 118   1          AMRR[2] = 0xff;
 119   1          AMRR[3] = 0xff;//接收屏蔽寄存器。 只接收主机发送的信息
 120   1          do
 121   1          {//  .0=1---reset MODRe,进入复位模式,以便设置相应的寄存器
 122   2           //防止未进入复位模式,重复写入
 123   2              MODR   = 0x09;
 124   2              Judge = MODR ;
 125   2          }
 126   1          while( !(Judge & 0x01) );
 127   1          CDR  = 0x88;// CDR.3=1--时钟关闭, .7=0---basic CAN, .7=1---Peli CAN
 128   1          BTR0 = 0x31;
 129   1          BTR1 = 0x1c;//总线波特率设定
 130   1          IER  = 0x01;// .0=1--接收中断使能;  .1=0--关闭发送中断使能
 131   1          OCR  = 0xaa;// 配置输出控制寄存器
 132   1          CMR  = 0x04;//释放接收缓冲器
 133   1      
 134   1          ACR  = ACRR[0];
 135   1          ACR1 = ACRR[1];
 136   1          ACR2 = ACRR[2];
 137   1          ACR3 = ACRR[3];//初始化标示码
 138   1      
 139   1          AMR  = AMRR[0];
 140   1          AMR1 = AMRR[1];
 141   1          AMR2 = AMRR[2];
 142   1          AMR3 = AMRR[3];//初始化掩码
 143   1          do
 144   1          {//确保退出复位模式
 145   2              MODR   = 0x08;
 146   2              Judge  = MODR ;
 147   2           }
 148   1          while( Judge & 0x01 );
 149   1      
 150   1      
 151   1      }//SJA1000 的初始化
 152          
 153          
 154          void CAN_TXD( void )
 155          {
 156   1          uchar data Judge;
 157   1          uchar data TX_buffer[ N_can ] ;
 158   1      
 159   1      //初始化标示码头信息
 160   1          TX_buffer[0] = 0x88;//.7=0扩展帧;.6=0数据帧; .3=1数据长度
 161   1          TX_buffer[1] = 0x01;//本节点地址
 162   1          TX_buffer[2] = 0x02;//
 163   1          TX_buffer[3] = 0x03;//

⌨️ 快捷键说明

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