简介
厂房弄完了,开始学习关于刷卡的门禁系统。这东西说简单也简单,说难搞也有点难搞啊!
器件选型
一般的常用RFID模块就是RC522(淘宝店铺MFRC-522 RC522 RFID射频 IC卡感应模块 送S50复旦卡PN532 PN5180代码就在下面的百度云盘里面),可以识别IC卡和S50复旦卡。
线路连接及代码(STM32版本)
其实这东西的驱动,店家都给与了,就是看你能否读懂代码的含义。
电路连接
RC522模块连接:
RST连接PA12
MISO连接PA10
MOSI连接PA8
SCK连接PB14
NSS连接PB12
IRQ悬空
3.3连接3.3V
GND连接GND
USB-TTL连接
RX接PA2
TX接PA3
将IC卡放上去串口调试助手就会显示数据,这就是IC卡的卡号,然后只需要将卡号对比就可以实现开门判断是否开门或者关门。
最终就可以实现只有唯一的卡,可以打开门(开门或者关门这个动作可以使用舵机,不会舵机的的看这里STM32F103系列驱动舵机)。
代码
主函数
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "main.h"
#include "mfrc522.h"
#include <stdlib.h>
#include <string.h>
void GPIO_ini()
{
//引脚初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(MF522_RST_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = MF522_RST_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(MF522_RST_PORT, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(MF522_MISO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = MF522_MISO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(MF522_MISO_PORT, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(MF522_MOSI_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = MF522_MOSI_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(MF522_MOSI_PORT, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(MF522_SCK_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = MF522_SCK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(MF522_SCK_PORT, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(MF522_NSS_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = MF522_NSS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(MF522_NSS_PORT, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(LED_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(LED_PORT, &GPIO_InitStructure);
}
void InitializeSystem()
{
//RC522初始化
LED_OFF;
delay_ms(10);
PcdReset();
PcdAntennaOff();
PcdAntennaOn();
M500PcdConfigISOType( 'A' );
LED_ON;
delay_ms(10);
LED_OFF;
delay_ms(10);
LED_ON;
delay_ms(10);
LED_OFF;
}
int main(void)
{
u16 t;
u16 len;
u16 times=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200); //串口初始化为115200
char data[50];
char mydata[50]={"1771739149"};
char status;
unsigned char snr, buf[16], TagType[2], SelectedSnr[4]={0xFF,0xFF,0xFF,0xFF};
GPIO_ini();
InitializeSystem( );
printf("RUN!!!");
while(1)
{
status= PcdRequest(REQ_ALL,TagType); //寻卡
if(!status)
{
status = PcdAnticoll(SelectedSnr); //防碰撞
if(!status)
{
sprintf(data,"%d%d%d%d",SelectedSnr[0],SelectedSnr[1],SelectedSnr[2],SelectedSnr[3]);//读到的值放入data数组中
printf("%s",data);
if(strcmp(data,mydata)==0){
//添加舵机开门的代码
printf("Open!\r\n");
}else //添加舵机关门的代码
printf("Close!\r\n");
WaitCardOff(); //等待卡离开
}
}
}
}
RC522驱动
这部分代码都是copy的,可以去百度,这边就带一部分代码!
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);
WriteRawRC(BitFramingReg,0x07);
SetBitMask(TxControlReg,0x03);
ucComMF522Buf[0] = req_code;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
if ((status == MI_OK) && (unLen == 0x10))
{
*pTagType = ucComMF522Buf[0];
*(pTagType+1) = ucComMF522Buf[1];
}
else
{ status = MI_ERR; }
return status;
}
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;
}
线路连接及代码(51版本)
电路连接
RC522模块连接
RST连接P1_6
NSS连接P2_4
SCK连接P2_5
MISO连接P2_2
MOSI连接P2_3
USB-TTL连接
略!——————————
代码
主函数
#include "reg52.h"
#include "main.h"
#include "mfrc522.h"
#include <stdlib.h>
#include <string.h>
unsigned char data TagType[2];
unsigned char data SelectedSnr[4]={0xFF,0xFF,0xFF,0xFF};
void InitializeSystem()
{
P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;
LED_GREEN = 1;
delay_10ms(10);
PcdReset();
PcdAntennaOff();
PcdAntennaOn();
LED_GREEN = 0;
delay_10ms(10);
LED_GREEN = 1;
delay_10ms(10);
LED_GREEN = 0;
delay_10ms(10);
LED_GREEN = 1;
}
void main( )
{
char status;
unsigned char snr, buf[16];
InitializeSystem( );
while (1)
{
status= PcdRequest(REQ_ALL,TagType);
if(!status)
{
status = PcdAnticoll(SelectedSnr);
if(!status)
{
sprintf(data,"%d%d%d%d",SelectedSnr[0],SelectedSnr[1],SelectedSnr[2],SelectedSnr[3]);//读到的值放入data数组中
if(strcmp(data,mydata)==0){
//添加舵机开门的代码
OpenDoor();
}else //添加舵机关门的代码
CloseDoor();
WaitCardOff(); //等待卡离开
}
}
LED_GREEN = 1;
}
}
RC522驱动
这部分还是拷贝然后改了改,能看懂绝不动手的本质!
代码直接拷贝吧,不想写了,主要代码和STM32的基本一样。
后续
这只是最简单的门禁系统,后期可以考虑一下如何修改主人的卡号,或者在加入一个上位远程控制开门关门,修改主人的卡号。还可以加入管理员模式,只有在管理员认证后才可以修改白名单。
有问题评论或私信 讨论群985432073
源码地址:
https://gitee.com/heiha_ha/stm32-project-sharing.git