图3-9 电机驱动模块原理图
3.2.6 存储模块
为了实现对卡片权限的设置,就需要用一个芯片存储卡片的信息,在本次设计中使用24C02存储芯片,AT24C02是2K位CMOS E2PROM串行电可擦除只读存储器,内部组织为256个字节,每个字节8位。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。
管脚配置:24C02与单片机的接口非常简单,如图3-10:
图3-10 24C02管脚图
管脚描述:
SCL 管脚:实现串行时钟的功能,它是一个输入管脚,与单片机的P21号管脚相连。SCL串行时钟输入管脚实现发送和接收器件产生的数据的时钟的功能。
SDA 串行数据/地址:AT24C02 双向串行数据/地址管脚用于器件所有数据的发送或接收,SDA 是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行
15
线或(wire-OR)。
A0、A1、A2 器件地址输入端:这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。当使用AT24C02 时最大可级联8个器件。如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0、A1、A2 )可悬空或连接到Vss,如果只有一个AT24C01被总线寻址这三个地址输入脚(A0、A1、A2 )必须连接到Vss。
如图3-11 为存储模块原理图:
图3-11 存储模块原理图
16
4 系统软件设计
4.1 软件设计思路
软件设计上,根据功能分了几个模块编程,包括主程序模块、读卡模块、显示模块,存储模块、延时子程序模块和中断子程序模块等。系统工作时当卡片靠近读卡模块时指示灯亮起,屏幕显示卡片信息,然后程序判断权限,若合法,开锁模块程序点亮指示灯,蜂鸣器发出警报,电机转动模拟门锁打开。若非合法卡,是否赋予权限,如果赋予权限电机转动,指示灯亮起,蜂鸣器发出警报,如果不赋予则返回。
4.2 射频模块软件工作流程
如图4-1射频模块子程序流程图:
图4-1 射频软件模块工作流程图
17
RC522的接收和发送数据的流程:
相对于飞利浦公司生产的RC500、RC530等基站芯片,RC522系统内部结构更加简洁明了,由于删除了RC522芯片内的E2PROM,芯片的指令集也被大大减少了。还有RC522简化了载波调制电路,发送电路和解调和解码电路的控制,同时删除了校准接收电路I时钟、Q时钟以及校准发送与接收时钟相位等繁琐的操作,极大的提高了RC522的工作效率。 工作过程:
模块与单片机接口如下:
#define RF_LPCTL BIT3 P2.3 射频卡休眠控制---RST #define RF_SS BIT7 p2.7 射频卡从机选择(SS)---SDA #define RF_SCLK BIT6 p2.6 射频卡数据时钟输出(SCLK) #define RF_DATA_OUT BIT5 p2.5 射频卡数据输出(MOSI) #define RF_DATA_IN BIT1 p2.1 射频模块输入(MISO)
需要完成4个步骤:寻卡→防冲撞处理→选卡→读卡/写卡,就能完成对模块内部的数据块进行读写。
第一步:寻卡
status2=PcdRequest(0x52,Temp);//寻卡 参数Temp为返回的卡类型 if(status2== MI_OK) {
tochar(Temp[0]);
tochar(Temp[1]);//输出卡类型 }
比如,当Temp[0]=04,Temp[1]=00时,卡类型为S50。
第二步:防冲撞处理
status2= PcdAnticoll(UID); //防冲撞处理,输出卡片序列号,4字节 if(status2==MI_OK) {
PutString0(\ tochar(UID[0]);
18
tochar(UID[1]); tochar(UID[2]);
tochar(UID[3]); //输出卡片序列号 }
第三步:选卡。
status2= PcdSelect(UID); //选择卡片,输入卡片序列号,4字节
第四步:在读写卡之前需要先进行认证。
status2= PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID);
其中四个参数分别代表:验证A密钥+块地址+扇区密码+卡序列号。然后进行写操作:
status2=PcdWrite(1,writeData);//写数据,将数组writeData中的数写入到卡
中,其中第一个参数1代表写入的地址为块1,或者进行读卡操作:
status2 = PcdRead(1, str);//读卡
其中第一个参数1代表读的地址为块1,读卡后得到的数据存放于数组str中。
4.3 子程序分析
4.3.1 RC522读卡程序
定义端口:
sbit MF522_RST = P1^7; //复位信号 sbit MF522_SO = P1^6;//SPI 接口主入从出 sbit MF522_SI = P1^5;//SPI 接口主出从入 sbit MF522_SCK = P1^4; //时钟接口 sbit MF522_NSS = P1^3; //应该是SDA接口
寻卡函数:
参数说明: req_code[IN]:寻卡方式
0x52 = 寻感应区内所有符合14443A标准的卡 0x26 = 寻未进入休眠状态的卡 pTagType[OUT]:卡片类型代码
0x4400 = Mifare_UltraLight
19