环境是STVD V4.1.6,
编译器是COSMIC STM8 C Compiler 16K ,Version: 4.3.1
调用的库有:GPIO,TIM2

相关宏定义:

//RF数据引脚
#define DATA_PORT   GPIOC
#define DATA_PIN    GPIO_PIN_3

//定义每一位的宽度,t/4us
#define BIT_TIME        128//一位数据时间
#define HAFE_TIME       64//半位数据时间
#define ERROR_BAND      10//允许是时间误差
#define BIT_HAFE_TIME   192//1.5位数据时间

//端口C外部中断,捕捉RFID卡数据输出的所有电平跳变
@far @interrupt void IntSrvPortC(void)
{
    unsigned char ucTemp;
    unsigned char ucCurrBitTime;
    _Bool bData;
   
    static _Bool s_bLastData;
   
    //先读取定时器计数器,即与上次中断的时间间隔,这是当前位的位宽
    //定时器每个值为4us,单独开启一个定时器计数
    if(TIM2->CNTRH == 0)
    {
        ucCurrBitTime = TIM2->CNTRL;
    }
    else//如果定时时间超过255,则以255计算
    {
        ucCurrBitTime = 255;
    }
    TIM2_SetCounter(0);//复位计数器,从0开始重新计时
   
    //接收到数据,接收超时计数器清零
    g_ucNoDataCnt = 0;
   
    //开始接收
    if(s_ucBitCounter < 18)//同步头,一共9个1,所以有18个跳变
    {
        if(s_ucBitCounter == 0)
        {
            //先找上升沿,数据0
            if(RESET != GPIO_ReadInputPin(DATA_PORT,DATA_PIN))
            {
                //找到上升沿,进入下一步
                s_ucBitCounter = 1;
            }
        }
        else if(s_ucBitCounter == 1)
        {
            //再找下降沿,如果上次的上升沿与本下降沿时间间隔为1个数据周期,则为连续的"01"
            //高电平时间持续1个数据周期,必定是"01"
            if(RESET == GPIO_ReadInputPin(DATA_PORT,DATA_PIN)//本次为下降沿
            && ucCurrBitTime > BIT_TIME - ERROR_BAND)//一个周期以上的高电平
            {
                //找到"01",进入下一步
                s_ucBitCounter = 2;
            }
            else//不是"01",重新找"01"
            {
                s_ucBitCounter = 0;
            }
        }
        else
        {
            //已经找到"01"了,接下来要再找到连续的8个1
            //若两个电平跳变间隔1个数据周期,则必定出现0,重新找"01"
            if(ucCurrBitTime > BIT_TIME - ERROR_BAND)
            {
                if(RESET == GPIO_ReadInputPin(DATA_PORT,DATA_PIN))//下降沿
                {
                    //本次下降沿,重新找上升沿
                    s_ucBitCounter = 0;
                }
                else//本次上升沿,接着找下降沿
                {
                    s_ucBitCounter = 1;
                }
            }
            else
            {
                s_ucBitCounter++;
                bData = 1;//为下面接收到数据作准备
            }
        }
    }
    else//获取同步头成功
    {
        //根据本次电平跳变情况,与上次跳变间隔,及上次数据位,
        //可判断出本次跳变是空跳还是有效数据
        //本次是下降沿
        if(RESET == GPIO_ReadInputPin(DATA_PORT,DATA_PIN))
        {
            //与上次跳变间隔1个数据周期,说明高电平持续了1个数据周期,必然是1
            if(ucCurrBitTime > BIT_TIME - ERROR_BAND)
            {
                bData = 1;
            }
            //与上次跳变间隔半个周期,若上次数据为1,本次数据也为1
            //即连续的两个1
            else if(s_bLastData == 1)
            {
                bData = 1;
            }
            //间隔不足1个数据周期,且上次数据为0,则本次是空跳
            else
            {
                return;
            }
        }
        //本次上升沿
        else
        {
            //与上次跳变间隔1个数据周期,说明低电平持续了1个数据周期,必然是0
            if(ucCurrBitTime > BIT_TIME - ERROR_BAND)
            {
                bData = 0;
            }
            //与上次跳变间隔半个周期,若上次数据为0,本次数据也为0
            //即连续的两个0
            else if(s_bLastData == 0)
            {
                bData = 0;
            }
            //间隔不跳1个数据周期,且上次数据为1,则本次是空跳
            else
            {
                return;
            }
        }
        
        if(s_ucBitCounter >= 73)//同步头18个跳变,加上55个数据位
        {
            //接收到完成数据,重新开始接收数据
            s_ucBitCounter = 0;
            //把数据移出缓冲区,且清空缓冲区
            for(ucTemp=0;ucTemp<11;ucTemp++)
            {
                g_ucData[ucTemp] = g_ucDataBuff[ucTemp] & 0x1f;
            }
            g_bitResevData = TRUE;//接收完成,处理数据
        }
        else
        {
            //把数据放入缓冲区
            ucTemp = s_ucBitCounter - 18;//减去同步头的18个跳变
            ucTemp /= 5;//得到当前接收到的数据属于第几个字节
            g_ucDataBuff[ucTemp] <<= 1;//从高位开始接收
            g_ucDataBuff[ucTemp] += bData;
            s_ucBitCounter++;//继续接收下一位
        }
    }
   
    s_bLastData = bData;//更新历史数据
    return;
}

 

rfid 125khz的更多相关文章

  1. RFID 读写器 Reader Writer Cloner

    RFID读写器的工作原理 RFID的数据采集以读写器为主导,RFID读写器是一种通过无线通信,实现对标签识别和内存数据的读出和写入操作的装置. 读写器又称为阅读器或读头(Reader).查询器(Int ...

  2. HITAG 2 125kHz RFID IC Read-Write 256 bits

    Features 256 bits EEPROM memory organized in 8 pages of 32 bits each 32 bits unique factory programm ...

  3. RFID应用范围

    RFID应用范围 (1)物流: 物流过程中的货物追踪,信息自动采集,仓储应用,港口应用,邮政,快递 (2)零售: 商品的销售数据实时统计,补货,防盗 (3)制造业: 生产数据的实时监控,质量追踪,自动 ...

  4. DIY FSK RFID Reader

    This page describes the construction of an RFID reader using only an Arduino (Nano 3.0 was tested, b ...

  5. RFID Exploration and Spoofer a bipolar transistor, a pair of FETs, and a rectifying full-bridge followed by a loading FET

    RFID Exploration Louis Yi, Mary Ruthven, Kevin O'Toole, & Jay Patterson What did you do? We made ...

  6. RFID 仿真/模拟/监控/拦截/检测/嗅探器

    Sound card based RFID sniffer/emulator (Too tired after recon.cx to do draw the schematics better th ...

  7. RFID 基础/分类/编码/调制/传输

    不同频段的RFID产品会有不同的特性,本文详细介绍了无源的感应器在不同工作频率产品的特性以及主要的应用. 目前定义RFID产品的工作频率有低频.高频和甚高频的频率范围内的符合不同标准的不同的产品,而且 ...

  8. 手持PDA智能条码扫描RFID打印POS机

    手持PDA智能条码扫描RFID打印POS机   一.系统稳定性: 1.硬件稳定性: 采用了华为海思(国内唯一可以媲美全球顶级的CPU+射频方案厂商,可以和英伟达等一决高下)手机方案,CPU+射频浑然一 ...

  9. RFIDler:一款定义RFID的读、写、仿真器的开源软件

    很多类似于RFID这样的技术看起来都很神秘,实际上他是依赖于很多物理学原理的,比如”电磁感应原理”.是的,这些现象产生的各种信号足以令人发狂,看完这些模拟模拟信号后,我忽然发现二进制信息多么干净美丽. ...

随机推荐

  1. C++11 中值得关注的几大变化(详解)

    源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里. ...

  2. 用SQL语句将远程SQL Server数据库中表数据导入到本地数据库相应的表中

    一.方法一 访问不同电脑上的数据库(远程访问,只好联好网就一样),如果经常访问或数据量较大,建议用链接服务器方法. 1.创建链接服务器 exec sp_addlinkedserver ‘srv_lnk ...

  3. (面试题)如何查找Oracle数据库中的重复记录

    今天做了个面试题:查找Oracle数据库中的重复记录,下面详细介绍其他方法(参考其他资料) 本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同 ...

  4. Mac office ppt无法正常输入文字的问题解决方案

     Mac office ppt无法正常输入文字的问题解决方案  Mac下每次启动office ppt后,在输入文字时会出现输入法文本框快速闪退无法正常录入文字的情况,在PowerPoint中会出现这种 ...

  5. 中控考勤机SDK使用中员工姓名的处理( c# )

    公司使用的考勤机是中控的指纹考勤机,但是中控的型号乱七八糟,通过程序读出来的型号和实际标的型号不一致. 另外,提供的开发包的C#版本的Demo中调用 axCZKEM1.ReadAllUserID(iM ...

  6. IOS 集成支付宝和邮件发送

    列表中自找 :http://blog.csdn.net/sing_sing?viewmode=contents

  7. struts2:多模块多配置文件开发

    struts2支持多模块多配置文件开发.下面是一个仅包含两个模块的示范程序,包括财务.仓库模块.它们都有一个“caiwu“的Action,在各自的命名空间下:还有一个从财务转向到仓库的Action. ...

  8. 如何更新 Visual Studio 2017 的离线安装包

    现在 Visual Studio 2017 已经不再使用原来的 iso 镜像提供离线安装包了,需要的话,可以通过命令行参数下载离线安装包,例如: vs_Enterprise.exe --layout ...

  9. 微信小程序 开发过程中遇到的坑(一)

      2124 1.我们使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 的时候在pages中写注释的时候回报错. 例如: { &quo ...

  10. Using ADB and fastboot

    What is adb? The Android Debug Bridge (adb) is a development tool that facilitates communication bet ...