文章目录
- 一、项目简介
- 二、原理图设计![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/809dd6c70b34425eb42f69187020c717.png)
- 程序设计
哔哩哔哩视频链接: https://www.bilibili.com/video/BV1K64y1V7Y9?p=4&spm_id_from=pageDriver&vd_source=e5082ef80535e952b2a4301746491be0
实物购买链接: https://m.tb.cn/h.5NEporx?tk=LsaZWgPDsDb CZ3457
一、项目简介
指纹门禁密码锁是一种既可以通过密码输入,指纹识别也可以通过识别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); //串口初始化为9600printf("串口功能正常\r\n");Button4_4_Init(); //初始化与按键连接的硬件接口OLED_Init(); //显示初始化Walkmotor_Init(); //步进电机初始化BEEP_Init(); //蜂鸣器初始化usart2_init(usart2_baund); //初始化指纹模块PS_StaGPIO_Init();USART3_init(115200); //人脸识别串口初始化OLED_Clear();starting();//开机信息 logoif(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;}//手机蓝牙解锁密码1Error = 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;}//手机蓝牙解锁密码2Error = 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);}}
}