baynkrnr 发表于 2013-1-20 11:05:21

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);
}

lyp103 发表于 2013-1-23 16:05:23

我做的模拟ID卡距离大概在6-8CM左右,其实就是驱动加个三极管就好了。天线大点距离会远点

baynkrnr 发表于 2013-1-25 20:16:18

原来这样子,我明天试试,可以拿去破人家的大门了

BG8CTZ 发表于 2014-1-6 15:32:14

请把硬件图贴出来

zyw19987 发表于 2014-1-6 23:26:46

小心请去喝茶

LZ19992005 发表于 2014-2-15 19:50:47

先看看,谢谢!
页: [1]
查看完整版本: STC12C5A32AD做有源RFID(万能ID卡)