韦根编码及协议应用.docx
- 文档编号:25908481
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:15
- 大小:72.92KB
韦根编码及协议应用.docx
《韦根编码及协议应用.docx》由会员分享,可在线阅读,更多相关《韦根编码及协议应用.docx(15页珍藏版)》请在冰豆网上搜索。
韦根编码及协议应用
韦根26经典讲
第一章韦根协议简介
Wiegand(韦根)协议是由摩托罗拉公司制定的一种通讯协议,它适用于涉及门禁控制系统的读卡器和卡片的许多特性,其协议并没有定义通讯的波特率、也没有定义数据长度韦根格式主要定义是数据传输方式:
Data0和Data1两根数据线分别传输0和1,现在应用最多的是26bit,34bit,36bit,44bit等等,其中标准26-bit格式是一个开放式的格式,任何人都可以购买某一特定格式的HID卡,并且这些特定格式的种类是公开可选的,26-Bit格式就是一个广泛使用的工业标准,并且对所有HID的用户开放,现在几乎所有的门禁控制系统都接受26-Bit格式的标准。
1.传感器原理介绍
韦根传感器是由一根双稳态磁敏感功能合金丝和缠绕其外的感应线圈组成的。
其工作原理是:
在交变磁场中,当平行于敏感丝的某极性(例如n极)磁场达到触发磁感应强度时,敏感丝中的磁畴受到激励会发生运动,磁化方向瞬间转向同一方向,同时在敏感丝周围空间磁场也发生瞬间变化,由此在感应线圈中感生出一个电脉冲。
此后若该磁场减弱,敏感丝磁化方向将保持稳定不变,感应线圈也无电脉冲输出,但当相反极性(s极)磁场增强触发磁感应强度时,敏感丝磁化方向又瞬间发生翻转,并在感应线圈中感生出一个方向相反的电脉冲。
如此反复,韦根传感器便将交变磁场的磁信号转换成交变电信号。
2.数据输出的基本概念
韦根协议又称韦根码,韦根码在数据的传输中只需两条数据线,一条为DATA0,另一条为DATA1。
协议规定,两条数据线在无数据时均为高电平,如果DATA0为低电平代表数据0,DATA1为低电平代表数据1(低电平信号低于1V,高电平信号大于4V),数据信号波形如图1.1所示。
图1.1中脉冲宽度在20μs到200μs之间,两个脉冲间的时间间隔在200μs到20ms之间。
3.韦根6位输出格式
标准韦根输出是由26位二进制数组成,每一位的含义如下:
EXXXXXXXXXXXXXXXXXXXXXXXXO二进制
第1位为2-13位的偶校验位
第2-9位对应与电子卡HID码的低8位
第10-25位对应电子卡的PID号码
第26位为14-25位的奇校验位
以上数据从左至右顺序发送,高位在前。
如果电卡的地区码位2个字符,即8位则可用那设置255个地区码((15×16)+15=255);电子卡的卡号位4个字符,即16位则可设置65536个卡号((15×16×16×16)+(15×16×16)+(15×16)+15=65,535)。
例如:
一个HID:
16385,PID:
00004的电子卡其26位韦根输出为:
10000000100000000000001000
检验位HID=16385(二进制的低8位)PID=4(二进制)检验位
这26位数据在读出器的韦根输出线DATA0,DATA1上输出。
DATA0,DATA1在没有数据输出时都保持+5V高电平。
若输出为0,则DATA0拉低一段时间,若输出为1,则DATA1拉低一段时间。
两个电子卡韦根输出之间的最小间隔为0.25秒。
4.韦根26接收
韦根的接收对时间的实时性要求比较高,如果用查询的方法接收会出现丢帧的现象:
假设查询到DATA0为0时主程序正在指向其它任务,等主程序执行完该任务时DATA0已经变为1了,那么这样就导致了一个0bit丢了,这样读出的卡号肯定奇偶校验通不过,所以表现出MCU接收不到IC模块发送的卡号。
唯一的办法是在外部中断里接收每个bit(仅仅在中断里获得开始接收wiegand数据还不行,因为这是尽管给开始接收wiegand数据标志位置位了,但是主程序还在执行其它代码而没有到达查询开始接收wiegand数据标志位这条指令)。
5.韦根接口定义
Wiegand接口界面由三条导线组成:
DATA0:
暂定,兰色,P2.5(通常为绿色)。
DATA1:
暂定,白色,P2.6(通常为白色)。
GND:
(通常为黑色),暂定信号地。
当安装读卡器时,在读卡器和门禁控制面板的连接点(终端)上都能够看到这三个名称。
目前所有的标准型读卡器都提供可选择的Wiegand接口,这三条线负责传送Wiegand数据,也被称为Wiegand信号。
6.特别说明:
在上述标准26位韦根格式中,只包含了电子卡HID码的低8位,即对应于韦根输出的第2位到第9位,实际上电子卡的HID码为16位。
除非特别说明,所售Census产品的韦根通讯协议均为上述标准协议。
奇/偶校验(ECC)是数据传送时采用的一种校正数据错误的一种方式,分为奇校验和偶校验两种,其原理如下:
如果是采用奇校验,在传送每一个字节的时候另外附加一位作为校验位,当实际数据中“1”的个数为偶数的时候,这个校验位就是“1”,否则,这个校验位就是“0”,这样就可以保证传送的数据满足奇校验的要求。
在接收方收到数据时,将按照奇校验的要求检测数据中“1”的个数,如果为奇数,表示传送正确,反之,表示传送错误。
偶校验的过程和奇校验一样,只不过是检测数据中的“1”的个数为偶数。
第二章韦根协议的应用
1.Wiegand接口硬件设计
将Wiegand接口的Data0和Data1两个输出通过74LS573接到MCU的两个IO脚上,采用查询的方式接收数据,但这样接收并不可靠。
比较好的方法是将Data0和Data1两个输出通过74LS573接到MCU的两个IO脚上,并将它们通过74LS08接到MCU的外部中断1上,采用中断的方式接收数据,其电路图如图2.1所示。
2.流程图
3.发送源程序
//***************************************************************************
//模块名称:
IC卡卡号显示程序
//***************************************************************************
//功能说明:
读取IC卡卡号,并予以LCM24064显示;
//连线说明:
其中D0接MCU的P1.5,D1接MCU的P1.6,D0与D1相与输出端接
//MCU的外部中断1;
//作者:
*
//完成日期:
2008年10月*
//***************************************************************************
#include
#include
#include
#include
#include
#include
#include
#include
//************函数定义**************//
#defineuintunsignedint
#defineucharunsignedchar
sbitD0=P1^6;//韦根数据0
sbitD1=P1^5;//韦根数据1
biteven;//前16位偶校验
bitodd;//后16位奇校验
uintm=0;
uchart;
ucharflag=1;//读数次数
ucharwiegand[3]={0xff,0xff,0xff};//IC卡卡号韦根26数据包24位
bitEven_odd_ture=0;//奇偶校验正确判断位
ucharICNo[6];
//******************函数声明***********************//
voidInit(void);
voidzijiezhuanhuan(void);
voidINT0_ISR(void);
bitdata_check(void);
//****************INTO中断服务程序***************//
voidINT0_ISR(void)interrupt0//外部中断0服务程序
{
bitSBUF0;//读数缓冲器
EX0=0;//关中断
SBUF0=D0;//读数据DATA0
switch(flag)
{case1:
if(SBUF0==0)even=0;//确定偶校验位
elseeven=1;
flag++;
break;
case2:
//第2~9位为区号码
if(SBUF0==0)wiegand[0]&=0x7f;
elsewiegand[0]|=0x80;
flag++;
break;
case3:
if(SBUF0==0)wiegand[0]&=0xbf;
elsewiegand[0]|=0x40;
flag++;
break;
case4:
if(SBUF0==0)wiegand[0]&=0xdf;
elsewiegand[0]|=0x20;
flag++;
break;
case5:
if(SBUF0==0)wiegand[0]&=0xef;
elsewiegand[0]|=0x10;
flag++;
break;
case6:
if(SBUF0==0)wiegand[0]&=0xf7;
elsewiegand[0]|=0x08;
flag++;
break;
case7:
if(SBUF0==0)wiegand[0]&=0xfb;
elsewiegand[0]|=0x04;
flag++;
break;
case8:
if(SBUF0==0)wiegand[0]&=0xfd;
elsewiegand[0]|=0x02;
flag++;
break;
case9:
if(SBUF0==0)wiegand[0]&=0xfe;
elsewiegand[0]|=0x01;
flag++;
break;
case10:
//第10~25位为卡号码
if(SBUF0==0)wiegand[1]&=0x7f;
elsewiegand[1]|=0x80;
flag++;
break;
case11:
if(SBUF0==0)wiegand[1]&=0xbf;
elsewiegand[1]|=0x40;
flag++;
break;
case12:
if(SBUF0==0)wiegand[1]&=0xdf;
elsewiegand[1]|=0x20;
flag++;
break;
case13:
if(SBUF0==0)wiegand[1]&=0xef;
elsewiegand[1]|=0x10;
flag++;
break;
case14:
if(SBUF0==0)wiegand[1]&=0xf7;
elsewiegand[1]|=0x08;
flag++;
break;
case15:
if(SBUF0==0)wiegand[1]&=0xfb;
elsewiegand[1]|=0x04;
flag++;
break;
case16:
if(SBUF0==0)wiegand[1]&=0xfd;
elsewiegand[1]|=0x02;
flag++;
break;
case17:
if(SBUF0==0)wiegand[1]&=0xfe;
elsewiegand[1]|=0x01;
flag++;
break;
case18:
if(SBUF0==0)wiegand[2]&=0x7f;
elsewiegand[2]|=0x80;
flag++;
break;
case19:
if(SBUF0==0)wiegand[2]&=0xbf;
elsewiegand[2]|=0x40;
flag++;
break;
case20:
if(SBUF0==0)wiegand[2]&=0xdf;
elsewiegand[2]|=0x20;
flag++;
break;
case21:
if(SBUF0==0)wiegand[2]&=0xef;
elsewiegand[2]|=0x10;
flag++;
break;
case22:
if(SBUF0==0)wiegand[2]&=0xf7;
elsewiegand[2]|=0x08;
flag++;
break;
case23:
if(SBUF0==0)wiegand[2]&=0xfb;
elsewiegand[2]|=0x04;
flag++;
break;
case24:
if(SBUF0==0)wiegand[2]&=0xfd;
elsewiegand[2]|=0x02;
flag++;
break;
case25:
if(SBUF0==0)wiegand[2]&=0xfe;
elsewiegand[2]|=0x01;
flag++;
break;
case26:
if(SBUF0==0)odd=0;
elseodd=1;
t=flag;
flag=1;
m++;
break;
default:
break;
}
EX0=1;//开中断
}
//*******************IC卡号数据奇偶校验********************//
//偶校验:
bit"1"的个数为偶数,则为0
//bit"1"的个数为奇数,则为1
//奇校验:
bit"1"的个数为奇数,则为0
//bit"1"的个数为偶数,则为1
bitdata_check(void)
{
uchari,check_temp;//
ucharone_num=0;//bit1的个数
biteven_temp;//偶校验位缓冲器
bitodd_temp;//奇校验位缓冲器
check_temp=wiegand[0];//先进行偶校验
for(i=0;i<8;i++)//前8位
{if(check_temp&0x01){one_num++;}//判断是否为1,若为1,则one_num加1
check_temp>>=1;//右移
}
check_temp=wiegand[1];
for(i=0;i<4;i++)//第9~12位
{if(check_temp&0x80){one_num++;}//判断是否为1,若为1,则one_num加1
check_temp<<=1;//左移
}
one_num%2==0?
(even_temp=0):
(even_temp=1);//
one_num=0;//bit1的个数清零
if(even_temp==even)//若偶校验正确,则进行奇校验
{check_temp=wiegand[1];
for(i=0;i<4;i++)//第13~17位
{if(check_temp&0x01){one_num++;}
check_temp>>=1;
}
check_temp=wiegand[2];//第18~24位
for(i=0;i<8;i++)//
{if(check_temp&0x01){one_num++;}
check_temp>>=1;
}
one_num%2==0?
(odd_temp=1):
(odd_temp=0);//
one_num=0;
if(odd==odd_temp)return1;//若奇偶校验正确,则返回1
}
elsereturn0;//否则返回0
}
voidInit(void)
{LcmInit();
IT0=1;//外部中断0,下降沿触发有效
EX0=1;//允许外部中断0中断
EA=1;
LcmClear(0);
display();
}
voidzijiezhuanhuan(void)
{
ICNo[0]=ASC[(wiegand[0]&0xF0)>>4];//取wiegand[0]的高4位
ICNo[1]=ASC[wiegand[0]&0x0F];//取wiegand[0]的低4位
ICNo[2]=ASC[(wiegand[1]&0xF0)>>4];
ICNo[3]=ASC[wiegand[1]&0x0F];//0
ICNo[4]=ASC[(wiegand[2]&0xF0)>>4];
ICNo[5]=ASC[wiegand[2]&0x0F];//4
}
//*****************主函数********************************//
voidmain(void)
{
uinti=0,j=0;
Init();
while
(1)
{
if(t==26)
{if(m==1){LcmClear(0);}//首次刷卡后执行清屏动作
Even_odd_ture=data_check();//奇偶校验
if(Even_odd_ture==1)//Even_odd_ture==1为有效数据
{
Even_odd_ture=0;
zijiezhuanhuan();
if(i>29){j++;i=0;}//一行显示完后,自动换行
if(j>7){LcmClear(0);j=0;}//整屏显示完后,自动清屏
PutChar(i++,j,ICNo[0]);//字符显示
PutChar(i++,j,ICNo[1]);
PutChar(i++,j,ICNo[2]);
PutChar(i++,j,ICNo[3]);
PutChar(i++,j,ICNo[4]);
PutChar(i++,j,ICNo[5]);
t=0;
}
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编码 协议 应用