rfid 125khz
环境是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的更多相关文章
- RFID 读写器 Reader Writer Cloner
RFID读写器的工作原理 RFID的数据采集以读写器为主导,RFID读写器是一种通过无线通信,实现对标签识别和内存数据的读出和写入操作的装置. 读写器又称为阅读器或读头(Reader).查询器(Int ...
- 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 ...
- RFID应用范围
RFID应用范围 (1)物流: 物流过程中的货物追踪,信息自动采集,仓储应用,港口应用,邮政,快递 (2)零售: 商品的销售数据实时统计,补货,防盗 (3)制造业: 生产数据的实时监控,质量追踪,自动 ...
- DIY FSK RFID Reader
This page describes the construction of an RFID reader using only an Arduino (Nano 3.0 was tested, b ...
- 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 ...
- RFID 仿真/模拟/监控/拦截/检测/嗅探器
Sound card based RFID sniffer/emulator (Too tired after recon.cx to do draw the schematics better th ...
- RFID 基础/分类/编码/调制/传输
不同频段的RFID产品会有不同的特性,本文详细介绍了无源的感应器在不同工作频率产品的特性以及主要的应用. 目前定义RFID产品的工作频率有低频.高频和甚高频的频率范围内的符合不同标准的不同的产品,而且 ...
- 手持PDA智能条码扫描RFID打印POS机
手持PDA智能条码扫描RFID打印POS机 一.系统稳定性: 1.硬件稳定性: 采用了华为海思(国内唯一可以媲美全球顶级的CPU+射频方案厂商,可以和英伟达等一决高下)手机方案,CPU+射频浑然一 ...
- RFIDler:一款定义RFID的读、写、仿真器的开源软件
很多类似于RFID这样的技术看起来都很神秘,实际上他是依赖于很多物理学原理的,比如”电磁感应原理”.是的,这些现象产生的各种信号足以令人发狂,看完这些模拟模拟信号后,我忽然发现二进制信息多么干净美丽. ...
随机推荐
- mongodb3.4 安装及用户名密码设置
下载: https://www.mongodb.com/download-center?jmp=nav#community 1.解压 修改文件名为mongo3.2.5,执行命令如下: mv mong ...
- Vue-cli / webpack 加载静态js文件的方法
一.html-webpack-plugin 编译 1.只需要在入口处定义一个chunks,如我们定义一个fuck模块 entry: { app: './src/main.js', fuck: ['./ ...
- python标准库介绍——32 Queue 模块详解
Queue 模块 ``Queue`` 模块提供了一个线程安全的队列 (queue) 实现, 如 [Example 3-2 #eg-3-2] 所示. 你可以通过它在多个线程里安全访问同个对象. ==== ...
- MSSQL2005:“超时时间已到。在操作完成之前超时时间已过或服务器未响应”
1.今天在整合项目中有这样一个需求,就是要改变以存在表字段的文本的大小,如把char(15)改成varchar(50). 2.此时以存在表已有1885742条数据,在直接下面进行调用 ALTER TA ...
- 【转】在一个Job中同时写入多个HBase的table
在进行Map/Reduce时,有的业务需要在一个job中将数据写入到多个HBase的表中,下面是实现方式. 原文地址:http://lookfirst.com/2011/07/hbase-multit ...
- unity, ios skin crash
https://issuetracker.unity3d.com/issues/ios-loading-models-with-tangents-set-to-calculate-legacy-fro ...
- android Ant 打包
1.首先我们先看看android 中SDK的${sdk.dir}/tools/ant/build.xml 这个build其实已经把Eclipse的开发操作已经全部实现了. 2.我们现在打包只需要把自己 ...
- Atitti 固化数据库表结构方案
Atitti 固化数据库表结构方案 1. 固化数据库表结的重要意义1 2. 如何固化表结构1 2.1. 向上抽象一层,以动词有目标,以名词为存储对象.1 2.2. 数据类型datatype字段:这个用 ...
- SQLServer中进行sql除法运算结果为小数时显示0的解决方案
转自:http://blog.sina.com.cn/s/blog_8020e41101019k7t.html SELECT field1/field2 FROM TB; 当 field1的数值 &g ...
- java 分布式锁总结
第一步,自身的业务场景: 在我日常做的项目中,目前涉及了以下这些业务场景: 场景一: 比如分配任务场景.在这个场景中,由于是公司的业务后台系统,主要是用于审核人员的审核工作,并发量并不是很高,而且任务 ...