韦根通信c语言程序,韦根26通信的示例程序

示例程序:

#include//string.h

#include//reg52.h

#include//intrins.h

#define

DELAY_TIME 60

#define

TRUE 1

#define

FALSE 0

#define uchar unsigned char

#define uint unsigned int

sbit DATA1=P3^2; //韦根读卡器的DATA1接单片机的P3^2

sbit DATA0=P3^3; //韦根读卡器的DATA0接单片机的P3^3

bit Even; // 偶检验位

bit Odd; // 奇检验位

bit

CheakEven=0;//偶检验

bit CheakOdd=1;//奇检验

uchar Cnt=0;//

uchar

WG[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//接收韦根数据26位

uchar

WGstr[3]={0,0,0};//存韦根ID卡卡号的HID和PID码,其中HID码为8位即一字节,PID码16位两字节

uchar i;

uchar j=0;

void Init()

{

EA=0;

TMOD=0x20;

TL1=0xfd;

TH1=0xfd;//设置波特率为9600的定时器1为方式2以及初始值

PCON=0x00;

SCON=0xd8; //设置串口方式

IT0=1; //设置外部中断0为下降沿触发方式

IT1=1; //设置外部中断1为下降沿触发方式

EX0=1; //开外部中断0

EX1=1; //开外部中断1

TR1=1; //开定时器1

EA=1; //开所有中断

}

void Weigand(uchar *str) //把26位韦根数据转换为3字节数据存储

{

uchar k;

for(k=0;k<26;k++)

{

if(k<=0) //读偶检验位

{

if(str[k]==0)

Even=0;

else

Even=1;

}

if(k>=25) //读奇检验位

{

if(str[k]==0)

Odd=0;

else

Odd=1;

}

if(k<=8) //读HID码低8位

{

if(str[k]==0x00)

WGstr[0]|=0x00;

else

{

WGstr[0]|=0x01;

CheakEven=~

CheakEven; // 根据HID码低8位1的个数来确定偶检验位是1还是0

}

if(k<8)

WGstr[0]=WGstr[0]<<1;

}

if(k<=16) //读PID码高8位

{

if(str[k]==0x00)

WGstr[1]|=0x00;

else

{

WGstr[1]|=0x01;

CheakOdd=~CheakOdd;  根据PID码高8位1的个数来确定奇检验位是1还是0

}

if(k<16)

WGstr[1]=WGstr[1]<<1;

}

else //读PID码的低8位

{

if(str[k]==0x00)

WGstr[2]|=0x00;

else

{

WGstr[2]|=0x01;

CheakOdd=~CheakOdd; // 根据PID码低8位1的个数来确定奇检验位是1还是0

}

if(k<24)

WGstr[2]=WGstr[2]<<1;

}

}

}

void main()

{

//P1=0x55;

Init();//调用初始化函数

Cnt=0;

while(1)

{

if(Cnt>=26)

{

EA=0; //关中断以免外部中断的干扰

Weigand(WG);//将读到的26位韦根数据转换位3字节格式

EA=1;

for(j=0;j<3;j++) //用串口调试工具显示读到的卡号

{

SBUF=WGstr[j];

while(TI==0);

TI=0;

WGstr[j]=0;

}

Cnt=0;

}

}

}

void DATA0_Interrupt(void) interrupt 2 using 1

//外部中断1读DATA0数据即0

{

WG[Cnt]=0x00;

Cnt++;

}

void DATA1_Interrupt(void) interrupt 0 using 2

//外部中断0读DATA1数据即1

{

WG[Cnt]=0x01;

Cnt++;

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值