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