c51 接收韦根26

ATMEGA162接收四路韦根数据
ATMEGA162接收四路韦根数据
作者:佚名 AVR单片机来源:本站原创 点击数: 更新时间:2008-10-22

void data0_deal(void)
{
datacn++;
if(datacn<10)
{
*sp<<=1;
}
else if(datacn<18)
{
*(sp+1)<<=1;
}
else if(datacn<26)
{
*(sp+2)<<=1;
}
else
//(datacn==26) //是最后一位?
{
*(sp+5)&=0x7f;
datacn=0;
wgdata_over=1; //一个通道的数据接受完毕
fg_wgend=1;
EIMSK=0x00;
cha=ch; //指示通道号
ch=0;
send_wgdata();
}
}


void data1_deal(void)
{
datacn++;
if(datacn<10)
{
*sp<<=1;
*sp|=0x01;
}
else if(datacn<18)
{
*(sp+1)<<=1;
*(sp+1)|=0x01;
}
else if(datacn<26)
{
*(sp+2)<<=1;
*(sp+2)|=0x01;
}
else
//(datacn==26) //是最后一位?
{
*(sp+5)|=0x80;
datacn=0;
wgdata_over=1; //一个通道的数据接受完毕
fg_wgend=1;
EIMSK=0x00;
cha=ch; //指示通道号
ch=0;
send_wgdata();
}
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
CLI();
cn_g=0;
if(fg_rxding==0) //已经开始接受?
{
//data0
fg_rxding=1;
ch=3;
EIMSK=0x03;
datacn=1;
ch3[5]&=0xfe;
sp=ch3;
}
else
{
data0_deal();
}
SEI();
}

#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
//external interupt on INT1
CLI();
cn_g=0;
if(fg_rxding==0) //已经开始接受?
{
//data1
fg_rxding=1;
ch=3;
EIMSK=0x03;
datacn=1;
ch3[5]|=0x01;
sp=ch3;
} // s=bufbit;
else
{
data1_deal();
}
SEI();
}

#pragma interrupt_handler int2_isr:4
void int2_isr(void)
{
//external interupt on INT2
CLI();
cn_g=0;
if(fg_rxding==0) //已经开始接受?
{
//data0
fg_rxding=1;
ch=4;
EIMSK=0x0c;
datacn=1;
ch4[5]&=0xfe;
sp=ch4;
}
else
{
data0_deal();
}
SEI();
}

#pragma interrupt_handler int3_isr:5
void int3_isr(void)
{
//external interupt on INT3
CLI();
cn_g=0;
if(fg_rxding==0) //已经开始接受?
{
//data1
fg_rxding=1;
ch=4;
EIMSK=0x0c;
datacn=1;
ch4[5]|=0x01;
sp=ch4;
} // s=bufbit;
else
{
data1_deal();
}
SEI();
}

#pragma interrupt_handler int4_isr:6
void int4_isr(void)
{
//external interupt on INT4
CLI();
cn_g=0;
if(fg_rxding==0) //已经开始接受?
{ //data0
fg_rxding=1;
ch=1;
EIMSK=0x30;
datacn=1;
ch1[5]&=0xfe;
sp=ch1;
}
else
{
data0_deal();
}
SEI();
}

#pragma interrupt_handler int5_isr:7
void int5_isr(void)
{
//external interupt on INT5
CLI();
cn_g=0;
if(fg_rxding==0) //已经开始接受?
{
//data1
fg_rxding=1;
ch=1;
EIMSK=0x30;
datacn=1;
ch1[5]|=0x01;
sp=ch1;
} // s=bufbit;
else
{
data1_deal();
}
SEI();
}

#pragma interrupt_handler int6_isr:8
void int6_isr(void)
{
//external interupt on INT6
CLI();
cn_g=0;
if(fg_rxding==0) //已经开始接受?
{ //data0
fg_rxding=1;
ch=2;
EIMSK=0xc0;
datacn=1;
ch2[5]&=0xfe;
sp=ch2;
}
else
{
data0_deal();
}
SEI();
}

#pragma interrupt_handler int7_isr:9
void int7_isr(void)
{
//external interupt on INT7
CLI();
cn_g=0;
if(fg_rxding==0) //已经开始接受?
{
//data1
fg_rxding=1;
ch=2;
EIMSK=0xc0;
datacn=1;
ch2[5]|=0x01;
sp=ch2;
}
else
{
data1_deal();
}
SEI();
}


/**************************************************/
//weigand数据校验函数
unsigned char wgverify(unsigned char temp_ch)
{
unsigned char cn_bit=0;
unsigned char fg_ver=0;
unsigned char i=0;
unsigned char *k;

if(temp_ch==01)
{
for(i=0;i<6;i++)
ch_buf[i]=ch1[i];
}

if(temp_ch==02)
{
for(i=0;i<6;i++)
ch_buf[i]=ch2[i];
}
if(temp_ch==03)
{
for(i=0;i<6;i++)
{ch_buf[i]=ch3[i];}
}
if(temp_ch==04)
{
for(i=0;i<6;i++)
{ch_buf[i]=ch4[i];}
}
k=&ch_buf[0];
cn_bit=0;
for(i=8;i>0;i--)
{
if(*k&0x01)
{cn_bit+=1;}
*k>>=1;
}
for(i=4;i>0;i--)
{
if((*(k+1))&0x80)
{cn_bit+=1;}
(*(k+1))<<=1;
}
(*(k+5))|=0x02;
if((cn_bit%2)==0)
{
(*(k+5))&=0xfd;
} //2---13bit 有偶数个1 EP=0;
////////////////////////////////////////////////////////////////////
cn_bit=0;
for(i=4;i>0;i--)
{
if((*(k+1))&0x80)
{cn_bit+=1;}
(*(k+1))<<=1;
}
for(i=8;i>0;i--)
{
if((*(k+2))&0x01)
{cn_bit+=1;}
(*(k+2))>>=1;
}
(*(k+5))&=0xbf;
if((cn_bit%2)==0) //14---25bit 有偶数个1 OP=1;
{
(*(k+5))|=0x40;
}
fg_ver=0xaa;
if((*(k+5)==0x00)||(*(k+5)==0xc3)||(*(k+5)==0x03)||(*(k+5)==0xc0))
{fg_ver=0x55;} //校验结果正确
return (fg_ver); //返回校验结果

}

你可能感兴趣的:(c)