指纹门禁密码锁是一种既可以通过密码输入,指纹识别也可以通过识别IC卡来实现门禁的开启关闭功能。在日常生活种它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的门禁密码锁是以芯片为核心,通过编程来实现的。
利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现门禁密码锁的基本功能,其主要具有如下功能:
●指纹识别
●手机蓝牙控制
●密码通过键盘输入,若密码正确,则将锁打开
●密码输入错误,蜂鸣器将报警提示
●用户可以自由设定密码
●RC522射频卡识别
●OLED显示
●步进电机控制电路
系统方案
采用一种是用以STM32F103C8T6为核心的单片机控制方案,其原理如图2.1所示:
#include "main.h"
#include "config.h"
#include <string.h>
int main(void)
{
int Error; //密码验证信息
int key_num;
int time1;
int time2; //锁屏时间
char arrow = 0; //箭头位子
P_USER p_user;
P_RECV_MSG p_msg;
//SysHSI_Init();
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();
USART3_init(115200); //人脸识别串口初始化
OLED_Clear();
starting();//开机信息 logo
if(RTC_Init()) //RTC初始化
{
OLED_Clear_NOupdate();
Show_Str(12, 13, 128, 20, (u8*)"RTC CRY ERR!", 12, 0);
OLED_Refresh_Gram();//更新显示
delay_ms(3000);
}
SysPartInit(); //系统参数初始化
Cfg_FR1002_State(sysFlag.fr_state);//配置人脸识别模块工作状态
while(1)
{
//锁屏界面
MAIN:
OLED_Clear();
while(1)
{
time1++;
Display_Data();//时间显示:每1000ms更新一次显示数据
if(sysFlag.DisFlag == 1)
{
sysFlag.DisFlag = 0;
OLED_Refresh_Gram();//更新显示
}
//密码锁
key_num = Button4_4_Scan(); //按键扫描
if(key_num)
{
Error = password(); //密码解锁函数
if(Error == 0)
{
goto MENU; //跳到解锁界面
}
}
if((time1 % 500) == 1)
{
//MFRC522解锁
MFRC522_Initializtion();
Error = MFRC522_lock();
if(Error == 0)
{
goto MENU;
}
//手机蓝牙解锁密码1
Error = usart1_cherk((char*)sys.passwd1);
if(Error == 0) {
OLED_Clear_NOupdate();
Show_Str(12, 13, 128, 20, (u8*)"蓝牙密码1:正确", 12, 0);
OLED_Refresh_Gram();//更新显示
delay_ms(800);
Set_UnLock();
goto MENU;
}
//手机蓝牙解锁密码2
Error = usart1_cherk((char*)sys.passwd2);
if(Error == 0) {
sys.errCnt = 0;
OLED_Clear_NOupdate();
Show_Str(12, 13, 128, 12, (u8*)"蓝牙密码2:正确", 12, 0);
OLED_Refresh_Gram();//更新显示
delay_ms(800);
Set_UnLock();
goto MENU;
}
delay_ms(1);
} else {
//指纹解锁
if(PS_Sta) //检测PS_Sta状态,如果有手指按下
{
while(PS_Sta) {
Error = press_FR(); //刷指纹
if(Error == 0)
{
//Set_UnLock();
goto MENU; //跳到解锁界面
}
}
}
}
/********************主界面**************************/
MENU:
OLED_Clear();
Dis_SysSetup(arrow);
while(1)
{
//超时锁屏
time2++;
//功能选项选择
key_num = Button4_4_Scan();
if(time2 > 10000 | key_num == 4) {
OLED_Clear_NOupdate();
Set_Lock();
if(time2 > 10000)beep_on_mode2();
time2 = 0;
// delay_ms(1000);
OLED_Clear_NOupdate();
goto MAIN;
}
//手机蓝牙锁定
if(memcmp(USART_RX_BUF, "LOCK", 4) == 0) {
// USART_RX_STA=0;
// memset(USART_RX_BUF,0,USART_REC_LEN);
Set_Lock();
goto MAIN;
}
if(key_num)
{
time2 = 0;
if(key_num == 13) {
if(arrow > 0)arrow--;
}
if(key_num == 15) {
if(arrow < MAX_SYS_PARA_NUM-1)arrow++;
}
Dis_SysSetup(arrow);
if(key_num == 16) {
switch(arrow)
{
case ADD_FIG:
Add_FR();
break;//录指
case DEL_FIG:
Del_FR();
break;//删指纹
case MOD_PSWD:
SetPassworld();
break;//修改密码
case MOD_TIMES:
Set_Time();
break; //设置时间
case ADD_RFID:
Add_Rfid();
break; //录入卡片
case DEL_RFID:
Delt_Rfid();
break;
case ADD_FACE:
Add_Face();
break;
case DEL_FACE:
Delt_Face();
break;
}
goto MENU;
}
}
delay_ms(1);
}
}
}