使用STC89C52单片机,RC522模块采用模拟SPI通信,OLED12864采用模拟IIC通信,实现对M1卡的读写以及显示,不需要原理图,程序里有引脚定义。
单片机源程序如下:
- #include <stc8.h>
- #include <main.h>
- #include <stdio.h>
- #include "mfrc522.h"
- #include "oled12864.h"
- #include "codetab.h"
- #include "intrins.h"
- unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
- unsigned char idata TagType[2];
- unsigned char idata SelectedSnr[4];
- /////////////////////////////////////////////////////////////////////
- //系统初始化
- /////////////////////////////////////////////////////////////////////
- void InitializeSystem()
- {
- P0 = 0xFF; P1 = 0xFF; P3 = 0xFF; P5 = 0xFF;
-
- PcdReset(); //RC522复位
- PcdAntennaOff(); //关闭RC522天线
- PcdAntennaOn(); //打开RC522天线
- M500PcdConfigISOType( 'A' ); //设置RC522工作方式
- }
- void main( )
- {
- char idata status,word_number;
- unsigned char idata snr, buf[16];
- InitializeSystem( ); //系统初始化
-
- OLED_Init(); //OLED初始化
- OLED_Fill(0xff); //全屏亮
- delayms(100);
- OLED_Fill(0x00); //全屏灭
- delayms(100);
-
- while (1)
- {
- status= PcdRequest(REQ_ALL,TagType); //RC522开始寻卡
- if(!status)
- {
- status = PcdAnticoll(SelectedSnr); //防冲撞
- if(!status)
- {
- status=PcdSelect(SelectedSnr); //选择卡片
- if(!status)
- {
- snr = 0; //选择卡片扇区0
- status = PcdAuthState(KEYA, (snr*4+3), DefaultKey, SelectedSnr); //校验0扇区密码,密码位于每一扇区第3块
- {
- if(!status)
- {
- status = PcdRead((snr*4+1), buf); //读卡,读取0扇区1块数据到buf[16]
- for(word_number=0; word_number<3; word_number++)
- {
- OLED_P16x16Ch(40+word_number*16,0,word_number); //通过16*16点阵来显示汉字 -- word_number表示字表数组的位置
- }
- OLED_P8x16Str(50,3,buf); //将卡号在OLED上显示出来
- delayms(800);
- OLED_CLS(); //清屏
-
- if(!status)
- {
- WaitCardOff(); //等待IC卡离开
- }
- }
- }
- }
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
写卡.zip
(111.22 KB, 下载次数: 111)
读卡 OLED12864.zip
(133.88 KB, 下载次数: 106)
读卡.zip
(89.8 KB, 下载次数: 92)
|