公司新闻

showcase

非接触式IC卡读写模块编程

  下面,给大家分享非接触式IC卡读写模块编程方面的问题。非接触式IC卡也称为射频卡,或称为感应式IC,它通过射频电磁感应,从读写设备获取能量和交换数据,读写操作时只需要将卡片放在可读写器附近一定距离之内,就能够实现数据交换,使用方便快捷,不易损坏。这类IC卡可用于存取频繁,可靠性要求高的场合。非接触式IC卡自问世以来,以其方便快捷的读写方式和灵活的适应性,备受用户和系统集成商的青睐。

  非接触IC卡读写电路主要包括3个部分,单片机控制部分,RS-232接口转换部分,以及IC卡读写模块H6152接口部分。单片机的晶振选用11.0592MHz,以得到稳定的波特率,尽量避免积累误差和波特错误引发的读写。红色发光管,用于卡片读写错误时的指示。

非接触式IC卡读写模块电路设计

  非接触式IC卡读写模块程序如下:主程序功能为选取一张卡,将0~15共16个数写入扇区1的块0中,然后再从该扇区的块0中,读出这16个数,存入缓冲区block0buf,接着再将block0buf中的内容写入该扇区的块1中,最后再从块1中读出16个数,存入缓冲区block1buf中。本程序的主要功能是验证H6152模块对非接触式IC卡的读写。

  //标志位定义

  FLAGOK BIT 00H

  FLAGFIRST BIT 01H

  FLAGSELOK BIT 02H

  FLAGLOGOK BIT 03H

  FLAGRD BIT 04H

  FLAGWR BIT 05H

  //变量定义

  CNT1 DATA 28H

  SECTNO DATA 29H

  BLOCKNO DATA 2AH

  SECNO DATA 2BH

  CNT2 DATA 2CH

  COUNT DATA 2DH

  MAIN:MOV SECTNO,#01H //扇区1

  MOV BLOCKNO, #00H //块0

  CLR FLAGOK

  SETB FLAGFIRST

  CLR FLAGSELOK

  CLR FLAGLOGOK

  MOV FLAGLOGOK,#00H

  MOV COUNT,#00H

  MOV CNT1,#10H

  MOV R0,#BLOCKBUF

  MOV A,#00H

  LOOP0:MOV @R0,A //写入0~15共16字节

  INC A

  INC R0

  DJNZ CNT1,#00H,LOOP0

  CLR CTRL //H6152正常工作

  SETB BP //红色发光管不亮

  SETB EA

  MOV TMOD,#01H //模式1,T0为16位定时/计数器

  MOV TH0,#3CH //设置计数初值

  MOV TL0,#0B0H

  SETB ET0 // 打开T0中断

  LCALL SINIT // 串口初始化

  LCALL 6152RST //H6152复位

  JB FLAGOK,NEXT00***

  LCALL CARDCK //卡片检测

  LCALL ENDCK // 停止检测

  JNB FLAGFIRST,NEXT02

  CLR FLAGFIRST

  LCALL AUTOSELECT

  MOV A,SNNO

  CJNE A,#00H,NEXT02 第一张卡片选择成功,并保存序列号sn

  SETB FLAGSELOK

  SETB TR0 T0开始计时

  LJMP NEXT02

  NEXT01:LCALL AUTOSELECT

  MOV A ,SNNO

  CJNE A,#00H,NEXT02 指定序列号sn的卡片选择成功

  SETB FLAGSELOK

  NEXT02:JNB FLAGSELOK,NEXT03****

  LCALL LOGINSECT

  MOV A,#RETURN

  CJNE A,#4CH,NEXT05**** 登录成功

  SETB FLAGLOGOK

  LJMP NEXT06

  NEXT05:CLR FLAGSELOK 登录不成工,重新去选卡

  CLR FLAGLOGOK

  NEXT06:JNB FLAGLOGOK,EXIT

  MOV BLOCKNUM,#04H

  MOV SECNO,#01H

  LCALL WRITEBLOCK

  JB FLAGWR,EXIT01

  MOV BLOCKNUM,#04H

  MOV SECNO,#01H

  LCALL READBLOCK

  JB FLAGRD,EXIT01

  MOV BLOCKNUM,#05H

  MOV SECNO,#02H

  LCALL WRITEBLOCK

  JB FLAGWR,EXIT01

  MOV BLOCKNUM,#05H

  MOV SECNO,#02H

  LCALL READBLOCK

  JB FLAGRD,EXIT01

  SETB FLAGOK

  SJMP $

  EXIT01:CLR FLAGSELOK ;读写块错误,重新去选卡

  SJMP $

  ;; 延时t毫秒函数 ;;

  DELAY:NOP

  DE1:MOV CNT2,#0FAH

  DE2:DJNZ CNT2,$

  DJNZ CNT1,DE1

  RET

  ;;定时器0中断服务子程序 ;;

  T0: CLR TR0

  MOV TH0,#3CH

  MOV TL0,#0B0H

  INC COUNT

  MOV A,COUNT

  CJNE A,#0FAH,NEXT0 第一次检测到卡

  MOV COUNT,#00H

  JB FLAGOK,NEXT0 如果检测到1.5s后读写标志还是失败,则蜂鸣器报警

  CLR BP

  MOV CNT1,#0F0H

  LCALL DELAY

  SETB BP

  NEXT0:SETB TR0

  RETI

  ;;串口发送命令函数;;

  SINT:MOV A,STRING

  CJNE A,#00H,NEXT1

  CLR TI 清发送标志位

  MOV A,STRING 发送数据

  MOV SBUF,A

  JNB TI,$ 等待发送完成

  NEXT1:RETI

  /* 串口初始化, 9600,n,8,1,外部晶振11.0592MHz,查询方式

  SINIT:MOV TMOD,#20H

  MOV TH1,#0FAH

  MOV TL1,#0FAH

  SETB TR0 T1开始计数

  MOV PCON,#80H SMOD = 1

  MOV SCON,#50H 工作方式1,波特率9600bit/s,允许接收

  CLR ES 关闭串行中断

  RET

  H6152复位函数

  RST6152: MOV A,#78H 发送命令"x"

  LCALL SENDCODE

  MOV CNT1,#0FAH

  LCALL DELAY 延时250ms确保H6152复位完毕

  RET

  ;; 卡片检测函数,检测到有卡在读写器有效区域内返回

  CARDCK:MOV A,#63H

  LCALL SENDCODE 发送命令"c",命令进入“连续读”模式

  MOV CNT1,#10H

  LCALL DELAY 延时10m

  一旦发现非接触式IC卡读写模块串口接收到数据就立即返回,表示检测到读写器有效区域内有卡片

  CLR RI

  JNB RI,$

  CLR RI

  MOV CNT1,#10H

  LCALL DELAY 延时10m

  CLR RI

  JNB RI,$

  RET 确认工作区内有卡片,返回

  ;;停止卡片检测函数,即取消“连续读"模式 ;;

  ENDCK:MOV A,#20H

  LCALL SENDCODE 发送" "取消”连续读“模式

  MOV CNT1,#10H

  LCALL DELAY 延时10m

  RET

  END