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);         //返回校验结果
  
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值