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

📄 wiegand.c

📁 mifare 读卡器weigant输出有kei uvision打开!
💻 C
字号:
 /*=====================================================================
  Copyright (C), 2005, RegalCyber Tech. Co., Ltd.
  File name:   Wiegand.C
  Author: Zhangui Duan   Version: v1.2   Date: 2005-3-30

  Description:
     此程序文件主要是完成Wiegand26数据格式的产生以及发送。
  		1,偶校验位的产生
  		2,奇校验位的产生
		3,Wiegand26输出 
  Other Description:
  		 由 Keil C51 V6.10 and V7.05 编译通过

  Function List:  
    1. 	偶校验位的产生
		bit Even_Parity(unsigned char a);
	2,	奇校验位的产生
		bit Odd_Parity(unsigned int a);
	3,	Wiegand26输出 
		 void Wiegand_Out(void);
  History:          
    1. Date:
       Author:
       Modification:

===========================================*/


#include "wiegand.h"

void Delay100us(volatile unsigned char n)
{
    unsigned char i;
    while(n--)
        for(i=0;i<35;i++)
            ;
}
/****************************************************************************************
  Function:        Even_Parity
  Description:     对Wiegand26中的第1-12位进行偶校验
  				   得出Wiegand26的第1位
  Calls:           
  Called By:      
  			 void Wiegand_Out(void);
  Input:     a 
  			 Wiegand26的第1-12位(12bit)数据   
  Output:    
  Return:    Bit_EP
  			 0 a的12位中1的个数为偶数
			 1 a的12位中1的个数为奇数
  Others:    
****************************************************************************************/
 bit Even_Parity(unsigned char *a)
 {
   unsigned char i,j;
   bit Bit_EP;
   for(i=0,j=0;i<12;i++)
   {
	 if(a[i]==0x01)
	 {
	   j++;
	  }
   }
   if((j&0x01)==0x01)Bit_EP=1;
   else Bit_EP=0;
   return(Bit_EP);
 }

/****************************************************************************************
  Function:        Odd_Parity
  Description:     对Wiegand26中的第13-24位进行偶校验
  				   得出Wiegand26的第26位
  Calls:           
  Called By:      
  			 void Wiegand_Out(void);
  Input:     a 
  			 Wiegand26的第13-24位(12bit)数据   
  Output:    
  Return:    Bit_OP
  			 0 a的12个数中1的个数为奇数
			 1 a的12个数中1的个数为偶数
  Others:    
****************************************************************************************/
 bit Odd_Parity(unsigned char *a)
 {
   bit Bit_OP;
   unsigned char i,j;
   for(i=0,j=0;i<12;i++)
   {
	 if(a[i]==0x01)
	 {
	   j++;
	  }
   }
   if((j&0x01)==0x01)Bit_OP=0;
   else Bit_OP=1;
   return(Bit_OP);
 }

/****************************************************************************************
  Function:        Wiegand_Out
  Description:     按照Wiegand26格式输出数据
  					
  Calls:           
  					bit Odd_Parity(unsigned int a)
					bit Even_Parity(unsigned char a)
					Delay100us()
  Called By:      
  			 		void main(void);
  Input:     		fc1:机器码
  			 		cc1:卡号 
  Output: 			
  					如果此位是0,则在DATA0上输出100US的低电平
					如果此位是1,则在DATA1上输出100US的低电平
					两个数据位输出间隔是1MS   
  Return:    
  Others:    
****************************************************************************************/
 void Wiegand_Out(unsigned char fc,unsigned int cc)
 {
	unsigned char i;
	unsigned char cardno[26];
	//得到HID号的低8位
	//fc=fc1;
	for(i=1;i<9;i++)
	{
	 cardno[i]=(fc&0x80)>>7;
	 fc=fc<<1;
	 }
	//得到16位机器号
	//cc=cc1;
	for(i=9;i<25;i++)
	{
	 if((cc&0x8000)==0x8000) cardno[i]=0x01;
	 else cardno[i]=0x00;
	 cc=cc<<1;
	 }
	//偶校验位
	if((Even_Parity(&cardno[1]))==1)cardno[0]=0x01;
	else cardno[0]=0x00;
	//奇校验位
	if((Odd_Parity(&cardno[13]))==1)cardno[25]=0x01;
	else cardno[25]=0x00;
	for( i=0;i<26;i++)
	{
	   if(cardno[i]==0x01)
	   {
	   	Data1=0;	   	//脉冲宽度100us	   	Delay100us(1);
	   	Data1=1;
	   }
	   else
	   {
	   //脉冲宽度100us
	   	Data0=0;
	   	Delay100us(1);
	   	Data0=1;
	   }
	  //脉冲间隔1ms
	  	Delay100us(10);
	 }
  }

 

⌨️ 快捷键说明

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