1、韦根数据格式韦根数据输出格式一、 韦根数据输出的基本概念:韦根数据输出由二根线组成,分别是DATA0 和DATA1 ;二根线分别将0或1输出。输出0时:DATA0线上出现负脉冲;输出1时:DATA1线上出现负脉冲;具体时序如下:例如:数据1011时序如下:DATA0 DATA1 TP TW 负脉冲宽度TP=100 us;周期TW=1000 us二、 几种韦根输出格式:韦根26位输出格式:E CCCC CCCC CCCC CCCC CCCC CCCC O 12BIT偶校验 12BIT奇校验E/O:偶/奇校验位。C: 卡片ID号。以上数据从左至右顺序发送。韦根34位输出格式:E CCCC CCCC
2、 CCCC CCCC CCCC CCCC CCCC CCCC O16BIT偶校验 16BIT奇校验E/O:偶/奇校验位。C: 卡片ID号。以上数据从左至右顺序发送。韦根36位输出格式:E CCCC CCCC CCCC CCCC C CCCC CCCC CCCC CCCI I O17BIT偶校验 17BIT奇校验E/O:偶/奇校验位。C: 卡片ID号。I:2位卡片发行码。以上数据从左至右顺序发送。韦根44位输出格式:CCCC CCCC CCCC CCCC CCCC CCCC CCCC CCCC IIII IIII XXXXC: 卡片ID号。I:8位卡片发行码。XXXX:LRC校验。以上数据从左至
3、右顺序发送。韦根26韦根34发送程序WG26协议Wiegand 26格式:各数据位的含义:第 1 位: 为输出数据213位的偶校验位第 29 位: ID卡的HID码的低8位第10-25位: ID卡的PID号码第 26 位: 为输出数据14-25位的奇校验位数据输出顺序: HID码和PID码均为高位在前,低位在后例:一张ID卡内容为:HID:32769 PID:34953 ( 卡面印:37 001, 34953 )相应的二进制为:HID:1000 0000 0000 0001 ( 只输出低8位 )PID:1000 1000 1000 1001输出如下:1 2 9 10 25 260 0 0 0
4、0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 | HID_L | PID |输出端D0、D1时序:图示:(1)D0、D1在没有数据输出时均保持高电平;(2)输出数据位时间为420uS(TL),如输出为0,D0拉低420uS(TL)后为高电平,若输出为1,则D1拉低420uS(TL)后为高电平;输出数据位之间的间隔时间为2mS(TL),如输出00:D0拉低420uS(TL)后为高电2mS(TL),再拉低为低电平420uS(TL),然后释放为高电平;WG34协议Wiegand 34格式:各数据位的含义:第 1 位: 为输出第217位的偶校验位第 2-17
5、位: ID卡的HID码第18-33位: ID卡的PID号码第 34 位: 为输出第18-33位的奇校验位数据输出顺序: HID码和PID码均为高位在前,低位在后例:一张ID卡内容为:HID:32769 PID:34953 ( 卡面印:37 001, 34953 )相应的二进制为:000HID:1000 0000 0000 0001PID:1000 1000 1000 1001输出如下:1 2 17 18 33 340 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0| HID_L | PID |输出端D0、D1时
6、序:图示:(1)D0、D1在没有数据输出时均保持高电平;(2)输出数据位时间为420uS(TL),如输出为0,D0拉低420uS(TL)后为高电平,若输出为1,则D1拉低420uS(TL)后为高电平;(3)输出数据位之间的间隔时间为2mS(TL),如输出00:D0拉低420uS(TL)后为高电2mS(TL),再拉低为低电平420uS(TL),然后释放为高电平;发送程序如下:Str中存的是4字节卡号。void Send_Weigand34(unsigned char *str) unsigned char one_num = 0; unsigned char even = 0; unsigned
7、 char odd = 0; unsigned char check_temp,i; check_temp = *str; for(i = 0;i = 1; check_temp = *(str + 1); for(i = 0;i = 1; if(one_num % 2 ) even = 1; else even = 0; one_num = 0; check_temp = *(str + 2); for(i = 0;i = 1; check_temp = *(str + 3); for(i = 0;i = 1; if(one_num % 2 ) odd = 0; else odd = 1;
8、one_num = 0; WG_DATA0 = 1; WG_DATA1 = 1; Delay_1ms(2); if(even) WG_DATA1 = 0; /*偶校验位为1*/ Delay_50us(8); WG_DATA1 = 1; else WG_DATA0 = 0; /*偶校验位为0*/ Delay_50us(8); WG_DATA0 = 1; Delay_1ms(2); /*延时2ms*/ for(i = 0;i 32;i+) WG_DATA0 = 1; WG_DATA1 = 1; if(str0 & 080) WG_DATA1 = 0; Delay_50us(8); WG_DATA1
9、 = 1; else WG_DATA0 = 0; Delay_50us(8); WG_DATA0 = 1; (*(long*)&str0) = 1; Delay_1ms(2); /*延时2ms*/ WG_DATA0 = 1; WG_DATA1 = 1; if(odd) WG_DATA1 = 0; Delay_50us(8); WG_DATA1 = 1; else WG_DATA0 = 0; Delay_50us(8); WG_DATA0 = 1; Delay_1ms(2);/*韦根26发送函数*/void Send_Weigand26(unsigned char *str) unsigned
10、char one_num = 0; unsigned char even = 0; unsigned char odd = 0; unsigned char check_temp,i; check_temp = *str; for(i = 0;i = 1; check_temp = *(str + 1); for(i = 0;i 4;i+) if(check_temp & 080) one_num+; check_temp = 1; if(one_num % 2 ) even = 1; else even = 0; one_num = 0; check_temp = *(str + 1); f
11、or(i = 0;i = 1; check_temp = *(str + 2); for(i = 0;i = 1; if(one_num % 2 ) odd = 0; else odd = 1; one_num = 0; WG_DATA0 = 1; WG_DATA1 = 1; Delay_1ms(2); if(even) WG_DATA1 = 0; /*偶校验位为1*/ Delay_50us(8); WG_DATA1 = 1; else WG_DATA0 = 0; /*偶校验位为0*/ Delay_50us(8); WG_DATA0 = 1; Delay_1ms(2); /*延时2ms*/ f
12、or(i = 0;i 24;i+) WG_DATA0 = 1; WG_DATA1 = 1; if(str0 & 080) WG_DATA1 = 0; Delay_50us(8); WG_DATA1 = 1; else WG_DATA0 = 0; Delay_50us(8); WG_DATA0 = 1; (*(long*)&str0) = 1; Delay_1ms(2); /*延时2ms*/ WG_DATA0 = 1; WG_DATA1 = 1; if(odd) WG_DATA1 = 0; Delay_50us(8); WG_DATA1 = 1; else WG_DATA0 = 0; Delay_50us(8); WG_DATA0 = 1; Delay_1ms(2);