STC12C5A32AD做有源RFID(万能ID卡)
下面是程序,做出来的"ID'卡发射距离好近,只有2CM,晚上我再上图,希望大虾门指点指点#include <STC12C5A.H>
#include <intrins.h>
#define uint unsigned int//定义
#define ucharunsigned char//定义
#define ulongunsigned long//定义
#define SS0xff//定义 定时器高8位 250US
#define SSS 0x1a//定义 定时器低8位
void SendData(uchar buffer,uchar BitCnt);
void inita(void);
void tfsucw(uchar *uid);//行校验
uchar gqsucw(uchar *p);//列校验,返回校好列位
bit fing;
uchar tempxz;
uchar ui[]={0x25,0x00,0x39,0xb3,0xc4};
uchar uidc;
/*先送9位1.再送数据,每发4个数据就加1位行效验数据.送完后送4位列校验位。1位停止位0*/
/*分成13个数组发出去*/
void inita(void)//
{
TMOD=0x21;
TH1=0xfd;//11.0592MHz9600
TL1=0xfd;
BRT=0xd4; // 1T下是D4
// BRTCLKO=1; // 独立发生器发出125K
BRTCLKO=0x00; // 独立发生器关闭125K发出
AUXR=0x14; // 1T下是0x14
PCON&=0x80;
SCON=0x50;
TH0=SS;//
TL0=SSS;//
EA=1;
ET0=1;
ET1=0;
TR0=0;
TR1=1;
ES=1;
REN=1;
PT0=1;//定时器0中断优先级最高:第三
fing=0;
}
////////////////////
void main (void)
{
uchar tmp;
uchar e;
inita();
tfsucw(ui); //行校验
tmp=gqsucw(uidc);//列校验
while(1)
{
SendData(0xff,4); //发送9个头1
SendData(0xff,5);
for(e=0;e<10;e++)
{
SendData(uidc,5);
}
SendData(tmp,5); //发送列校验和停止位
}
}
void Time_interrupt(void) interrupt 1 //定时器0中断
{
if(fing==1)
{
TR0=0; //关闭定时器
fing=0;
}
else
{
if(BRTCLKO==0) //0
{
BRTCLKO=1; //定时器250US发出
}
else
{ //1
BRTCLKO=0;
}
fing=1; //表示过来过一次
}
TH0=SS;
TL0=SSS;
}
void tfsucw(uchar *uid)//行校验
{
// uchar uid[]={0x25,0x00,0x39,0xb3,0xc4};
uchar uidx;
uchar i,ii,n;
n=0;
for(i=0;i<5;i++) //把5数组分成10个数组,后4位都为0
{
uidx = uid;
uidx = uidx>>4;
uidc = uidx = uidx<<4; //高8位
uidx = uid;
uidc = uidx = uidx<<4;//低4位
}
///////////////////////////////////////////
for(i=0;i<10;i++) //10个数组循还10次
{
n=0;
for(ii=0;ii<4;ii++) // 每次循还4次以确定1的个数
{
if((uidx&0x80)==0x80) //计算1的个数
{
n++;
}
uidx=uidx<<1;
}
if(n%2==1) //让算出来的1不能整除2,说明
{
uidc=uidc+0x08;
}
}
}
uchar gqsucw(uchar *p)//列校验,返回校好列位
{
uchar i,ii,n,nn;
uchar m;
nn=n=0;
for(i=0;i<10;i++) //把值副给M[]
{
m=p;
}
for(i=0;i<4;i++)
{
n=0;
for(ii=0;ii<10;ii++)
{
if((m&0x10)==0x10)
{
n++;
}
m=m>>1;
}
if(n%2==1) //让算出来的1不能整除2,说明
{
nn=nn+0x80;
}
if(i!=3)
{
nn=nn>>1;
}
}
return(nn);
}
void SendData(uchar buffer,uchar BitCnt) //发送buffer数据,BitCnt要发多少位
{
tempxz=buffer;
do
{
while(TR0); //等待
if((tempxz&0x80)==0) //判断最高位是0还是1
{
BRTCLKO=0;
TR0=1;
}
else //1
{
BRTCLKO=1;
TR0=1;
}
tempxz=buffer<<1;//将buffer中的数据左移一位
buffer=tempxz;
BitCnt--;
}
while(BitCnt);
} 我做的模拟ID卡距离大概在6-8CM左右,其实就是驱动加个三极管就好了。天线大点距离会远点 原来这样子,我明天试试,可以拿去破人家的大门了 请把硬件图贴出来 小心请去喝茶 先看看,谢谢!
页:
[1]