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

📄 can_self.lst

📁 CAN总线到RS232串口通信源程序
💻 LST
字号:
C51 COMPILER V8.02   CAN_SELF                                                              12/04/2008 19:20:05 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE CAN_SELF
OBJECT MODULE PLACED IN can_self.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE can_self.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   3          //描述:
   4          //      INT0按键程序+显示程序+CAN自收发程序                                    &
   5          //      数码管1-2(从右至左)显示本节点计数结果,数码管3-4显示接收到的数据     &
   6          //      十进制显示                                                             &
   7          //      CAN主要参数:       PeliCAN模式,扩展帧EFF模式                          &
   8          //      29位标示码结构:                                                       &
   9          //      发送数据结构:计数结果,0x02,0x03,0x04,0x05,0x06,0x07,0x08              &
  10          //      接收数据结构: 待显示数据+其它7个字节的数据                             &
  11          //      本节点的地址: 0x11,0x22,0x33,0x00;可以接收全部节点的数据               &
  12          //      目的节点地址:0x01,0x02,0x03,0x00;可以被能接收全部节点数据的节点接收   &
  13          
  14          
  15          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  16          //【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                   &
  17          //【声明】 作者: PIAE小组                                                      &
  18          
  19          #include <reg52.h>
  20          #include <intrins.h>
  21          #include <can_selfdef.h>
  22          #define uchar  unsigned char
  23          
  24          
  25          bit receive;  //接收标志
  26          
  27          
  28          uchar  i,buffer[8];//串口缓冲区
  29          uchar  sbuffer;
  30          
  31          uchar  cmd_numb ;//发送缓冲区填充完成标志
  32          uchar data TX_buffer[ N_can ] ;
  33          
  34          void  led_seg7(uchar ,uchar ) ;
  35          
  36          
  37          /********************************系统初始化函数************************/
  38          
  39          void initial(void)
  40          {  uchar j;
  41   1         SCON=0x50;           //串口工作方式1,允许接收
  42   1         PCON=0x80;           //波特率翻倍
  43   1         TCON=0;              
  44   1         TMOD=0x26;           //T1用于串口波特率控制
  45   1         TL1=0xfa;            //初始化T1,波特率为9600(晶振11.0592M)
  46   1         TH1=0xfa;                    
  47   1         TR1=1;               //开定时器
  48   1        
  49   1         ES=1;                //开串口中断
  50   1      
  51   1         receive = 0;        //接收标志清零
  52   1      
  53   1         cmd_numb = 0;       //接受计数器清零
  54   1       //  P1 = 0xb0;           //RS485允许接收
  55   1        for(j=0; j<8; j++)   //串口缓冲区清空
C51 COMPILER V8.02   CAN_SELF                                                              12/04/2008 19:20:05 PAGE 2   

  56   1            buffer[j] = 0xff;  //table[18]为空显示   
  57   1        
  58   1       // cash[0] = 15;  
  59   1       //CPU初始化
  60   1          SJA_RST = 1;//CAN总线复位管脚,复位无效
  61   1          SJA_CS = 0;//CAN总线片选有效
  62   1         
  63   1          IT1 = 0;//CAN总线低电平接收中断
  64   1         // IT0 = 1;//外部中断0负边沿触发
  65   1        //  EX0 = 1;//打开外部中断0   
  66   1          EX1 = 1; // 打开外部中断1
  67   1          EA = 1; //打开总中断
  68   1      
  69   1      
  70   1          SJA_CS = 1;//CAN总线片选无效,使对数据总线的操作不会影响SJA1000。
  71   1      //CPU初始化 
  72   1      //初始化标示码头信息 
  73   1      
  74   1          TX_buffer[0] = 0x88;//.7=0扩展帧;.6=0数据帧; .3=1数据长度
  75   1          TX_buffer[1] = 0x01;//本节点地址
  76   1          TX_buffer[2] = 0x02;//
  77   1          TX_buffer[3] = 0x03;//
  78   1          TX_buffer[4] = 0x00;//
  79   1      //初始化标示码头信息
  80   1      
  81   1      //初始化发送数据单元
  82   1          TX_buffer[5]  = 0xff;
  83   1          TX_buffer[6]  = 0x22;
  84   1          TX_buffer[7]  = 0x33;
  85   1          TX_buffer[8]  = 0x44;//
  86   1          TX_buffer[9]  = 0x55;//
  87   1          TX_buffer[10] = 0x66;//
  88   1          TX_buffer[11] = 0x77;//
  89   1          TX_buffer[12] = 0x88;//
  90   1      //初始化数据信息 
  91   1       }                        
  92          
  93          
  94          
  95          
  96          /*****************************串口中断响应处理函数***********************/
  97          
  98          void serial(void) interrupt 4
  99          {  uchar k;
 100   1        if(RI)//为接收中断
 101   1           {      
 102   2            RI=0;                                         //清接收中断标志
 103   2             LED_RED= ~LED_RED;                                  //闪串口指示LED
 104   2            sbuffer = SBUF;                               //读取串口缓冲区数据
 105   2      
 106   2            if((sbuffer == 's') && (receive == 0))       //判断是否为数据头 ,是数据头则准备接收
 107   2             {     
 108   3                 receive = 1;     //开始接收标志                         
 109   3                 cmd_numb = 0;    //清接收计数器
 110   3                 TXD_flag = 0;   //清接收完成标志
 111   3                }
 112   2            else if(sbuffer == 'e')   //判断数据尾     
 113   2              { 
 114   3                if(cmd_numb<8)//接收到的字符少于8个
 115   3                  for(k=cmd_numb;k<8;k++)//则空位填空显示
 116   3                    buffer[k] = 0;
 117   3                TXD_flag = 1;         //置接收完成标志      
C51 COMPILER V8.02   CAN_SELF                                                              12/04/2008 19:20:05 PAGE 3   

 118   3                receive =0;            //清接收标志
 119   3                }
 120   2            else if(receive){     //判断当前是否处于接收状态
 121   3                         
 122   3                buffer[cmd_numb++] = sbuffer;  //当前字符送缓冲区
 123   3                              Txd_data=cmd_numb ;
 124   3      
 125   3               }      
 126   2            else                    //无效命令则返回
 127   2               return;
 128   2             }
 129   1      }
 130          
 131          
 132          void CAN_RXD( void ) interrupt 2                  //接收数据函数,在中断服务程序中调用
 133          {
 134   1      
 135   1          uchar data Judge;
 136   1          EA = 0;    //关CPU中断
 137   1         //    IE0 = 0;  //禁止INT0
 138   1      
 139   1          Judge = IR;
 140   1          if( Judge & 0x01)     //IR.0 = 1 接收中断
 141   1          {
 142   2              RX_buffer[0] =  RBSR;
 143   2              RX_buffer[1] =  RBSR1;
 144   2              RX_buffer[2] =  RBSR2;
 145   2              RX_buffer[3] =  RBSR3;
 146   2              RX_buffer[4] =  RBSR4;
 147   2              RX_buffer[5] =  RBSR5;
 148   2              RX_buffer[6] =  RBSR6;
 149   2              RX_buffer[7] =  RBSR7;
 150   2              RX_buffer[8] =  RBSR8;
 151   2              RX_buffer[9] =  RBSR9;
 152   2              RX_buffer[10] =  RBSR10;
 153   2              RX_buffer[11] =  RBSR11;
 154   2              RX_buffer[12] =  RBSR12;
 155   2              RXD_flag = 1;//置有接收标志
 156   2              CMR = 0X04;     //释放接收缓冲区
 157   2              Judge = ALC;//释放仲裁随时捕捉寄存器
 158   2              Judge = ECC;//释放错误代码捕捉寄存器
 159   2          }
 160   1          IER = 0x01;// .0=1--接收中断使能;
 161   1          EA = 1;//打开CPU中断
 162   1      }
 163          
 164          void main(void)
 165          {
 166   1      
 167   1              initial(   );//串口初始化
 168   1          CAN_init(  ); //SJA1000初始化,对 SJA1000寄存器的读写是采用外部寄存器寻址方式,所以不需要程序单独控制

⌨️ 快捷键说明

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