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

📄 can_232show.lst

📁 主要是can工业总线方面的应用程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   CAN_232SHOW                                                           12/12/2007 14:42:30 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE CAN_232SHOW
OBJECT MODULE PLACED IN E:\制作和~1\总线开发\试验程序\CAN_LAB\CAN_RS~1\NODE1\CAN_232SHOW.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE E:\制作和~1\总线开发\试验程序\CAN_LAB\CAN_RS~1\NODE1\CAN_232SHOW.C DB SB OE

stmt level    source

   1          
   2          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   3          //描述:
   4          //      INT0按键程序+显示程序+CAN收发程序+RS232通讯                            &
   5          //      数码管1-2(从右至左)显示本节点计数结果,数码管3-4显示接收到的数据     &
   6          //      十进制显示                                                             &
   7          //      每按一次按键,数码管1-2显示加1,CAN发送一次,RS232发送一次             &
   8          //      收到RS232数据,数码管3-4显示,CAN发送一次                              &
   9          //      收到CAN数据,数码管3-4显示,RS232发送一次                              &
  10          //      CAN主要参数:       PeliCAN模式,扩展帧EFF模式                          &
  11          //      29位标示码结构:                                                       &
  12          //      发送数据结构:计数结果,0x02,0x03,0x04,0x05,0x06,0x07,0x08              &
  13          //      接收数据结构: 待显示数据+其它7个字节的数据                             &
  14          //      本节点的地址: 0x11,0x22,0x33,0x00;可以接收全部节点的数据               &
  15          //      目的节点地址:0x01,0x02,0x03,0x00;可以被能接收全部节点数据的节点接收   &
  16          
  17          //提示:如果CAN通讯不正常,会进入一个死循环,显示也不正常
  18          
  19          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  20          //【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                   &
  21          //【声明】 作者: PIAE小组                                                      &
  22          
  23          #include <reg52.h>
  24          #include <intrins.h>
  25          #include <can_232showdef.h>
  26          
  27          void INT0_Counter( void ) interrupt 0 using 1
  28          {//INT0按键为计数按键
  29   1          EA = 0;
  30   1          Show_tx_data++; //存储计数结果,并为待发送的数据
  31   1          TXD_Cflag = 1;//CAN总线要发送数据标志位
  32   1          TXD_232flag = 1;//RS232要发送数据标志位
  33   1          Txd_Cdata = Show_tx_data;//CAN总线要发送的数据
  34   1          Txd_232data = Show_tx_data;//232要发送的数据
  35   1          EA = 1;
  36   1      }
  37          
  38          void CAN_RXD( void ) interrupt 2
  39          {//接收数据函数,在中断服务程序中调用
  40   1      
  41   1          uchar data Judge;
  42   1          EA = 0;//关CPU中断
  43   1          IE0 = 0;
  44   1      
  45   1          Judge = IR;
  46   1          if( Judge & 0x01)
  47   1          {//IR.0 = 1 接收中断
  48   2              RX_buffer[0] =  RBSR;
  49   2              RX_buffer[1] =  RBSR1;
  50   2              RX_buffer[2] =  RBSR2;
  51   2              RX_buffer[3] =  RBSR3;
  52   2              RX_buffer[4] =  RBSR4;
  53   2              RX_buffer[5] =  RBSR5;
  54   2              RX_buffer[6] =  RBSR6;
  55   2              RX_buffer[7] =  RBSR7;
C51 COMPILER V7.06   CAN_232SHOW                                                           12/12/2007 14:42:30 PAGE 2   

  56   2              RX_buffer[8] =  RBSR8;
  57   2              RX_buffer[9] =  RBSR9;
  58   2              RX_buffer[10] =  RBSR10;
  59   2              RX_buffer[11] =  RBSR11;
  60   2              RX_buffer[12] =  RBSR12;
  61   2              RXD_Cflag = 1;//置有接收标志
  62   2              CMR = 0X04;
  63   2              Judge = ALC;//释放仲裁随时捕捉寄存器
  64   2              Judge = ECC;//释放错误代码捕捉寄存器
  65   2          }
  66   1          IER = 0x01;// .0=1--接收中断使能;
  67   1          EA = 1;//打开CPU中断
  68   1      }
  69          
  70          void RS232_RXD( void ) interrupt 4   using 1
  71          {//接收数据函数,在中断服务程序中调用
  72   1          EA = 0;//关闭所有中断
  73   1          ES = 0;//关闭串口
  74   1          if(RI==1)
  75   1          {
  76   2              RI = 0;
  77   2              Rxd_232data = SBUF;
  78   2              RXD_232flag = 1;//置接收到数据标志
  79   2          }
  80   1          _nop_();
  81   1          ES = 1;//打开串口
  82   1          EA = 1;//打开中断
  83   1      }
  84          
  85          void main(void)
  86          {
  87   1      //CPU初始化
  88   1          SJA_RST = 1;//CAN总线复位管脚
  89   1          SJA_CS = 0;//CAN总线片选有效
  90   1      
  91   1          SCON = 0x50; //串口方式1
  92   1          PCON = 0x80; //串口波特率加速
  93   1          TMOD = 0x21;
  94   1          TH1=0xFD; //19200bps
  95   1          TL1=0xFD;
  96   1          TR1 = 1;
  97   1          TI = 0;
  98   1          RI = 0;
  99   1          ES  = 1;//打开串口中断
 100   1      
 101   1          EX1 = 1;
 102   1          IT1 = 0;//CAN总线接收中断
 103   1          IT0 = 1;//外部中断0负边沿触发
 104   1          EX0 = 1;//打开外部中断0
 105   1          EA = 1; //打开总中断
 106   1          SJA_CS = 1;//CAN总线片选无效
 107   1      //CPU初始化
 108   1      
 109   1          CAN_init(  ); //SJA1000初始化
 110   1          _nop_();
 111   1          _nop_();
 112   1          while(1)
 113   1          {
 114   2              _nop_();
 115   2              _nop_();
 116   2              Rxd_deal();//接收处理程序
 117   2              Txd_deal();//发送处理程序
C51 COMPILER V7.06   CAN_232SHOW                                                           12/12/2007 14:42:30 PAGE 3   

 118   2              led_seg7(1,Show_tx_data);
 119   2              led_seg7(3,Show_rx_data);
 120   2      
 121   2       }
 122   1      
 123   1      }
 124          
 125          
 126          //*********************处理函数********************************
 127          
 128          
 129          void Rxd_deal(void)
 130          {//////// 接收处理程序//////////////
 131   1          //uchar data Order;
 132   1          if( RXD_Cflag )
 133   1          {//如果CAN总线收到数据,数码管3-4显示,RS232将收到的数据发送给PC机
 134   2              EA = 0;//关闭CPU中断
 135   2              RXD_Cflag = 0;
 136   2              Rxd_Cdata = RX_buffer[5];
 137   2              Show_rx_data = Rxd_Cdata;//
 138   2              TXD_232flag = 1;
 139   2              Txd_232data = Rxd_Cdata;//给要232发送的数据赋值
 140   2              EA = 1;//打开CPU中断
 141   2           }
 142   1      
 143   1          if( RXD_232flag )
 144   1          {//如果RS232总线收到数据,数码管3-4显示,CAN总线将收到的数据发送出去
 145   2              EA = 0;//关闭CPU中断
 146   2              RXD_232flag = 0;
 147   2              Show_rx_data = Rxd_232data;//
 148   2              TXD_Cflag = 1;
 149   2              Txd_Cdata = Rxd_232data;//给要can发送的数据赋值
 150   2              EA = 1;//打开CPU中断
 151   2           }
 152   1      }//////// 接收处理程序//////////////
 153          
 154          void Txd_deal(void)
 155          {//发送处理函数,主要是准备数据,并且调用发送函数
 156   1          if( TXD_Cflag == 1 )
 157   1          {
 158   2              EA = 0;//关闭CPU中断
 159   2              _nop_();
 160   2              TXD_Cflag = 0;
 161   2              TX_buffer[5]  = Txd_Cdata;//
 162   2              CAN_TXD();
 163   2              _nop_();
 164   2              EA = 1;//打开CPU中断
 165   2          }
 166   1          if( TXD_232flag == 1 )
 167   1          {
 168   2              EA = 0;//关闭CPU中断
 169   2              TXD_232flag = 0;
 170   2              RS232_TXD();
 171   2              EA = 1;//打开CPU中断
 172   2           }
 173   1      }
 174          
 175          //*********************处理函数********************************
 176          
 177          
 178          //*********************CAN子函数***********************
 179          
C51 COMPILER V7.06   CAN_232SHOW                                                           12/12/2007 14:42:30 PAGE 4   

 180          void CAN_init( void )
 181          {//SJA1000 的初始化
 182   1          uchar bdata Judge;
 183   1          uchar ACRR[4];
 184   1          uchar AMRR[4];
 185   1          ACRR[0] = 0x11;
 186   1          ACRR[1] = 0x22;
 187   1          ACRR[2] = 0x33;
 188   1          ACRR[3] = 0x44;//接收代码寄存器?
 189   1          AMRR[0] = 0xff;
 190   1          AMRR[1] = 0Xff;
 191   1          AMRR[2] = 0xff;
 192   1          AMRR[3] = 0xff;//接收屏蔽寄存器。 只接收主机发送的信息
 193   1          do
 194   1          {//  .0=1---reset MODRe,进入复位模式,以便设置相应的寄存器
 195   2           //防止未进入复位模式,重复写入
 196   2              MODR   = 0x09;
 197   2              Judge = MODR ;
 198   2          }
 199   1          while( !(Judge & 0x01) );
 200   1          CDR  = 0x88;// CDR.3=1--时钟关闭, .7=0---basic CAN, .7=1---Peli CAN
 201   1          BTR0 = 0x31;
 202   1          BTR1 = 0x1c;//总线波特率设定
 203   1          IER  = 0x01;// .0=1--接收中断使能;  .1=0--关闭发送中断使能
 204   1          OCR  = 0xaa;// 配置输出控制寄存器
 205   1          CMR  = 0x04;//释放接收缓冲器
 206   1      
 207   1      
 208   1      
 209   1          ACR  = ACRR[0];
 210   1          ACR1 = ACRR[1];
 211   1          ACR2 = ACRR[2];
 212   1          ACR3 = ACRR[3];//初始化标示码
 213   1      
 214   1          AMR  = AMRR[0];
 215   1          AMR1 = AMRR[1];
 216   1          AMR2 = AMRR[2];
 217   1          AMR3 = AMRR[3];//初始化掩码
 218   1          do
 219   1          {//确保退出复位模式
 220   2              MODR   = 0x08;
 221   2              Judge  = MODR ;
 222   2           }
 223   1          while( Judge & 0x01 );
 224   1      
 225   1      
 226   1      }//SJA1000 的初始化
 227          
 228          
 229          void CAN_TXD( void )
 230          {
 231   1          uchar data Judge;
 232   1          uchar data TX_buffer[ N_can ] ;
 233   1      
 234   1      //初始化标示码头信息
 235   1          TX_buffer[0] = 0x88;//.7=0扩展帧;.6=0数据帧; .3=1数据长度
 236   1          TX_buffer[1] = 0x01;//本节点地址
 237   1          TX_buffer[2] = 0x02;//
 238   1          TX_buffer[3] = 0x03;//
 239   1          TX_buffer[4] = 0x00;//
 240   1      //初始化标示码头信息
 241   1      
C51 COMPILER V7.06   CAN_232SHOW                                                           12/12/2007 14:42:30 PAGE 5   

 242   1      //初始化发送数据单元
 243   1          TX_buffer[5]  = Txd_Cdata;
 244   1          TX_buffer[6]  = 0x22;

⌨️ 快捷键说明

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