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