/************************************/
/*文件名称: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); //防止一次脉冲进多次中断
}
c51 接收韦根26 c
最新推荐文章于 2021-05-20 12:31:23 发布