微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微波和射频技术 > 射频综合技术问答 > 关于125KHZ RFID的疑惑!

关于125KHZ RFID的疑惑!

时间:10-02 整理:3721RD 点击:
我做的125KHZ的RFID读头,在晶振为11.0592MHz下,读一切正常,但是我把晶振频率提高到18.432MHz时就不能读了,真心求教!
#include<STC15F2K60S2.h>
#include <stdio.h>
sbit LED=P0^0;                //指示灯
sbit INPORT=P1^0;        //解码输入
//用来区分脉冲宽度的参数
#define TIME00        50
#define TIME05        260
#define TIME10        550
bit bitin;                                                        //上一次的状态位
unsigned char Buff[30];                                        //解码缓冲区
unsigned char buff0[6];
void delay_ms(unsigned int ms)                //延时函数
{
        unsigned char i;
        while(ms--)
        {
                i=112;
                while(i--);
        }
}
void printchar(unsigned char ch)   //显示16进制数
{
        if(ch>=0&&ch<=9) ch=ch+'0';               
        else if(ch>=10&&ch<=15) ch=ch+'A'-10;
        putchar(ch);
}
void printhex(unsigned char hex)   //以16进制格式输出一个字节
{
        unsigned char c;   
        c=hex;      
        c=c>>4;
        printchar(c);
        c=hex;
        c=c&0x0F;
        printchar(c);
}
//监测数据位
unsigned char readbit()
{
        unsigned int mk=TIME10;        //装入超时值
        TL0=TH0=0;                //初始化计数器
        TR0=1;                        //开始计时
        while(--mk)                //超时机制,防止等死
                if(bitin!=INPORT)        //有跳变
                {
                        break;
                }
        TR0=0;                        //停止计时
        if(mk==0)                //超时退出
                return 0;
        bitin=INPORT;        //保存状态
        mk=TH0*256+TL0;        //计算跳变的脉冲宽度
        if((mk>TIME05)&&(mk<=TIME10))        //一个周期
                return 1;
        if((mk>=TIME00)&&(mk<=TIME05))        //半个周期
                return 2;
        return 0;                //出错
}
//读一个完整地数据位
unsigned char readdata()
{
        switch(readbit())
        {
                case 1:               
                        return !bitin;
                case 2:               
                        if(readbit()!=2) return 2;       
                        return !bitin;
                default:
                        return 2;
        }
}
//接收并解码
bit CheckData()
{
        unsigned char i,j;
        bitin=INPORT;                //保存状态位
        for(i=0;i<9;i++)        //检测9个数据位1
        {
                LED=1;
                if(readdata()!=1)
                {
                        return 0;
                }               
        }
        //读取数据
        for(i=0;i<11;i++)                        //5个字节写数据
        {
                Buff[i]=0x00;
                for(j=0;j<5;j++)                //往一个字节写数据
                {
                        Buff[i]<<=1;
                        switch(readdata())
                        {
                                case 0:                //0
                                        break;
                                case 1:                //1
                                        Buff[i]|=0x08;
                                        break;
                                case 2:                //err
                                        return 0;
                        }
                }
        }
        //结束位
        if(Buff[10]&0x08!=0x00)
        {
                return 0;
        }
        //行奇校验
        for(i=0;i<10;i++)
                if((((Buff[i]>>4) ^
                        (Buff[i]>>3) ^
                        (Buff[i]>>2) ^
                        (Buff[i]>>1) ^
                         Buff[i])&0x08)!=0)
                        return 0;
        //列奇校验
        j=0;
        for(i=0;i<11;i++)
                j=j ^ (Buff[i]&0x80);
        if(j!=0)
                return 0;
        for(i=0;i<11;i++)
                j=j ^ (Buff[i]&0x40);
        if(j!=0)
                return 0;
        for(i=0;i<11;i++)
                j=j ^ (Buff[i]&0x20);
        if(j!=0)
                return 0;
        for(i=0;i<11;i++)
                j=j ^ (Buff[i]&0x10);
        if(j!=0)
                return 0;
//完成
        return 1;
}
bit ReadCardNo()
{
        if(CheckData())        //检测卡
        {
                unsigned char i;
               
                Buff[0]=(Buff[0] & 0xF0) | (Buff[1]>>4 & 0x0F);        buff0[0]=Buff[0];       
                Buff[1]=(Buff[2] & 0xF0) | (Buff[3]>>4 & 0x0F);        buff0[1]=Buff[1];
                Buff[2]=(Buff[4] & 0xF0) | (Buff[5]>>4 & 0x0F);        buff0[2]=Buff[2];
                Buff[3]=(Buff[6] & 0xF0) | (Buff[7]>>4 & 0x0F);        buff0[3]=Buff[3];
                Buff[4]=(Buff[8] & 0xF0) | (Buff[9]>>4 & 0x0F);        buff0[4]=Buff[4];
                                                                   buff0[5]=buff0[0]^buff0[1]^buff0[2]^buff0[3]^buff0[4];
                LED=1;
                for(i=0;i<6;i++)
                        printhex(buff0[i]);
                putchar('\n');
                delay_ms(300);
                LED=0;
                delay_ms(20000);
                return 1;
        }
        return 0;
}
void init(void)
{
        PCON=0x00;
        SCON=0x50;
        TMOD=0x00;
        T2H=(65536-(18432000/4/9600))/256;
        T2L=(65536-(18432000/4/9600))%256;
        AUXR=0x15;               
        ES=1;
        EA=1;
        TI=1;
       
       
        INPORT=1;
       
        delay_ms(300);
}
main()
{               
        init()
        delay_ms(300);
        LED=1;
        delay_ms(3000);
        LED=0;
        printf("Start\n");
        while(1)
        {
                ReadCardNo();
        }
}

是不是晶振变了。定时器配置也要变一下啊。不然你检测的载波就不是125Khz了啊

是前面定义的脉冲宽度计数没有改变导致的,现在OK了!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top