?? wg.c
字號:
//------------------------------------------------------
//功能:把數組封包成韋根26的格式,并發送出去
// 原理是把每個字節的低4位取出,來計算這個字節的值
//入口:str=要封包的數組,
//出口:DATA0P3.0;DATA1=P3.1
//設計:大鵬,大鵬艾迪,2006/4/11
//------------------------------------------------------
/*#include <52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int*/
extern sbit WG_DATA0 =P3^2;
extern sbit WG_DATA1 =P3^3 ;
void send_wiegand26(uchar *str)
{
//| wiegand[0] | wiegand[1] | wiegand[2] |
//| *str *(str + 1) | *(str + 2) *(str + 3)| *(str + 4) *(str + 5)|
uchar idata i;
static uchar data one_num; //計算1的個數
uchar data check_temp; //韋根包奇偶效驗中間暫存
bit data even; //韋根包前12位偶效驗
bit data odd; //韋根包后12位齊效驗
static uchar data wiegand[3]; //韋根包數據24位
// EA=0;//禁止中斷
//--------------------------------端口方向定義
// P3M0 = 0x00; //普通I/O口
// P3M1 = 0x00;
//================================數組到韋根包的轉化
wiegand[0] = wiegand[0]|((*str)<<4);//原理是把每個字節的低4位取出,來計算這個字節的值
wiegand[0] = wiegand[0]|(*(str+1)&0x0f);
//--------------------------------計算前8位1的個數,為偶效驗用
check_temp = wiegand[0];
for(i = 0;i<8;i++)
{
if(check_temp&0x01) //(check_temp&0x01)
{
one_num++;
}
check_temp >>= 1;
}
wiegand[1] = wiegand[1]|(*(str+2)<<4);
//--------------------------------計算接下來的4位1的個數,為偶效驗用
check_temp = wiegand[1];
for(i = 0;i<4;i++)
{
if(check_temp&0x80)
{
one_num++;
}
check_temp<<=1;
}
//--------------------------------判斷1的個數
one_num%2 == 0 ? (even = 0):( even = 1);
one_num = 0;
wiegand[1] = wiegand[1]|(*(str+3)&0x0f);
//--------------------------------計算接下來的4位1的個數,為奇效驗用
check_temp = wiegand[1];
for(i = 0;i<4;i++)
{
if(check_temp&0x01){one_num++;}
check_temp>>=1;
}
wiegand[2] = wiegand[2]|(*(str+4)<<4);
wiegand[2] = wiegand[2]|(*(str+5)&0x0f);
//--------------------------------計算接下來的8位1的個數,為奇效驗用
check_temp = wiegand[2];
for(i = 0;i<8;i++)
{
if(check_temp&0x01){one_num++;}
check_temp >>= 1;
}
//--------------------------------判斷1的個數
one_num%2 == 0 ? (odd = 1):( odd = 0);
one_num = 0;
//================================啟動發送,用定時器做時間延時
//--------------------------------韋根 輸出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
//--------------------------------發送偶效驗
TMOD=0X01; //T0為方式1計數
EA=1; EX1=0; EX0=0; //開中斷,禁止INT0,INT1中斷
if(even) //enen韋根包前12位偶效驗標志
{
WG_DATA1 = 0;
//-------------------------延時100us
TR0 = 0; //停止T0計算
TH0 = (65536 - 158)/256; //定時100us 20MHz晶體
TL0 = (65536 - 158)%256;
TF0 = 0; //T0中斷請求標志清0
ET0 = 0; //T0中斷禁止
TR0 = 1; //啟動T0計算
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//------------------------延時100us
TR0 = 0;
TH0 = (65536 - 158)/256; //定時100us
TL0 = (65536 - 158)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
//----------------------------延時一個發送周期
TR0 = 0;
TH0 = (65536 - 1582)/256; //定時1000us//1500us
TL0 = (65536 - 1582)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
//-------------------------------發送24位數據
for(i = 0;i<24;i++)
{
//---------------------------韋根 輸出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
if((wiegand[0])&0x80)
{
WG_DATA1 = 0;
//----------------------延時100us
TR0 = 0;
TH0 = (65536 - 158)/256; //定時100us
TL0 = (65536 - 158)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//---------------------延時100us
TR0 = 0;
TH0 = (65536 - 158)/256; //定時100us
TL0 = (65536 - 158)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
(*(long*)&wiegand[0]) <<= 1;
//-------------------------------延時一個發送周期
TR0 = 0;
TH0 = (65536 - 1582)/256; //定時1000us//1500us
TL0 = (65536 - 1582)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
}
//==============================發送奇效驗位
//------------------------------韋根 輸出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
if(odd) //韋根包后12位齊效驗標志
{
WG_DATA1 = 0;
//-------------------------延時100us
TR0 = 0;
TH0 = (65536 - 158)/256; //定時100us
TL0 = (65536 - 158)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//-------------------------延時100us
TR0 = 0;
TH0 = (65536 - 158)/256; //定時100us
TL0 = (65536 - 158)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
}
/*
void send_wiegand34(uchar *str)
{
//| wiegand[0] | wiegand[1] | wiegand[2] |
//| *str *(str + 1) | *(str + 2) *(str + 3)| *(str + 4) *(str + 5)|
uchar data i;
static uchar data one_num; //計算1的個數
uchar data check_temp; //韋根包奇偶效驗中間暫存
bit data even; //韋根包前16位偶效驗
bit data odd; //韋根包后16位齊效驗
static uchar data wiegand[4]; //韋根包數據32位
// EA=0;//禁止中斷
//--------------------------------端口方向定義
// P3M0 = 0x00; //普通I/O口
// P3M1 = 0x00;
//================================數組到韋根包的轉化
wiegand[0] = wiegand[0]|((*str)<<4);//原理是把每個字節的低4位取出,來計算這個字節的值
wiegand[0] = wiegand[0]|(*(str+1)&0x0f);
//--------------------------------計算前8位1的個數,為偶效驗用
check_temp = wiegand[0];
for(i = 0;i<8;i++)
{
if(check_temp&0x01) //(check_temp&0x01)
{
one_num++;
}
check_temp >>= 1;
}
wiegand[1] = wiegand[1]|(*(str+2)<<4);
//--------------------------------計算接下來的4位1的個數,為偶效驗用
check_temp = wiegand[1];
for(i = 0;i<4;i++)
{
if(check_temp&0x80)
{
one_num++;
}
check_temp<<=1;
}
//--------------------------------判斷1的個數
one_num%2 == 0 ? (even = 0):( even = 1);
one_num = 0;
wiegand[1] = wiegand[1]|(*(str+3)&0x0f);
//--------------------------------計算接下來的4位1的個數,為奇效驗用
check_temp = wiegand[1];
for(i = 0;i<4;i++)
{
if(check_temp&0x01){one_num++;}
check_temp>>=1;
}
wiegand[2] = wiegand[2]|(*(str+4)<<4);
wiegand[2] = wiegand[2]|(*(str+5)&0x0f);
//--------------------------------計算接下來的8位1的個數,為奇效驗用
check_temp = wiegand[2];
for(i = 0;i<8;i++)
{
if(check_temp&0x01){one_num++;}
check_temp >>= 1;
}
//--------------------------------判斷1的個數
one_num%2 == 0 ? (odd = 1):( odd = 0);
one_num = 0;
//================================啟動發送,用定時器做時間延時
//--------------------------------韋根 輸出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
//--------------------------------發送偶效驗
// TMOD=0X01; //T0為方式1計數
// EA=1; EX1=0; EX0=0; //開中斷,禁止INT0,INT1中斷
if(even) //enen韋根包前12位偶效驗標志
{
WG_DATA1 = 0;
//-------------------------延時100us
TR0 = 0; //停止T0計算
TH0 = (65536 - 158)/256; //定時100us 20MHz晶體
TL0 = (65536 - 158)%256;
TF0 = 0; //T0中斷請求標志清0
ET0 = 0; //T0中斷禁止
TR0 = 1; //啟動T0計算
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//------------------------延時100us
TR0 = 0;
TH0 = (65536 - 158)/256; //定時100us
TL0 = (65536 - 158)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
//----------------------------延時一個發送周期
TR0 = 0;
TH0 = (65536 - 1582)/256; //定時1000us //1382//1500us
TL0 = (65536 - 1582)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
//-------------------------------發送24位數據
for(i = 0;i<32;i++)
{
//---------------------------韋根 輸出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
if((wiegand[0])&0x80)
{
WG_DATA1 = 0;
//----------------------延時100us
TR0 = 0;
TH0 = (65536 - 158)/256; //定時100us
TL0 = (65536 - 158)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//---------------------延時100us
TR0 = 0;
TH0 = (65536 - 158)/256; //定時100us
TL0 = (65536 - 158)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
(*(long*)&wiegand[0]) <<= 1;
//-------------------------------延時一個發送周期
TR0 = 0;
TH0 = (65536 - 1582)/256; //定時1000us //1500us -1382
TL0 = (65536 - 1582)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
}
//==============================發送奇效驗位
//------------------------------韋根 輸出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
if(odd) //韋根包后12位齊效驗標志
{
WG_DATA1 = 0;
//-------------------------延時100us
TR0 = 0;
TH0 = (65536 - 158)/256; //定時100us
TL0 = (65536 - 158)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//-------------------------延時100us
TR0 = 0;
TH0 = (65536 - 158)/256; //定時100us
TL0 = (65536 - 158)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
} */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -