找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

C51读取RF射频卡

[复制链接]
admin 发表于 2012-9-2 10:35:12 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
最近研究了下RF射频卡的资料,做了些电路,对曼彻斯特解码成功了

以下内容为程序代码:

1 //检测位数据
2 uchar detect_bit()
3 {
4 uint timeout=LTIME;
5
6 TH0=TL0=0;
7 TR0=1;
8
9 while(timeout--)
10 if(dat_old!=dat_in) break; //有跳变跳出
11
12 TR0=0; //关闭定时器,读取脉冲宽度
13 if(timeout==0) return 0; //超时退出
14
15 dat_old=dat_in; //保存当前状态
16
17 timeout=TH0*256+TL0; //计算脉冲宽度
18
19 if((timeout>=STIME)&&(timeout<=MTIME)) //跳变为空跳,需再次判断下个跳变宽度
20 return 1;
21 if((timeout>MTIME)&&(timeout<=LTIME)) //跳变为一个脉冲单位
22 return 2;
23
24 return 0; //其他值为错误脉冲,退出
25 }
26
27 uchar read_rfiddat() //读取数据位
28 {
29 switch (detect_bit())
30 {
31 case 1:if(detect_bit()!=1) return 2; //半个周期,为空跳,再次检测半个周期
32 return !dat_old;
33 case 2:return !dat_old;
34 default:return 2; //出错返回2
35 }
36
37 }
38
39 bit read_rfid() //读取全部数据信息
40 {
41 uchar i,j;
42
43 dat_old=dat_in; //保存数据位状态
44
45 for(i=0;i<9;i++)
46 { if(read_rfiddat()!=1) return 0;} //数据头不为9个“1”,返回错误(0)
47
48 //以下开始读取卡信息
49 for(i=0;i<11;i++)
50 {
51 codebuff=0x00;
52 for(j=0;j<5;j++)
53 {
54 codebuff<<=1;
55 switch (read_rfiddat())
56 {
57 case 0: break;
58 case 1: codebuff|=0x08;break; //这样数据在高五位
59 case 2: return 0; //返回错误(0)
60 }
61 }
62 }
63
64 if((codebuff[10]&0x08)!=0) return 0; //判断结束位,返回错误(0)
65
66 return 1; //校验完成,返回成功(1)
67 }
68
69 uint hashfunc() //hash算法
70 {
71 uint hashtem;
72 hashtem=(codebuff[0]*256+codebuff[1])+(codebuff[3]*256+codebuff[4]);
73 hashtem%=200;
74 return (hashtem);
75 }
76
77 void read_cardnum() //提取卡号,相应处理
78 {
79 uchar i,temp;
80 uint add;
81
82 if(read_rfid())
83 {
84 codebuff[0]=(codebuff[2]&0xf0)|((codebuff[3]>>4)&0x0f);
85 codebuff[1]=(codebuff[4]&0xf0)|((codebuff[5]>>4)&0x0f);
86 codebuff[2]=(codebuff[6]&0xf0)|((codebuff[7]>>4)&0x0f);
87 codebuff[3]=(codebuff[8]&0xf0)|((codebuff[9]>>4)&0x0f);
88
89 add=hashfunc()*10;
90
91 if(!setkey)
92 {
93 for(i=0;i<4;i++)
94 {
95 if(write_IIC(add+i,0xff))
96 delay_ms(10);
97 else w_ring();
98 }
99
100 l_ring(800);
101 delay_ms(500); //重复读卡时间间隙
102 }
103
104 else
105 {
106 for(i=0;i<4;i++)
107 {
108 temp=read_IIC(add+i);
109 if(codebuff!=temp) break;
110 }
111
112 if(i==4) l_ring(300);
113 else w_ring();
114 delay_ms(500); //重复读卡时间间隙
115 }
116 }
117 }

159 void main()
160 {
161 init_sys();
162 while(1)
163 {
164 read_cardnum();
165 }
166 }


汗,没有传上去图片,学习中!
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 17:54 , Processed in 0.059795 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表