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

📄 system.lst

📁 125K曼彻斯特编码的只读ID卡读头程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 237   4                   return;
 238   4                }
 239   3             }
 240   2             TH0 = 0;
 241   2             TL0 = 0;
C51 COMPILER V6.23a  SYSTEM                                                                02/04/2009 09:04:10 PAGE 5   

 242   2             while(DIN)
 243   2             {
 244   3                if(TH0 > 6)
 245   3                {
 246   4                   TR0 = 0;
 247   4                   return;
 248   4                }
 249   3             }
 250   2             TH0 = 0;
 251   2             TL0 = 0;
 252   2             //WDT_CONTR = 0x3c;
 253   2             while(i < 11)
 254   2             {
 255   3                if(!last_level_flag)       //上次读卡时是低电平
 256   3                {
 257   4                   while(!DIN)
 258   4                   {
 259   5                      if(TH0 > 6)
 260   5                      {
 261   6                         TR0 = 0;
 262   6                         return;
 263   6                      }
 264   5                   }
 265   4                   sz.sk[0] = TH0;
 266   4                   sz.sk[1] = TL0;
 267   4                   last_level_flag = 1;
 268   4                   if(sz.kk > 300)            //不是空跳转则是有效数据0
 269   4                   {
 270   5                   TL0 = 0;
 271   5                   TH0 = 0;
 272   5                      if(head_flag)
 273   5                      {
 274   6                         *sip <<= 1;
 275   6                         if(++j > 4)
 276   6                         {
 277   7                            j = 0;
 278   7                            ++i;
 279   7                            //*sip &= 0x1f;
 280   7                            ++sip;
 281   7                         }
 282   6                      }
 283   5                      else n = 0;
 284   5                   }
 285   4                }
 286   3                else                       //上次读卡时电平是高电平
 287   3                {
 288   4                   while(DIN)
 289   4                   {
 290   5                      if(TH0 > 6)
 291   5                      {
 292   6                         TR0 = 0;
 293   6                         return;
 294   6                      }
 295   5                   }
 296   4                   sz.sk[0] = TH0;
 297   4                   sz.sk[1] = TL0;
 298   4                   last_level_flag = 0;
 299   4                   if(sz.kk > 300)         //不是空跳转则是有效数据0
 300   4                   {
 301   5                   TL0 = 0;
 302   5                   TH0 = 0;
 303   5                      if(head_flag)
C51 COMPILER V6.23a  SYSTEM                                                                02/04/2009 09:04:10 PAGE 6   

 304   5                      {
 305   6                         *sip <<= 1;
 306   6                         *sip |= 1;
 307   6                         if(++j > 4)
 308   6                         {
 309   7                            j = 0;
 310   7                            ++i;
 311   7                            //*sip &= 0x1f;
 312   7                           ++sip;
 313   7                         }
 314   6                      }
 315   5                      else if(++n == 9)
 316   5                      {
 317   6                         head_flag = 1;
 318   6                         i = 0;
 319   6                         j = 0;
 320   6                         sip = &card_code;
 321   6                      }
 322   5                   }
 323   4                }
 324   3             }
 325   2             TR0 = 0;
 326   2             CFE = 1;   //读禁止
 327   2             //WDT_CONTR = 0x3c;
 328   2             new_flag = 1;
 329   2             s = 2;
 330   2             n = 0;
 331   2             for(i=0;i<11;i++)
 332   2             {
 333   3                n |= card_code[i];
 334   3                if(card_code[i] & 0xe0)
 335   3                {
 336   4                   new_flag = 0;
 337   4                   return;
 338   4                }
 339   3                //else if(card_code[i] != old_card[i])
 340   3                //   {
 341   3                //      old_card[i] = card_code[i];
 342   3                //      card_code[i] = 0;
 343   3                //      new_flag = 0;
 344   3                //      s = 0;
 345   3                //   }
 346   3             }
 347   2             if(n == 0)
 348   2             {
 349   3                new_flag = 0;
 350   3                return;
 351   3             }
 352   2          }
 353   1          if(card_code[10]&0x01)             //最后1位=1 则错误
 354   1          {
 355   2             new_flag = 0;
 356   2             return;
 357   2          }
 358   1          k = 0;
 359   1          for(i=0;i<10;i++)
 360   1          {
 361   2             ACC = card_code[i];
 362   2             if(P)                           //行校验
 363   2             {
 364   3                new_flag = 0;
 365   3                return;
C51 COMPILER V6.23a  SYSTEM                                                                02/04/2009 09:04:10 PAGE 7   

 366   3             }
 367   2             k ^= ACC;
 368   2          }
 369   1          k ^= card_code[10];
 370   1          k &= 0x1e;                         //列校验
 371   1          if(k)
 372   1          {
 373   2             new_flag = 0;
 374   2             return;
 375   2          }
 376   1      
 377   1          for(i=2;i<10;i++)
 378   1          {
 379   2             card_code[i] =  card_code[i]>>1;
 380   2          }
 381   1          card_code[10] = 0;
 382   1          for(i=2;i<10;i++)
 383   1          {
 384   2             card_code[10] ^=  card_code[i];
 385   2          }
 386   1          //card_code[10] = card_code[10] ^ card_code[1];
 387   1          card_code[0] = 0xAA;               //帧头
 388   1          card_code[1] = 0xAA;               //帧头
 389   1          card_code[11] = 0x55;              //帧尾
 390   1          uart_send1(card_code,12);
 391   1      
 392   1          CCF0 = 0;
 393   1          CH = CH_VALUE;                     //定时记数初值
 394   1          CL = CL_VALUE;                     //定时记数初值
 395   1          CR = 1;                            //PCA计数器计数开
 396   1      
 397   1          LED = 0;                           //接收到一个刷卡信号以后输出指示
 398   1          led_flag = 1;                      //led显示标志
 399   1          led_time = 15;                     //led 闪烁时间 1.5 秒
 400   1      
 401   1          //WDT_CONTR = 0x3c;
 402   1      }
 403          
 404          //=====================================================================
 405          //曼彻斯特码处理函数
 406          //曼切斯特码头特征: 在码缓冲区中连续9个1则是头码
 407          //                   找到头码后纪录数据启始位置
 408          //                   找到头码返回1,没有头码返回0
 409          //
 410          //数据格式如下:
 411          //                U7   U6   U5   U4    P   0 = 用户标识
 412          //                U3   U2   U1   U0    P   1 = 用户标识
 413          //                D31  D30  D29  D28   P   2
 414          //                D27  D26  D25  D24   P   3
 415          //                D23  D22  D21  D20   P   4
 416          //                D19  D18  D17  D16   P   5
 417          //                D15  D14  D13  D12   P   6
 418          //                D11  D10  D9   D8    P   7
 419          //                D7   D6   D5   D4    P   8
 420          //                D3   D2   D1   D0    P   9
 421          //                X    X    X    X     0
 422          //
 423          // X 列校验 P 行校验
 424          //数据正确返回0   错误返回1
 425          //=====================================================================
 426          //00 14 00 00 0F 1B 1E 1D 0A 17 1E 00
 427          //00  A  0  0  7  D  F  E  5  B  F
C51 COMPILER V6.23a  SYSTEM                                                                02/04/2009 09:04:10 PAGE 8   

 428          /*void decode_data()
 429          {
 430              UINT8 i,k,s;
 431              //WDT_CONTR = 0x3c;
 432          //------------------------------------------------------------------------------
 433          //判断程序接收到的数据是否正确
 434          //00 14 00 00 0F 1B 1D 05 0A 03 10 00
 435          //00 14 00 00 0F 1B 1E 1D 0A 17 1E 00
 436          
 437              s = card_code[0];
 438          
 439              DT1 = 1;                             //输出数据值
 440          
 441              wait_flag = 1;                       //等待发送维根数据标志
 442              wait_time = 10;                      //等待发送时间500毫秒
 443              Ready = 0;                           //输出=0,通知主CPU准备发送韦根数据
 444              //while(!wait_flag);
 445          
 446          //--------------------------------------------------------------------------
 447          //开始发送数据, i=发送的数据个数,k=发送的数据位
 448          //向主CPU传送EM卡的卡号,采用串行移位寄存器方式发送数据
 449          //DT1传送数据,SCLK 传送同步时钟, SCLK=0时数据有效,SCLK=1时改变数据
 450              i=0; k=0;
 451              while(1)
 452              {   if(s&0x80)DT1=1;else DT1=0;       //输出数据值
 453                  wait_time=6;
 454                  while(SCLK)
 455                  {   //WDT_CONTR=0x3c;
 456                      if(!wait_flag){Ready=1;return;}
 457                  }
 458                  wait_time=6;
 459                  while(!SCLK)
 460                  {   //WDT_CONTR=0x3c;
 461                      if(!wait_flag){Ready=1;return;}
 462                  }
 463                  wait_time=6;
 464                  s<<=1;
 465                  if(++k>7)  //1个字节数据发送完毕
 466                  {   k=0; if(++i>12){Ready=1;return;}
 467                      else s=card_code[i];
 468                  }
 469              }
 470          }*/
 471          /***********************************************************************************
 472          函数名称:sys_init()
 473          功能描述:系统初始化子程序
 474          参    数:无
 475          ***********************************************************************************/
 476          void sys_init(void)
 477          {
 478   1          P1 = 0xFF;
 479   1          P3 = 0xFF;

⌨️ 快捷键说明

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