📄 wiegand.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 + -