4470|16

180

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于125KHZ RFID的疑问 [复制链接]

我做的125KHZ的RFID读头,在晶振为11.0592MHz下,读一切正常,但是我把晶振频率提高到18.432MHz时就不能读了,真心求教!!!!!


#include
#include

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

        }
}
此帖出自51单片机论坛

最新回复

楼主不觉得你的读卡程序有问题吗,要是前一个数据是1,后一个数据是0,波形是1001,楼主没有做分析吗  详情 回复 发表于 2015-11-10 08:55
点赞 关注
 

回复
举报

1万

帖子

142

TA的资源

版主

沙发
 
先确定你的MCU在18.432MHz下能不能稳定运行,如果能,检查程序中所有涉及定时器和延时的代码。
此帖出自51单片机论坛

点评

多谢指点,原因是开头定义的区分脉冲宽度的参数没有调大,现在一切正常!太谢谢了  详情 回复 发表于 2015-1-19 19:04
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

180

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
chunyang 发表于 2015-1-19 18:57
先确定你的MCU在18.432MHz下能不能稳定运行,如果能,检查程序中所有涉及定时器和延时的代码。
多谢指点,原因是开头定义的区分脉冲宽度的参数没有调大,现在一切正常!太谢谢了



此帖出自51单片机论坛
 
个人签名是金子总会发光1
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

4
 
楼主您好,我最近也在做读卡这一块儿,看了用ATmega8的读头等,想用51做,还想结合上继电器做门禁,楼主能不能把您的资料程序分享一份啊,万分感谢782575191@qq.com
此帖出自51单片机论坛

点评

我贴出来的这个例程就是晶振为11.0592时的例程,是完全可读的  详情 回复 发表于 2015-10-7 09:12
 
 
 

回复

180

帖子

0

TA的资源

一粒金砂(中级)

5
 
以吻封笺 发表于 2015-10-2 21:43
楼主您好,我最近也在做读卡这一块儿,看了用ATmega8的读头等,想用51做,还想结合上继电器做门禁,楼主能 ...

我贴出来的这个例程就是晶振为11.0592时的例程,是完全可读的
此帖出自51单片机论坛
 
个人签名是金子总会发光1
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

6
 
谢谢楼主指点,我还想问您一下,单片机哪个口出125KHz呢,我用protues仿真不出来求楼主指点
此帖出自51单片机论坛

点评

当然也可以用单片机定时器产生,使用单片机的CLKOUT引脚输出125KHZ,不过好像在11.0592MHz下没成功,16MHz以上实验成功  详情 回复 发表于 2015-10-8 15:12
用的74HC4060对4MHz晶振分频得到的125KHZ  详情 回复 发表于 2015-10-8 15:07
 
 
 

回复

180

帖子

0

TA的资源

一粒金砂(中级)

7
 
以吻封笺 发表于 2015-10-8 13:06
谢谢楼主指点,我还想问您一下,单片机哪个口出125KHz呢,我用protues仿真不出来求楼主指点

用的74HC4060对4MHz晶振分频得到的125KHZ
此帖出自51单片机论坛
 
个人签名是金子总会发光1
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

8
 
李俊锋 发表于 2015-10-8 15:07
用的74HC4060对4MHz晶振分频得到的125KHZ

哦哦~谢谢楼主指点
此帖出自51单片机论坛
 
 
 

回复

180

帖子

0

TA的资源

一粒金砂(中级)

9
 
以吻封笺 发表于 2015-10-8 13:06
谢谢楼主指点,我还想问您一下,单片机哪个口出125KHz呢,我用protues仿真不出来求楼主指点

当然也可以用单片机定时器产生,使用单片机的CLKOUT引脚输出125KHZ,不过好像在11.0592MHz下没成功,16MHz以上实验成功
此帖出自51单片机论坛
 
个人签名是金子总会发光1
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

10
 
楼主你好,这个程序头文件改改能不能直接下到89C52单片机里用啊,刷卡-读卡-LED亮灭?谢谢楼主指点
此帖出自51单片机论坛

点评

可以的,不过一些寄存器的定义就得注意了  详情 回复 发表于 2015-10-10 10:16
 
 
 

回复

180

帖子

0

TA的资源

一粒金砂(中级)

11
 
以吻封笺 发表于 2015-10-8 21:09
楼主你好,这个程序头文件改改能不能直接下到89C52单片机里用啊,刷卡-读卡-LED亮灭?谢谢楼主指 ...

可以的,不过一些寄存器的定义就得注意了
此帖出自51单片机论坛
 
个人签名是金子总会发光1
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

12
 
楼主,还得麻烦您一下,这个BUFF[0] -BUFF[4] 就是十位的卡号吧,ID1[5]={0x00,0x09,0x72,0x78,0x36}像这样的吧,谢谢您
此帖出自51单片机论坛

点评

这个应该是40位吧!  详情 回复 发表于 2015-10-21 16:18
 
 
 

回复

180

帖子

0

TA的资源

一粒金砂(中级)

13
 
以吻封笺 发表于 2015-10-18 19:32
楼主,还得麻烦您一下,这个BUFF[0] -BUFF[4] 就是十位的卡号吧,ID1[5]={0x00,0x09,0x72,0x78,0x36}像这样 ...

这个应该是40位吧!
此帖出自51单片机论坛
 
个人签名是金子总会发光1
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

14
 
前辈,求您的QQ,真心想请教您啊
此帖出自51单片机论坛

点评

私信吧,我也算不上前辈,指示比你接触125KHZ RFID早一点而已  详情 回复 发表于 2015-10-22 11:26
 
 
 

回复

180

帖子

0

TA的资源

一粒金砂(中级)

15
 
以吻封笺 发表于 2015-10-21 19:32
前辈,求您的QQ,真心想请教您啊

私信吧,我也算不上前辈,指示比你接触125KHZ RFID早一点而已
此帖出自51单片机论坛
 
个人签名是金子总会发光1
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
楼主不觉得你的读卡程序有问题吗,要是前一个数据是1,后一个数据是0,波形是1001,楼主没有做分析吗
此帖出自51单片机论坛

点评

能详细说说吗?因为我也是新手,谢谢!  详情 回复 发表于 2015-11-14 11:05
 
 
 

回复

180

帖子

0

TA的资源

一粒金砂(中级)

17
 
mengyingli 发表于 2015-11-10 08:55
楼主不觉得你的读卡程序有问题吗,要是前一个数据是1,后一个数据是0,波形是1001,楼主没有做分析吗

能详细说说吗?因为我也是新手,谢谢!
此帖出自51单片机论坛
 
个人签名是金子总会发光1
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表