📄 em4100.lst
字号:
C51 COMPILER V8.16 EM4100 11/11/2008 21:35:28 PAGE 1
C51 COMPILER V8.16, COMPILATION OF MODULE EM4100
OBJECT MODULE PLACED IN EM4100.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE EM4100.c OPTIMIZE(0,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /* 检测方法
3 1).确定起始位,首先要正确找到数据1 按规则下跳为1 上跳为0. 可检测高电平并等其变低
4 但这会把0错检为1因为0也存在高电平。但是如果检测到一个周期的高电平(数据01)则可
5 确定找到了数据1,找到1后就可以同步了,因为EM4100卡最后一位数据就是0正好可以利用
6 作为判断的特征。
7
8 2).对于数据的确定,由于有了同步则可在同步后延时384us即3/4个码原周期在判断接受段电平如何
9 如为高则置数据为1,并一直等到低电平的出现,相反则等高电平的出现,并在此之间插入超时
10 判断。这样,一个完整的数据判断就完成了,并确保数据的准确性,另外这种方法的抗干扰性
11 会非常好,而如果采用定时同步的话则会因信号的畸变而引起数据出错,整体会导致读卡几率降低
12 但是此程序也有其缺点,因为采用纯延时判断的手段,因此其占用单片机的运行时间比较大。
13
14 3).同步后开始接受同步数据即9个1,这一部分用一个循环做,如果出错则放弃接收
15
16 4).同步数据接收完后,则开始接受数据,数据分11行5列接收以利于校验位的判断
17 如有出错则放弃数据
18
19 5).如一切正常则返回卡号,如因尝试读卡次数到了则返回0以表示没有卡
20
21 6). 作者:章其波
22 时间:2006-5-15
23 Email:sudazqb@163.com
24 Phone:13771767085
25 QQ: 272200296
26
27 心得:
28
29 此程序真的很烦,花了我近六个小时
30 其中的循环真的是太绕人了
31 但这个程序比我之前那个用定时同步写的程序要好多了
32 由于没有见过别人是怎么写的,这仅是我闭门造车造出来的
33 相信一定有高人写出更好的程序
34
35 */
36
37
38 #include"EM4100.h"
39
40
41 //精确的384us延时,此延时可以不严格,但要大于256us小于512us
42 void Delay384us()
43 {
44 1 uchar i=DELAY_VAL;
45 1 while(i--);
46 1 }
47
48
49 //读取卡号,
50 ulong Read_Card()
51 {
52 1 uchar i=0; //起始为的计数值
53 1 uchar error; //时间溢出的计数值
54 1 uchar error_flag; //时间溢出标志
55 1 uchar row,col; //行列寄存器
C51 COMPILER V8.16 EM4100 11/11/2008 21:35:28 PAGE 2
56 1 uchar row_parity; //行校验寄存器
57 1 uchar col_parity[5]; //列校验寄存器
58 1 uchar _data; //数据寄存器
59 1 ulong temp; //卡号寄存器
60 1 ulong timeout=0; //搜索次数寄存器
61 1 while(1)
62 1 {
63 2 if(timeout==10)return 0;//尝试10次搜索,如没有责返回0
64 2 else timeout++;
65 2 error=0;
66 2 while(Manchester_IN==0)//等高电平
67 2 {
68 3 if(error==TIME_OF)break;//超时退出
69 3 else error++;
70 3 }
71 2 if(error==100)continue;//结束本次主循环
72 2 else error=0;
73 2 Delay384us();
74 2 if(Manchester_IN)//寻找真正的1起始位,利用01的波形确定1起始位,即最后一位加第一位
75 2 {
76 3 for(i=0;i<8;i++)//判断是否是真的起始位
77 3 {
78 4 error=0; //限定等待时间
79 4 while(Manchester_IN)
80 4 {
81 5 if(error==TIME_OF)
82 5 {
83 6 error_flag=1;//时间溢出
84 6 break; //退出
85 6 }
86 5 else error++;
87 5 }
88 4 Delay384us(); //延时至下一码原
89 4 if(Manchester_IN&&error_flag==0); //判断下一位是否为1 和是否没有时间溢出
90 4 else break; //不是1退出,溢出退出
91 4 }
92 3 if(error_flag)//因时间溢出造成的本次主循环退出
93 3 {
94 4 error_flag=0;
95 4 continue; //退出本次循环
96 4 }
97 3 else;
98 3 if(i==8) //起始位接受完并且正确后开始接受数据
99 3 {
100 4 error_flag=0;
101 4 error=0; //限定等待时间
102 4 while(Manchester_IN)
103 4 {
104 5 if(error==TIME_OF)
105 5 {
106 6 error_flag=0;
107 6 break; //时间溢出造成的出错
108 6 }
109 5 else error++;
110 5 }
111 4 if(error_flag)
112 4 {
113 5 error_flag=0;
114 5 continue; //因等待待第一个正式数据错误引起的本次主循环退出
115 5 }
116 4 else;
117 4 //所有列校验清零
C51 COMPILER V8.16 EM4100 11/11/2008 21:35:28 PAGE 3
118 4 col_parity[0]=col_parity[1]=col_parity[2]=col_parity[3]=col_parity[4]=0;
119 4 for(row=0;row<11;row++) //共11行数据
120 4 {
121 5 for(col=0,row_parity=0/*行校验清零*/;col<5;col++)//共5列数据
122 5 {
123 6 Delay384us(); //延时至下一码原
124 6 if(Manchester_IN)_data=1; //数据为1
125 6 else _data=0; //数据为0
126 6 if(col<4&&row<10) //数据区的接受,后四个字节
127 6 {
128 7 temp<<=1; //左移一位
129 7 temp+=(ulong)_data; //数据相加
130 7 }
131 6 else;
132 6 row_parity+=_data; //行校验加入数据
133 6 col_parity[col]+=_data; //相应列校验加入数据 虽最后一列没有校验但为了方便也加上
134 6 error=0; //限定等待时间清零
135 6 while(Manchester_IN==(bit)_data)
136 6 {
137 7 if(error==TIME_OF) //由于时间溢出造成的数据出错
138 7 {
139 8 error_flag=1;
140 8 break; //退出本while循环
141 8 }
142 7 else error++;
143 7 }
144 6 if(error_flag)break; //出错退出内层for循环
145 6 else;
146 6 }
147 5 if(row<10)//最后一行没有校验所以要加限制
148 5 {
149 6 if((row_parity&0x01)||error_flag) //出错退出外for循环
150 6 {
151 7 temp=0;
152 7 error_flag=1;
153 7 break; //退出
154 7 }
155 6 else;
156 6 }
157 5 else;
158 5 }
159 4
160 4 //对最后接收的列校验进行判断,及对来自上面数据错误error_flag处理以结束本次主循环
161 4 if(error_flag||((col_parity[0]&0x01)&&(col_parity[1]&0x01)&&(col_parity[2]&0x01)&&(col_parity[3]&0x01)
-))
162 4 { //最后一列没有校验
163 5 error_flag=0;
164 5 temp=0;
165 5 continue; //退出本次循环
166 5 }
167 4 else return temp;//将正确的数据返回
168 4 }
169 3 continue;
170 3 }
171 2 continue;
172 2 }
173 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 507 ----
CONSTANT SIZE = ---- ----
C51 COMPILER V8.16 EM4100 11/11/2008 21:35:28 PAGE 4
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 21 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -