刚接触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
-----------------------------------------------------------------------
顶下,有人来帮忙吗? 顶 有人来帮忙吗? 可能没有人帮忙了。我比较讨厌贴上段代码,然后请人帮忙。没有基础,就不要吃这碗饭,换个行当吧。
页:
[1]