Sshikamaru 发表于 2011-5-22 22:51:18

刚接触avr,谁用avr做过韦根26rfid读写器的,进来帮我看下怎么读不出卡号

data0,data1通过与门接在 INT0上 下降沿触发,data0,data1接在 porta0,porta1上。读出卡号想显示在 led数码管上。
源程序如下 结果刷卡时数码管上一直显示000000.



#include <mega16.h>
#include <delay.h>

/****类型声明******/
typedef unsigned char uchar;
typedef unsigned intuint;
typedef unsigned long ulong;
bit DATA0;
bit DATA1;
uchar ReadIDflag=0;
bit RcvEven;
bit RcvOdd;
bit CheckEven=0;
bit CheckOdd=1;
int Rcnt=0;
uchar RcvWG={0,0,0};
uchar IDindex={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
flash uchar led_7={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极的数码管
flash uchar position={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar ID={0x00,0x00,0x00,0x00,0x00,0x00};


void initial(void)
{
GICR|=0x40;   //使能INT0中断
MCUCR=0x02;    //INT0中断标志位
GIFR=0x40;    //清除INT0中断标志位
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x3F;
DDRA=0x00;
DATA0=PORTA.0;
DATA1=PORTA.1;
}

void display(void)
{
uint i;
for(i=0;i<6;i++)
{
PORTB=led_7];
PORTC=position;
delay_ms(2);
PORTC=0xff;
}
}


//INT0中断服务程序
interrupt void ext_int1_isr(void)
{
ReadIDflag=1;
Rcnt++;

}

voiddelay(void)
{
uint i;
for(i=125;i>0;i--)
{}
}




void main (void)
{
uchar i=0;
initial();
#asm("sei");
while(1)
    {
if(ReadIDflag==1)
       {
         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;         
       }
if(Rcnt>26)//26韦根数据读完
      {
          if((CheckEven==RcvEven)&&(CheckOdd==RcvOdd))//检验数据是否接受正确
            {
               for(i=0;i<10;i++)//显示卡号
               {
               if(RcvWG/16==IDindex) ID=IDindex;
               if(RcvWG%16==IDindex) ID=IDindex;
               if(RcvWG/16==IDindex) ID=IDindex;
               if(RcvWG%16==IDindex) ID=IDindex;
               if(RcvWG/16==IDindex) ID=IDindex;
               if(RcvWG%16==IDindex) ID=IDindex;
               }

               RcvWG=0;
               RcvWG=0;
               RcvWG=0;
               RcvEven=0;
               RcvOdd=0;
               CheckEven=0;
               CheckOdd=1;            
               Rcnt=0;
         }
   
         }
for(i=100;i>0;i--)

display();//在led数码管上显示卡号


//读卡后延时,准备下次读卡;
for(i=200;i>0;i--)
         delay();
         
          }
          }

Sshikamaru 发表于 2011-5-22 23:00:18

回复【楼主位】Sshikamaru
-----------------------------------------------------------------------

顶下,有人来帮忙吗?

Sshikamaru 发表于 2011-5-23 20:08:23

顶 有人来帮忙吗?

machao 发表于 2011-6-10 19:22:19

可能没有人帮忙了。我比较讨厌贴上段代码,然后请人帮忙。没有基础,就不要吃这碗饭,换个行当吧。
页: [1]
查看完整版本: 刚接触avr,谁用avr做过韦根26rfid读写器的,进来帮我看下怎么读不出卡号