📄 rfid读卡程序.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 + -