功能:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶显示功能界面
2.支持添加/删除/搜索指纹,更改密码
3.支持指纹和密码开锁
4.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:


PCB :

主程序:

#include "main.h"enum ModeFlag_Df ModeFlag; //模式,正常开锁模式,设置密码模式,设置指纹模式
unsigned char stepCnt = 0;
char setIndex = 0;
xdata unsigned char dis0[16];
bit refreshFlag = 1;
unsigned char inpPasswd[4]; //输入密码
unsigned char Passwd[4] = {'0','0','0','0'}; //初始密码
unsigned char isNewFlag = 1;void main()
{LOCK = OPEN; //锁打开DelayMs(200);LOCK = CLOSE; //锁关闭EEPROM_Init();DelayMs(200);// EEPROM_WriteByte(IS_NEW_ADDR, 1);ReadPassword(); //初次使用时屏蔽此句if (isNewFlag != 0){unsigned char i = 0;EEPROM_WriteByte(IS_NEW_ADDR, 0);for (i = 0; i < 4; i++){Passwd[i] = '0';}WritePassword();}LCD_Init(); //初始化液晶LCD_DispStr(0, 0, "Fingerprint Lock"); //液晶开机显示界面Timer0_Init(); //初始化定时器Uart_Init();  //初始化串口DelayMs(200);DelayMs(200);DelayMs(200); //延时500MS,等待指纹模块复位Device_Check(); //校对指纹模块是否接入正确,液晶做出相应的提示DelayMs(200);DelayMs(200);DelayMs(200); //对接成功界面停留一定时间LCD_Clear();LCD_DispStr(0, 0, "Enter pw or fp: "); //显示while (1){if (refreshFlag == 1){TR0 = 0;refreshFlag = 0;if (ModeFlag == NORMAL){if (stepCnt == 0){LCD_DispStr(0, 0, "Enter pw or fp: "); //显示LCD_DispStr(0, 1, "                ");}CTRL_BY_FPM10A_Find_Fingerprint(); //搜索指纹}else if (ModeFlag == OLD_PW){if (stepCnt == 0){LCD_DispStr(0, 0, "Old Password:   "); //显示LCD_DispStr(0, 1, "                ");}}else if (ModeFlag == SELECT_PW_FP){LCD_DispStr(0, 0, "A.Set Password  "); //显示LCD_DispStr(0, 1, "B.SetFingerprint");}else if (ModeFlag == SET_PW){if (stepCnt == 0){LCD_DispStr(0, 0, "New Password:   "); //显示LCD_DispStr(0, 1, "                ");}}else if (ModeFlag == SET_FP_SELECT){Into_FP();}else if (ModeFlag == FIND_FP){FPM10A_Find_Fingerprint();}else if (ModeFlag == ADD_FP){FPM10A_Add_Fingerprint();}else if (ModeFlag == DELETE_FP){LCD_DispStr(0, 0, "   Empty All    ");LCD_DispStr(0, 1, "  A.Yes  B.No   ");}TR0 = 1;}Key_Process(Calkey_scan());}
}void Timer0_Init(void)
{TMOD |= 0x01;                //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0 = (65536 - 18432) / 256; //重新赋值 20msTL0 = (65536 - 18432) % 256;EA = 1;  //总中断打开ET0 = 1; //定时器中断打开TR0 = 1; //定时器开关打开
}void Timer0_Interrupt(void) interrupt 1
{static unsigned char time_20ms = 0;TH0 = (65536 - 18432) / 256; //重新赋值 20msTL0 = (65536 - 18432) % 256;time_20ms++;if (time_20ms > 10) //定时显示{refreshFlag = 1;time_20ms = 0;}
}void Open_Lock(void) //打开电磁锁
{LOCK = OPEN;DelayMs(250);DelayMs(250);LOCK = CLOSE;
}void Into_FP(void)
{/**************进入主功能界面****************/if (setIndex == 0){LCD_DispStr(0, 0, " *Search finger "); //第一排显示搜索指纹LCD_DispStr(0, 1, "  Add     Delete"); //添加和删除指纹}else if (setIndex == 1){LCD_DispStr(0, 0, "  Search finger "); //第一排显示搜索指纹LCD_DispStr(0, 1, " *Add     Delete"); //添加和删除指纹}else if (setIndex == 2){LCD_DispStr(0, 0, "  Search finger "); //第一排显示搜索指纹LCD_DispStr(0, 1, "  Add    *Delete"); //添加和删除指纹}
}void ReadPassword(void)
{unsigned char i = 0;isNewFlag = EEPROM_ReadByte(IS_NEW_ADDR);for (i = 0; i < 4; i++){Passwd[i] = EEPROM_ReadByte(PASSWORD_ADDR + i);}
}void WritePassword(void)
{unsigned char i = 0;for (i = 0; i < 4; i++){EEPROM_WriteByte(PASSWORD_ADDR + i, Passwd[i]);}
}void Key_Process(unsigned char keyCode)
{static unsigned char count_num = 0;static unsigned char i = 0;if (ModeFlag == NORMAL){if (keyCode == 'A') //设置键{ModeFlag = OLD_PW;}else if ((keyCode >= '0') && (keyCode <= '9')){stepCnt = 1;if (count_num <= 3){inpPasswd[count_num] = keyCode;// LCD_DispOneChar((count_num+6), 1, inpPasswd[count_num]);LCD_DispOneChar((count_num+6), 1, '*');count_num++;}if (count_num == 4){DelayMs(250);DelayMs(250);for (i = 0; i < 4; i++) //判断密码是否正确{if (inpPasswd[i] != Passwd[i])break;}if (i == 4) //密码输入正确{LCD_DispStr(0, 1, "      Open      "); //显示状态Open_Lock();}else{LCD_DispStr(0, 1, "     Error      "); //显示状态Buzz_Times(2);}DelayMs(250);DelayMs(250);stepCnt = 0;count_num = 0;}}}else if (ModeFlag == OLD_PW){if ((keyCode >= '0') && (keyCode <= '9')) //输入旧密码{stepCnt = 1;if (count_num <= 3){inpPasswd[count_num] = keyCode;// LCD_DispOneChar((count_num+6), 1, inpPasswd[count_num]);LCD_DispOneChar((count_num+6), 1, '*');count_num++;}if (count_num == 4){DelayMs(250);DelayMs(250);for (i = 0; i < 4; i++) //判断密码是否正确{if (inpPasswd[i] != Passwd[i])break;}if (i == 4) //密码输入正确{LCD_DispStr(0, 1, "     Right      "); //显示状态DelayMs(250);DelayMs(250);ModeFlag = SELECT_PW_FP;}else{LCD_DispStr(0, 1, "     Error      "); //显示状态Buzz_Times(2);DelayMs(250);DelayMs(250);ModeFlag = NORMAL; //返回最初界面}stepCnt = 0;count_num = 0;}}}else if (ModeFlag == SELECT_PW_FP){if (keyCode == 'A'){ModeFlag = SET_PW;}else if (keyCode == 'B'){ModeFlag = SET_FP_SELECT;setIndex = 0;}}else if (ModeFlag == SET_PW){if ((keyCode >= '0') && (keyCode <= '9')) //设置新密码{stepCnt = 1;if (count_num <= 3){Passwd[count_num] = keyCode;LCD_DispOneChar((count_num+6), 1, Passwd[count_num]);count_num++;}if (count_num == 4){DelayMs(250);DelayMs(250);LCD_DispStr(0, 1, "      OK        "); //显示状态WritePassword();DelayMs(250);DelayMs(250);ModeFlag = NORMAL;stepCnt = 0;count_num = 0;}}else if (keyCode == 'B'){ModeFlag = SELECT_PW_FP;}} else if (ModeFlag == SET_FP_SELECT){if (keyCode == 'A') //确认{switch (setIndex){case 0: //搜索指纹ModeFlag = FIND_FP;// FPM10A_Find_Fingerprint();break;case 1: //添加指纹ModeFlag = ADD_FP;// FPM10A_Add_Fingerprint();break;case 2: //清空指纹ModeFlag = DELETE_FP;// FPM10A_Delete_All_Fingerprint();break;}}else if (keyCode == 'B'){ModeFlag = SELECT_PW_FP;}else if (keyCode == '*') //设置位置移动{setIndex--;if (setIndex < 0){setIndex = 2;}}else if (keyCode == '#') //设置位置移动{setIndex++;if (setIndex > 2){setIndex = 0;}}}else if (ModeFlag == FIND_FP){if (keyCode == 'B'){ModeFlag = SET_FP_SELECT;}}else if (ModeFlag == DELETE_FP){if (keyCode == 'A'){LCD_DispStr(0, 0, "   Emptying     ");LCD_DispStr(0, 1, "                ");DelayMs(250);FINGERPRINT_Cmd_Delete_All_Model();FPM10A_Receive_Data(12);LCD_DispStr(0, 0, "   All empty    ");LCD_DispStr(0, 1, "                ");Buzz_Times(3);DelayMs(250);ModeFlag = NORMAL;}else if (keyCode == 'B'){ModeFlag = SET_FP_SELECT;}}if (keyCode == 'D'){ModeFlag = NORMAL;stepCnt = 0;count_num = 0;setIndex = 0;}
}

实物演示视频:
https://www.bilibili.com/video/BV1b3411j7DF/

基于51单片机的带矩阵键盘指纹密码电子锁原理图PCB相关推荐

  1. 基于51单片机的水温温度PID算法控制系统proteus仿真原理图PCB

    1.本系统采用STC89C52作为单片机 2.采用液晶LCD1602液晶实时显示相关数据 3.采用矩阵键盘可设置PID相关参数 4.采用L298驱动功率电阻模拟加热过程 5.当温度超过设定值的一定范围 ...

  2. 基于51单片机数控可调恒流源设计(实物图+原理图+PCB+论文)

     资料编号:087 1.采用51单片机 2. LCD1602液晶实时显示当前的电流值,并且可以通过按键进行设置. 3.电流默认的范围为0-1000mA. 4.按键设置电流大小,步进为10mA(0.01 ...

  3. 基于51单片机声音噪声分贝检测采集显示proteus仿真原理图PCB程序设计

    硬件设计 (末尾附文件) 功能说明: 1.基于STC89C51/52(与AT89S51/52.AT89C51/52通用)单片机作为主控制器 2.采用LCD1602液晶显示屏实时显示分贝值: 3.使用小 ...

  4. 基于51单片机的智能蓝牙路灯街灯控制系统proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.液晶实时显示时间/环境光强/工作模式 2.每隔5s向蓝牙串口发送一次信息 3.支持路灯故障检测 4.工作时间18~24时,两个路灯同时点亮,24时 ...

  5. 基于51单片机的智能护眼台灯设计proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前时间/环境光强/工作模式 2.当检测到人体距离灯光太近时,蜂鸣器报警提醒 3.当使用时间超过设定阈值时,蜂鸣器报 ...

  6. 基于51单片机的智能饮水机烧水控制系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前温度和设定温度 2.当温度到达100℃时,蜂鸣器报警提醒水烧开了 3.按键可更改预设温度值,当温度低于设定温度5 ...

  7. 基于51单片机太阳能风能太阳能风光互补路灯proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.手动模式下,由手动开关控制小灯的亮灭 2.自动模式下,由光强决定小灯的亮灭 3.本系统具备太阳能和风能两种方式给系统的锂电池充电,锂电池再经过升压 ...

  8. 基于51单片机的智能水表水流量计流量报警器proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶显示水流量/累计流量/累计流量阈值 2.按'清零'键清除累计流量,按'加''减'设置累计流量报警阈值,按'启停'启动停止水泵 3 ...

  9. 基于51单片机的多路热电偶测温系统proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前检测的温度值 2.循环显示多路热电偶检测值 3.当温度超过设定温度值一定范围以后,蜂鸣器报警,同时启动升温或降温装置 ...

最新文章

  1. unity3d中旋转
  2. 将div垂直居中放置在另一个div中[重复]
  3. 如何使用GitHub Action自动发布JAR到Maven仓库
  4. php strchr和strrchr,strrchr与Strchr
  5. 我的log4net使用手册(转自 http://blog.csdn.net/lyjcn/archive/2009/08/11/4432833.aspx)
  6. 13款WordPress使用必装插件
  7. js 正则 正确的书写逻辑 中 德文小数点区别
  8. 8086的内中断典型如int 21h的分析
  9. 电商产品经理:电商后台系统
  10. 【Android Studio】XUI框架的使用记录:源代码Demo安装+从Demo中获取捷径快速开发自己的APP
  11. 微信公众号 | 封面图及缩略图设置及修改技巧
  12. Ubuntu(Linux) 磁盘分区方案
  13. 基于toolbox_calib工具箱的相机标定matlab仿真
  14. struct tm 和 time_t 时间和日期的使用方法
  15. 2017诺贝尔文学奖揭晓!1901-2017年最全诺奖书单来了
  16. 【Unity自己写框架】FairyGUI UI框架(一)
  17. 2021 ICPC Gran Premio de Mexico 2da Fecha(C,D,G,I)
  18. InnoDB存储引擎——缓冲池
  19. 【数独 2】候选数法解数独谜题-挖掘更深的信息-C++实现
  20. 一图看懂《百年孤独》人物关系

热门文章

  1. Web恶意代码检测方法
  2. 学习记录662@项目管理之项目整体管理
  3. Go语言自学系列 | golang标准库io包
  4. python学习笔记(二)流程
  5. 利用HTML5定位功能,实现在百度地图上定位
  6. 罗胖时间的朋友跨年演讲释放的世界氢燃料电池汽车信号
  7. MYSQL:餐厅点菜、管理员工的数据库。大学数据库课程大作业(初学者,入门,用的基础知识)
  8. FPGA状态机(一段式、二段式、三段式)、摩尔型(Moore)和米勒型(Mealy)
  9. 如何与职场“老油条”和谐的相处
  10. 【C语言】库函数的使用与模拟实现(strlen、strcpy、strcmp....