c51 接收韦根26 c

/************************************/
/*文件名称:wiegandRC.c
/*文件描述:韦根接收
/*完成日期:2008.4.7
/*************************************/


//**************************************
//伟根接受处理,采用状态变化中断接收
//RB0和RB1分别接入DATA0和DATA1
//RB4为中断引脚
//每没接受一个bit进入一次中断,进入m次后进行信息位解读(m为伟根长度,一般为26,34)
//************************************************


#include    <pic.h>
#include    "delay.h"
#include    "serial.h"
#include    "rtc.h"

bank1 unsigned char rc_temp[5];        //存放伟根码
bank1 unsigned char wg_rc[4];        //存放伟根码的数据位


/*************************************************************/
/*函数名称:wiegandRC
/*输入:韦根码的长度,一般为26,34
/*输出:无
/*功能描述:进行韦根的接收,信息码的解读,然后从串口输出
/*************************************************************/

void wiegandRC(int m)
{
        unsigned int jk;        //计算伟根中断次数
        unsigned int j;            //rc_temp的字节位
        static unsigned char check_rc=0x80;
        unsigned char even_check;    //偶校验
        unsigned char odd_check;    //奇校验
        int i;

        RBIE=0;                        //关闭状态变化中断


        if( RB1==0&&RB0==1 )                //DATA1=0 的处理
        {
            rc_temp[j] |= check_rc;
            check_rc >>= 1;
            PORTB = 0xFF;
            if( jk<m/2) even_check++;                //前面半个序列偶校验
            else if( jk>(m/2-1)&&jk<m ) odd_check++;    //后面半个序列奇校验
            jk++;                                     //中断计数+1
           
        }
        else if( RB0==0&&RB1==1 )            //DATA0=0 的处理
        {
            check_rc >>= 1;                   
            PORTB = 0xFF;
            jk++;
        }
       
        if( check_rc==0x00 )        //一个字节接收完之后,进入下一个字节
        {
            check_rc = 0x80;
            j++;
        }

//*************接受完m位伟根码后读取其信息位处理函数***************/

        if(jk==m)               
        {
           
            jk=0;
            j=0;
            check_rc=0x80;
            if( even_check%2==0&&odd_check%2==1 )
            {
                for( i=0;i<(m-2)/8;i++ )
                {
                    wg_rc[i]=rc_temp[i];
                    wg_rc[i]<<=1;                        //循环时一个字节的最低位是以0填充的
                    if( (rc_temp[i+1]&0x80) == 0x80 )        //移位时候如果后一字节最高位为1,本字节最低位则要置1
                        wg_rc[i]|=0x01;
                    putch(wg_rc[i]);
                }
            }
//            putch(hour);putst(":");putch(min);putst(":");putch(sec);
            for( i=0;i<5;i++ )                //暂存数据清空
                rc_temp[i]=0x00;
            even_check=0x00;                //奇偶校验清零
            odd_check=0x00;
           
           
        }

//*************************************************************/       

       
       
        RBIF = 0;        //清空中断标志位
        RBIE = 1;        //打开中断
        DelayUs(100);    //防止一次脉冲进多次中断



}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值