📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 06/12/2006 16:06:45 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //2006-4-27 13:10
2 //更改为默认 manchester,RF/64,软件可读写EM4469,不能更改设置读卡器参数,可读参数2006-4-27 12:01
3 //不能使用默认读命令
4 //支持PCB端软件:1.EM4469 RFID Development Kit Application Software 2.EM4469 Read Only Application Softwa
-re
5 //支持卡片:EM4469,EM410X
6
7 #include "main.h"
8
9
10 ////EM4095控制线定义
11 sbit MOD = P1^1;
12 sbit SHD = P1^2;
13 sbit DEMOD_OUT = P3^3;
14 sbit RDY_CLK = P3^4;
15 sbit speak = P1^3;
16
17 union myunion
18 {
19 uint word;
20 struct
21 {
22 uchar high2;
23 uchar low2;
24 }bytes;
25 };
26
27
28 union myunion count_timer2;
29 uchar fwd_1st_pulse = 256 - 20; //20个RF周期
30 uchar field_stop; //next field stop in RF clocks
31 uchar fwd_01_zero = 256 - 20; //complement to fwd_01_stop,20个RF周期
32 uchar fwd_01_one = 256 - 29; //notmod full period '1',29个RF周期
33 uchar fwd_01_stop = 256 - 9; //9个RF周期
34 uchar edge=1; //for manchester usage
35
36
37 // 定时器0中断服务程序
38 // 写操作,控制MOD
39 void Timer0_int(void) interrupt 1 using 1
40 {
41 1 TF0=0; //clear interrupt flag
42 1 if (fwd_bit_phase == 1)
43 1 {
44 2 MOD=1;
45 2 TR0=0;
46 2 TH0=0xFF;
47 2 TL0 = field_stop;
48 2 TR0=1;
49 2 field_stop = fwd_01_stop;
50 2 fwd_bit_phase = 2;
51 2 return;
52 2 }
53 1
54 1 MOD=0;
C51 COMPILER V7.50 MAIN 06/12/2006 16:06:45 PAGE 2
55 1 TR0=0;
56 1 if (fwd_bit_phase == 2)
57 1 {
58 2 TH0=0xFF;
59 2 TL0=fwd_01_zero;
60 2 }
61 1 else
62 1 {
63 2 TH0=0xFF;
64 2 TL0= fwd_01_one;
65 2 }
66 1 TR0=1;
67 1
68 1 if(fwd_bit_sz-- > 0)
69 1 {
70 2 if(((*fwd_write_ptr++) & 1) == 1)
71 2 fwd_bit_phase = 3;
72 2 else
73 2 fwd_bit_phase = 1;
74 2 }
75 1 else
76 1 {
77 2 TR0= 0;
78 2 ET0=0; //disable T0 interrupt
79 2 TF0=0;
80 2 }
81 1 }
82 //串口中断标志位
83 uchar Rxtemp;
84 bit rx_start;
85 bit rx_finish;
86 bit rx_lenflag;
87 uchar rx_i;
88 uchar rx_len;
89 bit MYTI;
90
91 //串口中断服务程序
92 void serial(void) interrupt 4 using 3
93 {
94 1 if(RI)
95 1 {
96 2 RI = 0;
97 2 Rxtemp = SBUF;
98 2 if(rx_start == 0)
99 2 {
100 3 if(Rxtemp == STX)
101 3 {
102 4 // clearrx_buff(); //清接收缓冲
103 4 rx_start = 1;
104 4 rx_finish = 0;
105 4 rx_lenflag = 0;
106 4 rx_i = 0; //接收到的个数
107 4 rx_len = 0;
108 4 rx_buff[0] = Rxtemp;
109 4 rx_i++; //长度+1
110 4 }
111 3 return;
112 3 }
113 2 if(rx_lenflag == 0)
114 2 {
115 3 rx_lenflag = 1;
116 3 rx_buff[1] = Rxtemp;
C51 COMPILER V7.50 MAIN 06/12/2006 16:06:45 PAGE 3
117 3 rx_i++;
118 3 rx_len = Rxtemp;
119 3 if(rx_len > MAX_RXNUM)
120 3 {
121 4 rx_start = 0;
122 4 rx_finish = 0;
123 4 rx_lenflag = 0;
124 4 }
125 3 return;
126 3 }
127 2 rx_buff[rx_i] = Rxtemp;
128 2 rx_i++;
129 2 rx_len--;
130 2 if(rx_len ==0)
131 2 {
132 3 rx_start = 0;
133 3 rx_finish = 1;
134 3 rx_lenflag = 0;
135 3 if(rx_buff[rx_i-1] != ETX)
136 3 {
137 4 rx_finish = 0;
138 4 }
139 3 }
140 2 return;
141 2 }
142 1 if(TI)
143 1 {
144 2 TI = 0;
145 2 MYTI = 1;
146 2 }
147 1 }
148
149 // ==================================================================
150 void Timer2_int(void) interrupt 5 using 2
151 {
152 1 if (currentMaxTimeHi != 0xFF)
153 1 {
154 2 currentMaxTimeHi = 0xFF;
155 2 }
156 1 else
157 1 {
158 2 flag_wait=0;
159 2 ET2=0;
160 2 }
161 1 }
162
163 void main(void)
164 {
165 1 uchar i;
166 1 uchar checksum;
167 1 //使能winbond W78E365内部1K SRAM
168 1 CHPENR = 0x87;
169 1 CHPENR = 0x59;
170 1 CHPCON = (CHPCON|0x10);
171 1 CHPENR = 0x00;
172 1
173 1 //串口,定时器1,双倍速率,9600bps
174 1 SCON = 0x50;
175 1 TMOD = 0x20;
176 1 TH1 = 0xf4;TL1 = 0xf4;
177 1 PCON = PCON|0x80;
178 1 TR1 = 1;
C51 COMPILER V7.50 MAIN 06/12/2006 16:06:45 PAGE 4
179 1 ES = 1;
180 1 TI = 0;RI = 0;
181 1 EA = 1;
182 1 C_T2 = 1; //T2脚的负跳变计数,TH2,TL2自动重装
183 1 //EM4095 初始化
184 1 MOD = 0;
185 1 SHD = 0;
186 1 //串口接收初始化
187 1 rx_start = 0;
188 1 rx_finish = 0;
189 1 rx_lenflag = 0;
190 1 rx_len = 0; //还要接收的数据个数
191 1 rx_i = 0; //接收到个数
192 1 MYTI = 0;
193 1
194 1 //配置读卡器默认值,RF/64,Manchester解码
195 1 config_delayed = 0;
196 1 config_lwr = 8;
197 1 config_raw = 0;
198 1
199 1 halfDataRate = 32;//default values, RF/64
200 1 MaxCaptureHalfDateRate = halfDataRate + (halfDataRate >> 1); //=48
201 1 MaxCaptureDateRate = halfDataRate + halfDataRate + (halfDataRate >> 1); //=80
202 1 lwr = config_lwr;
203 1 delayed = config_delayed;
204 1 raw = config_raw;
205 1 //forward_link_type = 0x01;
206 1 maxTLogin = 4 + (4 + 9) * 2 * (uint)halfDataRate; //0x0344
207 1 maxTWrite = 1144 + (4 + 8) * 2 * (uint)halfDataRate;
208 1 maxTWriteRaw = 1144 + (4 + 5 + 54) * 2 * (uint)halfDataRate;
209 1 maxTRead = (100) + 4 + (5 + 54) * 2 * (uint)halfDataRate; //3880
210 1 maxTDisable = maxTLogin;
211 1 maxTDefaultRead = 2*((lwr-4)*4*8)*2*((uint32)halfDataRate);
212 1 tpp_period = 4 + 2 * (uint)halfDataRate - 4; //64
213 1 twr_period = (68 + 64 + 896 + 116) + 2 * (uint)halfDataRate - 4;
214 1
215 1 while(1)
216 1 {
217 2 if(rx_finish == 1)//串口完成合法的接收
218 2 {
219 3 rx_finish = 0;
220 3 checksum = rx_buff[1];
221 3 for(i=2;i<=(rx_buff[1]-1);i++)
222 3 {
223 4 checksum ^= rx_buff[i];
224 4 }
225 3 if (checksum != rx_buff[rx_buff[1]]) //检查校验和
226 3 continue;
227 3 }
228 2 else continue;
229 2
230 2 forward_ptr = forwardLink_data;
231 2
232 2 switch(rx_buff[2])
233 2 {
234 3 case 0x80 :
235 3 ReadWordToPC(); //读卡
236 3 break;
237 3 case 0x81 :
238 3 WriteWordtoCard(); //写卡
239 3 break;
240 3 case 0x82 :
C51 COMPILER V7.50 MAIN 06/12/2006 16:06:45 PAGE 5
241 3 Login(); //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -