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

📄 zlg500b.lst

📁 RFID 使用C8051F020和周立功RC500开发模块
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   ZLG500B                                                               05/28/2007 14:55:19 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE ZLG500B
OBJECT MODULE PLACED IN zlg500B.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE zlg500B.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "main.h"
   2          
   3          #define __SRC
   4          #include "zlg500B.h"
   5          #undef  __SRC
   6          
   7          
   8          
   9          void Serial_int(void) interrupt 4 using 1               //串口中断来干什么呢
  10          {
  11   1              uchar stx,index,BCC_sum=0,rcv_len=5;
  12   1              
  13   1              ES0=0;                  //串行中断允许位,
  14   1              RI0=0;                  //串口接收中断标志清零
  15   1              stx=SBUF0;              //收到的数据转到stx
  16   1                                              /*通信协议中500B向主机发出响应信号*/
  17   1              delay_50us(1);  //延时:协议中没有这一延时
  18   1      
  19   1              CON_485=1;              //TXD发送时为高 即是主机有数据发出了
  20   1              REN0=0;                 //暂时的禁止接收
  21   1              SBUF0=ACK;              //主机发送应答信号  主机己经准备好了接收从ZLG500B发出来的数据帧
  22   1              while(TI0==0);
  23   1              TI0=0;
  24   1              CON_485=0;              //因为串口己经发送完毕,将RS485控制信号拉低
  25   1              REN0=1;                 //允许接收
  26   1      
  27   1              for(index=0;index<rcv_len;index++)
  28   1              {
  29   2                      START_T2(RCAP2_10ms);                   //定时器2的10MS的溢出率是自动重装方式
  30   2                      while(RI0==0&&TF2==0);                  //没有接收到什么AND定时器2没有溢出
  31   2                      if(RI0==1)                                              //如果产生了接收中断
  32   2                      {       RI0=0;                                          
  33   3                              ser_buffer[index]=SBUF0;                //发送数据
  34   3                              if(index==LENGTH)                       //发到最后一个数据了    
  35   3                                      rcv_len+=ser_buffer[index];                     //最后一个数据与rcv_len
  36   3                              if(index<rcv_len-2)                                             //当前序列号小于3
  37   3                                      BCC_sum^=ser_buffer[index];                     //异或
  38   3                                      /*      BCC校验码计算数据块中所有的INFO字节然后将结果传送到数据块的最后一个字节
  39   3                                              如下式所示
  40   3                                              INFO[n] = BCC = ~ INFO[0] ⊕ INFO[1] ⊕ ... ⊕ INFO[n-1] (⊕ ... XOR ~…NOT)*/
  41   3                      }
  42   2                      else    break;
  43   2              }               //完成的数据的下行,命令模式
  44   1                              
  45   1              STOP_T2();              //停用TIMER2
  46   1              ES0=1;                  //串行口中断允许位
  47   1              
  48   1              if(stx!=STX)    return;         //如果主机收到的是错的数据
  49   1              if(index==rcv_len)
  50   1              {
  51   2                      if(BCC_sum!=~ser_buffer[rcv_len-2])     return;         //BCC码又不对
  52   2                      if(ser_buffer[rcv_len-1]!=ETX)  return;                 //结束标志数据又不对
  53   2              }
  54   1              else    return;
  55   1      
C51 COMPILER V7.20   ZLG500B                                                               05/28/2007 14:55:19 PAGE 2   

  56   1              newdata=1;                      //成功          当中断接收到新数据时该位置位
  57   1      }       
  58          
  59          
  60          uchar senddata()
  61          {
  62   1              uchar send_cnt=3;               //主机最多发3次STX信号
  63   1              uchar send_len;
  64   1              uchar temp;
  65   1      
  66   1              ES0=0;                  //串行中断允许
  67   1              do
  68   1              {       CON_485=1;
  69   2                      REN0=0;
  70   2                      SBUF0=STX;              //主机向从机发送开始
  71   2                      while(TI0==0);
  72   2                      TI0=0;
  73   2                      CON_485=0;              //发送完成就可以拉低
  74   2      
  75   2                      REN0=1;
  76   2                      START_T2(RCAP2_10ms);                   //自动重装方式
  77   2                      while(RI0==0&&TF2==0);                  //没有接收到什么 AND 定时器2没有溢出            //这里是查询,一定要有事发生才行
  78   2                                                                                      //很可能是串口收到数据(500B的应答信号)
  79   2                      STOP_T2();
  80   2      
  81   2                      if(RI0==1)                                              //如果收到500B的响应
  82   2                      {       RI0=0;
  83   3                              temp=SBUF0;
  84   3                              delay_50us(1);
  85   3                              if(temp==ACK)   break;          //收到500B的ACK信号
  86   3                      }
  87   2              }while(--send_cnt);
  88   1              if(send_cnt==0) return COMM_ERR;                //退出整个发送数据
  89   1                      
  90   1              
  91   1              send_len=ser_buffer[LENGTH]+5;                  //有5个附属字节
  92   1              ser_buffer[send_len-2]=0;
  93   1              ser_buffer[send_len-1]=ETX;                     //最后发送一个终止符ETX结束本次发送
  94   1              
  95   1              REN0=0;
  96   1              CON_485=1;                                      //表示又要发送数据了
  97   1              for(send_cnt=0;send_cnt<send_len;send_cnt++)
  98   1              {
  99   2                      SBUF0=ser_buffer[send_cnt];
 100   2                      if(send_cnt<(send_len-2))                       //非BCC和ETX字节
 101   2                              ser_buffer[send_len-2]^=ser_buffer[send_cnt];           //求BCC
 102   2                      if(send_cnt==send_len-3)
 103   2                              ser_buffer[send_len-2]=~ser_buffer[send_len-2];         //最后求到BCC
 104   2                      while(TI0==0);
 105   2                      TI0=0;
 106   2              }
 107   1              CON_485=0;              //发送完成收工
 108   1              REN0=1;
 109   1              ES0=1;                  //开中断
 110   1              
 111   1              return  COMM_OK;
 112   1      }
 113          
 114          
 115          
 116          uchar ser_comm(void)            //主机等待500B发回状态和响应数据.若在300MS内未检测到响应,则退出本次传输
 117          {
C51 COMPILER V7.20   ZLG500B                                                               05/28/2007 14:55:19 PAGE 3   

 118   1              uchar ser_wdg=120;
 119   1              if(senddata()!=COMM_OK) return COMM_ERR;                //数据发送失败
 120   1      
 121   1              START_T2(RCAP2_2ms);                            //定时器溢出2MS 
 122   1              while(newdata==0&&ser_wdg!=0)
 123   1              {
 124   2                      if(TF2)
 125   2                      {
 126   3                              START_T2(RCAP2_2ms);
 127   3                              ser_wdg--;
 128   3                      }
 129   2              }
 130   1              if(newdata)     
 131   1              {       
 132   2                      newdata=0;
 133   2                      return COMM_OK;
 134   2              }
 135   1              else
 136   1                      return COMM_ERR;                        //在300MS未栓测到响应   
 137   1      }
 138          
 139          
 140          
 141          #if mifs_request_en
 142          uchar mifs_request(uchar _Mode,uchar idata *_TagType)           //发出询问命令,栓查在在效范围内是否有卡存在
 143          {       
 144   1              ser_buffer[SEQNR]=0;                                            //数据交换包的序号
 145   1              ser_buffer[COMMAND]=0x41;                                       //命令对应的数值
 146   1              ser_buffer[LENGTH]=0x01;                                        //数据长度
 147   1              ser_buffer[DATA]=_Mode;                                         //只有一个数据
 148   1              
 149   1              if(ser_comm()!=COMM_OK)                                         //主机等待500B发回状态和响应数据.若在300MS内未检测到响应,则退出本次传输
 150   1                      return COMM_ERR;
 151   1                      
 152   1              if(ser_buffer[STATUS]==MI_OK)           //500B---主机:响应模式的状态字符
 153   1              {
 154   2                      _TagType[0]=ser_buffer[DATA];
 155   2                      _TagType[1]=ser_buffer[DATA+1];
 156   2              }
 157   1              return ser_buffer[STATUS];                              //返回状态值
 158   1      }
 159          #endif
 160          

⌨️ 快捷键说明

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