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这样的技术看起来都很神秘,实际上他是依赖于很多物理学原理的,比如”电磁感应原理”.是的,这些现象产生的各种信号足以令人发狂,看完这些模拟模拟信号后,我忽然发现二进制信息多么干净美丽. ...
随机推荐
- netty LEAK: ByteBuf.release() was not called before it's garbage-collected
背景.netty抛出完整的error信息如下: 2018-02-08 14:30:43.098 [nioEventLoopGroup-5-1] ERROR io.netty.util.Resource ...
- 【转载】Java导入导出excel
转自:https://blog.csdn.net/jerehedu/article/details/45195359 目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI ...
- APP服务端开发遇到的问题总结(后续再整理解决方法)
IOS AES对称加密,加密结果不同,问题解决 IOS http post请求,使用AFNetworing 框架,默认请求content-type为application/json ,所以无法使用@ ...
- Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组
一. Android资源文件简介 1. Android应用资源的作用 (1) Android项目中文件分类 在Android工程中, 文件主要分为下面几类 : 界面布局文件, Java src源文件, ...
- Android Developers:支持不同的屏幕密度
这节课程向你展示如何通过提供不同的资源和使用与分辨率无关的测量单位,支持不同屏幕密度. 使用密度无关的像素 —————————————————————————————————————————————— ...
- 常用代码之八:setTimeout 和 clearTimeout。
1.先写一个错误的例子: function DealSomething() { //write some code window.setTimeout(function ...
- Appium 设置手机连接方式
使用appium的 Connection 和driver 的setConnection方法,可以切换手机的上网方式 // 切换到wifi Connection cnn = Connection.WIF ...
- eclipse 开发 spring 、 springboot项目调试时一直跳转到 SilentExitExceptionHandler.exitCurrentThread 方法
不想让 eclipse 调试时一直跳转到该方法 解决方法: Eclipse->[Preferences]->[Java]->[Debug]:去掉[Suspend execution ...
- Android基础知识之屏幕兼容模式
原文:http://android.eoe.cn/topic/android_sdk 注意:如果你在低于安卓3.0的版本上进行应用开发,但其在更大屏幕的设备(比如平板电脑)上显示正常时,你就需要禁用屏 ...
- Android 移动端数据结构
## SparseArray ## SparseBooleanArray ## SparseIntArray ## SparseLongArray * 位于android.util,Android 中 ...
