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这样的技术看起来都很神秘,实际上他是依赖于很多物理学原理的,比如”电磁感应原理”.是的,这些现象产生的各种信号足以令人发狂,看完这些模拟模拟信号后,我忽然发现二进制信息多么干净美丽. ...
随机推荐
- xcode修改项目名后反复出现 clang error
xcode修改项目名后反复出现 clang error, 提示 ld: file not found . 并且该错误并不是出现在项目编译阶段,而是项目的Tests 的link阶段, 同时提示 xct ...
- 关于埃博拉病毒的基本知识(ABC)
科学研究表明.埃博拉病毒的存在历史很久远,可能有两千多万年的历史,在类人猿出现的时期就已存在. 埃博拉病毒呈现一种"蚕丝状",又细又长,无色透明.直径有80纳米,长短不等,在14微 ...
- MongoDB常用操作一查询find方法(转)
来:http://blog.csdn.net/wangli61289/article/details/40623097 https://docs.mongodb.org/manual/referenc ...
- 创建多模块springcloud应用eureka server和client和消费端demo
使用环境是 STS + maven 1 创建父级 项目,springcloud-demo1 new -> maven project -> 按照要求进行配置即可.然后删除 src目录,因为 ...
- Gitlab Runner的使用(涵盖gitlab-page)
#gitlab-runner 的简单安装和部署##背景 因为公司要使用CI 功能,已经使用gitlab-page的功能能,所以这里记录一下 ###安装步骤: 参考官方文档:https://doc ...
- JS两日期相减
JS两日期相减,主要用到下面两个方法 dateObject.setFullYear(year,month,day) 方法 stringObject.split(separator) 方法 functi ...
- Spring ORM数据訪问——Hibernate
Hibernate 我们将首先介绍Spring环境中的Hibernate 5.然后介绍使用Hibernate 5来演示Spring集成O-R映射器的方法. 本节将具体介绍很多问题,并显示DAO实现和事 ...
- PowerShell控制台字体设置
1.打开注册表: HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe 2.找到键 ...
- SQL分页参数传值 在存储过程中使用 动态SQL实现
PROCEDURE [dbo].[SP_GetList] ( ), @arrearsStatus int, , --最小ID , --每页显示记录数 ) ) AS ); declare @strSQL ...
- Linux系统/boot目录破损无法启动怎么办
linux系统中的/boot目录存放着系统开机所需要的各种文件,其中包含内核.开机菜单及所需配置文件等等.但是当不小心删除了/boot目录里的某些文件或者干脆整个/boot目录都不见了的情况下,该如何 ...
