📄 system.lst
字号:
237 4 return;
238 4 }
239 3 }
240 2 TH0 = 0;
241 2 TL0 = 0;
C51 COMPILER V6.23a SYSTEM 02/04/2009 09:04:10 PAGE 5
242 2 while(DIN)
243 2 {
244 3 if(TH0 > 6)
245 3 {
246 4 TR0 = 0;
247 4 return;
248 4 }
249 3 }
250 2 TH0 = 0;
251 2 TL0 = 0;
252 2 //WDT_CONTR = 0x3c;
253 2 while(i < 11)
254 2 {
255 3 if(!last_level_flag) //上次读卡时是低电平
256 3 {
257 4 while(!DIN)
258 4 {
259 5 if(TH0 > 6)
260 5 {
261 6 TR0 = 0;
262 6 return;
263 6 }
264 5 }
265 4 sz.sk[0] = TH0;
266 4 sz.sk[1] = TL0;
267 4 last_level_flag = 1;
268 4 if(sz.kk > 300) //不是空跳转则是有效数据0
269 4 {
270 5 TL0 = 0;
271 5 TH0 = 0;
272 5 if(head_flag)
273 5 {
274 6 *sip <<= 1;
275 6 if(++j > 4)
276 6 {
277 7 j = 0;
278 7 ++i;
279 7 //*sip &= 0x1f;
280 7 ++sip;
281 7 }
282 6 }
283 5 else n = 0;
284 5 }
285 4 }
286 3 else //上次读卡时电平是高电平
287 3 {
288 4 while(DIN)
289 4 {
290 5 if(TH0 > 6)
291 5 {
292 6 TR0 = 0;
293 6 return;
294 6 }
295 5 }
296 4 sz.sk[0] = TH0;
297 4 sz.sk[1] = TL0;
298 4 last_level_flag = 0;
299 4 if(sz.kk > 300) //不是空跳转则是有效数据0
300 4 {
301 5 TL0 = 0;
302 5 TH0 = 0;
303 5 if(head_flag)
C51 COMPILER V6.23a SYSTEM 02/04/2009 09:04:10 PAGE 6
304 5 {
305 6 *sip <<= 1;
306 6 *sip |= 1;
307 6 if(++j > 4)
308 6 {
309 7 j = 0;
310 7 ++i;
311 7 //*sip &= 0x1f;
312 7 ++sip;
313 7 }
314 6 }
315 5 else if(++n == 9)
316 5 {
317 6 head_flag = 1;
318 6 i = 0;
319 6 j = 0;
320 6 sip = &card_code;
321 6 }
322 5 }
323 4 }
324 3 }
325 2 TR0 = 0;
326 2 CFE = 1; //读禁止
327 2 //WDT_CONTR = 0x3c;
328 2 new_flag = 1;
329 2 s = 2;
330 2 n = 0;
331 2 for(i=0;i<11;i++)
332 2 {
333 3 n |= card_code[i];
334 3 if(card_code[i] & 0xe0)
335 3 {
336 4 new_flag = 0;
337 4 return;
338 4 }
339 3 //else if(card_code[i] != old_card[i])
340 3 // {
341 3 // old_card[i] = card_code[i];
342 3 // card_code[i] = 0;
343 3 // new_flag = 0;
344 3 // s = 0;
345 3 // }
346 3 }
347 2 if(n == 0)
348 2 {
349 3 new_flag = 0;
350 3 return;
351 3 }
352 2 }
353 1 if(card_code[10]&0x01) //最后1位=1 则错误
354 1 {
355 2 new_flag = 0;
356 2 return;
357 2 }
358 1 k = 0;
359 1 for(i=0;i<10;i++)
360 1 {
361 2 ACC = card_code[i];
362 2 if(P) //行校验
363 2 {
364 3 new_flag = 0;
365 3 return;
C51 COMPILER V6.23a SYSTEM 02/04/2009 09:04:10 PAGE 7
366 3 }
367 2 k ^= ACC;
368 2 }
369 1 k ^= card_code[10];
370 1 k &= 0x1e; //列校验
371 1 if(k)
372 1 {
373 2 new_flag = 0;
374 2 return;
375 2 }
376 1
377 1 for(i=2;i<10;i++)
378 1 {
379 2 card_code[i] = card_code[i]>>1;
380 2 }
381 1 card_code[10] = 0;
382 1 for(i=2;i<10;i++)
383 1 {
384 2 card_code[10] ^= card_code[i];
385 2 }
386 1 //card_code[10] = card_code[10] ^ card_code[1];
387 1 card_code[0] = 0xAA; //帧头
388 1 card_code[1] = 0xAA; //帧头
389 1 card_code[11] = 0x55; //帧尾
390 1 uart_send1(card_code,12);
391 1
392 1 CCF0 = 0;
393 1 CH = CH_VALUE; //定时记数初值
394 1 CL = CL_VALUE; //定时记数初值
395 1 CR = 1; //PCA计数器计数开
396 1
397 1 LED = 0; //接收到一个刷卡信号以后输出指示
398 1 led_flag = 1; //led显示标志
399 1 led_time = 15; //led 闪烁时间 1.5 秒
400 1
401 1 //WDT_CONTR = 0x3c;
402 1 }
403
404 //=====================================================================
405 //曼彻斯特码处理函数
406 //曼切斯特码头特征: 在码缓冲区中连续9个1则是头码
407 // 找到头码后纪录数据启始位置
408 // 找到头码返回1,没有头码返回0
409 //
410 //数据格式如下:
411 // U7 U6 U5 U4 P 0 = 用户标识
412 // U3 U2 U1 U0 P 1 = 用户标识
413 // D31 D30 D29 D28 P 2
414 // D27 D26 D25 D24 P 3
415 // D23 D22 D21 D20 P 4
416 // D19 D18 D17 D16 P 5
417 // D15 D14 D13 D12 P 6
418 // D11 D10 D9 D8 P 7
419 // D7 D6 D5 D4 P 8
420 // D3 D2 D1 D0 P 9
421 // X X X X 0
422 //
423 // X 列校验 P 行校验
424 //数据正确返回0 错误返回1
425 //=====================================================================
426 //00 14 00 00 0F 1B 1E 1D 0A 17 1E 00
427 //00 A 0 0 7 D F E 5 B F
C51 COMPILER V6.23a SYSTEM 02/04/2009 09:04:10 PAGE 8
428 /*void decode_data()
429 {
430 UINT8 i,k,s;
431 //WDT_CONTR = 0x3c;
432 //------------------------------------------------------------------------------
433 //判断程序接收到的数据是否正确
434 //00 14 00 00 0F 1B 1D 05 0A 03 10 00
435 //00 14 00 00 0F 1B 1E 1D 0A 17 1E 00
436
437 s = card_code[0];
438
439 DT1 = 1; //输出数据值
440
441 wait_flag = 1; //等待发送维根数据标志
442 wait_time = 10; //等待发送时间500毫秒
443 Ready = 0; //输出=0,通知主CPU准备发送韦根数据
444 //while(!wait_flag);
445
446 //--------------------------------------------------------------------------
447 //开始发送数据, i=发送的数据个数,k=发送的数据位
448 //向主CPU传送EM卡的卡号,采用串行移位寄存器方式发送数据
449 //DT1传送数据,SCLK 传送同步时钟, SCLK=0时数据有效,SCLK=1时改变数据
450 i=0; k=0;
451 while(1)
452 { if(s&0x80)DT1=1;else DT1=0; //输出数据值
453 wait_time=6;
454 while(SCLK)
455 { //WDT_CONTR=0x3c;
456 if(!wait_flag){Ready=1;return;}
457 }
458 wait_time=6;
459 while(!SCLK)
460 { //WDT_CONTR=0x3c;
461 if(!wait_flag){Ready=1;return;}
462 }
463 wait_time=6;
464 s<<=1;
465 if(++k>7) //1个字节数据发送完毕
466 { k=0; if(++i>12){Ready=1;return;}
467 else s=card_code[i];
468 }
469 }
470 }*/
471 /***********************************************************************************
472 函数名称:sys_init()
473 功能描述:系统初始化子程序
474 参 数:无
475 ***********************************************************************************/
476 void sys_init(void)
477 {
478 1 P1 = 0xFF;
479 1 P3 = 0xFF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -