RFID读卡程序。硬件工作原理:基站在上电的情况下通过耦合线圈发射频率为125k的正弦波,ID卡的耦合线圈在125k的正弦波的激励下产生感应电动势,它为整个ID卡提供电源。ID卡通过调制电路根据其卡类的数据使ID卡的耦合线圈也发出正弦波,基站的耦合线圈接收到,根据它与125k波的不同来表示不同的数据。并将其通过DATA端以曼切斯特码的形式输出。
说明:以下程序是读取基站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 ; )
{
评论0