韦根协议刷卡原理及代码实现

news2024/11/16 5:27:23

一、韦根协议原理

韦根接口在门禁行业广泛使用,是一个门禁行业的通信标准,通过两条数据线 DATA0(D0)和 DATA1 (D1)发送数据。目前用的最多的是韦根 34 和韦根 26,二者数据格式相同,只是发送的位数的不同。

DATA0 和DATA1 在无信号时同时保持高电平
若发送数据为0,则DATA0 数据线上出现一个 200us(可定义)的低电平,DATA1 数据线上信号保持不变
若发送数据为 1,则DATA1 数据线上出现一个 200us(可定义)的低电平,DATA0 数据线上信号保持不变
在 200us 低电平之外,DATA0 和DATA1 始终保持高电平。

标准韦根26 格式如图所示,由 24 位卡号和 1 位偶校验位、1 位奇校验位组成。卡号中的高 12 位进 行偶校验,低 12 位进行奇校验。发送顺序从高位(每字节的 bit7)开始,如箭头所示。
在这里插入图片描述

标准韦根34格式与韦根26相同,由 32 位卡号和 1 位偶校验位、1 位奇校验位组成。卡号中的高 16 位进 行偶校验,低 16 位进行奇校验。发送顺序从高位(每字节的 bit7)开始。
韦根 66 与韦根 26 的结构相同,但发送的字节长度有所不同,刷 Mifare1 S50 卡时发送 4 字节卡号;刷 UltraLight 卡时发送 7 字节卡号;刷身份证时发送 8 字节物理卡号

二、代码实现

本代码使用引脚电平变化中断实现韦根协议刷卡

1、韦根引脚初始化

/*****************************************************************
** 名称:void WGInit(void)
** 功能:韦根协议引脚设置为输入,并开启对应的引脚电平变化中断
** 入口参数:无
** 出口参数:无
** 使用说明:
*****************************************************************/
void WGInit(void)
{
	WG0_IN;               //设置DATA0引脚为输入
	WG1_IN;               //设置DATA1引脚为输入
	PCIFR|=1<<PCIF2;      //清除PCINT23-16的引脚电平变化中断标志位
	PCICR|=1<<PCIE2;      //开启PCINT23-16上的的引脚电平变化中断
	PCMSK2|=1<<PCINT22;   //选择PCINT22-PD6的引脚电平变化中断
	PCMSK2|=1<<PCINT23;   //选择PCINT23-PD7的引脚电平变化中断
	PCMSK2&=~(1<<PCINT16);   //取消PCINT22-PD6的引脚电平变化中断
}
//引脚电平变化中断
ISR(PCINT2_vect)
{
	global *gv = &global_struct;       //全局结构体
	T4_INIT();       //定时器4初始化,这里设置如果引脚电平变化中断触发后连续200ms无触发/数据,则认为接受完成 。  
	if((PIND&(1<<PIND7))==0x00)
	{
		gv->WG_Data[gv->WG_Count] = 0;
		gv->WG_Count++;
	}
	if ((PIND&(1<<PIND6))==0x00)
	{
		gv->WG_Data[gv->WG_Count] = 1;
		gv->WG_Count++;
	}
	if (gv->WG_Count>34)
	{
		gv->WG_Count=0;
	}
}

2、定时器4初始化代码

/*****************************************************************
** 名称:void T4_INIT(void)
** 功能:定时器T4初始化   16位定时器
** 入口参数:无
** 出口参数:无
** 使用说明:
*****************************************************************/
void T4_INIT(void)
{
	PRR1 &= ~((1<<PRTIM4));  //启用USART2模块
	//关闭T1  选择无时钟源,关闭系统时钟  T1-CS10  T2-CS20  T0-CS00
	TCCR4B = (TMR_CLK_STOP<<CS40);
	//36864/3686400 = 10ms
	TCNT4 = 65535-36864;   //16位  65535
	//sei();
	//T1定时器普通模式、无分频,并开启定时器
	TCCR4A  =  0X00;
	TCCR4B |= (TMR_CLK_NO_PRESCALE << CS40);
	//开定时器T2溢出中断
	TIMSK4 |= (1 << TOIE4);
}
/*****************************************************************
** 名称:ISR(TIMER4_OVF_vect)
** 功能:定时器T4  10ms溢出中断
** 入口参数:无
** 出口参数:无
** 使用说明:
*****************************************************************/
extern u8 wgdate[34];
ISR(TIMER4_OVF_vect)
{
	global *gv = &global_struct;
	TCNT4 = 65535-36864;
	TIME_BASE.time3++;
	if (TIME_BASE.time3>=20)  //定时时间到200ms
	{
		TIME_BASE.time3=0;
		if (gv->WG_Count==34)
		{
			gv->WG_Count=0;
			memcpy(wgdate,gv->WG_Data,34);
			gv->WG_State=1;                 //连续200ms无数据接收,韦根接收完成标志位置位
		}
		else
		{
			gv->WG_Count=0;
		}
		TCCR4B &= ~(TMR_CLK_STOP<<CS40);    //无时钟源,关闭系统时钟
		TIMSK4 &= ~(1 << TOIE4);            //关闭时器T1溢出中断
	}
}

3、韦根协议奇偶检验代码

/*****************************************************************
** 名称:void check_even_odd(u8 *str)
** 功能:计算接受到的韦根数据的奇偶校验
** 入口参数:接受到的韦根数据
** 出口参数:无
** 使用说明:
*****************************************************************/
void check_even_odd(u8 *str)
{
	u8 i=0;
	u8 one_num=0;
	//偶校验计算:有偶数个1,那么检验位1=0,反之为1
	for(i = 1;i < 17;i++)
	{
		if(str[i] & 0x01)
			one_num++;
	}
	if((one_num % 2)==0)
		odd = 0;
	else
		odd = 1;
	one_num=0;
	//奇校验计算:有奇数个1,那么检验位2=0,反之为1
	for(i = 17;i < 33;i++)
	{
		if(str[i] & 0x01)
			one_num++;
	}		
	if((one_num % 2)==1)
		even = 0;
	else
		even = 1;
}

4、韦根协议最终卡号获取代码

int WG_Recv34(unsigned char *str)
{
	global *gv = &global_struct;
	
	if(gv->WG_State)
	{
		check_even_odd(wgdate);     //韦根数据奇偶校验
		if((even == wgdate[33]) && (odd == wgdate[0]))  //判断韦根数据奇偶校验是否正确
		{
			gv->WG_State = 0;
			for(char m=0; m<(34/8); m++) //获取通过校验的韦根卡号对应的16进制数据gv->WG_ID
			{
				for(char n=0; n<8; n++)
				{
					gv->WG_ID[m] += wgdate[8*m+1+n]<<(7-n);  
					wgdate[8*m+1+n]=0;
				}
			}
			memset(wgdate,0,34);
			even=0;
			odd=0;
			return 1;
		} 
		else    //韦根数据奇偶校验错误舍去该次数据
		{
			even=0;
			odd=0;
			gv->WG_State = 0;
			memset(wgdate,0,34);
			memset(gv->WG_ID,0,4);
			return 0;
		}
	}
	return -2;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1502359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】科研代码学习:二 dataclass,pipeline

【Python】科研代码学习&#xff1a;二 dataclass&#xff0c;pipeline 前言dataclasspipeline 前言 后文需要学习一下 transformers 库&#xff0c;必要时会介绍其他相关的重要库和方法。主要是从源代码、别人的技术文档学习&#xff0c;会更快些。 dataclass Python中的数…

为什么选择Copilot for Microsoft365而不是Copilot Pro

最近很多小伙伴都用上了copilot&#xff0c;开始感受copilot在生产力工具中发挥的作用与带来的提升。 询问比较多的就是商业企业版的Copilot for Microsoft 365和个人家庭版的Copilot Pro有什么区别&#xff1f; 这篇文章一定会让你在两者之间选择最合适你的那个。 一、价格…

uniapp使用华为云OBS进行上传

前言&#xff1a;无论是使用华为云还是阿里云&#xff0c;使用其产品的时候必须阅读文档 1、以华为云为例&#xff0c;刚接触此功能肯定是无从下手的情况&#xff0c;那么我们需要思考&#xff0c;我们使用该产品所用到的文档是什么 2、我们要使用obs 文件上传&#xff0c;肯…

Python:在 Ubuntu 上安装 pip的方法

目录 1、检测是否已安装pip 2、更新软件源 3、安装 4、检测是否安装成功 pip和pip3都是Python包管理工具&#xff0c;用于安装和管理Python包。 在Ubuntu上&#xff0c;pip和pip3是分别针对Python2和Python3版本的pip工具。 pip3作用&#xff1a;自动下载安装Python的库文…

llama-index调用qwen大模型实现RAG

背景 llama-index在实现RAG方案的时候多是用的llama等英文大模型&#xff0c;对于国内的诸多模型案例较少&#xff0c;本次将使用qwen大模型实现llama-index的RAG方案。 环境配置 &#xff08;1&#xff09;pip包 llamaindex需要预装很多包&#xff0c;这里先把我成功的案例…

pytorch CV入门3-预训练模型与迁移学习

专栏链接&#xff1a;https://blog.csdn.net/qq_33345365/category_12578430.html 初次编辑&#xff1a;2024/3/7&#xff1b;最后编辑&#xff1a;2024/3/8 参考网站-微软教程&#xff1a;https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorc…

python界面开发 - messagebox 提示框

文章目录 1. messagebox1.1. 示例 2. Tkinter 开发3. python图形界面开发3.1. Python图形界面开发——Tkinter3.2. Python图形界面开发——PyQt3.3. Python图形界面开发——wxPython3.4. Python图形界面开发—— PyGTK&#xff1a;基于GTK3.5. Python图形界面开发—— Kivy3.6.…

java SSM汽车租赁管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM汽车租赁管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

安卓真机无root环境下的单机游戏修改-IL2CPP

前言 之前在研究手游的il2cpp修改&#xff0c;选取了 Mine Survival 作为研究对象&#xff0c;由于手上没有root的机子&#xff0c;于是安装在了MuMu模拟器上 但是很快发现了问题&#xff0c;游戏只有arm的lib&#xff0c;由于一系列原因&#xff0c;导致我无法获取到 libil2…

如何压缩PDF文件大小?看完这篇文章,即可实现无损压缩!

平时工作或生活中&#xff0c;很多小伙伴是不是经常喜欢用PDF格式进行文件的保存&#xff0c;毕竟它具有较高的兼容性&#xff0c;且在不同设备中打开也不会出现排版错乱的情况。不过有时候PDF文件会因为内容过大&#xff0c;占用的内存过多&#xff0c;从而导致电脑卡顿的情况…

大路灯哪个牌子好?五大品质大路灯盘点,体验超赞!

在这个生活水平不断提高的时代&#xff0c;大路灯作为一款能够帮助孩子解决不少用眼是的光线问题的电器&#xff0c;有着比较高的优势&#xff0c;但关于它的伤眼案例却频频发生。之所以如此矛盾&#xff0c;主要是市场上的不专业大路灯泛滥成灾&#xff0c;就比如一些所谓的网…

Word中的文档网格线与行距问题

在使用Word编辑文档时&#xff0c;经常会发生以下动图展示的这种情况&#xff1a; 上面的动图里&#xff0c;将文字大小放大到某个字号时&#xff0c;单倍行距的间距突然增加很多。造成这种情况的原因是文档中定义了网格线&#xff0c;并且设置了对齐到网格线。如果取消文档中…

Centos安装Jenkins

1、更新系统 &#xff08;1&#xff09;更新下系统 sudo yum -y update 安装用于下载java 17二进制文件的wget命令行工具 sudo yum -y install wget vim 2、卸载centos自带的jdk 由于我们安装的版本比较高&#xff0c;需要jdk17&#xff0c;卸载centos自带的jdk。用 下面的…

分布式定时任务调度xxl-job

1. xxl-job基本介绍 1.1 Quartz的体系结构 Quartz中最重要的三个对象:Job&#xff08;作业&#xff09;、Trigger&#xff08;触发器&#xff09;、Scheduler&#xff08;调度器&#xff09;。 xxl-job的调度原理:调度线程在一个while循环中不断地获取一定数量的即将触发的Tr…

用 ChatGPT 搭配 STAR 原则,准备英文面试超轻松

用 ChatGPT 搭配 STAR 原则&#xff0c;准备英文面试超轻松 ChatGPT 除了可以帮忙改简历&#xff0c;在你的求职历程中&#xff0c;ChatGPT 也可以帮忙练英文面试。在我们实测之后&#xff0c;发现 ChatGPT 在练习英文面试上&#xff0c;不仅能针对你的回答给予回馈&#xff0…

汽车大灯汽车尾灯破裂裂纹破损破洞掉角崩角等问题能修复吗?修复后需要注意什么?

汽车灯罩破损修复后&#xff0c;车主需要注意以下几点&#xff1a; 检查修复效果&#xff1a;修复完成后&#xff0c;车主应该仔细检查灯罩的修复效果&#xff0c;确保破损部分已经被填补并恢复原有的透明度和光泽。如果修复效果不理想&#xff0c;需要及时联系维修店进行处理…

快乐数---链表的入口点

文章目录 一、鸽巢原理二、环的入口点分析题目思路代码 三、快乐数分析题目思路代码 在刷题中&#xff0c;遇到这样两道类似知识点的题目&#xff0c;下面是两道题的链接&#xff0c;感兴趣的朋友可以去尝试一下。力扣链接: 快乐数力扣链接: 环形链表。 一、鸽巢原理 这两道题…

Elastic Stack--04--ES中的检索方式、Query DSL

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.ES中的检索方式第一种方式GET bank/_search # 检索bank下的所有信息&#xff0c;包括 type 和 docsGET bank/_search?q*&sortaccount_number:asc 第二种方式…

生产管理MES系统在卫浴企业中的应用

在卫浴企业的制造过程中&#xff0c;实现透明车间管理是一个旨在提升效率、质量和可视性的重要目标。MES系统可以在卫浴企业中帮助打造透明车间&#xff0c;提升生产管理的效率和可视性。具体能实现哪些管理呢&#xff1f; 实时监控生产状态&#xff1a; MES系统可以实时监控车…

指针运算题

题目一&#xff1a; #include <stdio.h> int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } //程序的结果是什么&#xff1f; 答案&#xff1a; 2&#xff0c;5 详解&#xff1a; …