📄 cid.lst
字号:
C51 COMPILER V6.10 CID 11/05/2008 12:38:04 PAGE 1
C51 COMPILER V6.10, COMPILATION OF MODULE CID
OBJECT MODULE PLACED IN D:\ID2\cid.OBJ
COMPILER INVOKED BY: D:\应用软件\lope\kc51\bin\C51.exe D:\ID2\cid.c SMALL OT(0,SIZE) SB OR DB OE
stmt level source
1 /*-- 曼码调制的非接触ID卡通用读卡程序编制
2 /******************头文件********************/
3 #include "string.h"
4 #include <reg52.h>
5 #include <intrins.h>
6 #include <math.h>
7
8 #if 0
#define p 9
#define l 10
#endif
12 /******************宏定义*********************/
13 sbit P17 = P1^7;
14 sbit P37 = P3^7;
15 sbit P16 = P1^6;
16 sbit P36 = P3^6;
17 sbit P15 = P1^5;
18 sbit P35 = P3^5;
19 sbit P14 = P1^4;
20 sbit P34 = P3^4;
21 sbit P13 = P1^3;
22 sbit P33 = P3^3;
23 sbit P12 = P1^2;
24 sbit P32 = P3^2;
25 sbit P11 = P1^1;
26 sbit P31 = P3^1;
27 sbit P10 = P1^0;
28 sbit P30 = P3^0;
29 sbit P27 = P2^7;
30 sbit P07 = P0^7;
31 sbit P26 = P2^6;
32 sbit P06 = P0^6;
33 sbit P25 = P2^5;
34 sbit P05 = P0^5;
35 sbit P24 = P2^4;
36 sbit P04 = P0^4;
37 sbit P23 = P2^3;
38 sbit P03 = P0^3;
39 sbit P22 = P2^2;
40 sbit P02 = P0^2;
41 sbit P21 = P2^1;
42 sbit P01 = P0^1;
43 sbit P20 = P2^0;
44 sbit P00 = P0^0;
45
46 #define uchar unsigned char
47 #define uint unsigned int
48
49 #define RF_DATA_IN P17 //接收来至U2270B的数据"Output"
50 #define SO P31 //单片机输出数据到用户接口
51 #define SCK P16 //同步时钟输出
52 #define CP P15 //卡存在信号输出
53 #define MSEL P13 //数据发送方式选择
54 #define WATCHDOG P21 //看门狗
55 #define RED_LED P10 //led灯
C51 COMPILER V6.10 CID 11/05/2008 12:38:04 PAGE 2
56 #define GREEN_LED P11 //led灯
57 #define DD P12 //蜂鸣器
58
59 /****************全局变量***********************/
60 uchar data Read_RF_Data[11]; //暂存从U2270B上接收的数据
61 uchar data ID_Data[6]; //暂存经效验后的正确数据
62 uint data TIMER_1=0;
63 bit Check_Data_bit; //效验请求标志位
64 /****************函数列表***********************/
65 void Recive_RF_Data(void);
66 void Check_Data(void);
67 void Clern_Number(void);
68 void Send_RS232net(uchar Data[],uchar Num);
69 void delay0_2ms(uint count);
70 void delay1ms(uint count);
71 void dida(uchar j);
72 /*****************串口初始话*********************/
73 void Data_start(void)
74 {DD=0x00;
75 1 RED_LED=0x00;
76 1 TMOD=0x21; //T0方式1,T1工作于方式2
77 1 TH1=0x00; //初始化T1计时器
78 1 TL1=0x00;
79 1 TR1=0;
80 1 SCON=0x50; //串行口初始化
81 1 PCON=0x80; //SMOD位设置
82 1 TH0=0x00; //初始化T0计时器
83 1 TL0=0x04;
84 1 TR0=0;
85 1 ES=1; //开放串行口中断
86 1 EA=1; //开放总中断
87 1 }
88 /**********************************************/
89 /*主函数*/
90 /**********************************************/
91 void main(void)
92 {
93 1 delay1ms(100);
94 1 Data_start();
95 1 while(1)
96 1 {
97 2 WATCHDOG=~WATCHDOG;
98 2 Recive_RF_Data(); //调用接收RF数据函数
99 2 if(Check_Data_bit==1) //如果此位为1,有一组数据申请效验
100 2 {
101 3 Check_Data(); //调用数据效验函数
102 3 Check_Data_bit=0;
103 3 }
104 2 }
105 1 }
106 /*********************************************/
107 /*接收RF数据*/
108 /*********************************************/
109 void Recive_RF_Data(void)
110 {
111 1 /////////////////////定义局部变量
112 1 uchar header,pc;
113 1 uchar temp;
114 1 uchar temp1;
115 1 uint temp2;
116 1 uchar ByteCounter; //字节计数器
117 1 uchar *PData;
C51 COMPILER V6.10 CID 11/05/2008 12:38:04 PAGE 3
118 1 uchar BitCounter; //位计数器
119 1 ////////////////////初始化变量值
120 1 header=0;pc=4;
121 1 PData=Read_RF_Data;
122 1 temp=0;
123 1 temp1=0;
124 1 ByteCounter=0;
125 1 BitCounter=5;
126 1 /////////////////////检测一个稳定的低电平
127 1 str:
128 1 WATCHDOG=~WATCHDOG;
129 1 if(RF_DATA_IN==0)
130 1 if(RF_DATA_IN==0)
131 1 if(RF_DATA_IN==0)
132 1 if(RF_DATA_IN==0)
133 1 if(RF_DATA_IN==0)
134 1 {
135 2 _nop_();
136 2 _nop_();
137 2 _nop_();
138 2 _nop_();
139 2 _nop_();
140 2 _nop_();
141 2 _nop_();
142 2 _nop_();
143 2 _nop_();
144 2 _nop_();
145 2 ////////////////////检测一个起始位电平
146 2 while(RF_DATA_IN==0); //当电平由低向高跳变时启动计时器
147 2 TR0=1;
148 2 _nop_();
149 2 _nop_();
150 2 _nop_();
151 2 _nop_();
152 2 _nop_();
153 2 _nop_();
154 2 _nop_();
155 2 _nop_();
156 2 _nop_();
157 2 _nop_();
158 2 ////////////////////检测9个"header"
159 2 while(RF_DATA_IN==1);
160 2 TR0=0;
161 2 TF0=0;
162 2 TIMER_1=TH0;
163 2 TIMER_1=(TIMER_1<<8)+TL0;
164 2 TH0=0x00;
165 2 TL0=0x04;
166 2 temp2=0x108;
167 2 if(TIMER_1>temp2) // >520us
168 2 {
169 3 goto str;
170 3 }
171 2 temp2=0xf9;
172 2 if(TIMER_1<temp2) // <490us
173 2 {
174 3 goto str;
175 3 }
176 2 do
177 2 {
178 3 TIMER_1=0;
179 3 WATCHDOG=~WATCHDOG;
C51 COMPILER V6.10 CID 11/05/2008 12:38:04 PAGE 4
180 3 while(RF_DATA_IN==0);
181 3 TR0=1;
182 3 _nop_();
183 3 _nop_();
184 3 _nop_();
185 3 _nop_();
186 3 _nop_();
187 3 _nop_();
188 3 _nop_();
189 3 _nop_();
190 3 _nop_();
191 3 _nop_();
192 3 while(RF_DATA_IN==1);
193 3 TR0=0;
194 3 TF0=0;
195 3 TIMER_1=TH0;
196 3 TIMER_1=(TIMER_1<<8)+TL0;
197 3 TH0=0x00;
198 3 TL0=0x04;
199 3 temp2=0x90;
200 3 if(TIMER_1>temp2)// >280us
201 3 {
202 4 header=0;
203 4 goto str;
204 4 }
205 3 temp2=0x77;
206 3 if(TIMER_1<temp2)// <230us
207 3 {
208 4 header=0;
209 4 goto str;
210 4 }
211 3 header++;
212 3 }while(header<8);
213 2 TR0=0;
214 2 TF0=0;
215 2 ///////////////////如果9个"header"都对,开始接收卡内数据
216 2 TH0=0xff; //time:300us
217 2 TL0=0x6a;
218 2 TR0=1;
219 2 if(header==8)
220 2 {
221 3 do
222 3 {
223 4 do
224 4 {
225 5
226 5 while(TF0==0); //等待一个位周期
227 5 TF0=0;
228 5 if(RF_DATA_IN==1) temp=1;
229 5 else temp=0;
230 5 while(RF_DATA_IN==temp) //检测电平跳变否?
231 5 {
232 6 if(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!
233 6 {
234 7 TR0=0;
235 7 TF0=0;
236 7 goto str;
237 7 }
238 6 }
239 5 TH0=0xff; //time:300us
240 5 TL0=0x6a;
241 5 temp=~RF_DATA_IN;
C51 COMPILER V6.10 CID 11/05/2008 12:38:04 PAGE 5
242 5 temp1=(temp1<<1)|temp;
243 5 BitCounter--;
244 5 }while(BitCounter); //一个字节完否
245 4 *(PData+ByteCounter)=temp1; //将一字节数据存入缓存数组
246 4 temp1=0;
247 4 BitCounter=5;
248 4 ByteCounter++;
249 4 WATCHDOG=~WATCHDOG;
250 4 }while(ByteCounter<10);
251 3 do
252 3 {
253 4 WATCHDOG=~WATCHDOG;
254 4 while(TF0==0); //等待一个位周期
255 4 TF0=0;
256 4 if(RF_DATA_IN==1) temp=1;
257 4 else temp=0;
258 4 while(RF_DATA_IN==temp) //检测电平跳变否?
259 4 {
260 5 if(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!
261 5 {
262 6 TR0=0;
263 6 TF0=0;
264 6 goto str;
265 6 }
266 5 }
267 4 TH0=0xff; //time:300us
268 4 TL0=0x6a;
269 4 temp=~RF_DATA_IN;
270 4 temp1=(temp1<<1)|temp;
271 4 pc--;
272 4 }while(pc); //一个字节完否
273 3 Read_RF_Data[10]=temp1; //将一字节数据存入缓存数组
274 3 ///////////////////检测最后一个停止位
275 3 while(TF0==0);
276 3 TR0=0;
277 3 TF0=0;
278 3 if(RF_DATA_IN==1) temp=1;
279 3 else temp=0;
280 3 while(RF_DATA_IN==temp) //检测电平跳变否?
281 3 {
282 4 if(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!
283 4 {
284 5 TR0=0;
285 5 TF0=0;
286 5 goto str;
287 5 }
288 4 }
289 3 temp=~RF_DATA_IN;
290 3 if(temp==0) //如果停止位正确
291 3 {
292 4 Check_Data_bit=1; //置效验请求标志
293 4 }
294 3 else //如果停止位不正确
295 3 {
296 4 Clern_Number(); //清除
297 4 }
298 3 }
299 2 }
300 1 }
301 /*********************************************/
302 /*效验数据*/
303 /*********************************************/
C51 COMPILER V6.10 CID 11/05/2008 12:38:04 PAGE 6
304 void Check_Data(void)
305 {
306 1 /////////////////////定义局部变量
307 1 uchar temp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -