大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
- 最近在某宝上买了一块RC522模块,试玩了下,读写卡正常。想学习使用新的东西时,有必要了解它的工作原理和工作过程,不清楚或者不知道的可以参考相关数据手册和参考文献,在这里为了节省自己的时间,我只对我的51程序做一个小小的笔记~~
想要驱动RC522模块对IC卡(这里用的是M1卡型号是S50)进行读写操作,一定要有以下5个步骤:
一、寻卡
二、防冲突
三、选择卡
四、验证扇区密码(每个扇区都有密匙A和密匙B,验证正确才能对该扇区的某块进行读写)
五、读/写
- 硬件方面与单片机I/O口连好,使用SPI通信的时候NSS就是SDA引脚,IRQ悬空。
- 主程序如下:
#include "reg52.h"
#include "mfrc522.h"
#include "intrins.h"
#include <string.h>
#include "stdio.h"
#define u8 unsigned char
#define u32 unsigned int
#define FOSC 12000000L //System frequency
#define BAUD 2400 //UART baudrate
sbit P11=P1^1;//作为一个辅助LED灯而已
bit CmdValid=0;
u8 status;
u8 pTagType[2];
u8 code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //配带的那张白卡的扇区密码
u8 idata MLastSelectedSnr[4];//这个用来存放卡片的序列号,4个字节
u8 idata RevBuffer[16];
u8 me[16]={1,1,1,4,4,4,5,5,5,10,10,10,3,13,5,15};//想在块一写入
void ANT_INIT();
//定时器只是用来做波特率发生器
//使用定时器/计数器2的时候记得要在REG52.h头文件里添加:sfr T2CON = 0xC8;
//否则会报错
void Timer2Init(void) //100微秒@12.000MHz
{
T2MOD = 0; //初始化模式寄存器
T2CON = 0x34; //Timer2 start run
TL2 = RCAP2L = (65536-(FOSC/32/BAUD)); //Set auto-reload vaule
TH2 = RCAP2H = (65536-(FOSC/32/BAUD)) >> 8;
TR2 = 1; //定时器2开始计时
}
void main()
{
Timer2Init();
P11=1;
SCON = 0x50; //8-bit variable UART
ES = 1; //Enable UART interrupt
EA = 1; //Open master interrupt switch
CmdValid=0;
PcdReset(); //以下三条是天线的初始化,必须
PcdAntennaOff();
PcdAntennaOn();
// delay_10ms(250);
M500PcdConfigISOType( 'A' );//工作模式“A”
while(1)
{
ANT_INIT();
}
}
void ANT_INIT()
{
PcdHalt();
PcdRequest(PICC_REQALL,&pTagType);//寻卡成功
status=PcdAnticoll(&MLastSelectedSnr);//防冲撞成功
PcdSelect(MLastSelectedSnr);
PcdAuthState(0x60,1,DefaultKey,MLastSelectedSnr);
//status=PcdWrite(1,me); //这是写,使用时可以先注释掉下面一行代码
//status=PcdRead(1,RevBuffer);//这是读,使用时可以先注释掉上面一行代码
if(status==0)
SBUF=MLastSelectedSnr[0];//触发串口中断
else TI=0;
}
/*----------------------------
UART interrupt service routine
----------------------------*/
void Uart_Isr() interrupt 4 using 1
{
static unsigned char i=0; //白卡序列号 : BA A5 EF 0A
if(TI==1)
{
TI=0;
for(i=1;i<4;i++)
{
SBUF=MLastSelectedSnr[i];
while(!TI);
TI=0;
}
}
}
另外mfrc522.h和RC522.c可以从资料调用过来自己的工程。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191973.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...