非接触式IC卡也称为射频卡,或称为感应式IC,它通过射频电磁感应从读写设备获取能量和交换数据,读写操作时只需要将卡片放在可读写器附近一定距离之内就能够实现数据交换,使用方便快捷,不易损坏。这类IC卡可用于存取频繁,可靠性要求高的场合。非接触式IC 卡自问世以来,以其方便快捷的读写方式和灵活的适应性,备受用户和系统集成商的青睐。
非接触IC卡读写电路主要包括三个部分,单片机控制部分,RS-232接口转换部分以及IC卡读写模块H6152接口部分。单片机的晶振选用11.0592MHz,以得到稳定的波特率,尽量避免积累误差和波特错误引发的读写。红色发光管用于卡片读写错误时的指示。
程序如下
****************************************************************************
主程序功能为选取一张卡,将0~15共16个数写入扇区1的块0中,然后再从该扇区的
块0中读出这16个数,存入缓冲区block0buf,接着再将block0buf中的内容写入
该扇区的块1中,最后再从块1中读出16个数,存入缓冲区block1buf中。本程序
的主要功能是验证H6152模块对非接触式IC卡的读写
****************************************************************************
//标志位定义
FLAGOK BIT 00H
FLAGFIRST BIT 01H
FLAGSELOK BIT 02H
FLAG**K 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 FLAG**K
MOV FLAG**K,#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 FLAG**K
LJMP NEXT06
NEXT05:CLR FLAGSELOK 登录不成工,重新去选卡
CLR FLAG**K
NEXT06:JNB FLAG**K,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
一旦发现串口接收到数据就立即返回,表示检测到读写器有效区域内有卡片
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 |