微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机与rfid串口

51单片机与rfid串口

时间:10-02 整理:3721RD 点击:
前几天在淘宝上买了一个frid的板子,然后就只有一个用户手册,在手册上发现一家公司,去主页找到了一份与51的代码,如下,然后就是我在串口发命令可以吧买的电子标签的UID读出来,可是在程序中就是读不到,求大神帮忙分析一下程序:
////////////////////////////////////////////////////////////
//Test SL025x
//MCS51 source code
////////////////////////////////////////////////////////////   
#include <reg52.h>
#include <string.h>
#define  true     1
#define  false    0
//#define  OSC_FREQ        22118400L
#define  OSC_FREQ        13560000L
#define  TIME0_10ms      65536L - OSC_FREQ/1200L
#define  BOUND4800       256 - 24
#define  BOUND9600       256 - 12
#define  BOUND14400      256 - 8
#define  BOUND19200      256 - 6
#define  BOUND28800      256 - 4
#define  BOUND38400      256 - 3
#define  BOUND57600      256 - 2
#define  BOUND115200     256 - 1
//IO definition
sbit CARDIN = P1^0;                                                     
sbit led =P1^1;
void InitializeSystem();                                                           
void SendCom(unsigned char *g_cCommand);                                          
void StartTime(unsigned int _MS);                                                  
void StopTime();
char ReadWriteUltralight(void);
char ReadWriteMifareStd(void);
//Command List, preamble + length + command code + data frame
unsigned char code SelectCard[4] =     {0xBA,0x02,0x01,0xB9};      
unsigned char code LoginSector0[11] =  {0xBA,0x0A,0x02,0x00,0xAA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};  
unsigned char code LoginSector1[11] =  {0xBA,0x0A,0x02,0x01,0xAA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
unsigned char code ReadBlock1[4]   =   {0xBA,0x03,0x03,0x01};                                    
unsigned char code WriteBlock1[20] =   {0xBA,0x13,0x04,0x01,0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF};                                
unsigned char code ReadValue[4]  =     {0xBA,0x03,0x05,0x05};  
unsigned char code InitializeValue[8] ={0xBA,0x07,0x06,0x04,0x00,0x00,0x00,0x01};                                
unsigned char code IncrementValue[8] = {0xBA,0x07,0x08,0x04,0x00,0x00,0x00,0x20};                                
unsigned char code DecrementValue[8] = {0xBA,0x07,0x09,0x04,0x03,0x00,0x00,0x00};                                          
unsigned char code CopyValue[5] =      {0xBA,0x04,0x0A,0x04,0x05};
unsigned char code ReadULPage5[4] =    {0xBA,0x03,0x10,0x05};                                          
unsigned char code WriteULPage5[8] =   {0xBA,0x07,0x11,0x05,0x11,0x22,0x33,0x44};
unsigned char code TurnOnRedLed[4] =   {0xBA,0x03,0x40,0x01};     
unsigned char code TurnOffRedLed[4] =  {0xBA,0x03,0x40,0x00};            
                           
unsigned char g_ucReceBuf[21];                                      
unsigned char g_ucReceNum;                                          
unsigned char g_ucWatchTime;
unsigned char g_ucCardType;
char g_cStatus;                                       
char g_cErr;
bit   g_bReceOver;                                                
bit   g_bReceReady;
bit   g_bTimeOut;                                                  
void main()
{
     InitializeSystem();
     
     while(1)
     {
         while (!CARDIN)
         {   
              g_cErr = 0;
     //Get the unique serial number of Mifare Card
              SendCom(SelectCard);                              //
              StartTime(8);                                     //waitting until receive response from SL013 or over 80ms
              while (!g_bReceOver && !g_bTimeOut);              //
              StopTime();                                       //
              if ((g_ucReceBuf[2]!=0x01) || (g_ucReceBuf[3]!=0) || g_bTimeOut)
              {   led = 0;continue;   }     
              if (g_ucReceBuf[1] == 8)
           {
        
               g_ucCardType = g_ucReceBuf[8];
//      if(g_ucReceBuf[9]==0x11)
//      {
//      
//      }
           }
           else
           {
               g_ucCardType = g_ucReceBuf[11];
           }
           
           switch(g_ucCardType)
              {  
                  case 1://Mifare 1k 4 byte UID
                  case 2://Mifare 1k 7 byte UID
                      g_cStatus = ReadWriteMifareStd( );
                      if (g_cStatus != true)
                      {    g_cErr = 3;    }
                      break;
                  case 3://Mifare_UltraLight
                      g_cStatus = ReadWriteUltralight( );
                      if (g_cStatus != true)
                      {    g_cErr = 3;    }
                      break;
                  case 4://Mifare 4k 4 byte UID
                  case 5://Mifare 4k 7 byte UID
                      g_cStatus = ReadWriteMifareStd( );
                      if (g_cStatus != true)
                      {    g_cErr = 3;    }
                      break;
                   case 6://Mifare_DesFire
                      g_cErr = 4;
                      break;                 
               default:
                   g_cErr = 3;
                      break;
              }
//Glare Red_Led to indicate working ok               
              if (g_cErr == 0)
              {
            SendCom(TurnOnRedLed);                           
                  StartTime(8);                                    
                  while (!g_bReceOver && !g_bTimeOut);              
                  StopTime();  
                  
                  StartTime(20);                                    
                  while (!g_bTimeOut);              
                  StopTime();
                  
                  SendCom(TurnOffRedLed);                           
                  StartTime(8);                                    
                  while (!g_bReceOver && !g_bTimeOut);              
                  StopTime();                                       
              }
         }
    }
}
////////////////////////////////////////////////////////////
char ReadWriteUltralight(void)
{

//Write data to page5 of UltraLight   
    SendCom(WriteULPage5);                     
    StartTime(8);                                    
    while (!g_bReceOver && !g_bTimeOut);              
    StopTime();                                       
    if ((g_ucReceBuf[2]!=0x11) || (g_ucReceBuf[3]!=0) || g_bTimeOut)
    {    return false;   }
//read data from page5 of UltraLight            
    SendCom(ReadULPage5);                     
    StartTime(8);                                    
    while (!g_bReceOver && !g_bTimeOut);              
    StopTime();                                       
    if ((g_ucReceBuf[2]!=0x10) || (g_ucReceBuf[3]!=0) || g_bTimeOut)
    {    return false;   }                                            
//Compare read data with written data        
    if (memcmp(&WriteULPage5[4], &g_ucReceBuf[4], 4) != 0 )
    {    return false;   }
    else
    {    return true;   }        
}
////////////////////////////////////////////////////////////
char ReadWriteMifareStd(void)
{
    long lPurseValue;
//Verify password of sector0   
    SendCom(LoginSector0);               
    StartTime(8);
    while (!g_bReceOver && !g_bTimeOut);
    StopTime();
    if ((g_ucReceBuf[2]!=0x02) || (g_ucReceBuf[3]!=2) || g_bTimeOut)
    {    return false;   }               
            
//Write data to block1            
    SendCom(WriteBlock1);                 
    StartTime(8);
    while (!g_bReceOver && !g_bTimeOut);
    StopTime();
    if ((g_ucReceBuf[2]!=0x04) || (g_ucReceBuf[3]!=0) || g_bTimeOut)
    {    return false;   }
    if (memcmp(&WriteBlock1[4], &g_ucReceBuf[4], 16) != 0)
    {    return false;   }                 
            
//Read data from block1            
    SendCom(ReadBlock1);                 
    StartTime(8);
    while (!g_bReceOver && !g_bTimeOut);
    StopTime();
    if ((g_ucReceBuf[2]!=0x03) ||(g_ucReceBuf[3]!=0) || g_bTimeOut)
    {    return false;   }
//Compare read data with written data      
    if (memcmp(&WriteBlock1[4], &g_ucReceBuf[4], 16) != 0)
    {    return false;   }                  
//Verify password of sector1
    SendCom(LoginSector1);               
    StartTime(8);
    while (!g_bReceOver && !g_bTimeOut);
    StopTime();
    if ((g_ucReceBuf[2]!=0x02) || (g_ucReceBuf[3]!=2) || g_bTimeOut)
    {    return false;   }  
                          
//Initialize block4 to one purse, and value = 0x01000000            
    SendCom(InitializeValue);                 
    StartTime(8);
    while (!g_bReceOver && !g_bTimeOut);
    StopTime();
    if ((g_ucReceBuf[2]!=0x06) || (g_ucReceBuf[3]!=0) || g_bTimeOut)
    {    return false;   }
    if (memcmp(&InitializeValue[4], &g_ucReceBuf[4], 4) != 0)
    {    return false;   }     
//Increment            
    SendCom(IncrementValue);                 
    StartTime(8);
    while (!g_bReceOver && !g_bTimeOut);
    StopTime();
    if ((g_ucReceBuf[2]!=0x08) || (g_ucReceBuf[3]!=0) || g_bTimeOut)
    {    return false;   }  
//Decrement            
    SendCom(DecrementValue);                 
    StartTime(8);
    while (!g_bReceOver && !g_bTimeOut);
    StopTime();
    if ((g_ucReceBuf[2]!=0x09) || (g_ucReceBuf[3]!=0) || g_bTimeOut)
    {    return false;   }   
            
//Backup purse to blcok5           
    SendCom(CopyValue);                 
    StartTime(8);
    while (!g_bReceOver && !g_bTimeOut);
    StopTime();
    if ((g_ucReceBuf[2]!=0x0A) || (g_ucReceBuf[3]!=0) || g_bTimeOut)
    {    return false;   }                           
                           
//Read purse value from blcok5            
    SendCom(ReadValue);               
    StartTime(8);
    while (!g_bReceOver && !g_bTimeOut);
    StopTime();
    if ((g_ucReceBuf[2]!=0x05) || (g_ucReceBuf[3]!=0) || g_bTimeOut)
    {    return false;   }
   
//Check value   
    lPurseValue = g_ucReceBuf[7]*0x1000000 + g_ucReceBuf[6]*0x10000 + g_ucReceBuf[5]*0x100 + g_ucReceBuf[4];
    if (lPurseValue != 0x01000000 + 0x20000000 - 0x00000003)
    {    return false;   }
    else
    {    return true;   }
}
        
////////////////////////////////////////////////////////////
void InitializeSystem()
{
    TMOD &= 0x0F;
    TMOD |= 0x21;
    PCON |= 0x80;
    SCON  = 0x50;
    TH1 = TL1 = BOUND115200;
    g_ucReceNum = 0;
    g_bReceOver = 0;
    g_bReceReady = 0;
    TR1   = 1;
    IE   |= 0x90;
}
////////////////////////////////////////////////////////////
void StartTime(unsigned int _MS)
{
    TH0 = (unsigned char)((TIME0_10ms>>8)&0xFF);
    TL0 = (unsigned char)(TIME0_10ms&0xFF);
    g_ucWatchTime = _MS;
    g_bTimeOut = 0;
    ET0 = 1;
    TR0 = 1;
}
////////////////////////////////////////////////////////////
time0_int () interrupt 1 using 1
{
    TH0 = (unsigned char)((TIME0_10ms>>8) & 0xFF);
    TL0 = (unsigned char)(TIME0_10ms & 0xFF);
    if (g_ucWatchTime--==0)
    {    g_bTimeOut = 1;    }
}
////////////////////////////////////////////////////////////
void StopTime()
{
    ET0 = 0;
    TR0 = 0;
}
////////////////////////////////////////////////////////////
//Send command to SL025
////////////////////////////////////////////////////////////
void SendCom(unsigned char *g_cCommand)
{   
     unsigned char i,chkdata,sendleg;
     ES = 0;
     sendleg = *(g_cCommand+1) + 1;
     
     chkdata = 0;
     for(i=0; i<sendleg; i++)
     {   
        chkdata ^= *(g_cCommand+i);
        
        TI = 0;
        SBUF = *(g_cCommand+i);
        while(!TI);
     }
     
     TI = 0;
     SBUF = chkdata;
     while (!TI);
     TI = 0;
     
     g_bReceReady = 1;
     g_bReceOver = 0;
     ES = 1;
}
/////////////////////////////////////////////////////////////////////
//Get result from SL025
/////////////////////////////////////////////////////////////////////
seri_int () interrupt 4 using 1
{
   unsigned char i,j;
   unsigned char rece_data = SBUF;
   unsigned char verify = 0;
   
   if(RI)
   {   
       RI = 0;
       if (g_bReceReady)
       {  
           switch (rece_data)
           {   
               case 0xBD:
                    g_bReceReady = 0;
                    g_bReceOver = 0;
                    g_ucReceNum = 0;
                    g_ucReceBuf[0] = 0xBD;
                    g_ucReceBuf[1] = 0;
                    break;
               default:
                    g_ucReceNum++;
                    break;
           }
       }
       else
       {   
           i = ++g_ucReceNum;
           g_ucReceBuf[i] = rece_data;
    if (g_ucReceBuf[1] == g_ucReceNum - 1)
    {
        for (j=0; j<g_ucReceNum+1; j++)
               {   verify ^= g_ucReceBuf[j];    }
               g_bReceOver = 1;
               ES = 0;
           }
           if (g_ucReceNum > sizeof(g_ucReceBuf))
           {
               g_bReceOver = 0;
               g_ucReceNum = 0;
           }
        }
    }
   
    if(TI)
    {   
        TI = 0;
    }
}
发命令 是BA 02 01 B9,B9是前几位的异或值,回应应该为BD+08+01+00+uid+01+(前几位异或值)

单片机的串口设置正确吗,单片机是用13.56兆的晶振吗

您好,我用的是51单片机,13.0592M,我把晶频率成这个也不中

官方给的和51 的默认是22118400L

单片机的波特率取决于晶振,更换了晶振,相应的波特率参数就要更改,对于51用11。0592M的波特率的时序比较准,或者是11。0592的倍数的。
你先换成程序原来使用的参数和晶振,先调通了再考虑是不是换晶振

请问怎么用读出卡号呢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top