毕设-基于STM32/C51刷卡的门禁系统(基础版)

简介

厂房弄完了,开始学习关于刷卡的门禁系统。这东西说简单也简单,说难搞也有点难搞啊!

器件选型

一般的常用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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘉鑫的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值