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

📄 em4100.lst

📁 用芯片u2270b读取id卡EM4100的数据
💻 LST
字号:
C51 COMPILER V8.16   EM4100                                                                11/11/2008 21:35:28 PAGE 1   


C51 COMPILER V8.16, COMPILATION OF MODULE EM4100
OBJECT MODULE PLACED IN EM4100.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE EM4100.c OPTIMIZE(0,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          /*                 检测方法
   3          1).确定起始位,首先要正确找到数据1 按规则下跳为1 上跳为0. 可检测高电平并等其变低
   4                  但这会把0错检为1因为0也存在高电平。但是如果检测到一个周期的高电平(数据01)则可
   5                  确定找到了数据1,找到1后就可以同步了,因为EM4100卡最后一位数据就是0正好可以利用
   6                  作为判断的特征。
   7          
   8          2).对于数据的确定,由于有了同步则可在同步后延时384us即3/4个码原周期在判断接受段电平如何
   9                  如为高则置数据为1,并一直等到低电平的出现,相反则等高电平的出现,并在此之间插入超时
  10                  判断。这样,一个完整的数据判断就完成了,并确保数据的准确性,另外这种方法的抗干扰性
  11                  会非常好,而如果采用定时同步的话则会因信号的畸变而引起数据出错,整体会导致读卡几率降低
  12                  但是此程序也有其缺点,因为采用纯延时判断的手段,因此其占用单片机的运行时间比较大。
  13          
  14          3).同步后开始接受同步数据即9个1,这一部分用一个循环做,如果出错则放弃接收
  15          
  16          4).同步数据接收完后,则开始接受数据,数据分11行5列接收以利于校验位的判断
  17                  如有出错则放弃数据
  18          
  19          5).如一切正常则返回卡号,如因尝试读卡次数到了则返回0以表示没有卡
  20          
  21          6). 作者:章其波
  22                  时间:2006-5-15
  23                  Email:sudazqb@163.com
  24                  Phone:13771767085
  25                  QQ:   272200296
  26                  
  27          心得:
  28                  
  29          此程序真的很烦,花了我近六个小时
  30          其中的循环真的是太绕人了
  31          但这个程序比我之前那个用定时同步写的程序要好多了
  32          由于没有见过别人是怎么写的,这仅是我闭门造车造出来的
  33          相信一定有高人写出更好的程序
  34                                                                                                                                                  
  35          */
  36          
  37          
  38          #include"EM4100.h"
  39          
  40          
  41          //精确的384us延时,此延时可以不严格,但要大于256us小于512us
  42          void Delay384us()
  43          {
  44   1              uchar i=DELAY_VAL;
  45   1              while(i--);
  46   1      }
  47          
  48          
  49          //读取卡号,
  50          ulong Read_Card()
  51          {
  52   1              uchar i=0;      //起始为的计数值
  53   1              uchar error;  //时间溢出的计数值
  54   1              uchar error_flag; //时间溢出标志
  55   1              uchar row,col;    //行列寄存器
C51 COMPILER V8.16   EM4100                                                                11/11/2008 21:35:28 PAGE 2   

  56   1              uchar row_parity;  //行校验寄存器
  57   1              uchar col_parity[5]; //列校验寄存器
  58   1              uchar _data;            //数据寄存器
  59   1              ulong temp;                     //卡号寄存器
  60   1              ulong timeout=0;         //搜索次数寄存器
  61   1              while(1)
  62   1              {               
  63   2                      if(timeout==10)return 0;//尝试10次搜索,如没有责返回0
  64   2                      else timeout++;
  65   2                      error=0;
  66   2                      while(Manchester_IN==0)//等高电平
  67   2                      {
  68   3                              if(error==TIME_OF)break;//超时退出
  69   3                              else error++;
  70   3                      }       
  71   2                      if(error==100)continue;//结束本次主循环
  72   2                      else error=0;   
  73   2                      Delay384us();     
  74   2                      if(Manchester_IN)//寻找真正的1起始位,利用01的波形确定1起始位,即最后一位加第一位
  75   2                      {        
  76   3                              for(i=0;i<8;i++)//判断是否是真的起始位
  77   3                              {         
  78   4                                      error=0;           //限定等待时间
  79   4                                      while(Manchester_IN)
  80   4                                      {       
  81   5                                              if(error==TIME_OF)
  82   5                                              {         
  83   6                                                      error_flag=1;//时间溢出
  84   6                                                      break;  //退出
  85   6                                              }
  86   5                                              else error++;
  87   5                                      }        
  88   4                                      Delay384us();                              //延时至下一码原
  89   4                                      if(Manchester_IN&&error_flag==0); //判断下一位是否为1 和是否没有时间溢出
  90   4                                      else break;                      //不是1退出,溢出退出                      
  91   4                              }
  92   3                              if(error_flag)//因时间溢出造成的本次主循环退出
  93   3                              {         
  94   4                                      error_flag=0;
  95   4                                      continue;       //退出本次循环
  96   4                              }
  97   3                              else;
  98   3                              if(i==8)  //起始位接受完并且正确后开始接受数据
  99   3                              {       
 100   4                                      error_flag=0;
 101   4                                      error=0;         //限定等待时间
 102   4                                      while(Manchester_IN)
 103   4                                      {  
 104   5                                              if(error==TIME_OF)
 105   5                                              {       
 106   6                                                      error_flag=0;
 107   6                                                      break;           //时间溢出造成的出错
 108   6                                              }
 109   5                                              else error++;
 110   5                                      }         
 111   4                                      if(error_flag)     
 112   4                                      {
 113   5                                              error_flag=0;
 114   5                                              continue;          //因等待待第一个正式数据错误引起的本次主循环退出
 115   5                                      }
 116   4                                      else; 
 117   4                                      //所有列校验清零
C51 COMPILER V8.16   EM4100                                                                11/11/2008 21:35:28 PAGE 3   

 118   4                                      col_parity[0]=col_parity[1]=col_parity[2]=col_parity[3]=col_parity[4]=0;
 119   4                                      for(row=0;row<11;row++) //共11行数据
 120   4                                      {
 121   5                                              for(col=0,row_parity=0/*行校验清零*/;col<5;col++)//共5列数据
 122   5                                              {
 123   6                                                      Delay384us();  //延时至下一码原
 124   6                                                      if(Manchester_IN)_data=1;  //数据为1
 125   6                                                      else _data=0;                      //数据为0
 126   6                                                      if(col<4&&row<10)                  //数据区的接受,后四个字节
 127   6                                                      {
 128   7                                                              temp<<=1;                        //左移一位
 129   7                                                              temp+=(ulong)_data;      //数据相加
 130   7                                                      }
 131   6                                                      else;
 132   6                                                      row_parity+=_data;               //行校验加入数据
 133   6                                                      col_parity[col]+=_data;  //相应列校验加入数据  虽最后一列没有校验但为了方便也加上
 134   6                                                      error=0;                                 //限定等待时间清零
 135   6                                                      while(Manchester_IN==(bit)_data)
 136   6                                                      {
 137   7                                                              if(error==TIME_OF)                //由于时间溢出造成的数据出错
 138   7                                                              {       
 139   8                                                                      error_flag=1;
 140   8                                                                      break;                    //退出本while循环
 141   8                                                              }
 142   7                                                              else error++;
 143   7                                                      }
 144   6                                                      if(error_flag)break;     //出错退出内层for循环
 145   6                                                      else;
 146   6                                              }
 147   5                                              if(row<10)//最后一行没有校验所以要加限制
 148   5                                              {
 149   6                                                      if((row_parity&0x01)||error_flag) //出错退出外for循环
 150   6                                                      {
 151   7                                                              temp=0;
 152   7                                                              error_flag=1; 
 153   7                                                              break;                   //退出
 154   7                                                      }
 155   6                                                      else;
 156   6                                              }
 157   5                                              else;    
 158   5                                      }
 159   4      
 160   4                                      //对最后接收的列校验进行判断,及对来自上面数据错误error_flag处理以结束本次主循环
 161   4                                      if(error_flag||((col_parity[0]&0x01)&&(col_parity[1]&0x01)&&(col_parity[2]&0x01)&&(col_parity[3]&0x01)
             -))
 162   4                                      {       //最后一列没有校验                                                                                               
 163   5                                              error_flag=0;
 164   5                                              temp=0;
 165   5                                              continue; //退出本次循环
 166   5                                      } 
 167   4                                      else return temp;//将正确的数据返回
 168   4                              }
 169   3                              continue;
 170   3                      }
 171   2                      continue;
 172   2              }
 173   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    507    ----
   CONSTANT SIZE    =   ----    ----
C51 COMPILER V8.16   EM4100                                                                11/11/2008 21:35:28 PAGE 4   

   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     21    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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