⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wiegand26.c

📁 WEIGANG-ID卡读卡头数据传输协议,在门禁,停车场系统中大量使用
💻 C
字号:
#include"config.h"


sttWiegandFlags stWG1Flags;   //标识定义

unsigned char WG1_Data[3];   //接收缓存

unsigned char ucBitCounter1;  // 用于指示当前接收的位为第几位,取值范围:0到25

bit Wiegand_Flag=0;

/*--------------------检查奇偶校验----------------------*/
/*-------------------------------------------------------
    如果数据是:01010111八位,
    偶校验应该加“1”->1+1+1+1+1+'1'(这个是校验位)=
    奇校验应该加“0”->1+1+1+1+1+'0'(这个是校验位)=1
    -----------------------------------------------------*/
bit Wg_ParityCheck(unsigned char *cData,bit bEven,bit bOdd)
{
    bit bWg_CountPE;   //校验标志
    bit bWg_CountPO;

    unsigned char i;

    unsigned char ucPE_Counter = 0;
    unsigned char ucPO_Counter = 0;

    unsigned char ucDataSeparate;  //校验数据暂存

    // 计算奇校验
    ucDataSeparate = cData[0];
    for (i = 0; i <= 7; i++)
    {
        ucPO_Counter = ucPO_Counter + (ucDataSeparate & 0x01);
        ucDataSeparate = ucDataSeparate >> 1;
    }
    ucDataSeparate = cData[1];
    for (i = 0; i <= 3; i++)
    {
        ucPO_Counter = ucPO_Counter + (ucDataSeparate & 0x01);
        ucDataSeparate = ucDataSeparate >> 1;
    }
    if ((ucPO_Counter % 2) == 1)    // 若为奇数个1,则奇校验为0;
    {
        bWg_CountPO = 0;
    }
    else      // 若为偶数个1,则奇校验为1
    {
        bWg_CountPO = 1;
    }

    // 计算偶校验
    for (i = 4; i <= 7; i++)
    {
        ucPE_Counter = ucPE_Counter + (ucDataSeparate & 0x01);
        ucDataSeparate = ucDataSeparate >> 1;
    }
    ucDataSeparate = cData[2];
    for (i = 0; i <= 7; i++)
    {
        ucPE_Counter = ucPE_Counter + (ucDataSeparate & 0x01);
        ucDataSeparate = ucDataSeparate >> 1;
    }
    if ((ucPE_Counter % 2) == 1)    // 若为奇数个1,则偶校验为1;
    {
        bWg_CountPE = 1;
    }
    else    // 若为偶数个1,则偶校验为0
    {
        bWg_CountPE = 0;
    }

    if ((bWg_CountPO == bOdd) && (bWg_CountPE == bEven))   //校验通过
        return 1;
    else
        return 0;
}

/*
//--------------------从一个字节的右边移入一个位----------------------
void Wg1_RightAddBit(unsigned char* ucChar, bit bBit)
{
    (*ucChar) <<= 1;
    if (bBit) (*ucChar)++;
}
*/

/*------------------接收程序-----------------*/
void Receive_Wiegand1_Data() 
{   
    unsigned int TIMEOUT=20000;   //超时参数
    EA = 0;      // 关闭所有中断
   
    stWG1Flags.value = 0xFF;
    stWG1Flags.bits.bRecFlag = 0;       // 复位数据接收标志位
    ucBitCounter1 = 0;    //接收计数器
    while(TIMEOUT--)
     {  // 检测数据线0
        stWG1Flags.bits.bCurData0 = WG1_DATA0;  //读引脚
        if ((stWG1Flags.bits.bCurData0 != stWG1Flags.bits.bOldData0) 
            && stWG1Flags.bits.bCurData0 == 0) // 检测到WG_DATA0的一个负跳变
    	{
            stWG1Flags.bits.bRecData = 0;
            stWG1Flags.bits.bRecFlag = 1;
    	}
        stWG1Flags.bits.bOldData0 = stWG1Flags.bits.bCurData0;

        // 检测数据线1
        stWG1Flags.bits.bCurData1 = WG1_DATA1;
        if ((stWG1Flags.bits.bCurData1 != stWG1Flags.bits.bOldData1) 
            && stWG1Flags.bits.bCurData1 == 0) // 检测到WG_DATA1的一个负跳变
    	{
            stWG1Flags.bits.bRecData = 1;
            stWG1Flags.bits.bRecFlag = 1;
    	}
        stWG1Flags.bits.bOldData1 = stWG1Flags.bits.bCurData1;

        // 对收到的数据进行处理
        if (stWG1Flags.bits.bRecFlag == 1)
    	{
            stWG1Flags.bits.bRecFlag = 0;       // 复位数据接收标志位

            if (ucBitCounter1 == 0)     // 取出第0位,即前12位的偶校验位
    		{
                stWG1Flags.bits.bEven = stWG1Flags.bits.bRecData;
                ucBitCounter1++;
    		}
            else if (ucBitCounter1 >= 1 && ucBitCounter1 <= 8)  // 接收第一个字节
    		{
  //              Wg1_RightAddBit(&WG1_Data[2], stWG1Flags.bits.bRecData);
				 (WG1_Data[2]) <<= 1;
                if (stWG1Flags.bits.bRecData) (WG1_Data[2])++;
                ucBitCounter1++;
    		}
            else if (ucBitCounter1 >= 9 && ucBitCounter1 <= 16) // 接收第二个字节
    		{
//                Wg1_RightAddBit(&WG1_Data[1], stWG1Flags.bits.bRecData);
                (WG1_Data[1]) <<= 1;
                if (stWG1Flags.bits.bRecData) (WG1_Data[1])++;
                ucBitCounter1++;
    		}
            else if (ucBitCounter1 >= 17 && ucBitCounter1 <= 24)    // 接收第三个字节
    		{
 //               Wg1_RightAddBit(&WG1_Data[0], stWG1Flags.bits.bRecData);
                (WG1_Data[0]) <<= 1;
                if (stWG1Flags.bits.bRecData) (WG1_Data[0])++;
                ucBitCounter1++;
    		}
            else if (ucBitCounter1 == 25)     // 取出第26位,即后12位的奇校验位
    		{
                stWG1Flags.bits.bOdd = stWG1Flags.bits.bRecData;
                Wiegand_Flag=1;
                EX0=1;
				EX1=1;
				EA = 1;
				Printk("rece ok");
                return;
    		}
    	}
    }
	Printk("rece err");
    EX0=1;
	EX1=1;
	EA = 1; 
}



void WG_Init()   //初始化
{
    WG1_DATA0 = 1;      // WG1数据线0
    WG1_DATA1 = 1;      // WG1数据线1
    EX0 = 1;            // 开外部中断0
    EX1 = 1;            // 开外部中断1
//    IT0 = 1;            // 设置外部中断0为电平触发
//	IT1 = 1;            // 设置外部中断1为电平触发
}


void Int0(void) interrupt 0
{EX0=0;
 Receive_Wiegand1_Data();
 EX0=1;
}

void Int1(void) interrupt 2
{EX1=0;
 Receive_Wiegand1_Data();
 EX1=1;
}

/*--------------------输出韦根数据----------------------*/
bit Get_WgData(unsigned char* ucWgData)
{
    if(Wiegand_Flag)   //读数据
    {
	 Wiegand_Flag=0;
        if(Wg_ParityCheck(WG1_Data,stWG1Flags.bits.bEven,stWG1Flags.bits.bOdd)) //校验
    	{ 
            ucWgData[0] = 0;           //数据格式转换
            ucWgData[1] = WG1_Data[2];
            ucWgData[2] = WG1_Data[1];
            ucWgData[3] = WG1_Data[0];
            return 1;
    	}
    }
    return 0;
}

/*********************************************************************
名称:韦跟26读头
组成:wiegand26.h,wiegand26.c
日期:2006.07.04
备注:使用延时读韦跟数据,占用2个INT口,DATA0接INT0低电平输出0,DATA1接INT1低电平输出1

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

/*

#include"config.h"


sbit SPEAKER        =	P3^4;

//========================延时函数============================
//Delay at 22.1184M
void Delay50us(unsigned char _50us)
{
    unsigned char data i;
//  bit EA_Value = EA;
//  EA = 0;
    while(_50us--)
    {
        i=13;
        while(i--);
    }
//  EA = EA_Value;
}


void Delay1ms(unsigned char _1ms)
{
    while(_1ms--)
    {
        Delay50us(20);
        //Clr_Dog();
    }
}
//----------------------------------------------------------------

//蜂鸣器函数,Times为响次数,OnTimes_ms为蜂鸣时长,OffTime_ms为间隔时长
//单位:ms
void Beep(unsigned char Times, unsigned char OnTime_ms, 
          unsigned char OffTime_ms)
{   //Speaker At CPU P1.2
    while(Times--)
    {
        SPEAKER = 0;
        Delay1ms(OnTime_ms);
        SPEAKER = 1;
        Delay1ms(OffTime_ms);
    }
}

void Main()
{
    unsigned char wgBuffer[4];   //读数据缓存
    WG_Init();
    T2Uart_Ini();   //初始化
    Beep(1,250,0);
    EA = 1;
    while(1)
    {
        if(Get_WgData(wgBuffer))      //读取数据
    	{
    
            Uart_Send(wgBuffer[0]);   //高字节
            Uart_Send(wgBuffer[1]);
            Uart_Send(wgBuffer[2]);
            Uart_Send(wgBuffer[3]);    //底字节
            Beep(1,150,0);
    	}
    
    }
}

*/


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -