打印

非接触式IC卡读写模块

[复制链接]
4197|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
非接触式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

相关帖子

沙发
liqaz| | 2012-4-20 19:40 | 只看该作者
这个代码是用汇编
写的啊,
佩服,

使用特权

评论回复
板凳
huangfeng33| | 2012-4-20 21:25 | 只看该作者
呵呵,汇编有那么“上青天”吗?
不过确实很难。:loveliness:

使用特权

评论回复
地板
tianli1980| | 2012-4-21 21:30 | 只看该作者
要实现单片机对射频卡的读写,最生要的是二者之间的结合。很好的资料,如果用C就更好了,:lol

使用特权

评论回复
5
huangfeng33| | 2012-4-21 21:48 | 只看该作者
IC卡应用很广呀。谢谢分享。谢谢21i:)

使用特权

评论回复
6
华力电子| | 2023-6-9 23:00 | 只看该作者
测试模块资料3284494788@qq.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:好好学习,天天向上!

519

主题

4195

帖子

30

粉丝