关于125KHZ RFID的疑问

2019-03-24 17:49发布

我做的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(' ');
                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 ");

        while(1)
        {
                ReadCardNo();

        }
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
李俊锋
2019-03-24 22:03
chunyang 发表于 2015-1-19 18:57
先确定你的MCU在18.432MHz下能不能稳定运行,如果能,检查程序中所有涉及定时器和延时的代码。
多谢指点,原因是开头定义的区分脉冲宽度的参数没有调大,现在一切正常!太谢谢了



一周热门 更多>