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

📄 wiegand.c

📁 维根输出源程序用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 "main.h"
//Wiegand 数据线定义
sbit Data0		   =P0^5; //DIO7
sbit Data1		   =P0^4; //DIO6


/*************************************************
  Function:        Even_Parity
  Description:     对Wiegand26中的第2-9位进行偶校验
  				   得出Wiegand26的第1位
  Calls:           
  Called By:      
  			 void Wiegand_Out(void);
  Input:     a 
  			 Wiegand26的第2-9位(一个字节)数据   
  Output:    
  Return:    Bit_EP
  			 0 a的八位中1的个数位偶数
			 1 a的八位中1的个数位奇数
  Others:    
*************************************************/
 bit Even_Parity(unsigned char a)
 {
   unsigned char i,j,b;
   bit Bit_EP;
   for(i=0,j=0;i<8;i++)
   {
     b=a&0x01;
	 if(b==0x01)
	 {
	   j++;
	   b=0;
	  }
	 a=a>>1;
   }
   if((j&0x01)==0x01)Bit_EP=1;
   else Bit_EP=0;
   return(Bit_EP);
 }

/*************************************************
  Function:        Odd_Parity
  Description:     对Wiegand26中的第10-25位进行偶校验
  				   得出Wiegand26的第26位
  Calls:           
  Called By:      
  			 void Wiegand_Out(void);
  Input:     a 
  			 Wiegand26的第10-25位(2个字节)数据   
  Output:    
  Return:    Bit_OP
  			 0 a的16位中1的个数为奇数
			 1 a的16位中1的个数为偶数
  Others:    
*************************************************/
 bit Odd_Parity(unsigned int a)
 {
   bit Bit_OP;
   unsigned char i,j;
   unsigned int b;
   for(i=0,j=0;i<16;i++)
   {
     b=a&0x0001;
	 if(b==0x0001)
	 {
	   j++;
	   b=0;
	  }
	 a=a>>1;
   }
   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 fc1,unsigned int cc1)
 {
	unsigned char i;
	unsigned char cardno[26];
	//偶校验位
	if((Even_Parity(fc1))==1)cardno[0]=0x01;
	else cardno[0]=0x00;
	//奇校验位
	if((Odd_Parity(cc1))==1)cardno[25]=0x01;
	else cardno[25]=0x00;
	//得到HID号的低8位
	//fc=fc1;
	for(i=1;i<9;i++)
	{
	 cardno[i]=(fc1&0x80)>>7;
	 fc1=fc1<<1;
	 }
	//得到16位机器号
	//cc=cc1;
	for(i=9;i<25;i++)
	{
	 if((cc1&0x8000)==0x8000) cardno[i]=0x01;
	 else cardno[i]=0x00;
	 cc1=cc1<<1;
	 }

	for( i=0;i<26;i++)
	{
	   if(cardno[i]==0x01)
	   {
	   	Data1=1;
	   	//脉冲宽度100us	   	Delay100us(1);
		//Delayms(20);
	   	Data1=0;
	   }
	   else
	   {
	   //脉冲宽度100us
	   	Data0=1;
	   	Delay100us(1);
		//Delayms(20);
	   	Data0=0;
	   }
	  //脉冲间隔1ms
	  	Delay100us(10);
	  //Delayms(50);
	 }
	 /*
   for( i=0;i<26;i++)
   {
	 PutChar(cardno[i]);
    }
	*/
  }

 

⌨️ 快捷键说明

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