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

📄 decode.c

📁 U2270B的非接触ID卡的解码程序
💻 C
字号:

#include <intrins.h>
#include "reg52.h"

//data_2270为u2270的第二个引脚
extern unsigned char CardNum[4];
void Func_decode(void);
sbit data_2270 = P1 ^ 4;
bit bbrushcard = 0;
uchar data card_buffer[4];  	   // 4


//==============//调用解码程序,返回有无刷卡的标号及卡号==============
void Func_decode(void)
{
	uchar i, j, tempreceive, tempH, tempL, temp_remote[12];
	uint temptime;
	bit bdata2270;
	if (!data_2270) {
		TH2 = card_timeH;
		TL2 = card_timeL;
		TR2 = 1;
		while (!data_2270) {
			if (TF2) {
				TR2 = 0;
				TF2 = 0;
				return;
			}
		};//each time is 5mS.
		TR2 = 0;
		TH2 = card_syn_originH;
		TL2 = card_syn_originL;
		TR2 = 1;
		while (data_2270) {
			if (TF2) {
				TF2 = 0;
				TR2 = 0;
				return;
			}
		}
		TR2 = 0;
		tempH = TH2;
		tempL = TL2;
		TF2 = 0;
		TH2 = card_delayH;//card_syn_originH;
		TL2 = card_delayL;//card_syn_originL;
		TR2 = 1;
		temptime = tempH * 256 + tempL;
		if (temptime < card_1p_down) {
			TR2 = 0;

			return;
		}
		i = 0;
		//********************************************************
		while (1)   	//wait 8 number 1;
		{
			while (!TF2);
			TR2 = 0;
			TF2 = 0;
			if (!data_2270) {
				return;
			}
			i++;
			TH2 = card_delayH;//delay 400us
			TL2 = card_delayL;
			while (data_2270) {
			};

			if (i >= 8) {
				break;   //有刷卡时
			}
			TR2 = 1;
		}
		//*****************************************************************

		i = 0;
		TR2 = 1;
		bdata2270 = 1;
		for (i = 0; i < 11; i++) {
			tempreceive = 0;
			for (j = 0; j < 5; j++) {
				tempreceive <<= 1;
				while (!TF2);
				TR2 = 0;
				TF2 = 0;
				TH2 = card_code_originH;
				TL2 = card_code_originL;
				TR2 = 2;
				if (!data_2270) {
					bdata2270 = 0;
					while (!data_2270) {
						if (TF2) {
							TR2 = 0;
							TF2 = 0;
							return;
						}
					}
				} else {
					bdata2270 = 1;
					tempreceive |= 1;
					while (data_2270) {
						if (TF2) {
							TR2 = 0;
							TF2 = 0;
							return;
						}
					}
				}
				TH2 = card_delayH;//delay 400us
				TL2 = card_delayL;
				TR2 = 1;
			}
			temp_remote[i] = tempreceive;
		}
		for (i = 0; i < 10; i++)//row checkout
		{
			tempreceive = temp_remote[i] >> 1;
			switch (tempreceive) {
			case 0x00:
				bdata2270 = 0; break;
			case 0x01:
				bdata2270 = 1; break;
			case 0x02:
				bdata2270 = 1; break;
			case 0x03:
				bdata2270 = 0; break;
			case 0x04:
				bdata2270 = 1; break;
			case 0x05:
				bdata2270 = 0; break;
			case 0x06:
				bdata2270 = 0; break;
			case 0x07:
				bdata2270 = 1; break;
			case 0x08:
				bdata2270 = 1; break;
			case 0x09:
				bdata2270 = 0; break;
			case 0x0A:
				bdata2270 = 0; break;
			case 0x0B:
				bdata2270 = 1; break;
			case 0x0C:
				bdata2270 = 0; break;
			case 0x0D:
				bdata2270 = 1; break;
			case 0x0E:
				bdata2270 = 1; break;
			case 0x0F:
				bdata2270 = 0; break;
			default:
				break;
			}
			if ((bit) (temp_remote[i] & 0x01) != bdata2270) {
				return;
			}
		}
		tempH = temp_remote[10];
		tempH >>= 1;
		for (i = 0; i < 4; i++)//arrange checkout.
		{
			tempreceive = 0;
			bdata2270 = 0;
			for (j = 0; j < 10; j++) {
				if ((temp_remote[j] >> (i + 1)) & 0x01)
					tempreceive++;
			}
			if ((tempH >> i) & 0x01)
				bdata2270 = 1;
			if ((bit) (tempreceive % 2) != bdata2270) {
				return;
			}
		}

		for (i = 1; i < 5; i++) 			   //ID卡号为4位卡号时
		{
			temp_remote[2 * i] >>= 1;
			temp_remote[2 * i] <<= 4;
			temp_remote[2 * i + 1] >>= 1;
			card_buffer[i - 1] = temp_remote[2 * i] + temp_remote[2 * i + 1];
		}
                 //刷卡时按键没有用,Key此时可用。
		if ((Key[Key_Len-4] == card_buffer[0]) &&
			(Key[Key_Len-3] == card_buffer[1]) &&
			(Key[Key_Len-2] == card_buffer[2]) &&
			(Key[Key_Len-1] == card_buffer[3])) {

			bbrushcard = 1; 							 //2006.12.8刷卡抗干扰处理
		} else {
			Key[Key_Len-4] = card_buffer[0];
			Key[Key_Len-3] = card_buffer[1];
			Key[Key_Len-2] = card_buffer[2] ;
			Key[Key_Len-1] = card_buffer[3] ;
                        shuakatime=250;
		}
	}
}

⌨️ 快捷键说明

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