目录
一、前言
项目成品图片:
哔哩哔哩视频链接:
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32智能门禁锁系统。
功能如下:
- 按键解锁:系统通过4×4矩阵键盘模块输入密码进入主菜单
- 门禁刷卡:通过RFID模块刷卡进入主菜单,卡片可以添加或者覆盖删除
- 指纹识别:通过AS608指纹识别模块识别指纹开锁
- 蓝牙APP解锁:通过蓝牙APP输入密码解锁
- 实时时间显示:OLED屏幕显示当前时间,可通过按键修改
- 步进电机:步进电机模拟门锁开关
- OLED显示:显示用户解锁界面,主菜单以及各项功能界面
- 蜂鸣器报警:密码输入错误蜂鸣器报警
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);
}
}
}
六、实验效果
七、资料内容