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这样的技术看起来都很神秘,实际上他是依赖于很多物理学原理的,比如”电磁感应原理”.是的,这些现象产生的各种信号足以令人发狂,看完这些模拟模拟信号后,我忽然发现二进制信息多么干净美丽. ...
随机推荐
- windows(64位)下使用curl命令
Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令. 工具下载 在官网处下载工具包:http://cu ...
- 解决tomcat服务器下,只能通过localhost,而不能通过127.0.0.1或者本地ip地址访问的问题
今天在tomcat上部署了一个web应用以后,发现用localhost的方式来访问应用是正常的,但是换成127.0.0.1或者是本地的ip地址来访问,确出现访问不了的情况.之前想是不是防火墙的问题,于 ...
- Java 8 – How to sort a Map
Java 8 – How to sort a Map 1. Quick ExplanationMap result = map.entrySet().stream() .sorted(Map.Entr ...
- lnmp 一键安装
系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin Server/Aliyun/Amazon/Mint Linux发行版 需要5GB以上硬盘剩 ...
- ITOO高校云平台V3.1--项目总结(二)
自身责任要明白 心态要明白 布置任务要有反馈 总结 今天下午.举办了一场ITOO高校云平台3.1总结大会,针对3.1开发的过程中统计上来的问题进行讨论. 通过讨论统计上来的问题,映射到自身,看看自己还 ...
- log4j的正确使用姿势
最近清明节,朋友公司的日志爆了,说控制台打得太满了,出了问题,早上4点多被喊去公司修改代码,他们把所有的日志全部在控制台打印了,结果就...我说日志这么做不可取啊,你们打印出来的内容太多啦,控制台没必 ...
- 【Unity】6.6 Random类
分类:Unity.C#.VS2015 创建日期:2016-04-20 一.简介 Unity引擎提供的Random类可以用来生成随机数.随机点或旋转角度. 1.成员变量 seed:设置用于随机数生成器的 ...
- C语言发展历程及其保留字(关键字)——附:C语言标准文档
引言 抽时间对C语言发展历程和C语言的标准库文件及其保留字/关键字做了个梳理,后面附C语言各版本国际标准. C语言发展历程及其标准库 C语言关键字/保留字 C语言国际标准 ...
- pandas数组(pandas Series)-(3)向量化运算
这篇介绍下有index索引的pandas Series是如何进行向量化运算的: 1. index索引数组相同: s1 = pd.Series([1, 2, 3, 4], index=['a', 'b' ...
- 用NPOI创建Excel、合并单元格、设置单元格样式、边框的方法
本篇文章小编为大家介绍,用NPOI创建Excel.合并单元格.设置单元格样式.边框的方法.需要的朋友参考下 今天在做项目中,遇到使用代码生成具有一定样式的Excel,找了很多资料,最后终于解决了,Ex ...
