当前位置:   article > 正文

RC522 读卡器和写卡器 读写测试程序----基于cc2530开发板_rc522读写程序

rc522读写程序
RC522 写卡器操作步骤:1)寻卡,2)防冲突;3)选卡;4)授权;5)写操作;6)读操作;具体步骤见源码,红色的部分是我增加的代码,其它的都是开发板自带的代码;
  1. /****************************************************************************
  2. * 文 件 名: main.c
  3. * 描 述: 读写RFID
  4. ****************************************************************************/
  5. #include <ioCC2530.h>
  6. #include <string.h>
  7. #include "LCD.h"
  8. #include "mfrc522.h"
  9. typedef unsigned char uchar;
  10. typedef unsigned char uint8;
  11. typedef unsigned int uint;
  12. typedef unsigned long ulong;
  13. #define ON 0
  14. #define OFF 1
  15. #define LED1 P1_0 //定义P1.0口为LED1控制端
  16. #define LED2 P1_1 //定义P1.1口为LED2控制端
  17. #define LED3 P1_4 //定义P1.4口为LED3控制端
  18. #define BUZZER_PIN P0_7 //蜂鸣器控制脚
  19. #define KEY1 0x01
  20. #define KEY2 0x02
  21. //M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
  22. //4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
  23. unsigned char data2[4] = {0x12,0,0,0};
  24. unsigned char DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  25. unsigned char g_ucTempbuf[20];
  26. unsigned char MLastSelectedSnr[4];
  27. unsigned char RevBuffer[30];
  28. unsigned char SerBuffer[20];
  29. unsigned char CmdValid;
  30. unsigned char waitCommData=1;
  31. int data_len=0;
  32. int data_index=0;
  33. /****************************************************************************
  34. * 名 称: InitLed()
  35. * 功 能: 设置LED灯相应的IO口
  36. * 入口参数: 无
  37. * 出口参数: 无
  38. ****************************************************************************/
  39. void InitLed(void)
  40. {
  41. P1DIR |= 0x13; //P1.0、P1.1、p1.4定义为输出
  42. LED1 = 1; //默认LED灯为熄灭状态
  43. LED2 = 1;
  44. LED3 = 1;
  45. P0_7=1;
  46. }
  47. void InitUart0(void)
  48. {
  49. PERCFG &= ~ 0x01; //外设控制寄存器 USART 0的IO位置:0为P0口位置1
  50. P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能)
  51. P2DIR &= ~0xC0; //P0优先作为UART0
  52. U0CSR |= 0x80; //设置为UART方式
  53. U0GCR |= 11;
  54. U0BAUD |= 216; //波特率设为115200
  55. UTX0IF = 0; //UART0 TX中断标志初始置位0
  56. U0CSR |= 0x40; //允许接收
  57. IEN0 |= 0x84; //开总中断允许接收中断
  58. }
  59. /****************************************************************************
  60. * 名 称: UART0_ISR(void) 串口中断处理函数
  61. * 描 述: 当串口0产生接收中断,将收到的数据保存在RxBuf中
  62. ****************************************************************************/
  63. #pragma vector = URX0_VECTOR
  64. __interrupt void UART0_ISR(void)
  65. {
  66. unsigned char bbb=U0DBUF;
  67. URX0IF=0;
  68. if(waitCommData>0)
  69. {
  70. waitCommData=0;
  71. data_len=U0DBUF;
  72. data_index=0;
  73. memset(RevBuffer, 0, sizeof(RevBuffer));
  74. }
  75. else
  76. {
  77. RevBuffer[data_index]=U0DBUF;
  78. data_index++;
  79. if(data_len==data_index)
  80. {
  81. U0CSR &= ~0x40; //禁止接收
  82. CmdValid=1;
  83. waitCommData=1;
  84. U0CSR |= 0x40;
  85. }
  86. }
  87. }
  88. void Uart0SendString(char *Data, int len)
  89. {
  90. uint i;
  91. for(i=0; i<len; i++)
  92. {
  93. U0DBUF = *Data++;
  94. while(UTX0IF == 0);
  95. UTX0IF = 0;
  96. }
  97. }
  98. void InitClockTo32M(void)
  99. {
  100. CLKCONCMD &= ~0x40; //设置系统时钟源为 32MHZ晶振
  101. while(CLKCONSTA & 0x40); //等待晶振稳定
  102. CLKCONCMD &= ~0x47; //设置系统主时钟频率为 32MHZ
  103. }
  104. void iccardcode()
  105. {
  106. unsigned char cmd;
  107. unsigned char status;
  108. cmd = RevBuffer[0];
  109. switch(cmd)
  110. {
  111. case 1: // Halt the card //终止卡的操作
  112. status= PcdHalt();;
  113. RevBuffer[0]=1;
  114. RevBuffer[1]=status;
  115. break;
  116. case 2: // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
  117. // 寻卡,防冲突,选择卡 返回卡类型(2 bytes)+ 卡系列号(4 bytes)
  118. status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
  119. if(status!=0)
  120. {
  121. status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
  122. if(status!=0)
  123. {
  124. RevBuffer[0]=1;
  125. RevBuffer[1]=status;
  126. break;
  127. }
  128. }
  129. RevBuffer[0]=3;
  130. RevBuffer[1]=status;
  131. break;
  132. case 3: // 防冲突 读卡的系列号 MLastSelectedSnr
  133. status = PcdAnticoll(&RevBuffer[2]);
  134. if(status!=0)
  135. {
  136. RevBuffer[0]=1;
  137. RevBuffer[1]=status;
  138. break;
  139. }
  140. memcpy(MLastSelectedSnr,&RevBuffer[2],4);
  141. RevBuffer[0]=5;
  142. RevBuffer[1]=status;
  143. break;
  144. case 4: // 选择卡 Select Card
  145. status=PcdSelect(MLastSelectedSnr);
  146. if(status!=MI_OK)
  147. {
  148. RevBuffer[0]=1;
  149. RevBuffer[1]=status;
  150. break;
  151. }
  152. RevBuffer[0]=3;
  153. RevBuffer[1]=status;
  154. break;
  155. case 5: // Key loading into the MF RC500's EEPROM
  156. status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校验卡密码
  157. RevBuffer[0]=1;
  158. RevBuffer[1]=status;
  159. break;
  160. case 6:
  161. RevBuffer[0]=1;
  162. RevBuffer[1]=status;
  163. break;
  164. case 7:
  165. RevBuffer[0]=1;
  166. RevBuffer[1]=status;
  167. break;
  168. case 8: // Read the mifare card
  169. // 读卡
  170. status=PcdRead(RevBuffer[1],&RevBuffer[2]);
  171. if(status==0)
  172. {RevBuffer[0]=17;}
  173. else
  174. {RevBuffer[0]=1;}
  175. RevBuffer[1]=status;
  176. break;
  177. case 9: // Write the mifare card
  178. // 写卡 下载密码
  179. status=PcdWrite(RevBuffer[1],&RevBuffer[2]);
  180. RevBuffer[0]=1;
  181. RevBuffer[1]=status;
  182. break;
  183. case 10:
  184. PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
  185. RevBuffer[0]=1;
  186. RevBuffer[1]=status;
  187. break;
  188. case 12: // 参数设置
  189. PcdBakValue(RevBuffer[1], RevBuffer[2]);
  190. RevBuffer[0]=1; //contact
  191. RevBuffer[1]=0;
  192. break;
  193. }
  194. }
  195. /
  196. //系统初始化
  197. /
  198. void InitializeSystem()
  199. {
  200. //P0_4、P0_5、P0_6、p1_0和p1_1用于控制RFID
  201. //P0_7用于控制蜂鸣器
  202. P0DIR |= 0xF0; //P0_4、P0_5、P0_6、P0_7定义为输出
  203. P1DIR |= 0x03;//p1_0、p1_1输出
  204. P0 |= 0xF0; //P0_4、P0_5、P0_6、P0_7输出1
  205. P1 |= 0x03; //P1_0输出高电平
  206. CmdValid=0;
  207. PcdReset();
  208. PcdAntennaOff();
  209. PcdAntennaOn();
  210. M500PcdConfigISOType( 'A' );
  211. delay_10ms(10);
  212. LED2=OFF;
  213. delay_10ms(10);
  214. }
  215. //BCD码转成ASC码
  216. char NumberToLetter(unsigned char number)
  217. {
  218. char buff[]="0123456789ABCDEF";
  219. if(number>15) return 0;
  220. return buff[number];
  221. }
  222. //蜂鸣器响两声
  223. void buzzerOn()
  224. {
  225. BUZZER_PIN=0;
  226. DelayMS(200);
  227. BUZZER_PIN=1;
  228. DelayMS(50);
  229. BUZZER_PIN=0;
  230. DelayMS(200);
  231. BUZZER_PIN=1;
  232. }
  233. void main(void)
  234. {
  235. uint8 SendBuf[10]={0};
  236. uint8 error=0;
  237. InitLed();
  238. InitializeSystem();
  239. InitClockTo32M();
  240. InitUart0();
  241. LCD_Init();
  242. LCD_CLS();
  243. LCD_P8x16Str(20, 0, "SZ_YY RFID");
  244. //周期地在寻卡
  245. while (1)
  246. {
  247. //寻卡命令
  248. RevBuffer[0]=0x02;
  249. RevBuffer[1]=0x26;
  250. // 寻卡
  251. iccardcode();
  252. error=0;
  253. if(RevBuffer[1]==0)//寻卡成功
  254. {
  255. //读卡命令
  256. SendBuf[0]=RevBuffer[2]; //data
  257. SendBuf[1]=RevBuffer[3]; //data
  258. //找到卡
  259. //读卡
  260. RevBuffer[0]=0x03;
  261. iccardcode();
  262. if(RevBuffer[1]==0)
  263. {
  264. //读卡成功
  265. //记录卡ID
  266. SendBuf[2]=RevBuffer[2]; //data
  267. SendBuf[3]=RevBuffer[3]; //data
  268. SendBuf[4]=RevBuffer[4]; //data
  269. SendBuf[5]=RevBuffer[5]; //data
  270. }
  271. else
  272. {
  273. error=1;
  274. }
  275. }
  276. else
  277. {
  278. error=1;
  279. }
  280. if(error==0)
  281. {
  282. char card_buff[20]={0};
  283. //各种卡的含义
  284. // 0x4400 = Mifare_UltraLight
  285. // 0x0400 = Mifare_One(S50)
  286. // 0x0200 = Mifare_One(S70)
  287. // 0x0800 = Mifare_Pro(X)
  288. // 0x4403 = Mifare_DESFire
  289. if(SendBuf[0]==0x44 && SendBuf[1]==0x00)
  290. {
  291. LCD_P8x16Str(0, 2, "Mifare_UltraLight");
  292. Uart0SendString((uint8 *)"Mifare_UltraLight", strlen("Mifare_UltraLight"));
  293. }
  294. else if(SendBuf[0]==0x04 && SendBuf[1]==0x00)
  295. {
  296. LCD_P8x16Str(0, 2, "Mifare_One(S50)");
  297. Uart0SendString((uint8 *)"Mifare_One(S50)", strlen("Mifare_One(S50)"));
  298. }
  299. else if(SendBuf[0]==0x02 && SendBuf[1]==0x00)
  300. {
  301. LCD_P8x16Str(0, 2, "Mifare_One(S70)");
  302. Uart0SendString((uint8 *)"Mifare_One(S70)", strlen("Mifare_One(S70)"));
  303. }
  304. else if(SendBuf[0]==0x08 && SendBuf[1]==0x00)
  305. {
  306. LCD_P8x16Str(0, 2, "Mifare_One(X)");
  307. Uart0SendString((uint8 *)"Mifare_One(X)", strlen("Mifare_One(X)"));
  308. }
  309. else if(SendBuf[0]==0x44 && SendBuf[1]==0x03)
  310. {
  311. LCD_P8x16Str(0, 2, "Mifare_DESFire");
  312. Uart0SendString((uint8 *)"Mifare_DESFire", strlen("Mifare_DESFire"));
  313. }
  314. else
  315. {
  316. error=1;
  317. LCD_P8x16Str(0, 2, "");
  318. LCD_P8x16Str(0, 4, "");
  319. Uart0SendString((uint8 *)"find error", strlen("find error"));
  320. }
  321. Uart0SendString((uint8 *)"\r\n", 2);
  322. /*
  323. card_buff[0]='I';
  324. card_buff[1]='D';
  325. card_buff[2]=':';
  326. //BCD转ASC码
  327. //ID轮换
  328. for(int i=0; i<4; i++)
  329. {
  330. unsigned char temp= SendBuf[2+i];
  331. card_buff[3+i*2]=NumberToLetter((temp>>4)&0x0f);
  332. card_buff[3+i*2+1]=NumberToLetter(temp&0x0f);
  333. }
  334. //LCD显示ID
  335. LCD_P8x16Str(0, 4,card_buff);
  336. //串口输出ID
  337. Uart0SendString(card_buff, strlen(card_buff));
  338. Uart0SendString((uint8 *)"\r\n", 2);
  339. //蜂鸣器提示
  340. buzzerOn();
  341. */
  342. <span style="color:#ff0000;"> //选择卡
  343. RevBuffer[0]=0x04;
  344. iccardcode();
  345. //授权
  346. RevBuffer[0]=0x05;
  347. RevBuffer[1]=0x60;
  348. RevBuffer[3]=0x06;
  349. iccardcode();
  350. if(RevBuffer[1]==0)
  351. {
  352. //授权成功,进行写操作
  353. //mifire卡写卡
  354. RevBuffer[0]=0x09;
  355. RevBuffer[1]=0x06;
  356. for(int j=0;j<16;j++)
  357. {
  358. RevBuffer[j+2]=j;
  359. }
  360. iccardcode();
  361. //mifire 卡读卡;
  362. RevBuffer[0]=0x08;
  363. RevBuffer[1]=0x06;
  364. //清空缓存区
  365. for(int j=0;j<16;j++)
  366. {
  367. RevBuffer[j+2]=0;
  368. }
  369. iccardcode();
  370. //LCD显示读到的数据
  371. for(int i=0; i<8; i++)
  372. {
  373. unsigned char temp= RevBuffer[2+i];
  374. card_buff[i*2]=NumberToLetter((temp>>4)&0x0f);
  375. card_buff[i*2+1]=NumberToLetter(temp&0x0f);
  376. }
  377. LCD_P8x16Str(0, 4,card_buff);
  378. Uart0SendString((uint8 *)"\r\n", 2);
  379. </span> }
  380. }
  381. else
  382. {
  383. //寻不到卡
  384. LCD_P8x16Str(0, 2," ");
  385. LCD_P8x16Str(0, 4," ");
  386. }
  387. DelayMS(500);
  388. }
  389. }


 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/64040
推荐阅读
相关标签
  

闽ICP备14008679号