功能介绍:
0.本系统采用STC12C5A60S2-35I作为单片机,因本系统需要使用WiFi模块和指纹模块,两者均是串口串口通信,89C52只有一路串口,因此无法满足需求,STC12C5A60S2-35I加强型51具备两路串口。
1.采用LCD1602液晶显示相关信息
2.密码可通过矩阵键盘设置,解锁支持矩阵键盘和指纹
3.支持WiFi通信解锁功能
4.采用DC005作为电源接口可直接输入12V给整个系统供电,系统具备12V转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 tempPasswd[4] = {'x','x','x','x'}; //临时密码
unsigned char tempEnable = 0; //临时密码使能
unsigned char isNewFlag = 1;void main()
{LOCK = OPEN; //锁打开DelayMs(200);LOCK = CLOSE; //锁关闭LCD_Init(); //初始化液晶LCD_DispStr(0, 0, "    Welcome!    "); //液晶开机显示界面DelayMs(200);DelayMs(200);DelayMs(200);LCD_DispStr(0, 0, "   Waiting...   "); //液晶开机显示界面Uart2_Init();Uart2_Send_Str("AT+CIPMUX=1\r\n", 13); //打开多连接DelayMs(50);Uart2_Send_Str("AT+CIPSERVER=1,8080\r\n", 21); //建立服务 端口号为8080DelayMs(200);IE2 &= 0xFE;            //串口2中断关闭DelayMs(200);Uart1_Init();  //初始化串口DelayMs(200);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_Clear();LCD_DispStr(0, 0, "Fingerprint Lock"); //液晶开机显示界面
//    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: "); //显示Timer0_Init(); //初始化定时器while (1){if (refreshFlag == 1){refreshFlag = 0;if (modeFlag == NORMAL){if (stepCnt == 0){LCD_DispStr(0, 0, "Enter pw or fp: "); //显示LCD_DispStr(0, 1, "                ");}TR0 = 0;IE2 &= 0xFE;            //串口2中断关闭CTRL_BY_FPM10A_Find_Fingerprint(); //搜索指纹IE2 |= 0x01;            //串口2中断打开TR0 = 1;}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){IE2 &= 0xFE;            //串口2中断关闭Into_FP();IE2 |= 0x01;            //串口2中断打开}else if (modeFlag == FIND_FP){IE2 &= 0xFE;            //串口2中断关闭FPM10A_Find_Fingerprint();IE2 |= 0x01;            //串口2中断打开}else if (modeFlag == ADD_FP){IE2 &= 0xFE;            //串口2中断关闭FPM10A_Add_Fingerprint();IE2 |= 0x01;            //串口2中断打开}else if (modeFlag == DELETE_FP){LCD_DispStr(0, 0, "   Empty All    ");LCD_DispStr(0, 1, "  A.Yes  B.No   ");}}IE2 &= 0xFE;            //串口2中断关闭Key_Process(Calkey_scan());IE2 |= 0x01;            //串口2中断打开}
}void Timer0_Init(void)
{AUXR &= 0x7F;     //定时器时钟12T模式TMOD &= 0xF0;      //设置定时器模式TL0 = 0x00;       //设置定时初值TH0 = 0x4C;        //设置定时初值 50msTF0 = 0;      //清除TF0标志TR0 = 1;      //定时器0开始计时ET0 = 1;        //开启定时器1中断PT0 = 1;EA = 1;  //总中断打开
}void Timer0_Routine(void) interrupt 1
{static unsigned int time_50ms = 0;TL0 = 0x00;        //设置定时初值TH0 = 0x4C;        //设置定时初值 50mstime_50ms++;if (time_50ms > 5) //定时显示{refreshFlag = 1;time_50ms = 0;//BUZZER = ~BUZZER;}}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;unsigned char i = 0;unsigned char j = 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 (tempEnable == 1) //可以输入临时密码{for (j = 0; j < 4; j++) //判断密码是否正确{if (inpPasswd[j] != tempPasswd[j])break;}}if (i == 4 || j == 4) //密码输入正确{if (j == 4){tempEnable = 0; //清空临时密码使能for (j = 0; j < 4; j++) //判断密码是否正确{tempPasswd[j] = 'x'; //清空临时密码//LCD_DispOneChar(0+j, 1, tempPasswd[j]); //显示状态}}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;// FINGERPRINT_Cmd_Delete_All_Model();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/BV19r4y147zJ/

基于51单片机的电子密码指纹锁无线WiFi通信原理图PCB相关推荐

  1. 51、基于51单片机洗衣机控制系统(带水位)系统设计(程序+原理图+PCB源文件+Proteus仿真+参考论文+开题报告+任务书+流程图+元器件清单等)

    摘 要 随着数字技术的快速发展,数字技术被广泛应用于智能控制的领域中.单片机以体积小.功能全.价格低廉.开发方便的优势得到了许多电子系统设计者的青睐.它适合于实时控制,可构成工业控制器.智能仪表.智能 ...

  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.LCD1602液晶实时显示当前锁的状态 2.可通过按键开启/关闭继电器 3.当上锁后,检测到有人同时有震动时,5s后进入监测, 监测0~5s, ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 奇思妙想——我心中的智能自行车
  2. [转载]WPF – 使用触发器
  3. idea资源包下创建资源包_根据谁创建资源授权资源
  4. mysql浅拷贝_深拷贝与浅拷贝
  5. React开发(253):react项目理解 ant design ancher锚点
  6. java并发初探ConcurrentSkipListMap
  7. 国产特斯拉Model Y已开始向欧洲用户交付
  8. 数据:BTC全网算力为134.17 EH/s,新增地址数51.05万
  9. [原创]FOCUS处理系统流程之:大文本文件极速合并(sps文件合并)
  10. dev 命令行参数调用_在Linux系统上使用简单命令行创建高强度的预共享密钥
  11. Guava Cache本地缓存
  12. OpenCV保存H264视频的问题
  13. 美赛数学建模O奖论文下载
  14. cs1.6服务器怎么注册,CS服务器登录与管理工具
  15. U盘提示磁盘写保护无法强制格式化------使用量产工具解决
  16. zookeeper和ZAB协议
  17. Nginx的rewrite(地址重定向)剖析
  18. HTML 表单 表格 列表
  19. WebGL简易教程(十一):纹理
  20. Collections与Comparator

热门文章

  1. 计算机音乐奇迹再现乐谱,天谕手游奇迹再现乐谱_奇迹再现乐谱代码分享_3DM手游...
  2. android按键模拟测试
  3. python random模块中seed函数的详解_random.seed()函数理解
  4. iOS内存管控实战(上)—原理篇
  5. 当x大于时,y等于1;当x等于0时,y等于0;当x小于0时,y等于-1。
  6. leetcode题解(含解题思路)(持续更新中)
  7. 在线教育报告上线,助力职业与成人教育行业高效运营
  8. seata(二) 分布式事务框架seata1.3 AT及XA模式实例演示
  9. 白钢条用什么可以切割_白钢用什么切割?
  10. vue 分割面板组件