jszjl2007 发表于 2008-4-10 14:53:50

哪为高手懂韦根协议啊。怎么用单片机来读取韦根26的ID卡的信息,以下为我写的程序,ID

源程序

#include <reg52.h>
#include <intrins.h>
#include <absacc.h>

/*类型声明*/
typedef unsigned char uchar;
typedef unsigned intuint;
typedef unsigned long ulong;

voiddelay(void);

sbit DATA1_INT0=P3^2;
sbit DATA0=P1^6;
uchar ReadIDflag=0;
bit RcvEven;
bit RcvOdd;
bit CheckEven=0;
bit CheckOdd=1;
bit RCVOK=0;
uchar RcvWG={0,0,0};
uchar Rcnt=0;


sbit bell_cl=P1^7;//蜂鸣器
sbit WD=P3^5;       //看门狗
sbit OE2_138=P1^5;//低有效

sbit INT_1=P3^3;
uchar COUNT_T0=0;
ulong flashbell=0;

#define T0H0Xf9
#define T0L0X85//1.8ms
#define NOP5()_nop_();_nop_();_nop_();_nop_();_nop_()
#define selDW_CS_18ADD XBYTE
#define selDW_CS_90ADD XBYTE
#define selDM_ADD      XBYTE

#define EN138          OE2_138=1
#define DISEN138       OE2_138=0

uchar code DM={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code IDindex={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
uchar ID={0xE9,0xa0,0xa0,0x4f,0x00,0x00,0x00,0x00,0x00,0x00};

uchar code DW_CS={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfE,0xfD};
bitb_ClrDog=0;
uchar ClrDogcount=0;


void initial(void)
{
EA=0;
EN138;
bell_cl=1;
COUNT_T0=0;
//INT0=0;
IT0=0;//低电平触发中断
EX0=1;//外部中断允许
//T0
TMOD = 0x11;
TH0= T0H;
TL0= T0L;
//T1
TH1= T1H;
TL1= T1L;
ET0=1;
TR0=1;
ET1=1;
TR1=0;
EA=1;
}
voiddelay(void)
{
uint i;
for(i=125;i>0;i--)
{}
}
void v_ClrDog(void)
{
    if(b_ClrDog)
    {
      b_ClrDog=0;
      WD=0;NOP5();
        WD=1;NOP5();
        WD=0;
    }
}

void main (void)
{
uchar i=0;
initial();
while(1)
    {
      v_ClrDog();
      if(ReadIDflag==1)
       {EA=0;
         if(Rcnt<=1))//读偶校验位1
         {
             if(DATA0==0)RcvEven=0;
             else RcvEven=1;
         }
         else if(Rcnt>=26)//读奇校验位26
         {
            if(DATA0==0)RcvOdd=0;
            else RcvOdd=1;
         }
         else//读24位卡号数据
         {
         
         if(DATA0==0)
               {if(Rcnt<=9)
                RcvWG=RcvWG|0x00;
                else if(Rcnt<=17)
                RcvWG=RcvWG|0x00;
                else RcvWG=RcvWG|0x00;
               }   
         else
             {
                if(Rcnt<=9)                   //2~9位 用RcvWG存
                RcvWG=RcvWG|0x01;
                else if(Rcnt<=17)            //10~17位 用RcvWG存
                RcvWG=RcvWG|0x01;
                else RcvWG=RcvWG|0x01;   //18~25位 用RcvWG存
                if(Rcnt<=13)CheckEven=~CheckEven; //偶校验
                else CheckOdd=~CheckOdd;//奇校验
            }
             if(Rcnt<=9)
            RcvWG=RcvWG<<1;
            else if(Rcnt<=17)
            RcvWG=RcvWG<<1;
            else RcvWG=RcvWG<<1;
          }
      ReadIDflag=0;
      EA=1;
       }
      if(Rcnt>26)//26韦根数据读完
      {
          if((CheckEven==RcvEven)&&(CheckOdd==RcvOdd))//检验数据是否接受正确
            {
               for(i=0;i<10;i++)//显示卡号
               {
               if(RcvWG/16==IDindex) ID= DM;
               if(RcvWG%16==IDindex) ID= DM;
               if(RcvWG/16==IDindex) ID= DM;
               if(RcvWG%16==IDindex) ID= DM;
               if(RcvWG/16==IDindex) ID= DM;
               if(RcvWG%16==IDindex) ID= DM;
               }

               RcvWG=0;
               RcvWG=0;
               RcvWG=0;
               RcvEven=0;
               RcvOdd=0;
               CheckEven=0;
               CheckOdd=1;
               temp=0;
               Rcnt=0;
               RWGcnt=0;
               RCVOK=1;

         }
      }
      if (RCVOK)//读卡成功后,延时,再开始读下一次
         {
          EX0=0;
          for(i=200;i>0;i--)
         delay();
          EX0=1;
         }
      if(ClrDogcount>=20){b_ClrDog=1;ClrDogcount=0;}
   }
}
void T0_interrupt (void) interrupt 1 using 1    //动态显示3字节卡号数据
{
EA = 0;
TR0 = 0;
v_ClrDog();
if(COUNT_T0>=10) COUNT_T0=0;
selDW_CS_18ADD=0xff;
selDW_CS_90ADD=0xff;
selDM_ADD=0x00;
if(RCVOK)
   {
    switch (COUNT_T0)
         {
         v_ClrDog();

         case 0:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=ID;break;}
         case 1:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=ID;break;}
         case 2:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=ID;break;}
         case 3:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=ID;break;}
         case 4:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=ID;break;}
         case 5:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=ID;break;}
         case 6:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=ID;break;}
         case 7:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=ID;break;}
         case 8:{ selDW_CS_90ADD= DW_CS ; selDM_ADD=ID;break;}
         case 9:{ selDW_CS_90ADD= DW_CS ; selDM_ADD=ID;break;}

      }
   }
else
   {switch (COUNT_T0)
         {
         v_ClrDog();

         case 0:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=DM;break;}
         case 1:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=DM;break;}
         case 2:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=DM;break;}
         case 3:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=DM;break;}
         case 4:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=DM;break;}
         case 5:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=DM;break;}
         case 6:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=DM;break;}
         case 7:{ selDW_CS_18ADD= DW_CS ; selDM_ADD=DM;break;}
         case 8:{ selDW_CS_90ADD= DW_CS ; selDM_ADD=DM;break;}
         case 9:{ selDW_CS_90ADD= DW_CS ; selDM_ADD=DM;break;}

      }
   }
v_ClrDog();
ClrDogcount++;
COUNT_T0++;
TH0 = T0H;
TL0 = T0L;
TR0 = 1;
EA = 1;
}
void INT0_interrupt (void) interrupt 0 using 2
{
EA = 0;
ReadIDflag=1;
Rcnt++;
EA = 1;
}

shmily 发表于 2008-4-10 16:07:56

wiegand包括数据data0和data1。静态电平应该为高。
低电平脉冲表示有数据:data0线的低电平标志数据0,data1线的低电平表示1
脉冲宽度和脉冲间隔时间应该根据需要调整(RFID行业经验)
数据格式:
w26:bit0为bit1~bit12的偶校验
   bit25为bit13~bit24的奇校验


例子:      0   1   1   0
            
data0 ------ ----------------- ----
         |_|               |_|
data1 ------------ ----- ----------
               |_|   |_|

jszjl2007 发表于 2008-4-11 08:58:30

《〈脉冲宽度和脉冲间隔时间应该根据需要调整(RFID行业经验)〉,楼上的大虾,我想问一下,我的DATA0,DATA1是通过一个与非门接到INT0外部中断因脚上的,低电平触发中断,有中断说明有数据发过来,有中断我开始读DATA0,DATA1的状态,我还需要“调整脉冲宽度和脉冲间隔时间”吗?

shmily 发表于 2008-4-11 09:12:16

接收的时候不需要,发送的时候需要注意

avr1008 发表于 2008-4-11 15:23:18

不用 IT0=0;//低电平触发中断 ,而该用下降沿触发中断,用与门

jszjl2007 发表于 2008-4-12 10:53:02

谢谢大家,【4楼】 avr1008 ,能不能麻烦你仔细的帮我查一下程序,除了你提到的《《该用下降沿触发中断,用与门》》,还有其他的问题吗?小女子万分感谢啊!!!!!

jszjl2007 发表于 2008-4-14 07:57:47

问题已完满解决,谢谢大家

jetbo 发表于 2008-4-14 09:52:56

是什么问题啊,说一说嘛

jszjl2007 发表于 2008-4-14 10:48:16

1。《《该用下降沿触发中断,用与门
2。读24位卡号数据 的时候,移位多移了一次

wxdx8320 发表于 2008-8-10 19:48:06

留个记号

34480016 发表于 2008-8-10 22:35:51

收藏

vanloon 发表于 2009-3-13 13:46:23

韦根硬件通信电路怎么连接,比如说通信电压是几伏,是直接用TTL接口,还是要电平转换下,请大虾赐教!!

l456789 发表于 2009-4-15 09:32:26

我网站很久就收录了篇文章,看看应该会明白

Pyramid Series Wiegand Data Format(韦根数据格式)
http://www.zhlab.cn/technique/T0000006.htm

zilog 发表于 2009-4-19 21:42:02

楼上的DD比较好,可是是全E文的啊,有没高手帮忙翻译下呢

mysky 发表于 2009-8-24 09:00:12

mark

yaya001 发表于 2009-8-24 11:44:52

mark mark

mikeseaver 发表于 2009-9-17 22:58:22

标记

wmz128 发表于 2010-4-8 12:41:13

楼主你好!我想请教一下用52单片机读韦根26ID卡信息的问题,我的邮箱是wmz128@163.com,可以把你的资料和程序源码发给我吗?万分感谢!

myljd01 发表于 2011-8-5 10:57:22

mark

Mcu_2009 发表于 2011-10-26 14:56:48

mark

mbq168 发表于 2012-2-3 17:50:40

要是有个原理图就好了

xuxiang10 发表于 2014-9-24 14:27:33

程序先收藏了

123bac 发表于 2015-3-6 10:36:59

jszjl2007 发表于 2008-4-14 07:57
问题已完满解决,谢谢大家

怎么解决的说一下,我也有类似问题{:smile:}
页: [1]
查看完整版本: 哪为高手懂韦根协议啊。怎么用单片机来读取韦根26的ID卡的信息,以下为我写的程序,ID