精华内容
下载资源
问答
  • 本文设计了一款符合14443A标准的Mifare IC卡读写器。系统以STM32F103C8T6为主控芯片,读写卡芯片采用MFRC522芯片(支持14443A协议,...利用双线并绕的方式设计PCB天线,大幅提高了读写卡器的天线信号强度和生产成品率。
  • 行业分类-设备装置-基于智能手机的IC卡写卡系统、写卡方法和写卡器.zip
  • 基于STM32的Mifare IC卡写卡器设计
  • 明泰URD-R110接触式IC卡读写 明泰URD-R110接触式IC卡读写该款设备是明华RD-EB-MX、KRD-EB-MX、RD-ET-MX、KRD-ET-MX接触式IC卡读写升级替代品,完全兼容。明泰URD-R110接触式IC卡读写可对MEMORY卡和CPU卡...

    明泰URD-R110接触式IC卡读写器

    明泰URD-R110接触式IC卡读写器该款设备是明华RD-EB-MX、KRD-EB-MX、RD-ET-MX、KRD-ET-MX接触式IC卡读写器升级替代品,完全兼容。明泰URD-R110接触式IC卡读写器可对MEMORY卡和CPU卡操作。明泰RD系列读写器提供三种卡座选择,支持多种卡型操作。可以采用串口并口USB口与计算机相连。随机提供的接口函数库性能完善,能够满足各种高级程序开发和应用的需要。可广泛用于工商、税务、邮电、银行、保险、医疗等收费系统。

    aa71207590c643a839ea3a44e2609f28.png

    明泰URD-R110接触式IC卡读写器

    该款设备是明华RD-EB-MX、KRD-EB-MX、RD-ET-MX、KRD-ET-MX接触式IC卡读写器升级替代品,完全兼容。明泰URD-R110接触式IC卡读写器可对MEMORY卡和CPU卡操作。明泰RD系列读写器提供三种卡座选择,支持多种卡型操作。可以采用串口并口USB口与计算机相连。随机提供的接口函数库性能完善,能够满足各种高级程序开发和应用的需要。可广泛用于工商、税务、邮电、银行、保险、医疗等收费系统。

    项目内容技术规格参数
    外观尺寸150mm×118mm×100mm
    电源
    电源接口USB接口取电
    工作电压5V±
    通讯方式RS232串口通讯
    通讯波特率9600bps~115200bps,默认9600bps;
    连接线不小于米
    接触式模块
    支持卡片类型IC卡大卡座:符合ISO7816标准的T=0,T=1协议的CPU卡,储存卡,AT24C01a/02/04/08/32/64,AT88SC102/1608/1608B,SLE4404/4406/4432/4442/4418/4428,
    卡座规格1个推拔式IC大卡座
    卡读写速度9600bps~115200 bps
    卡座触点8个,有卡到位信息。所有触点都带有短路保护,还有过流保护,最大程度保护读写器和卡片
    卡座寿命不小于10万次
    人机界面
    指示灯1个双色指示灯,红灯亮为电源指示,绿色指示灯亮表示设备已插卡,绿灯闪烁表示设备正在通讯
    蜂鸣单调音
    支持开发平台Windows 2000/NT/XP/Vista/Windows 7/Linux/Unix
    工作环境
    工作温度0°C ~ 50°C (可选-25°C ~ 85°C )
    工作湿度10% ~ 90% 
    技术支持
    驱动无驱设备
    API标准Windows 32位动态库
    配套服务

    提供开发包,包括产品接口动态库、演示例程及帮助文档

    明泰URD-R110接触式IC卡读写器

    产品名称:URD-R110 产品分类:接触式读卡器系列 1:电子政务 2:电子银行和电子支付 3:电子医疗 4:社保应用 5:网络安全 6:访问控制 7:积分优惠
    项目内容技术规格参数
    外观尺寸150mm×118mm×100mm
    电源
    电源接口USB接口取电
    工作电压5V±
    通讯方式RS232串口通讯
    通讯波特率9600bps~115200bps,默认9600bps;
    连接线不小于米
    接触式模块
    支持卡片类型IC卡大卡座:符合ISO7816标准的T=0,T=1协议的CPU卡,储存卡,AT24C01a/02/04/08/32/64,AT88SC102/1608/1608B,SLE4404/4406/4432/4442/4418/4428,
    卡座规格1个推拔式IC大卡座
    卡读写速度9600bps~115200 bps
    卡座触点8个,有卡到位信息。所有触点都带有短路保护,还有过流保护,最大程度保护读写器和卡片
    卡座寿命不小于10万次
    人机界面
    指示灯1个双色指示灯,红灯亮为电源指示,绿色指示灯亮表示设备已插卡,绿灯闪烁表示设备正在通讯
    蜂鸣单调音
    支持开发平台Windows 2000/NT/XP/Vista/Windows 7/Linux/Unix
    工作环境
    工作温度0°C ~ 50°C (可选-25°C ~ 85°C )
    工作湿度10% ~ 90% 
    技术支持
    驱动无驱设备
    API标准Windows 32位动态库
    配套服务

    提供开发包,包括产品接口动态库、演示例程及帮助文档

    常见应用

    l 电子政务l 电子银行和电子支付l 电子医疗l 社保应用l 网络安全l 访问控制l 积分优惠

    保修期:1年

    明泰URD-R110接触式IC卡读写器该款设备是明华RD-EB-MX、KRD-EB-MX、RD-ET-MX、KRD-ET-MX接触式IC卡读写器升级替代品,完全兼容。明泰URD-R110接触式IC卡读写器可对MEMORY卡和CPU卡操作。明泰RD系列读写器提供三种卡座选择,支持多种卡型操作。可以采用串口并口USB口与计算机相连。随机提供的接口函数库性能完善,能够满足各种高级程序开发和应用的需要。可广泛用于工商、税务、邮电、银行、保险、医疗等收费系统。

     6f8540286b77ce9057bfabc0a072a07d.png

    北京明华诚信科技有限公司主要生产明华诚信MHCX非接触式射频卡读写器、明华诚信MHCX射频ID卡读卡器、明华诚信MHCX磁条卡阅读器、明华诚信MHCX磁条卡读写器、明华诚信MHCX密码小键盘;同时公司还专业销售明华IC卡读卡器、明华接触式读卡器、明泰接触式读卡器、明华USB口读写器、读卡器、会员读卡器、读写器、会员读卡器、商场会员卡读卡器、酒店会员卡读卡器、会员卡发卡器、医疗卡读卡器、保险卡读卡器、社保卡读卡器、超市会员卡发卡器、旅馆会员卡发卡器、门禁卡发卡器;我司还承接IC卡、射频M1卡、射频ID卡、磁条卡、PVC卡的印刷业务。

    展开全文
  • 基于STM32的Mifare IC卡写卡器设计.pdf
  • MF-800IC卡读写应用非常广泛,适用于多种IC卡的读写,该示例程序为VB6编写,写卡使用
  • 单片机实现通用存贮器IC卡的读写,该系统结构简单,在实际运行时具有很高的可靠性,同时具有一定的可扩展性,并可通过单片机的串行口经电平转换后直接与计算机相连,以进行数据通讯。另外,也可根据需要连接到其它...
  • 通用IC卡读写工具

    2018-04-03 09:04:00
    通用IC卡读写工具
  • Arduino 控制RFID读写读写 IC卡

    Arduino 控制RFID读写器读写 IC卡

    一、IC卡的认识

      IC卡可以通过频段进行划分,低频(125KHz~134kHz,典型工作频率是12KHz)、高频(13.56MHz)和超高频(860-960MHz)。

      今天的主角是高频卡即咱的M1卡,当然高频卡还有其他类型的卡,M1卡的芯片主要有s50和s70,即Philips Mifare 1 S50/S70芯片。区别是前者存储区只有1KB,后者4KB。 协议遵循ISO 14443 和ISO 10536。

      M1 S50卡共分为16个扇区,每个扇区分为4个块,每个块16个字节,所以总共16X4X16=1024字节,即1KB。

      每个扇区的最后一个块,也就是块三,控制着整个扇区的数据读写权限,数据可进行增加和减少等等,具体显示如下。

    FF FF FF FF FFFF 07 80 69FF FF FF FF FF
    密码A控制权限密码B

      控制字节的前三个字节为有效字节,最后一个字节为备用字节,通过位的组合来进行多种控制的选择,

      比如第二个字节的第四位X、第三个字节的第一位Y和第三个字节的第四位Z组成一个0-7 的数据,每个数据代表一种控制方式,控制着块0的读写及数据加减操作。

    76543210
    字节1 (FF)Y3_bY2_bY1_bY_bX3_bX2_bX1_bX_b
    字节2 (07)X3X2X1XZ3_bZ2_bZ1_bZ_b
    字节3 (80)Z3Z2Z1ZY3Y2Y1Y
    字节4(69备用)
    控制位控制位控制位访问条件访问条件访问条件访问条件
    XYZ读数据写数据数据增加+数据减少
    000KEYA/BKEYA/BKEYA/BKEYA/B
    001KEYA/BXXX
    010KEYA/BKEYBXX
    011KEYA/BKEYBKEYBKEYA/B
    100KEYA/BXXKEYA/B
    101KEYBKEYBXX
    110KEYBXXX
    111XXXX

      ** KEYA/B 表示验证AB密码均可 X表示没有该权限 无法进行该操作

      X_b表示X的反码。

      比如上面的控制权限 为000 即验证A或者B任意密码均可以进行读写加减数据等操作,属于安全性较低的一种控制权限。

      然后块1块2的读写权限也如上图所示,是由X1 Y1Z1X2Y2Z2来控制。

      块3的读写权限,与块012有所不同。

    控制位控制位控制位A密码访问条件A密码访问条件存取控制访问条件存取控制访问条件B密码访问条件B密码访问条件
    X3Y3Z3读数据写数据读数据写数据读数据写数据
    000XKEYA/BKEYA/BXKEYA/BKEYA/B
    001XXKEYA/BXKEYA/BX
    010XKEYBKEYA/BXXKEYB
    011XXKEYA/BXXX
    100XKEYA/BKEYA/BKEYA/BKEYA/BKEYA/B
    101XKEYBKEYA/BKEYBXKEYB
    110XXKEYA/BKEYBXX
    111XXKEYA/BXXX

      普通的M1白卡块0的前四位是UID号,代表着该卡唯一ID不可以随意修改,因此许多门禁卡将其作为身份的识别,但是也有不少人想复制别人的卡,意思就是将自己卡的UID改成与别人的卡的UID一致。

    #块0 16字节数据解释
    D9 B2 20 09: 4字节卡号(即UID)
    41         : XOR卡号校验
    08         : 卡容量
    04 00      : 卡类型
    00 00 00 00: 其它
    00 00 00 00: 其它
    

      普通的M1白卡无法修改,就出现了一种特殊的M1卡,UID卡,也称为魔术卡,UID可以更改,但是不可以直接通过读写更改,需要特殊的指令才可以修改,可以更改多次,但是无法绕过读写器的防火墙,会响应读写器后指令,被发现为复制卡。
    在这里插入图片描述
    在这里插入图片描述

      于是乎又出现了一种CUID卡,可以直接通过读写指令多次更改0扇区,方便了很多,同时会屏蔽后指令,绕过防火墙,但是其ID可能被其他读写更改,可能导致失效。

    在这里插入图片描述
    在这里插入图片描述

      于是乎又出现了一种FUID卡,可更改一次UID,之后将变成普通的UID卡,防火墙检测也可以绕过,只能读写一次。还有一种UFUID卡,如果执行封卡操作,则变成普通的M1卡,如果不执行封卡操作,就是CUID卡,可以反复读写,是FUID和CUID的组合版,可能就是比较贵。

    在这里插入图片描述
    在这里插入图片描述

    二、Arduino读写IC卡取及UID号

      笔者使用的Arduino套件中的RFID读写器,芯片采用NXP公司的RC522,SPI通信,由于Arduino中自带SPI和RFID的库,所以很方便的调用来初始化芯片,以及读取卡片信息。
    在这里插入图片描述
    在这里插入图片描述

    读取IC卡的信息步骤:

    0、初始化RC522

    1、是否有新卡处于空闲状态,自动忽略睡眠的卡,会唤醒卡

    2、发送选择指令选择 一张卡,

    3、串口输出卡的存储转储文件信息。(dump文件)

    /*
    【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
    实验一百零二:MFRC-522 RFID射频 IC卡感应模块读卡器S50复旦卡钥匙扣
    1、工具-管理库-搜索“MFRC522”库-安装
    2、项目:使用MFRC522 RFID和Arduino读写标签
    3、RFID与Arduino Uno的连线
    SDA------------------------Digital 10
    SCK------------------------Digital 13
    MOSI----------------------Digital 11
    MISO----------------------Digital 12
    IRQ------------------------不用连接
    GND-----------------------GND
    RST------------------------Digital 9                    
    3.3V------------------------3.3V (千万不要连接到5V接口!!!)
    */
    
    #include <SPI.h>
    #include <MFRC522.h>
    
    #define SS_PIN 10
    #define RST_PIN 9
    MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.
    
    void setup() {
      Serial.begin(9600); // Initialize serial communications with the PC
      SPI.begin();  // Init SPI bus
      mfrc522.PCD_Init(); // Init MFRC522 card
      Serial.println("Scan PICC to see UID and type...");
    }
    
    void loop() {
      // Look for new cards
    
      if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
      }
    
      // Select one of the cards
      if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }
    
      // Dump debug info about the card. PICC_HaltA() is automatically called.
      mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
    }
    
    

    在这里插入图片描述

      Arduino 读写IC卡内容的程序,主要是验证扇区AB密码、读块数据和写块数据,具体流程如下:

    0、初始化RC522,定义要写入的数据等

    1、察看是否有新卡

    2、选择一张卡

    3、显示卡片UID和类型

    4、验证密钥,并读取整个扇区数据,具体验证A还是B密钥,需要知道卡的控制类型,根据上面知道的其实000,即验证AB密码均可。

    5、验证秘钥,写入对应扇区对应块的数据。

    6、检测写入的数据是否正确,先读出数据,然后和源数据做比较,

    /*
      【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
      实验一百零二:MFRC-522 RFID射频 IC卡感应模块读卡器S50复旦卡钥匙扣
      1、安装库:IDE-工具-管理库-搜索“MFRC522”库-安装
      2、项目三:RC522 模块的读写操作
      3、RFID与Arduino Uno的连线
      SDA------------------------Digital 10
      SCK------------------------Digital 13
      MOSI----------------------Digital 11
      MISO----------------------Digital 12
      IRQ------------------------不用连接
      GND-----------------------GND
      RST------------------------Digital 9
      3.3V------------------------3.3V (千万不要连接到5V接口!!!)
    */
    
    #include <SPI.h>
    #include <MFRC522.h>
    #define RST_PIN         9           // 配置针脚
    #define SS_PIN          10
    MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建新的RFID实例
    MFRC522::MIFARE_Key key;
    void setup() {
      Serial.begin(9600); // 设置串口波特率为9600
      while (!Serial);    // 如果串口没有打开,则死循环下去不进行下面的操作
      SPI.begin();        // SPI开始
      mfrc522.PCD_Init(); // Init MFRC522 card
    
      for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
      }
    
      Serial.println(F("扫描卡开始进行读或者写"));
      Serial.print(F("使用A和B作为键"));
      dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);    //将keybyte格式化成字符串,
      Serial.println();
      Serial.println(F("注意,会把数据写入到卡在#0"));
    }
    
    
    void loop() {
        
      MFRC522::StatusCode status;
      
      // 寻找新卡
      if ( ! mfrc522.PICC_IsNewCardPresent())
        return;
    
      // 选择一张卡
      if ( ! mfrc522.PICC_ReadCardSerial())
        return;
    
      // 显示卡片的详细信息
      Serial.print(F("卡片 UID:"));
      dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);   //将uid格式化成字符串,
      Serial.println();
      Serial.print(F("卡片类型: "));
      MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
      Serial.println(mfrc522.PICC_GetTypeName(piccType));
    
      // 检查兼容性
      if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
              &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
              &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
        Serial.println(F("仅仅适合Mifare Classic卡的读写"));
        return;
      }
    
      // 我们使用第0个扇区
      // 修改块1
      byte sector         = 0;
      byte blockAddr      = 1;
      byte dataBlock[]    = {
        0x01, 0x02, 0x03, 0x04, //  1,  2,   3,  4,
        0x04, 0x06, 0x07, 0x08, //  5,  6,   7,  8,
        0x0A, 0x0B, 0x0C, 0x0D, //  0,0,0,0
        0x0E, 0x0F, 0x09, 0x10  // 0,0,0,0
      };//写入的数据定义
      byte trailerBlock   = 1;
     
      byte buffer[18];
      byte size = sizeof(buffer);
    
      // 原来的数据
      Serial.println(F("显示原本的数据..."));
      status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
      if (status != MFRC522::STATUS_OK) {
        Serial.print(F("身份验证失败?或者是卡链接失败"));
        Serial.println(mfrc522.GetStatusCodeName(status));
        return;
      }
    
      // 显示整个扇区
      Serial.println(F("显示所有扇区的数据"));
      mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
      Serial.println();
    
      // 从块儿读取数据
      Serial.print(F("读取块儿的数据在:")); Serial.print(blockAddr);
      Serial.println(F("块 ..."));
      status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
      if (status != MFRC522::STATUS_OK) {
        Serial.print(F("读卡失败,没有连接上 "));
        Serial.println(mfrc522.GetStatusCodeName(status));
      }
      Serial.print(F("数据内容在第 ")); Serial.print(blockAddr); Serial.println(F(" 块:"));
      dump_byte_array(buffer, 16); Serial.println();
      Serial.println();
    
      //开始进行写入准备
      Serial.println(F("开始进行写入的准备..."));
      status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
      if (status != MFRC522::STATUS_OK) {
        Serial.print(F("写入失败,没有连接上或者没有权限 "));
        Serial.println(mfrc522.GetStatusCodeName(status));
        return;
      }
    
      // Write data to the block
      Serial.print(F("在第: ")); Serial.print(blockAddr);
      Serial.println(F("  块中写入数据..."));
      dump_byte_array(dataBlock, 16); Serial.println();
      status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
      if (status != MFRC522::STATUS_OK) {
        Serial.print(F("写入失败... "));
        Serial.println(mfrc522.GetStatusCodeName(status));
      }
      Serial.println();
    
    
      // 再次读取卡中数据,这次是写入之后的数据
      Serial.print(F("读取写入后第")); Serial.print(blockAddr);
      Serial.println(F(" 块的数据 ..."));
      status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
      if (status != MFRC522::STATUS_OK) {
        Serial.print(F("读取失败... "));
        Serial.println(mfrc522.GetStatusCodeName(status));
      }
      Serial.print(F("块 ")); Serial.print(blockAddr); Serial.println(F("数据为 :"));
      dump_byte_array(buffer, 16); Serial.println();
    
      // 验证一下数据,要保证写入前后数据是相等的
      // 通过计算块中的字节数量
      Serial.println(F("等待验证结果..."));
      byte count = 0;
      for (byte i = 0; i < 16; i++) {
        // 比较一下缓存中的数据(我们读出来的数据) = (我们刚刚写的数据)
        if (buffer[i] == dataBlock[i])
          count++;
      }
      Serial.print(F("匹配的字节数量 = ")); Serial.println(count);
      if (count == 16) {
        Serial.println(F("验证成功 :"));
      } else {
        Serial.println(F("失败,数据不匹配"));
        Serial.println(F("也许写入的内容不恰当"));
      }
      Serial.println();
    
      // 转储扇区数据
      Serial.println(F("写入后的数据内容为::"));
      mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
      Serial.println();
    
      // 停止 PICC
      mfrc522.PICC_HaltA();
      //停止加密PCD
      mfrc522.PCD_StopCrypto1();
    }
    
    /**
      将字节数组转储为串行的十六进制值
    */
    void dump_byte_array(byte *buffer, byte bufferSize) {
      for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], HEX);
      }
    }
    

    在这里插入图片描述

      Arduino 更改UID卡的ID号,UID卡的ID不能直接按常规的上面的方法写入,刚开始的时候,笔者并不知道如何更改UID号,就按照常规的方法写入,即验证秘钥A/B,然后写入,结果发现,每次都无法写入,提示写入失败,卡片无响应。
    在这里插入图片描述

      然后上网百度发现UID卡无法按照正常的方式写入,需要特殊的指令,这段指令和常规的写法不同,网上有实现采用STM32的,我采用Arduino的,都可以实现。

    Sent bits: 50 00 57 cd //休眠,50 00 就是 PcdHalt()
    Sent bits: 40 (7 bits) (特殊指令)//第一条指令,要设定 BitFramingReg 使 传送 7位数据,不能是8位。
    Received bits: a (4 bits)
    Sent bits: 43 (特殊指令)//第二条指令
    Received bits: 0a
    Sent bits: a0 00 5f b1 //第三条指令
    Received bits: 0a
    Sent bits: 00 dc 44 20 b8 08 04 00 46 59 25 58 49 10 23 02 c0 10 //正常的写入块0数据
    Received bits: 0a

      经过查找和尝试,找到了库中的一个写入函数:PCD_TransceiveData,这个函数的参数挺复杂的,然后多次尝试之后,终于写成功了,

    0、初始化RC522,定义要写入的数据等

    1、察看是否有新卡

    2、选择一张卡

    3、显示卡片UID和类型

    4、休眠

    5、以此执行一二三条指令,返回正确则正常写入。

    6、读取验证是否正常写入(未调试成功)

    /*
      【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
      实验一百零二:MFRC-522 RFID射频 IC卡感应模块读卡器S50复旦卡钥匙扣
      1、安装库:IDE-工具-管理库-搜索“MFRC522”库-安装
      2、项目三:RC522 模块的读写操作
      3、RFID与Arduino Uno的连线
      SDA------------------------Digital 10
      SCK------------------------Digital 13
      MOSI----------------------Digital 11
      MISO----------------------Digital 12
      IRQ------------------------不用连接
      GND-----------------------GND
      RST------------------------Digital 9
      3.3V------------------------3.3V (千万不要连接到5V接口!!!)
    */
    
    #include <SPI.h>
    #include <MFRC522.h>
    #define RST_PIN         9           // 配置针脚
    #define SS_PIN          10
    MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建新的RFID实例
    MFRC522::MIFARE_Key key;
    void setup() {
      Serial.begin(9600); // 设置串口波特率为9600
      while (!Serial);    // 如果串口没有打开,则死循环下去不进行下面的操作
      SPI.begin();        // SPI开始
      mfrc522.PCD_Init(); // Init MFRC522 card
    
      for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
      }
    
      Serial.println(F("扫描卡开始进行读或者写"));
      Serial.print(F("使用A和B作为键"));
      dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
      Serial.println();
    
      Serial.println(F("注意,会把数据写入到卡在#0"));
    }
    
    
    void loop() {
        
        MFRC522::StatusCode status;
      
      // 寻找新卡
      if ( ! mfrc522.PICC_IsNewCardPresent())
        return;
    
      // 选择一张卡
      if ( ! mfrc522.PICC_ReadCardSerial())
        return;
    
      // 显示卡片的详细信息
      Serial.print(F("卡片 UID:"));
      dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
      Serial.println();
      Serial.print(F("卡片类型: "));
      MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
      Serial.println(mfrc522.PICC_GetTypeName(piccType));
    
      // 检查兼容性
      if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
              &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
              &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
        Serial.println(F("仅仅适合Mifare Classic卡的读写"));
        return;
      }
    
      
    
    
      //开始进行写入准备
      Serial.println(F("开始进行写入的准备..."));
    
    
        status = mfrc522.PICC_HaltA();         //休眠
        if(status != MFRC522::STATUS_OK)
        {
          Serial.print(F("休眠失败... "));
          
          return;
        }
        
        Serial.println(F("休眠成功... "));
        
        //第一条指令、
        byte buffer_send[4]={0x40,0x00,0x00,0x00};
        byte receive= 0x01;
        byte rec_len = 1;
        byte validbits = 0x07;
        mfrc522.PCD_SetRegisterBitMask(MFRC522::BitFramingReg,validbits);
        status = mfrc522.PCD_TransceiveData(buffer_send,1,&receive,&rec_len,&validbits,0,false);
       if(status != MFRC522::STATUS_OK)
       {
          Serial.println(F("0x40 发送失败... "));
          Serial.println(status); 
          return;
       }
        Serial.println(receive); 
            
        buffer_send[0] = 0x43;
        validbits = 8;
        mfrc522.PCD_ClearRegisterBitMask(MFRC522::BitFramingReg,0x07);
         status = mfrc522.PCD_TransceiveData(buffer_send,1,&receive,&rec_len,nullptr,0,false);
       if(status != MFRC522::STATUS_OK)
       {
          Serial.println(F("0x43 发送失败... "));
          return;
       } 
        Serial.println(receive); 
        
        //第一条指令、
        buffer_send[0] = 0xa0;
        buffer_send[1] = 0x00;
        buffer_send[2] = 0x5f;
        buffer_send[3] = 0xb1;
        validbits = 8;
         status = mfrc522.PCD_TransceiveData(buffer_send,4,&receive,&rec_len,nullptr,0,false);
       if(status != MFRC522::STATUS_OK)
       {
          Serial.println(F("块0 发送失败... "));
          return;
       } 
        Serial.println(receive); 
    
        //第三条指令、
        byte  data[20]={
        0x21, 0xB7, 0x7F, 0xE2, //  1,  2,   3,  4,
        0x9C, 0x08, 0x04, 0x00, //  5,  6,   7,  8,
        0x00, 0x00, 0x00, 0x00, //  0, 0,   0, 0
        0x00, 0x00, 0x00, 0x00  //  0, 0,   0, 0
       }; 
    
        byte i=0;
        byte Value = 0;
        for(i=0;i<4;i++)
        {
          Value^=data[i];
        }
        data[4] = Value;
       mfrc522.PCD_CalculateCRC(data,16,&data[16]);
       status = mfrc522.PCD_TransceiveData(data,18,&receive,&rec_len,nullptr,0,false);
       if(status != MFRC522::STATUS_OK)
       {
           Serial.println(F("块0 发送失败... "));
           return;
       }
        Serial.println(receive); 
    
    
      byte sector         = 0; //0扇区
      byte blockAddr      = 0; //0块
     
      byte buffer[18]; 
      byte size = sizeof(buffer);
       
    
      // 再次读取卡中数据,这次是写入之后的数据
      Serial.print(F("读取写入后第")); Serial.print(blockAddr);
      Serial.println(F(" 块的数据 ..."));
      status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
      if (status != MFRC522::STATUS_OK) {
        Serial.print(F("读取失败... "));
        Serial.println(mfrc522.GetStatusCodeName(status));
      }
      Serial.print(F("块 ")); Serial.print(blockAddr); Serial.println(F("数据为 :"));
      dump_byte_array(buffer, 16); Serial.println();
    
      // 验证一下数据,要保证写入前后数据是相等的
      // 通过计算块中的字节数量
      Serial.println(F("等待验证结果..."));
      byte count = 0;
      for (byte i = 0; i < 16; i++) {
        // 比较一下缓存中的数据(我们读出来的数据) = (我们刚刚写的数据)
        if (buffer[i] == data[i])
          count++;
      }
      Serial.print(F("匹配的字节数量 = ")); Serial.println(count);
      if (count == 16) {
        Serial.println(F("验证成功!"));
      } else {
        Serial.println(F("失败,数据不匹配"));
        Serial.println(F("也许写入的内容不恰当"));
      }
      Serial.println();
    
    
      // 停止 PICC
      mfrc522.PICC_HaltA();
      //停止加密PCD
      mfrc522.PCD_StopCrypto1();
    }
    
    /**
      将字节数组转储为串行的十六进制值
    */
    void dump_byte_array(byte *buffer, byte bufferSize) {
      for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], HEX);
      }
    }
    

    在这里插入图片描述

    修改UID卡学习即可,别做坏事呦!

    github地址:https://github.com/ZhangYiXiSucceed/Arduino-control-IC

    参考:
    1、https://blog.csdn.net/FXRZF/article/details/112341016
    2、https://www.arduino.cn/thread-91519-1-1.html
    3、https://blog.csdn.net/wlwl0071986/article/details/48394297

    展开全文
  • 本文对AT24系列存贮器和AT89系列单片机的特征及总线状态作为介绍,并以AT24C01与AT89C2051为例详细描述了通用存贮器IC卡的工作原理及单片机对其进行读写操作的基本电路连接和软件编程方法。 通用存贮器IC卡是由...
  • 中控IC写卡器Demo

    2018-12-24 11:15:31
    各种类型的Demo比较全的,其中就有C/Java/C# 等;是一卡通的资料!
  • 易语言IC卡读写模块

    2010-04-25 04:01:26
    IC卡读写模块IC卡读写模块IC卡读写模块IC卡读写模块
  • IC卡读写程序 (R330系列读写
  • C#编写的 IC 连接,识别源代码。
  • 因为本计划中所行使的PIC单片机的措施存储器较大(8KB),因而可以编写较大的措施,实现多合一该卡器并由PC机节制读写哪种芯片的IC卡。其它,因为本计划所行使单片机的措施存储器是Flash存储器,因而可以利便地实现...

    1.1 SPI主模式

    因为节制时钟SCK的输出,主模式可以在任何时辰开始传输数据。主模式通过软件协议节制从模式的数据输出。

    在主模式中,一旦SSPUF寄存器写入,数据就会发送或吸取。在吸取数据时,SSPSR寄存器凭证时钟速度移位,一旦吸取到一个字节,数据就传输到SSPBUF,同时刻断符号位和状态符号位置位。

    时钟的极性可以通过编程改变。在主模式中,时钟SCK的频率可以配置为:fosc/4(即Tcy)、fosc/16(即4Tcy)、fosc/64(即16Tcy)和按时器2(Timer2)输出的二分频等四种。在芯片时钟为20MHz时,SCK的最大频率为5.0MHz。

    在本计划中,行使的就是SPI主模式,由单片机节制时钟SCK的输出。当向IC卡中写数据时,随时可以发送数据;当读IC卡内的数据时,先要发送恣意一个数据(此时IC卡不处于写入状态,不会吸取该数据), 给IC卡提供输出数据的时钟,然后再吸取IC卡发出的数据。那时序如图2所示。(发送和接惦的数据均为6FH)

    假如要持续发送数据,那么每次将数据送到SSPBUF寄存器后,都要判定是否已经发送完该数据,即判定PIR1寄存器的SSPIF位是否为1。假如SSPIF位为1,则表白数据已经发送完毕,可以继承发送下一个数据。但此时还不能当即发送下一个数据,由于SSPIF位必需在措施中由软件清零,只有将SSPIF位软件清零后,才气继承发送下一个数据。

    1.2 SPI从模式

    ac9132d8b364ea513b47835f3ab60b1e.gif

    在SPI从模式,数据的发送和吸取领先SCK引脚上输入的外时钟脉冲,当最后一位被锁存后,间断符号位SSPIF(PIR1的D3)位。在休眠模式,从模式仍可发送和吸取数据,一旦吸取到数据,芯片就从休眠中叫醒。假如回收SS节制的从模式,当SS引脚接到VDD时,SPI模式复位;假如 彩CKE=1节制的从模式,必需开放SS引脚节制。

    在本计划中,因为IC卡是存储器卡,不能提供时钟信号,因此不能回收从模式,只能回收主模式,由单片机节制时钟信号。

    单片机的SPI方法初始化措施如下:

    MOVLW20H ;将20H送到累加器

    MOVWF SSPCON ;将累加器中的数送到SSPCON寄存器

    BSF STATUS,RP0 ;将定RAM区的第1页

    BCF SSPSTAT,SMP ;将SSPSTAT寄存器的SMP位置0

    BSF SSPSTAT,CKE ;将SSPSTAT寄存器的CLK位置1

    BCF TRISC,3 ;将端口C的第3位配置为输出

    BCF TRISC,5 ;将端口C的第5位配置为输出

    个中,上述第1、2行措施是设置节制寄存器,将SPI方法设置为主控模式,时钟频率为单片机时钟频率的1/4,并将时钟的高电平配置为空闲状态。第3行措施为换页指令,将指针转到第1页。由于PIC16F877单片机的数据存储器是分页的,而所要操纵的寄存器在第1页,因此要用换页指令将指针到第1页。第4、5行措施是设置状态寄存器,将SPI方法配置为数据输出时钟的中间采样,时钟SCK的上升沿触发。第6、7行措施则是将RC口的RC3和RC5配置为输出。

    2 USART方法

    通用同步异步吸取发送模块(USART)是两个串行通讯接口之一,USART又称为SCI(Serial Communication Interface)。USART可以配置为全双工异步串行通讯体系,这种方法可以与小我私人计较机PC或串行接口CRT等外围装备举办串行通讯:也可以配置为半双工异步串行通讯体系,与串行接口的A/D或D/A集成电路、串行EEPROM等器件毗连。USART是二线制串行通讯接口,它可以被界说如下三种事变方法:全双工异步方法、半双工同步主控方法、半双工同步从动方法。

    为了把RC6和RC7别离配置成串行通讯接口的发送/时钟(TX/CK)线和吸取/数据(TX/DT)线,必需起首把SPEN位(TCSTAT的RD7)和偏向寄存器TRISC的D7:D6置1。

    USART成果模块含有两个8位可读/写的状态/节制寄存器,它们是发送状态/节制寄存器TXSTA和吸取状态/节制寄存器TCSTA。

    e78eda3e0555432640e80219a782045a.gif

    USART带有一个8位波特率产生器BRG(Baud Rato Generator),这个BRG支持USART的同步和异步事变方法。用SPBRG寄存器节制一个独立的8位按时器的周期。在异步方法下,发送状态/节制寄存器TXSTA的BRGH位(即D2)也被用来节制波特率(在同步方法下忽略BRGH位)。

    向波特率寄存器SPBRG写入一个新的初值时,城市使BRG按时器复位清零,由此可以担保BRG不必要比及按时器溢出后就可以输出新的波特率。

    对USART方法举办初始化的措施如下:

    BSF STATUS,RP0 ;将指针指向数据存储器的第1页

    MOVLW 0x19

    MOVWF SPBRG ;配置波特率为9600

    BCF STATUS,RP0 ;将指针指向数据存储器的第0页

    CLRF RCSTA ;将吸取节制和状态寄存器清零

    BSF RCSTA,SPEN ;串口应承

    CLRF PIR1 ;破除间断符号

    BSF STATUS,RP0 ;将指针指向数据存储器的第1页

    CLRF TXSTA ;将发送节制和状态寄存器清零

    BSF TXSTA,BRGH ;配置为异步、高速波特率

    BSF TXSTA,TXEN ;应承发送

    BCF STATUS,RP0 ;将指针指向数据存储器的第0页

    BSF RCSTA,CREN ;应承吸取

    初始化完成后,即可发送或吸取数据。在发送或吸取数据时,通过查询发送/吸取间断符号位即可判定是否发送完一个数据/吸取到一个数据。发送/吸取间断标地不必要也不有效软件复位。

    在异步串行发送的进程中,只要TXREG寄存器为空,间断符号TXIF就置位。因此,TXIF为1并不是发送完毕的符号,但仍可以用TXIF符号来判定。因此当TXREG为空时,将数据送入后,数据会保存在TXREG寄存器中,直到前一个数据从发送移位寄存器中移出,即前一个数据发送完。

    ebe6fe0fef56e087a7808e7a9ba6069b.gif

    3 IC卡

    IC卡是集成电路卡(Integrated Circuit Card)的简称,有些国度和地点称其为智能卡(Smart Card)、芯片卡(Chip Card)。国际尺度化组织(ISO)在ISO7816尺度中划定,IC卡是指在由聚氯乙烯(PVC)或聚氯乙烯酸脂(PVCA)原料制成的塑料卡内嵌入式处理赏罚器和存储器等IC芯片的数据卡。连年来,因为导半体技能的前进,集成化水和善存储器容量有了很大进步,并使CPU和存储器集成在一个芯片上,从而进步了数据的安详性。

    在本计划中,IC卡回收的是AT45DB041B-SC芯片,该芯片的特点如一下:

    *单一的2.7V~3.6V电源;

    *串行接口布局;

    *页面编程操纵,单一的轮回一再编程(擦除和编程,2048页(每页264字节)主存;

    *两个264字节的SRAM数据缓存,应承在重编程非易失性存储器时吸取数据;

    *内置的编程和节制按时器;

    *低功耗,4mA有源读取电流,2μA CMOS备用电流;

    *15MHz的最大时钟频率;

    *串行外围接口方法(SPI)——模式0和3;

    *CMOS的TTL兼容的输入和输出;

    *5.0V可遭受的输入,SI、SCK、CS(低电平有用)、RESET(低电平有用)。

    在本计划的调试进程中,曾测试过IC卡的输入输出电平,功效证明这种IC卡的输入电平与TTL兼容,而输出电平与TTL不兼容。

    4 IC卡的电源提供电路

    在本计划中,因为IC卡的电源电压范畴为+2.7~+3.6V,而PIC单片机必要的电源为+5V,并且稳压源提供的电压一ㄇ+5V,因此,要计一律个稳压模块,给IC卡提供+3V阁下的电压。计划电路如图3所示。

    该电路的首要元件为LM317芯片,它是三端可调集成稳压器,输出电压为1.25~37V范畴内可调。当其Vin端的输入电压在2~40V范畴内变革时,电路均能正常事变,输出端Vout和调解端ADJ间的电压便是基准电压1.25V。该芯片内的基电路的事变电流IREF很小,约为50μA,由一个恒流性很好的恒流源提供,以是它的巨细不受供电电压的影响,很是不变。在图3中,B点为电压输出端,为IC卡提供电压。A点为节制端,与单片机的一个端口引脚相连,当该引脚为低电平常,三极管Q1不事变,B点输出电压约为3.15V;当该引脚为高电平常,三极管Q1事变,B点输出电压约为1.25V。在措施中查询IC卡插座中是否有IC卡,当有IC卡时,将A点所连的单片机引脚配置为低电平,从而为IC卡提供电源;当没有IC卡或对IC卡的操纵竣事时,将A点连的单片机引脚配置为高电平,从而不给IC卡提供电源。

    IC卡的上电和下电措施如下。

    IC卡上电子措施 IC卡下电子措施

    POWERON POWEROOF

    BSF STATUS,RP0 BSFSTATUS,RP0

    BCF TRISE,0 BCF TRISE,0

    BCF RTISE,1 BCF TRISE,1

    BCF STATUS,RP0 BCF STATUS,RP0

    BCF PORTE,0 BSF PORTE,0

    BCF PORTE,1 BSF PORTE,1

    CALL DLYTIM CALL DLYTIM

    RETURN RETURN

    在本计划中,单片机与IC卡通讯的主措施流程图如图4所示。

    5 与PC机的通讯

    在本计划中,有PIC单片机与PC机串行通讯的成果。因为本计划所用的单片机PIC16F877有USART方法,该方法可将C口的RC5和RC7配置成异步串行通讯模式,因而在本计划中,与PC机的通讯模块电路就较量简朴。将单片机C口的RC6和RC7配置为异步串行通讯模式,颠末MAX232A芯片举办电平转换后,将TTL电平转换为RS232电平,再与DB9接口相连,即可实现通讯。在PC机端,可以用VC等编程器材按照通讯协议编写软件来节制对IC卡的读写操纵。

    6 结论

    颠末调试,本计划可以或许在离开在线仿真器的环境下,上电后独立的运行措施,并能在PC机软件的节制下,实现对IC卡中恣意位置的读写,个中读写的起始地点、读写数据的个数以及数据内容可以在PC机端输入或选择。

    本计划已在现实应用中测试过,具有适用代价。因为本计划中所行使的PIC单片机的措施存储器较大(8KB),因而可以编写较大的措施,实现多合一该卡器并由PC机节制读写哪种芯片的IC卡。其它,因为本计划所行使单片机的措施存储器是Flash存储器,因而可以利便地实现措施的下载和进级。

    展开全文
  • IC卡cuid写卡软件

    2018-04-03 13:44:09
    解决一些写卡软件 无法写cuid卡问题 ACR122U NFC 非接触式智能卡读写可用
  • IC卡读写仿真

    2018-02-12 17:20:02
    基于单片机的IC卡读写仿真,包括仿真文件电路以及分部编程。
  • IC卡读写软件

    热门讨论 2015-10-22 00:16:00
    IC卡读写软件DEMO,支持ISO14443A、ISO14443B、ISO15693协议, ISO14443A:NTAG203、NTAG210、NTAG212、NTAG213、NTAG215、NTAG216, Ultralight、Ultralight C,MIFARE Classic 1K/4K, Mifare DESFire, MIFARE ProX...
  • 非接触式IC卡读写设备,常用的MIFARE S1 50读写卡设备,驱动界面形象,非常好用
  • 本文对AT24系列存贮器和AT89系列单片机的特征及总线状态作为介绍,并以AT24C01与AT89C2051为例详细描述了通用存贮器IC卡的工作原理及单片机对其进行读写操作的基本电路连接和软件编程方法。
  • IC卡读写

    千次阅读 2017-12-16 15:20:13
    IC卡物理属性 1、IC卡分为32和64扇区,每一个扇区4个块号,第一个扇区0,第一个块号为物理卡号,此扇区只读。每个扇区的第三个块号为密码块,密码分为两种0A和0B。 2、每个块号可存储16个字节,例如16个英文或数字...

    IC卡物理属性

    1、IC卡分为32和64扇区,每一个扇区4个块号,第一个扇区0,第一个块号为物理卡号,此扇区只读。每个扇区的第三个块号为密码块,密码分为两种0A和0B。

    2、每个块号可存储16个字节,例如16个英文或数字。1个英文占一个字节,一个汉字在utf-8下占用3个字节。

    IC读卡器

    读卡器分为多种每种读卡器协议由硬件自己定义,主要有串口通讯和网口通讯(tcp/udp为主要模式),网口可以实现485通讯。

    展开全文
  • 明华IC读卡c# 源码Demo,串口连接、读卡,读取卡片序列号,蜂鸣,验证扇区密钥,读取数据,数据,修改扇区密码
  • IC卡读写源码VB

    2014-11-07 17:08:57
    一个读卡、一个写卡、一个蜂鸣响声的函数,就能轻松搞定IC卡读、写操作。即使是从未接触过一卡通开发的软件开发人员,写起程序来也毫不困难,一点都不浪费开发时间。
  • 磁卡、IC卡读写程序

    2011-05-31 21:22:00
    读写基于串行口,集磁卡、IC卡、SAM卡读写功能于一体,适用于银行、邮电、证券、海关、公安等行业
  • 万能批量写卡器

    2013-01-06 13:01:10
    万能 写卡器 一卡多号 批量写卡
  • IC卡写器的密码识别,不错的资料,有兴趣可以看看
  • nfc ic卡写卡软件

    热门讨论 2012-12-24 19:24:33
    NFCGUI是一款图形化NFC协议安全工具,主要是针对Mifare进行安全检测,工具基于libnfc开发完成.
  • 智能卡(Smart Card)有接触与非接触卡片,内嵌有微芯片的塑料卡的通称。有包含RFID芯片的,也有加上热敏膜技术的,实现可视功能的,卡片具有储存信息的功能,能实现智能功能作用。... 智能卡是IC卡(集成电路卡
  • 本文详细介绍了一种基于单片机直接读写的IC卡读卡设计的思路和方法,并给出了相应的程序流程和程序实例
  • UPIDR-03隔爆型IC卡读卡(读写型)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,048
精华内容 4,419
关键字:

如何用写卡器写ic卡