历史上的今天
今天是:2024年11月06日(星期三)
2019年11月06日 | 单片机读写RC522射频卡上位机调试软件及参考例程
2019-11-06 来源:51hei
下位机(单片机)电路原理图:
上位机delphi源码与说明资料:
IC读写器使用说明
一、读写器连接
1.1 把通讯线“DB9”端插到PC 机的串口1/2 上
1.2 把通讯线2510端插到读写器的插座,使读写器和PC 机的串口良好连接
1.2 把电源线的“圆柱”端插到读写器的电源座子上
1.3读写器上电以后可以听到一声风鸣器的响声,如果没有听到风鸣器声,表明读写器没有正常上电.
二、启动Demo 软件

2.1 双击启动测试软件
2.2 如果串口良好连接的话可以听到一声风鸣器的响声,如果启动测试软件以后并没有听到风鸣器声表明串口通讯没有连接好,请检查串口连接线是否连接正确
三、M1卡片读写测试
3.1 把一张Mifare One 卡片放在天线区域范围内
3.2 进入功能选项“低级操作”里面点击“寻卡”,如果出现“寻卡成功!”表明寻卡正常,如果出现“执行失败!”表明出现异常,请检查卡片是否在寻卡范围内,如果确认卡片没有问题,那读写器有异常
3.3 点击“防冲突”,如果出现“执行成功”表明防冲突正常,如果出现“执行失败”表明读写器出现异常或者卡片没有在天线区域范围内
3.4 点击“选择”,如果出现“执行成功”表明选择正常,如果出现“执行失败”表明读写器出现异常或者卡片没有在天线区域范
围内
3.5 进入功能选项“密码下载”里面下载卡片密码,比如需要测试卡片扇区1 数据的读写,那么就在扇区1后面填上密码A/B(注:卡片的初始密码A/B 均为全‘F’),然后选择“A 组密码”或者“B 组密码”,最后点击“下载”,如果出现“密码下载成
功”表明密码下载成功,如果出现异常请按照错误提示更改后再下载一次,直至“下载成功”为止
3.6 进入功能选项“数据读写”里面,“请选择扇区号”下面的可拉选项里面选择第5步下载密码的扇区号(比如扇区1),然后点击“读出”,如果提示“第*扇区数据读出成功”表明读数据正确。如果出现“第*扇区数据读出失败”表明密码校验出错或者出现其他异常,请返回第5 步重新下载密码
3.7 如果读数据正确,在块0、块1、块2 后面修改数据,比如改成
“块0:12345678901234567890123456789012”
“块1:23456789012345678901234567890123”
“块2:34567890123456789012345678901234”
然后点击“写入”,如果出现“第*扇区数据写入成功”表明写入数据正确。如果出现“第*扇区写入失败”表明密码校验出错或者出现其他异常,请返回第5 步重新下载密码
3.8 再次点击“读出”键,然后点击“读出”,如果提示“第*扇区数据读出成功”表明读数据正确,再对比块0、块1、块2 是否和第7 步写入的数据一样,如果数据一样,证明写入成功了。如果出现“第*扇区数据读出失败”表明密码校验出错或者出现其他异常,请返回第5 步重新下载密码。
四、Mifare One 卡片块值测试
4.1 进入功能选项“块值操作”里面,在“扇区号”下面的可拉选项里面选择第3.5 步下载密码的扇区号(比如扇区1),在“块号”下面的可拉选项里面选择你想测试的块号(比如第1 块)
4.2 在“操作值”后面填上你所希望的初始值(比如“11111111”),然后点击“初始化”,如果出现“数据初始化成功”表明操作成功。如果出现“数据初始化失败”表明操作失败,请检查密码是否正确,返回第3.1 步重新操作一次。

4.3 点击“读出”,如果在“当前值”后面出现是你原来写进去的初始值,证明操作正确,如果“数据读出失败”表明块值操作有异常,请重新初始化。
4.4 在“操作值:”后面填上你所希望的操作值(比如“22222222”),然后点击“加值”,如果出现“数值加操作成功”,表明操作成功。如果出现其他提示表明操作失败
4.4 点击“读出”,如果在“当前值:”后面出现是你初始值加上加值(11111111+22222222=33333333)表明操作正确,如果是其他的值表明失败
4.5 在“操作值:”后面填上你所希望的操作值(比如“11111111”),然后点击“减值”,如果出现“数值减操作成功”,表明操作成功。如果出现其他提示表明操作失败
4.6 点击“读出”,如果在“当前值:”后面出现是你当前值减去操作值(33333333-11111111=22222222),表明操作正确,如果是其他值表明失败
五、修改密码和控制位
5.1 进入功能选项“修改密码”里面,在“扇区号”下面的可拉选项里面选择第3.5步下载密码的扇区号(比如扇区1)
5.2 在“密码A”和“密码B”后面分别写入你想修改的密码A 和密码B
5.3 卡片控制位修改之前请详细阅读卡片资料,因为控制位修改不正确,就会导致卡片
不能再使用,请务必小心使用
5.4 在控制位后面填上该扇区的控制位
5.3 点击“修改密码”,如果出现“修改密码成功”,表示操作正确,如果出现出错提示,
请按照出错提示做相应的处理。(注:密码修改后请务必记住,密码遗忘卡片就不
能再次是使用了)
六、参数设置
6.1 进入功能选项“参数设置”里面,可以设置串口通讯参数:串口号、波特率、校验位、数据位、停止位等等,设置玩了以后点击“修改串口”,如果出现“串口参数设置成功”,表明串口设置成功,如果出现异常,请按照提示做出改动。
6.2 设置完毕以后可以点击“测试读卡器”,如果出现“读卡器连接成功”,并且听到读卡器的风鸣器响声,证明串口设置正确,如果出现“读卡器连接失败”,表明串口设置有问题,请重新设置。
6.3 读写器默认参数:Com1、9600bps、N、8、1
七、调试信息
7.1 进入功能选项“调试信息”里面,在“串口信息发送与接受”处可以看到PC 机和读卡器之间通讯的详细过程,对调试非常有帮助
单片机(下位机)源程序如下:
#include #include "reg52.h" #include "main.h" #include "mfrc522.h" #include #define MAXRLEN 18 ///////////////////////////////////////////////////////////////////// //功 能:寻卡 //参数说明: req_code[IN]:寻卡方式 // 0x52 = 寻感应区内所有符合14443A标准的卡 // 0x26 = 寻未进入休眠状态的卡 // pTagType[OUT]:卡片类型代码 // 0x4400 = Mifare_UltraLight // 0x0400 = Mifare_One(S50) // 0x0200 = Mifare_One(S70) // 0x0800 = Mifare_Pro(X) // 0x4403 = Mifare_DESFire //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdRequest(unsigned char req_code,unsigned char *pTagType) { char status; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; // unsigned char xTest ; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x07); // xTest = ReadRawRC(BitFramingReg); // if(xTest == 0x07 ) // { LED_GREEN =0 ;} // else {LED_GREEN =1 ;while(1){}} SetBitMask(TxControlReg,0x03); ucComMF522Buf[0] = req_code; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen); // if(status == MI_OK ) // { LED_GREEN =0 ;} // else {LED_GREEN =1 ;} if ((status == MI_OK) && (unLen == 0x10)) { *pTagType = ucComMF522Buf[0]; *(pTagType+1) = ucComMF522Buf[1]; } else { status = MI_ERR; } return status; } ///////////////////////////////////////////////////////////////////// //功 能:防冲撞 //参数说明: pSnr[OUT]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdAnticoll(unsigned char *pSnr) { char status; unsigned char i,snr_check=0; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x00); ClearBitMask(CollReg,0x80); ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x20; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen); if (status == MI_OK) { for (i=0; i<4; i++) { *(pSnr+i) = ucComMF522Buf[i]; snr_check ^= ucComMF522Buf[i]; } if (snr_check != ucComMF522Buf[i]) { status = MI_ERR; } } SetBitMask(CollReg,0x80); return status; } ///////////////////////////////////////////////////////////////////// //功 能:选定卡片 //参数说明: pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdSelect(unsigned char *pSnr) { char status; unsigned char i; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x70; ucComMF522Buf[6] = 0; for (i=0; i<4; i++) { ucComMF522Buf[i+2] = *(pSnr+i); ucComMF522Buf[6] ^= *(pSnr+i); } CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]); ClearBitMask(Status2Reg,0x08); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen); if ((status == MI_OK) && (unLen == 0x18)) { status = MI_OK; } else { status = MI_ERR; } return status; } ///////////////////////////////////////////////////////////////////// //功 能:验证卡片密码 //参数说明: auth_mode[IN]: 密码验证模式 // 0x60 = 验证A密钥 // 0x61 = 验证B密钥 // addr[IN]:块地址 // pKey[IN]:密码 // pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr) { char status; unsigned int unLen; unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = auth_mode; ucComMF522Buf[1] = addr; for (i=0; i<6; i++) { ucComMF522Buf[i+2] = *(pKey+i); } for (i=0; i<6; i++) { ucComMF522Buf[i+8] = *(pSnr+i); } // memcpy(&ucComMF522Buf[2], pKey, 6); // memcpy(&ucComMF522Buf[8], pSnr, 4); status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen); if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))) { status = MI_ERR; } return status; } ///////////////////////////////////////////////////////////////////// //功 能:读取M1卡一块数据 //参数说明: addr[IN]:块地址 // pData[OUT]:读出的数据,16字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdRead(unsigned char addr,unsigned char *pData) { char status; unsigned int unLen; unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_READ; ucComMF522Buf[1] = addr; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if ((status == MI_OK) && (unLen == 0x90)) // { memcpy(pData, ucComMF522Buf, 16); } { for (i=0; i<16; i++) { *(pData+i) = ucComMF522Buf[i]; } } else { status = MI_ERR; } return status; } /////////////////////////////////////////////////////////////////////
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑 请教各位高手,什么型号的双栅管可以代替3SK318(能直接替换最好) 谢谢! … 查看全部问答> |
|
2440 读 温度芯片,总是无法触发中断,请教有什么方法呀? BSP包里通过应用层调用IIC文件夹不能正常工作,只好转入到bootloader层去做温度检测了,可是无论如何也不能触发中断,有经验的请指教,先谢谢了。… 查看全部问答> |
|
只要电路原理图和c源程序。小弟在这拜谢了! 或者谁能帮我改下这电压表的程序成电流表的程序: #include unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7, &nbs ...… 查看全部问答> |
|
刚做的东西给几个小MM去贴片,把101当103贴上去了,居然USB也可以联机。但操作偶尔有问题,手工复位一般可以解决掉。听小道消息说,101是阉割的103,就像奔腾的cache有瑕疵变成赛扬一样。… 查看全部问答> |
|
使能I/O口子程序,在CCS帮助文件中看到对该子程序 GPIO_Handle GPIO_open( int chaNum, Uint32 flags ); 的解释是: chaNum GPIO channel to open: lags & ...… 查看全部问答> |




