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

📄 wg_232.c

📁 功能:接收读卡器 Wiegand 信号
💻 C
字号:
#pragma OPTIMIZE(9,SIZE)

/*========================================================
控制程序V6.0,
Edit: Zy
@2007.2.2

功能:	接收读卡器 Wiegand 信号,输出给 RS232
		驱动继电器输出 0.2秒
资源:
 	①P87LPC764(20P,4K+128) &18.4320M
	②RS232 &9600, N, 8, 1
	③2路管脚直接输入
	④1路继电器输出、2路三极管输出
--------------------------------------------------------
Src:	P87LPC764(20P,4K+128) &18.4320M
In:	Wiegand
Out:RS232, 2 Lap, 1 Beep
========================================================*/
#include "REGLPC76.H"

sbit p_flsh =P0^6;
sbit p_Bp = P0^4;
sbit p_Grn = P0^5;
sbit p_Red = P0^7;

sbit p_WgA = P1^4;
sbit p_WgB = P1^5;

bit flg_ms;
unsigned char tm_set;

#define	WchDog()	{ WDRST =0X1E; WDRST =0XE1; }

unsigned char click;

bit wga0, wgb0;
bit wg_bit;
unsigned char wg_got, wg_tms, WG_s, WG_n;
unsigned long wg_B;

unsigned char Wg_Chk();

unsigned char T_need;
main()
{
	WchDog();
	WDCON = 0x17;	//x,x,OV,Run,Clk,S2,S1,S0 (16mS~2.1S);此处选择2.1S,即1.3-2.9S

	P0M2 = 0XFF;
// Set UART
	PCON = 0X80;	//电源控制: 倍频 定SCON.7 掉电 上电 F1 F0 置掉电 置空闲
	SCON = 0X50;	//串口控制: SM0 SM1 SM2 REN TB8 RB8 TI RI
	PCON = 0XD0;

	TMOD = 0X22;	//定时器模式 G C M M G C M M
		//T1:8b自重载,for UART; T0:8b自重载, for timer
	TCON = 0X40;	//定时器控制 F R F R :启动T1
	TL1 = -20;
	TH1 = -20;	// T1= -20:9.6K;-40:4.8K;-80:2.4K

	TL0 = -102;  // 33uS
	TH0 = -102;	// -18.432M /6 /1000 /30

	TR0 = 1;
	TR1 = 1;

//Enable ES, T0(由起始位启动)
//	IEN1 = 0X00;	//ETI,x,EC1,x; x,EC2,EKB,EI2
	IEN0 = 0X92;	//EA=1,EWD,EBO(掉电),ES=1;ET1,EX1,ET0=1,EX0

//Init Pin
	P0 = 0X0F;

	while( 1 ){
		if( flg_ms ){	//维护程序运行标志
			flg_ms = 0;
			WchDog();
			p_flsh = !p_flsh;
		}

		if( Wg_Chk() ==1 ){
			p_Red = 1;
			p_Grn = 1;
			p_Bp = 1;
			tm_set = 120;

			T_need = 4;
			SBUF = 0XA5;
		}
	}
}

void t_T0( void ) interrupt 1	/* T0 :33uS :20mS */
{
static unsigned char clks, mSs;

	if( click<100 )		// Wiegand 的bit 之间间隔1.6mS, 约48下
		click ++;

	if( ++clks >=30 ){		// per mS
		clks = 0;

		if( tm_set ){		// 如果正在驱动继电器, 准备关闭
			if( --tm_set ==0 ){
				p_Red = 0;
				p_Grn = 0;
				p_Bp = 0;
			}
		}

		if( wg_tms<100 )	//无 Wiegand 的毫秒数
			wg_tms ++;

		if( ++mSs == 0 )	// per 256mS
			flg_ms = 1;
	}
}

unsigned char Wg_Chk()
{
	wg_got = 0;		//检测Wiegand信号
	if( wga0!=p_WgA ){
		p_Red = wga0;
		wga0 = p_WgA;
		if( wga0==0 ){	//bit 0
			wg_got ++;
			wg_bit = 0;
		}
	}
	if( wgb0!=p_WgB ){
		p_Grn = wgb0;
		wgb0 = p_WgB;
		if( wgb0==0 ){	//bit 1
			wg_got ++;
			wg_bit = 1;
		}
	}
	if( wg_got ){ 		//收到Wiegand数据
		if( wg_got>1 )
			return -1;
		else{
			if( wg_tms >50 ){	//1st bit
				WG_n = 0;
				wg_B = 0;
			}
//			else{
//				if( click<40 || click>60 )	//不是一个bit周期
//					return 0;
//			}
			click = 0;
			wg_tms = 0;

			switch( ++WG_n ){	// must set=0 at begin
			case 1:
				WG_s = wg_bit ?0X80 :0;
				break;
			case 26:
				if( wg_bit )
					WG_s ++;
				return 1;
				break;
			default:
				wg_B <<= 1;
				if( wg_bit )
					wg_B ++;
			}
		}
	}

	return 0;
}

/*******************************************************/
/* 串口中断服务 */
intcomm() interrupt 4
{
	if( RI ){	/*接收*/
		RI = 0;
	}

	if( TI ){	/*发送*/
		TI = 0;
		switch( T_need ){
		case 4:
			SBUF = WG_s;
			break;
		case 3:
			SBUF = *((unsigned char *)&wg_B+3);
			break;
		case 2:
			SBUF = *((unsigned char *)&wg_B+2);
			break;
		case 1:
			SBUF = *((unsigned char *)&wg_B+1);
			break;
		case 0:
			return;
		}
		T_need --;
	}
}

⌨️ 快捷键说明

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