韦根26韦根34

http://baike.baidu.com/view/557637.htm

WG26协议

Wiegand 26 格式:
各数据位的含义:
第  1   位: 为输出数据2—13位的偶校验位
第 2—9 位:  ID卡的HID码的低8位
第 10-25位:  ID卡的PID号码
第  26 位: 为输出数据14-25位的奇校验位
 
数据输出顺序:
     HID码和 PID码均为高位在前,低位在后
例:一张 ID卡内容为:
HID: 32769   PID:34953      ( 卡面印:2147584137   001, 34953 )
相应的二进制为:
HID: 1000 0000 0000 0001       ( 只输出低8位 )
PID: 1000 1000 1000 1001
输出如下:
1 2          9 10                     25  26
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     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   位: 为输出第2—17位的偶校验位
第 2-17 位:  ID卡的HID码
第 18-33位:  ID卡的PID号码
第  34 位: 为输出第18-33位的奇校验位
 
数据输出顺序:
     HID码和 PID码均为高位在前,低位在后
例:一张 ID卡内容为:
HID: 32769   PID:34953       ( 卡面印:2147584137   001, 34953 )
相应的二进制为:
HID: 1000 0000 0000 0001
PID: 1000 1000 1000 1001
输出如下:
1 2                      17 18                     33  34
0 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时序:
 图示:

 

(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 char odd = 0;
       unsigned char check_temp,i;
      
       check_temp = *str;
       for(i = 0;i < 8;i )
       {
              if(check_temp & 0x01)
                     one_num ;
              check_temp >>= 1;
       }
       check_temp = *(str 1);
       for(i = 0;i < 8;i )
       {
              if(check_temp & 0x01)
                     one_num ;
              check_temp >>= 1;
       }
       if(one_num % 2 )
              even = 1;
       else
              even = 0;
 
       one_num = 0;
       check_temp = *(str 2);
       for(i = 0;i < 8;i )
       {
              if(check_temp & 0x01)
                     one_num ;
              check_temp >>= 1;
       }
       check_temp = *(str 3);
       for(i = 0;i < 8;i )
       {
              if(check_temp & 0x01)
                     one_num ;
              check_temp >>= 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*/
      
       for(i = 0;i < 32;i )
       {
              WG_DATA0 = 1;
              WG_DATA1 = 1;
 
              if(str[0] & 0x80)
              {
                     WG_DATA1 = 0;
                     Delay_50us(8);
                     WG_DATA1 = 1;
              }
              else
              {
                     WG_DATA0 = 0;
                     Delay_50us(8);
                     WG_DATA0 = 1;
              }
              (*(long*)&str[0]) <<= 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 char one_num = 0;
       unsigned char even = 0;
       unsigned char odd = 0;
       unsigned char check_temp,i;
      
       check_temp = *str;
       for(i = 0;i < 8;i )
       {
              if(check_temp & 0x01)
                     one_num ;
              check_temp >>= 1;
       }
       check_temp = *(str 1);
       for(i = 0;i < 4;i )
       {
              if(check_temp & 0x80)
                     one_num ;
              check_temp <<= 1;
       }
      
       if(one_num % 2 )
              even = 1;
       else
              even = 0;
 
       one_num = 0;
       check_temp = *(str 1);
       for(i = 0;i < 4;i )
       {
              if(check_temp & 0x01)
                     one_num ;
              check_temp >>= 1;
       }
       check_temp = *(str 2);
       for(i = 0;i < 8;i )
       {
              if(check_temp & 0x01)
                     one_num ;
              check_temp >>= 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*/
      
       for(i = 0;i < 24;i )
       {
              WG_DATA0 = 1;
              WG_DATA1 = 1;
 
              if(str[0] & 0x80)
              {
                     WG_DATA1 = 0;
                     Delay_50us(8);
                     WG_DATA1 = 1;
              }
              else
              {
                     WG_DATA0 = 0;
                     Delay_50us(8);
                     WG_DATA0 = 1;
              }
              (*(long*)&str[0]) <<= 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);  
}

转载于:https://www.cnblogs.com/icedog/p/3281074.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Keil 5 C语言中实现韦根2634解码,可以按照以下步骤进行: 1. 定义中断服务函数:在程序中定义外部中断的中断服务函数,并在函数中实现对韦根码的捕获和解码。 2. 定义变量:定义相应的变量来存储韦根码的数据和状态信息。例如,可以定义一个字符数组来存储韦根码的二进制数据,以及一个整型变量来表示当前位的状态(高电平或低电平)。 3. 解码韦根码:根据韦根码的特点,通过对外部中断信号的状态变化进行分析,可以还原出韦根码的原始数据。对于韦根26码,可以通过分析26个位的状态变化,识别出卡号等信息;对于韦根34码,则需要分析34个位的状态变化。 4. 处理数据:解码出韦根码的原始数据后,可以将其保存到内存或外部存储器中,也可以发送到其他设备进行处理。 下面是一个简单的示例代码,可以用于韦根26码的解码: ``` #include <reg52.h> char cardNo[26]; // 存储卡号的字符串 int bitState; // 当前位的状态(0或1) int bitCount; // 当前位的计数器 // 中断服务函数 void externalInterrupt(void) interrupt 0 { if (bitState != (P3 & 0x01)) // 判断当前位的状态是否发生变化 { bitState = P3 & 0x01; // 更新当前位的状态 if (bitCount < 26) // 如果卡号还没有完全接收 { cardNo[bitCount++] = bitState + '0'; // 将当前位的状态转换为字符,存储到卡号字符串中 } else // 卡号接收完成 { // 处理卡号数据,例如校验数据、发送数据等 // ... bitCount = 0; // 重置计数器,准备接收下一张卡的数据 } } } void main() { bitState = 0; // 初始化位的状态 bitCount = 0; // 初始化计数器 // 配置外部中断的触发方式(例如下降沿触发) IT0 = 1; EX0 = 1; EA = 1; while (1) { // 主循环中可以进行其他任务,例如控制设备、显示数据等 // ... } } ``` 需要注意的是,在实际应用中,韦根码的格式和解码方式可能存在差异,具体实现方式需要根据具体的硬件设备和软件程序而定。同时,为了保证数据的可靠性,还需要考虑数据校验等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值