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

📄 rfid读卡程序.txt

📁 RFID读卡程序。硬件工作原理:基站在上电的情况下通过耦合线圈发射频率为125k的正弦波
💻 TXT
字号:
说明:以下程序是读取基站DATA端数据,并加以校验正确后,将卡内正确数据存放于effectdata[5]中,而没有直接给出main函数,故可根据需要编写main调用effectdata[5](内存有正确的卡内数据)。

/////////////////////////////////////////////////////////////////////////////////////////

                                 文件名:IC_Read.h

/////////////////////////////////////////////////////////////////////////////////////////

#ifndef _IC_Read_h

#define _IC_Read_h

 

typedef unsigned char uint8 ;

 

//宏定义

#define RFID_DATA  P3_2       //外部中断口 接收数据

#define OpenRFID   P3_7 = 0   //打开RFID电源

#define OffRFID    P3_7 = 1   //关闭RFID电源

 

/******变量申明********/

extern uint8 InitRFID   ; // 0: 未初始化RFID模块   1: 已经初始化RFID模块

extern uint8 RFIDdataOk ; // 0: RFID接收数据失败   1: RFID成功接收数据

 

extern uint8 temp_buf[16]  ;

extern uint8 effectdata[5] ;

extern uint8 count         ;

extern uint8 t_count       ;

 

 

//函数申明

void IC_Read() ;

void Data_reveice() ;

void Lmove_bite() ;

uint8 find_head() ;

uint8 Data_L_check() ;

uint8 Data_R_check() ;

uint8 Data_Sever() ;

void Get_EffectData(uint8 edata) ;

 

#endif

/////////////////////////////////////////////////////////////////////////////////////////

                                 文件名:IC_Read.C

/////////////////////////////////////////////////////////////////////////////////////////

#include"at89x52.h"

#include"Timer.h"

#include"EX0.h"

#include"IC_Read.h"

#include"ES.h"

 

/******变量申明*********/

uint8 tcount        ;

uint8 count         ;

uint8 t_count       ;

uint8 temp          ;

uint8 temp_buf[16]  ;

uint8 effectdata[5] ;

 

uint8 RFIDdataOk    ; // 0: RFID接收数据失败   1: RFID成功接收数据

uint8 InitRFID      ; // 0: 未初始化RFID模块   1: 已经初始化RFID模块

 

/*********************************************

函数名:IC_Read

功能:  初始化RFID模块

参数:  无

*********************************************/

void IC_Read()

{  

         OpenRFID       ;  //开RFID

 

         count = 0 ;

        

         Init_RFIDEX0() ;  //开外部中断0 处理RFID中断

}

 

/*********************************************

函数名:EX0_Serve

功能:  外部中断0 初始化定时器1 定时128us

参数:  无

*********************************************/

void EX0_Serve() interrupt 0    //外部中断0

{

         Init_Timer1() ;             //初始化定时器1

         tcount = 0 ;         

}

 

/*********************************************

函数名:Timer1_Serve

功能:  定时器1中断

参数:  无

*********************************************/

void Timer1_Serve() interrupt 3  //定时1中断

{

         Data_reveice() ;

 

         tcount ++ ;

         if( tcount == 5 )

         {

                   InitRFID = 0   ;     //允许RFID重新初始化

                 RFIDdataOk = 0 ;     //允许RFID重新接收数据

         }

 

         TH1  = 0xfe ;                // 再定时 128X2=256us

         TL1  = 0x95 ;

}

 

/*********************************************

函数名:Data_reveice

功能:  定时器1中断接收RFID数据

参数:  无

*********************************************/

/*void deplay(uint8 time)

{

         uint8 t;

         while(time--)

         {

                   while(t--);

         }

}*/

 

 

void Data_reveice()

{P2=0x00;

         if(RFID_DATA==1)

         {

                   temp_buf[count/8] = (temp_buf[count/8]|(0x01<<(count%8)) ) ;

         }

 

          if(RFID_DATA==0)

          {

                   temp_buf[count/8] = (temp_buf[count/8]&(~(0x01<<(count%8))) ) ;

          }

        

         count ++ ;

         if(count==128)                           //0x80)

         {

                   count=0 ;

            

                   TR1=0;                       //TCON = ( TCON & 0xbf ) ; //TR1= 0  关定时器1

                EA=0;                   //IE = ( IE & 0x7f ) ;     //EA = 0  关外部中断0

                  

                   OffRFID ;                //关RFID 

  

                   if( Data_Sever() )       //RFID数据处理成功 等待usb发送

                   {

                            RFIDdataOk = 1 ;     //禁止RFID接收数据                           

             }

                   else                     //RFID数据处理失败

                   {

                   //      P3_4=0;///////////////////////////////////////////////////////////////////////////////////

                   //      deplay(0x1f);

                   //      P3_4=1;

                            InitRFID = 0   ;     //允许RFID重新初始化

                          RFIDdataOk = 0 ;     //允许RFID重新接收数据

                 }

         }

         P2=0xff;

}

 

/*********************************************

函数名:Lmove_bite

功能:  128位左移一位。

参数:  无

*********************************************/

void Lmove_bite()

{       

         uint8 tempData0=0 ;

         for(temp=0 ; temp<0x10 ; temp++ )         //循环16次

         {

                   if( temp == 0 )

                   { tempData0 = ( (temp_buf[0]&0x01) <<7 ) ;} //保存数组0 的1位

 

                   if( temp == 0x0f )

                   { temp_buf[temp] =( (temp_buf[temp]>>1) | tempData0 ) ; }

                   else

                   {

                            temp_buf[temp] = ( (temp_buf[temp]>>1) |  ( (temp_buf[temp+1]&0x01) <<7 ) ) ;

                   }

         }

 

}

 

/*******************************************

函数名:find_head

功能:  循环移位 查找128位数据的9个1 :

             1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0

参数:       无

*********************************************/

uint8 find_head()

{

         for(count=0;count<128;count++)

         {

                   if( (temp_buf[0]==0x55) && (temp_buf[1]==0x55) && ((temp_buf[2]&0x03)==0x01) )

                   {return 1;}

                   else

                   {Lmove_bite();}

         }

         return 0 ;

}

 

/*******************************************

函数名:get_data

功能:  将128位 除9个1 0 的位转化为55位

参数:  无

********************************************/

void get_data()

{

         for( count=0 ,t_count=0 ; count <= 126 ; )//0x6c ;  )

         {

                   if(( temp_buf[((count+18)/8)]&(0x01<<((count+18)%8)))>\         

                   ( temp_buf[((count+19)/8)]&(0x01<<((count+19)%8))))                 //1

                   { temp_buf[t_count/8] = ( temp_buf[t_count/8] | ( 0x01 << (t_count%8) ) ) ; }

 

                   if(( temp_buf[((count+18)/8)]&(0x01<<((count+18)%8)))<\        

                   ( temp_buf[((count+19)/8)]&(0x01<<((count+19)%8))))                  //0

                   { temp_buf[t_count/8] = ( temp_buf[t_count/8] & ( ~ ( 0x01 << (t_count%8) ) ) ) ; }

 

                   t_count++;

                   count=count+2;

         }

}

 

/*********************************************

函数名:Data_L_check

功能: 列校验

返回值: 列校验成功返回1   列校验失败返回0 

********************************************/

uint8 Data_L_check()

{

         for(count=0 ; count < 0x04 ; count++)

         {

                   temp = 0 ;

                   t_count = count ;

    for(  ; t_count <= 53 ; )//0x37 ; )

                   {       

                            if( ( temp_buf[(t_count/8)] & (0x01<<(t_count%8)) ) )//>> (t_count%8) )

                            {

                                     temp ++ ;

                            }

                            t_count = t_count + 5 ;

                   }

 

                   if((temp%2)!= 0)

                   {

                           return 0 ;  //列校验失败

                   }

         }

         return 1 ;

}

 

/*********************************************

函数名:Data_R_check

功能:  行校验  [7]

参数:  行校验成功返回1   行校验失败返回0

********************************************/

uint8  Data_R_check()

{

         uint8 t_buf[5] ;

         count=0 ;

 

         for(t_count=0 ; t_count<= 45 ; )//0x32 ; )

         {

                   t_buf[0] = ( ( temp_buf[(t_count/8)]     & (0x01<<(t_count%8))     ) >> (t_count%8)     ) ;

                   t_buf[1] = ( ( temp_buf[((t_count+1)/8)] & (0x01<<((t_count+1)%8)) ) >> ((t_count+1)%8) ) ;

                   t_buf[2] = ( ( temp_buf[((t_count+2)/8)] & (0x01<<((t_count+2)%8)) ) >> ((t_count+2)%8) ) ;

                   t_buf[3] = ( ( temp_buf[((t_count+3)/8)] & (0x01<<((t_count+3)%8)) ) >> ((t_count+3)%8) ) ;

                   t_buf[4] = ( ( temp_buf[((t_count+4)/8)] & (0x01<<((t_count+4)%8)) ) >> ((t_count+4)%8) ) ;

                  

 

                   if( (( t_buf[0]+t_buf[1]+t_buf[2]+t_buf[3]+t_buf[4] )%2) == 0)

                   {t_count = t_count + 5 ;}

                   else

                   {return 0 ;}    //行校验失败               

 

                   for(temp=0 ; temp<0x04 ; temp++ )

                   {

                            Get_EffectData( t_buf[temp] ) ;

                            count ++ ;

                   }

         }

         return 1 ;

}

 

/*********************************************

函数名:Get_EffectData

功能:  将一位数据依次放入数组effectdata【5】

参数:  edata 要放入数组的数据

*********************************************/

void Get_EffectData(uint8 edata)

{

         switch(edata)

         {

                   case 1:

                   effectdata[count/8] = (effectdata[count/8]|(0x01<<(count%8)) ) ;

                            break ;       

                   case 0:

                   effectdata[count/8] = (effectdata[count/8]&(~(0x01<<(count%8))) ) ;

                            break ;

         }

}

/*********************************************

函数名:Data_Sever

功能:  处理RFID数据

返回值:0 处理是失败  1 处理成功  

*********************************************/

uint8 Data_Sever()

{ 

         if(find_head() == 0 )         //寻找128位中 9个1 0  的曼切斯特码的头

         { return 0 ; }

 

         get_data() ;                  //将128位转化为除去 9个1 0 的55位       

 

         if(Data_L_check() == 0 )       //列校验

         { return 0 ; }

 

         if(Data_R_check() == 0 )          //行校验  如果成功将其放入特定的有效数组

         { return 0 ; }                          

 

         return 1 ;

}

/////////////////////////////////////////////////////////////////////////////////////////

                            文件名:Timer.h

/////////////////////////////////////////////////////////////////////////////////////////

#ifndef _Timer_h

#define _Timer_h

 

/*********************************************

函数名:Init_Timer1

功能:设定定时器1 定时128us

参数:无

*********************************************/

void Init_Timer1() ;

 

 

 

#endif

 

/////////////////////////////////////////////////////////////////////////////////////////

                            文件名:Timer.c

/////////////////////////////////////////////////////////////////////////////////////////

#include"at89x52.h"

 

/*********************************************

函数名:Init_Timer1

功能:  设定定时器1 定时128us

参数:  无

*********************************************/

void Init_Timer1()

{

         TH1  = 0xff ;//fe                //定时 128us

         TL1  = 0xa0 ;//fe

 

         TMOD = 0x10 ;                     //设置定时器1

         //TCON = ( TCON | 0x40 ) ;     //启动定时器1

         TCON =0x41 ;

         IE = 0x89;

         //IE = ( IE | 0x08 ) ;         //ET1= 1;  在 IE中 开 定时器1中断 ET1       

}

 

/////////////////////////////////////////////////////////////////////////////////////////

                            文件名:ES.h

/////////////////////////////////////////////////////////////////////////////////////////

#include"at89x52.h"

#ifndef _EX0_h

#define _EX0_h

 

/*********************************************

函数名:Init_EX0

功能:  启动外部中断0 为跳变中断

参数:  无

*********************************************/

void Init_RFIDEX0() ;

 

#endif

 

/////////////////////////////////////////////////////////////////////////////////////////

                            文件名:ES.c

/////////////////////////////////////////////////////////////////////////////////////////

/*********************************************

函数名:Init_RFIDEX0

功能:  启动外部中断0 为跳变中断

参数:  无

*********************************************/

void Init_RFIDEX0()

{

         TCON = 0x01 ;    //IT0 = 0x01 ;      设置外部中断触发方式:跳变触发 同时 关定时器1

 

         IE   = 0x81 ;    //EA  = 0x01 ;      开总中断 和 外部中断0

                          //EX0 = 0x01 ;

        

//      IP   = 0x01 ;    //PX0 = 0x01 ;      设置优先级:外部中断高

}

⌨️ 快捷键说明

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