STM32项目分享:智能门禁锁系统

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

1.PCB图

2.PCB板及元器件图

五、程序设计

六、实验效果

七、资料内容

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1Sg4y1X7Ex/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末)

二、项目简介

1.功能详解

基于STM32智能门禁锁系统。

功能如下:

  1. 按键解锁:系统通过4×4矩阵键盘模块输入密码进入主菜单
  2. 门禁刷卡:通过RFID模块刷卡进入主菜单,卡片可以添加或者覆盖删除
  3. 指纹识别:通过AS608指纹识别模块识别指纹开锁
  4. 蓝牙APP解锁:通过蓝牙APP输入密码解锁
  5. 实时时间显示:OLED屏幕显示当前时间,可通过按键修改
  6. 步进电机:步进电机模拟门锁开关
  7. OLED显示:显示用户解锁界面,主菜单以及各项功能界面
  8. 蜂鸣器报警:密码输入错误蜂鸣器报警

2.主要器件

  • STM32F103C8T6最小系统板
  • OLED显示屏(7针SPI协议)
  • 4×4矩阵键盘
  • RFID门禁模块(加卡片)
  • AS608指纹模块
  • 蓝牙模块(BT04-A)
  • 蜂鸣器

三、原理图设计

四、PCB硬件设计

1.PCB图

2.PCB板及元器件图

五、程序设计

cpp 复制代码
 int main(void)
 {			
	u16 set=0;
	u8 err=0;
	int key_num;
	int time1;
	int time2;		//锁屏时间
	char arrow=0;  //箭头位子
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(9600);	 //串口初始化为9600
	printf("串口功能正常\r\n");
	Button4_4_Init();          //初始化与按键连接的硬件接口
	OLED_Init();    			//显示初始化
    Walkmotor_Init();
	BEEP_Init();			//蜂鸣器初始化
	usart2_init(usart2_baund);           //初始化指纹模块
	PS_StaGPIO_Init();
	OLED_Clear(); 
	starting();//开机信息  logo
	err = RTC_Init();	  			//RTC初始化
	if(err)
	{
		OLED_Clear(); 
		Show_Str(12,13,128,20,"RTC CRY ERR!",12,0); 
		OLED_Refresh_Gram();//更新显示
		delay_ms(3000);
	}
	SysPartInit();   //系统参数初始化 
 	while(1)
	{
//锁屏界面
    MAIN:
		OLED_Clear(); 
		OLED_Show_Font(56,48,0);//显示锁图标
		while(1)
		{
			time1++;  Display_Data();//时间显示:每1000ms更新一次显示数据
			if(DisFlag == 1)
			{
				DisFlag = 0;
				OLED_Fill(0,24,16,63,0);
				OLED_Refresh_Gram();//更新显示
			}
			if((time1%100)==1)
		 	{
				//MFRC522解锁
				time1=0;
				MFRC522_Initializtion();			
				Error=MFRC522_lock();
				if(Error==0)
				{
					goto MENU;	
				}
				else 
				{
					OLED_Show_Font(56,48,0);//锁
				}
				//手机蓝牙解锁密码1
				Error=usart1_cherk((char*)sys.passwd1);         
				if(Error==0)
                { 
			    	OLED_Clear_NOupdate();
				    Show_Str(12,13,128,20,"蓝牙密码1:正确",12,0); 
					OLED_Refresh_Gram();//更新显示
					delay_ms(800);
					DisUnLock();
					goto MENU;	
				}
				else {}
				//手机蓝牙解锁密码2
				Error=usart1_cherk((char*)sys.passwd2);         
				if(Error==0)
                {
				    sys.errCnt = 0;
				    OLED_Clear_NOupdate();
					Show_Str(12,13,128,12,"蓝牙密码2:正确",12,0); 
					OLED_Refresh_Gram();//更新显示
					delay_ms(800);
					DisUnLock();
					goto MENU;	
				}
				else {}
			}
			//指纹解锁
			if(PS_Sta)	 //检测PS_Sta状态,如果有手指按下
			{
			    while(PS_Sta)
                {
			    	Error=press_FR();//刷指纹
					if(Error==0)
					{
						goto MENU;   //跳到解锁界面
					}								
					else 
					{
						OLED_Show_Font(56,48,0);//锁
					}
				}
			}
			//密码锁
			key_num=Button4_4_Scan();	//按键扫描
			if(key_num!=-1)
			{
				Error=password();//密码解锁函数
				if(Error==0)
				{
					goto MENU;	//跳到解锁界面
				}
				else 
				{
					OLED_Show_Font(56,48,0);//锁
				}
			}
			delay_ms(1);				
		}
/********************主界面**************************/
    MENU:
		OLED_Clear();
    MENUNOCLR:
		OLED_Fill(0,0,20,48,0);
		//主页菜单显示
		if(arrow<3)
        {
		    Show_Str(5,arrow*16,128,16,"->",16,0);//显示箭头
		    set=0;
        }
		else 
        {
			Show_Str(5,(arrow-3)*16,128,16,"->",16,0);
			set=3;
        }
		Show_Str(25,0,128,16,setup[set],16,0);
		Show_Str(25,16,128,16,setup[set+1],16,0);
		Show_Str(25,32,128,16,setup[set+2],16,0);
		Show_Str(0,52,128,12,"上    下     确定",12,0);
		OLED_Refresh_Gram();//更新显示
		time2=0;
		while(1)
		{
			//超时锁屏
			time2++;
			if(time2>100 | key_num==4){  
		    OLED_Clear();
			DisLock();
			if(time2>100) beep_on_mode2();
			time2 =0;
            OLED_Clear();
			goto MAIN;
		}
		//手机蓝牙锁定
		if(memcmp(USART_RX_BUF,"lock",4)==0)	
        {
		    DisLock();
		    goto MAIN;
	    }			
		//功能选项选择
		key_num=Button4_4_Scan();	
		if(key_num)
		{
		    if(key_num==13)
            {
				if(arrow>0)arrow--;
				goto MENUNOCLR;
			}
			if(key_num==15)
            {
				if(arrow<5)arrow++;
				goto MENUNOCLR;
			}
			if(key_num==16)
            {
			    switch(arrow)
			    	{
					case 0:Add_FR();		break;//录指
					case 1:Del_FR();		break;//删指纹
					case 2:SetPassworld();break;//修改密码
					case 3:Set_Time(); break;  //设置时间
					case 4:Add_Rfid(); break;  //录入卡片
					case 5:Massige(); break;  //显示信息			
		    		}
				goto MENU;
	    		}		
	    	}
        delay_ms(1);
		}	
	}
 }

六、实验效果

七、资料内容

项目分享

相关推荐
yutian06067 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
析木不会编程10 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
枯无穷肉14 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名67714 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式科普15 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
嵌入式大圣15 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室15 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费15 小时前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件
qq_3975623117 小时前
MPU6050 , 设置内部低通滤波器,对于输出数据的影响。(简单实验)
单片机
liyinuo201717 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范