韦根26经典讲解文档格式.docx
- 文档编号:5042573
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:16
- 大小:73.43KB
韦根26经典讲解文档格式.docx
《韦根26经典讲解文档格式.docx》由会员分享,可在线阅读,更多相关《韦根26经典讲解文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
第2-9位对应与电子卡HID码的低8位
第10-25位对应电子卡的PID号码
第26位为14-25位的奇校验位
以上数据从左至右顺序发送,高位在前。
如果电卡的地区码位2个字符,即8位则可用那设置255个地区码((15×
16)+15=255);
电子卡的卡号位4个字符,即16位则可设置65536个卡号((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信号。
在上述标准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<
math.h>
string.h>
absacc.h>
reg51.h>
intrins.h>
stdio.h>
huanyingguanglin.h>
LCM.h>
//************函数定义**************//
#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;
case3:
=0xbf;
elsewiegand[0]|=0x40;
case4:
=0xdf;
elsewiegand[0]|=0x20;
case5:
=0xef;
elsewiegand[0]|=0x10;
case6:
=0xf7;
elsewiegand[0]|=0x08;
case7:
=0xfb;
elsewiegand[0]|=0x04;
case8:
=0xfd;
elsewiegand[0]|=0x02;
case9:
=0xfe;
elsewiegand[0]|=0x01;
case10:
//第10~25位为卡号码
if(SBUF0==0)wiegand[1]&
elsewiegand[1]|=0x80;
case11:
elsewiegand[1]|=0x40;
case12:
elsewiegand[1]|=0x20;
case13:
elsewiegand[1]|=0x10;
case14:
elsewiegand[1]|=0x08;
case15:
elsewiegand[1]|=0x04;
case16:
elsewiegand[1]|=0x02;
case17:
elsewiegand[1]|=0x01;
case18:
if(SBUF0==0)wiegand[2]&
elsewiegand[2]|=0x80;
case19:
elsewiegand[2]|=0x40;
case20:
elsewiegand[2]|=0x20;
case21:
elsewiegand[2]|=0x10;
case22:
elsewiegand[2]|=0x08;
case23:
elsewiegand[2]|=0x04;
case24:
elsewiegand[2]|=0x02;
case25:
elsewiegand[2]|=0x01;
case26:
if(SBUF0==0)odd=0;
elseodd=1;
t=flag;
flag=1;
m++;
default:
break;
}
EX0=1;
//开中断
}
//*******************IC卡号数据奇偶校验********************//
//偶校验:
bit"
1"
的个数为偶数,则为0
//bit"
的个数为奇数,则为1
//奇校验:
的个数为奇数,则为0
的个数为偶数,则为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];
4;
i++)//第9~12位
0x80){one_num++;
}//判断是否为1,若为1,则one_num加1
check_temp<
<
//左移
one_num%2==0?
(even_temp=0):
(even_temp=1);
one_num=0;
//bit1的个数清零
if(even_temp==even)//若偶校验正确,则进行奇校验
{check_temp=wiegand[1];
i++)//第13~17位
}
check_temp=wiegand[2];
//第18~24位
i++)//
}
one_num%2==0?
(odd_temp=1):
(odd_temp=0);
//
if(odd==odd_temp)return1;
//若奇偶校验正确,则返回1
elsereturn0;
//否则返回0
voidInit(void)
{LcmInit();
IT0=1;
//外部中断0,下降沿触发有效
//允许外部中断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]&
ICNo[3]=ASC[wiegand[1]&
//0
ICNo[4]=ASC[(wiegand[2]&
ICNo[5]=ASC[wiegand[2]&
//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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 韦根 26 经典 讲解
![提示](https://static.bingdoc.com/images/bang_tan.gif)