1.系统功能概述
本次分享的是一款基于51单片机的指纹识别电子密码锁系统,该系统以STC89C52单片机作为模块核心,通过串口通信控制指纹模块AS608实现录取指纹并存储指纹数据,并通过LCD12864液晶显示屏比对流程及效果,辅以直流继电器以发光二极管模拟开锁动作。

2.硬件设计
(1)整体硬件框图

硬件电路主要包括51单片机最小系统、指纹模块AS608电路、4*4矩阵键盘电路、LCD12864显示屏电路及系统电源。

(2)AS608指纹模块电路
AS608指纹模块采用串口或者USB进行数据通讯。本例程采用串口通讯的方式实现对指纹模块的控制。单片机可通过厂家提供的控制指令集对指纹模块做相应的操作,详细可以参考AS608指纹模块用户手册。

(3)其他电路
由于其他硬件电路都是比较常用,就不一一介绍了。

3.软件设计
软件流程:首先对各个模块进行初始化,检测有无按键按下,如果按下,则判断是哪一个按键,并作出判断,并调用相应的按键处理函数。
主程序主要由液晶显示、串口通讯程序和按键程序组成。

(1)主函数

void main()
{   //PSB=0;UART_Init();      //串口初始化        x24c02_init();     //24C02初始化LcmInit();          //LCD12864初始化                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            LcmClearTXT();     //LCD12864清屏 while(1) { fan();delay(100);

(2)指纹模块处理程序(部分代码)
因为源码比较大,我就不想全都贴出来了,如果需要详细了解源码可下载源码查看(下载链接在文章最后)

#define buffer1ID  0x01
#define buffer2ID  0x02
#define queren  0x88        //确认
#define tuichu  0x85        //退出
#define shanchu 0x82        //删除#define User 1              //用户     void fan();                    //主界面刷指纹管理员函数sbit B0=B^0;
sbit B7=B^7;
sbit k2=P3^7;              //指纹模块
sbit jidianqi=P3^6;            //继电器extern unsigned char times[];
uchar  Member=0,sec;uchar  code buffer[User][6]=
{{"000000"}
};uchar dz[4];
uchar time[4];
uchar mima[6];
uchar mimag[6];
uchar mimaID[6]={1,2,3,4,5,6};uchar Address1=20,tempx=20;
uchar Address2=20;   uchar data K;
uchar data Key;uint PageID;
uchar data querenma=11;
uchar sum[2];
int summaf,summas;uchar  xdata UserPassword[7]={0};//密码
uchar  xdata DSY_BUFFER[16] ={0};//缓存void Red_Init(void);//检测脉冲宽度
unsigned char check(void);unsigned char redchange(unsigned char rednum);void delayms(unsigned int z)
{unsigned int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);
}/********************************************************************
* 名称 : Chack(uchar User_Number)
* 功能 : 单一用户密码检测
* 输入 : User_Number
* 输出 : 密码正确与错误,错误返回0,正确返回1
********************************************************************/
uchar Chack(uchar User_Number)
{uchar flag, i,temp[6],Address;Address=User_Number*10;for(i=0;i<6;i++){temp[i]=x24c02_read(Address);delayms(10);Address++;}for(i=0;i<6;i++){if(temp[i]==UserPassword[i])flag=1;else  flag=0;        }return flag;
}/********************************************************************
* 名称 : PassWord_Chack()
* 功能 : 所有用户密码检测
* 输入 : 无
* 输出 : 密码正确与错误,错误返回0,正确返回1
********************************************************************/
uchar PassWord_Chack()
{uchar i=0;while(i<User){if(Chack(i)==2){Member=i+2;return 1;}i++;    }return 0;
}void delay(uint tt)
{  uchar i;while(tt--){for(i=0;i<125;i++);}
}
/********************************************************************
* 名称 : UART_Init()
* 功能 : 单片机串口初始化
* 单片机:晶振11.0592MHz 波特率为9600bps
* 指纹模块:波特率为9600bps,
********************************************************************/
void UART_Init()
{SCON= 0x50;               //串口方式1 //REN=1; 允许接收PCON=0x01;                //SMOD=0TMOD= 0x01;               //定时器1定时方式2TH1= 0xFD;                //11.0592MHz  模块默认波特率为9600bpsTL1= 0xFD;                                      TR0= 1;                   //启动定时器 EA=1;
}unsigned char Keycan(void) //按键扫描程序 P1.0--P1.3为行线 P1.4--P1.7为列线
{unsigned char rcode, ccode;P1 = 0xF0;      // 发全0行扫描码,列线输入if((P1&0xF0) != 0xF0) // 若有键按下{delay(1);// 延时去抖动 if((P1&0xF0) != 0xF0){  rcode = 0xef;         // 逐行扫描初值while((rcode&0x10) != 0){P1 = rcode;         // 输出行扫描码if((P1&0xF0) != 0xF0) // 本行有键按下{ccode = (P1&0xF0)|0x0F;//do{;}while((P1&0xF0) != 0xF0); //等待键释放return ((~rcode) + (~ccode)); // 返回键编码}elsercode = (rcode<<1)|0x01; // 行扫描码左移一位}}}  return 0; // 无键按下,返回值为0
}void KeyDeal(unsigned char Key)
{  //unsigned char n;if(Key!=0){switch(Key){case 0x12: K=1; break;     case 0x22: K=2; break;  case 0x42: K=3; break;  case 0x82: break;       case 0x13: K=4; break;case 0x23: K=5; break;case 0x43: K=6; break;case 0x83: K=34;break;     case 0x14: K=7; break;case 0x24: K=8; break;case 0x44: K=9; break;case 0x84: break;      case 0x18: break;       case 0x28: K=0; break;case 0x48: K=11; break;case 0x88: break;        default: break;}}
}void SFG_identify()                //自动验证指纹     录图像+生成特征+搜索
{uchar i,ID1,ID2; SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=1;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X03;while(TI==0);TI=0;SBUF=0X11;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;summaf=0x15;SBUF=summaf;       //校验和while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;ID1=SBUF;while(RI==0);RI=0;ID2=SBUF;while(RI==0);RI=0;while(RI==0);RI=0;            //得分while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]>>8)+sum[0];                                     //PageID=ID1;PageID=(ID1>>8)+ID2;
}
void shuazhiwen()
{uchar IDs1,IDs2,IDs3;   LcmClearTXT();PutStr(1,1,"请按手指开锁");      SFG_identify();while(querenma==2)SFG_identify(); if(querenma==0){LcmClearTXT();PutStr(1,2,"门已打开"); IDs1=PageID/100;IDs2=PageID/10%10;IDs3=PageID%10;PutStr(2,1,"编号为:");WriteCommand(0x8D);       //指定第三行显示位置WriteData(0x30+IDs1);WriteData(0x30+IDs2);WriteData(0x30+IDs3);jidianqi=0;delay(2500); jidianqi=1;  }else if(querenma==9){LcmClearTXT();PutStr(1,1,"没搜索到指纹");PutStr(2,1,"请重新按手指");}else {LcmClearTXT();PutStr(1,1,"接收包出错");}delay(2000);//   while(Keycan()==0);
}
void addfinger()      //录入用户指纹
{uchar IDa1,IDa2,IDa3;LcmClearTXT();PutStr(1,2,"请按手指");    SFG_getimage();while(querenma!=0)SFG_getimage();SFG_genchar(buffer1ID);UART_Init();SFG_fastsearch(buffer1ID);while(querenma==1)SFG_fastsearch(buffer1ID);if(querenma==0){LcmClearTXT();PutStr(1,1,"该指纹已存储");PutStr(3,0,"  按任意键继续"); while(Keycan()==0);}else if(querenma==9){LcmClearTXT();PutStr(1,1,"请再次按手指");SFG_enroll();while(querenma==2)SFG_enroll();LcmClearTXT();if(querenma==0){ IDa1=PageID/100;IDa2=PageID/10%10;IDa3=PageID%10;PutStr(1,1,"指纹采集成功");PutStr(2,1,"编号为:");WriteCommand(0x8D); WriteData(0x30+IDa1);WriteData(0x30+IDa2);WriteData(0x30+IDa3);}else if(querenma!=0){PutStr(1,1,"指纹采集失败");PutStr(2,1,"请重新操作");}PutStr(3,0,"  按任意键继续"); while(Keycan()==0);}LcmClearTXT();
}
void deletfinger()      //删除用户指纹
{uchar i,j=0;LcmClearTXT();PutStr(1,0,"输入删去的指纹号");for(i=0;i<5;i++)dz[i]=0;    Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);                                           //按键有抖动@@@if(Key==0)K=10;if((K>=0)&&(K<=9)){dz[j]=K;if(j<3){    WriteCommand(0x88+j);      //指定第三行显示位置WriteData(0x30+dz[j]);  }++j;if(j==4)j=3;                                                 //@@#yinhuang}   //显示LCD12864并行显示 if(K==34)      //按了删除键{if(j==0){WriteCommand(0x88);      //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j);     //指定第三行显示位置WriteData(0x20);}}}if(j>=2)PageID=dz[2]+dz[1]*10+dz[0]*100;if(j==1)PageID=dz[1]+dz[0]*10;if(j==0)PageID=dz[0];SFG_deletchar(PageID);if(querenma==1){LcmClearTXT();PutStr(1,1,"删去指纹号成功!"); }else{LcmClearTXT();PutStr(1,2,"删去指纹号失败!");  }PutStr(2,0,"  按任意键继续"); while(Keycan()==0);LcmClearTXT();
}void gaimima()      //修改用户密码
{uchar i,j=0,mima1[4],mima2[4];uchar k,temp;LcmClearTXT();PutStr(1,1,"请输入新密码");for(i=0;i<6;i++)mima1[i]=0;                                    Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);                                           if(Key==0)K=10;if((K>=0)&&(K<=9)){mima1[j]=K;if(j<6){  WriteCommand(0x89+j);      //指定第三行显示位置WriteData(0x0f); }++j;if(j==7)j=6;                                                 //@@#yinhuang}   //显示LCD12864并行显示 if(K==34)      //按了删除键{if(j==0){WriteCommand(0x89);      //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x89+j);     //指定第三行显示位置WriteData(0x40);}}}LcmClearTXT();LcmClearTXT();j=0;PutStr(1,0,"请再次输入新密码");for(i=0;i<6;i++)mima2[i]=0;                                  Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);                                           if(Key==0)K=10;if((K>=0)&&(K<=9)){mima2[j]=K;if(j<6){      WriteCommand(0x89+j);      //指定第三行显示位置WriteData(0x0f); }++j;if(j==7)j=6;                                                 //@@#yinhuang}   //显示LCD12864并行显示 if(K==34)      //按了删除键{if(j==0){WriteCommand(0x89);      //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x89+j);     //指定第三行显示位置WriteData(0x20);}}}LcmClearTXT();if((mima1[0]==mima2[0])&&(mima1[1]==mima2[1])&&(mima1[2]==mima2[2])&&(mima1[3]==mima2[3])&&(mima1[4]==mima2[4])&&(mima1[5]==mima2[5])){for(i=0;i<6;i++)mimaID[i]=mima1[i];/for(i=0;i<6;i++)           //密码限制在6位以内{UserPassword[i]=mima1[i]+0x30;                             }temp=(Member-1)*100;  delayms(5);for(k=1;k<6;k++){x24c02_write(temp,UserPassword[k]);delayms(10);temp++;}  //PutStr(0,1,"密码修改成功"); PutStr(3,0,"  按任意键继续");while(Keycan()==0);}else{PutStr(0,0,"  密码修改失败  ");PutStr(1,0,"两次输入的密码不"); PutStr(2,0,"一致,请重新操作");       PutStr(3,0,"  按任意键继续"); while(Keycan()==0);}LcmClearTXT();
}void zhu()
{    LcmClearTXT();PutStr(1,2,"门已打开");jidianqi=0;delay(2500); jidianqi=1;PutStr(3,0,"  按任意键继续");while(Keycan()==0);
}void guanliyuan()       //管理员
{ uchar i,j=0,x=1;uchar Right_flag;LcmClearTXT();PutStr(1,1,"请输入密码:");   for(i=0;i<6;i++)mima[i]=0;                                   Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);                                           if(Key==0)K=10;if((K>=0)&&(K<=9)){mima[j]=K;if(j<6){   WriteCommand(0x89+j);      //指定第三行显示位置WriteData(0x0f); }++j;if(j==7)j=6;                                                }   //显示LCD12864并行显示 if(K==34)      //按了删除键{if(j==0){WriteCommand(0x89);      //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x89+j);     //指定第三行显示位置WriteData(0x20);}}}LcmClearTXT();for(i=0;i<6;i++){UserPassword[i]=mima[i]+0x30;} if(j==6){Right_flag=PassWord_Chack(); }if (Right_flag==1){Right_flag=0;while(Keycan()!=tuichu){   PutStr(0,0,"按键1 : 增加指纹"); PutStr(1,0,"按键2 : 删去指纹");PutStr(2,0,"按键3 : 手动开锁");PutStr(3,0,"按键4 : 修改密码");KeyDeal(Keycan());  switch(K){case 1:    addfinger();K=8; break;case 2:    deletfinger();    break;case 3:    zhu(); K=6;  break;case 4:    gaimima();        break;default: break;}}}else{PutStr(1,2,"密码错误");PutStr(2,0,"  请重新操作!"); PutStr(3,0,"  按任意键继续"); while(Keycan()==0);}Key=0;LcmClearTXT();
}void fan(){
//  PutStr(1,2,"请先按键");
//  PutStr(2,2,"再刷指纹");PutStr(0,2,"欢迎使用");PutStr(1,1,"指纹门禁系统");PutStr(3,1,"请按手指开锁");Key=Keycan();
if(k2==1)     //指纹刷机{LcmClearTXT();shuazhiwen();LcmClearTXT();}if(Key==0x81)            //管理员操作{LcmClearTXT();guanliyuan();LcmClearTXT();}}

源码+电路图 下载:关注公众号,首页回复“指纹密码锁”获取资料

基于51单片机的指纹密码锁相关推荐

  1. 基于51单片机的指纹密码锁设计

    目录 具体实现功能 设计介绍 单片机介绍 设计思路 资料内容 原理图 程序 仿真实现 全部资料 具体实现功能 具体功能: 本设计采用STC89C52.AT89C52.AT89S52作为主控芯片,LCD ...

  2. 基于51单片机的指纹解锁自动开门

    基于51单片机的指纹解锁自动开门 目录 基于51单片机的指纹解锁自动开门 一.设计说明 二.总体设计思路 三.系统硬件设计 四.系统软件设计 五. 实物制作与现象 七.体会 一.设计说明 指纹解锁:手 ...

  3. 基于51单片机AS608指纹自动识别电路设计(毕业设计)

    本设计是基于STC89C52单片机的指纹识别设计,采用AS608指纹模块做为传感器,LCD1602显示屏显示信息.具有指纹添加,指纹识别,删除指纹功能.是一款简单的指纹识别毕业设计设计,电路原理图和P ...

  4. 基于51单片机智能指纹锁设计

    资料编号:181 功能讲解: 本设计师以51单片机作为核心微控制器通过单片机串口通信发送指令控制指纹识别模块进行存贮指纹比对指纹的作业.具体工作原理如下 1.指纹登陆的过程 指纹登陆时通过51单片机发 ...

  5. 基于51单片机的指纹识别锁管理门禁密码锁系统方案原理图程序设计

    硬件电路的设计 (附文件) 3.1系统的功能分析及体系结构设计 3.1.1系统功能分析 本系统由STC89C52单片机电路+指纹模块传感器电路+LCD1602液晶显示电路+继电器电路+按键电路+电源电 ...

  6. 电子密码锁课设单片机c语言,基于51单片机的电子密码锁综合课程设计

    5.大容量片内EEPROM,擦写次数10万次以上 EEPROM,擦写次数10万次以上,擦写次数10万次以上 6.ISP/IAP,在系统可编程/在应用可编程,无需编程器/仿真器 7.共8通道10位高速A ...

  7. 基于51单片机智能电子密码锁的设计

    该题目是作者课程设计时所写题目,隔了段时间了,之前一直放到自己的网站上的,现在网站资源过期了,就放到这里保存了. 题目要求如下: 内容及要求 以MCS-51单片机为核心,设计一个通过面板键盘输入密码的 ...

  8. 基于51单片机的电子密码锁

    主要功能: 1.6位密码开锁 可以修改用户密码和管理员密码 断电记忆 3次错误报警锁住键盘 #include <REG51.h> #include<intrins.h> #de ...

  9. 基于51单片机密码锁-舵机开锁-CXM

    这个项目的起因还是因为每次进出寝室十分的麻烦才有了这个项目 所以我和我的铁子就决定搞个密码锁 我负责软件我的铁子负责硬件 目录 原理图 主要功能函数讲解 硬件 先简单介绍一下整个架构 原理图 主要功能 ...

最新文章

  1. C++输入/输出文件
  2. 教你玩转CSS 组合选择符
  3. 哈师大计算机等级考试,哈尔滨师范大学教务处
  4. Spring @Autowired Annotation教程
  5. window.event.srcElement在Firefox IE下的兼容问题
  6. 人到中年生活不易,特别是工作压力很大
  7. python加密模块教程_Python hashlib加密模块常用方法解析
  8. AirBuddy技巧:如何检查Mac电脑是否支持低功耗蓝牙?
  9. 看我用ubuntu virtualbox
  10. 程序设计导引及在线实践之时区间时间的转换
  11. 基于CDD修复模型的图像修复算法
  12. Dzz Desktop1.2 Demo
  13. 一种提升多分类准确性的Trick
  14. 无约束优化问题(一)
  15. 谷歌play 数据接口_如何检查,管理和清除Google Play服务存储的数据/缓存
  16. 公派访问学者博士后语言考试WSK(PETS5)介绍及常见问题
  17. Bugku之Flask_FileUpload
  18. 屏幕细密横条纹_叶一茜早秋造型,穿竖条纹风衣配横条纹裙,不仅不土意外显瘦时尚...
  19. Microsoft Bitlocker企业级管理部署方案
  20. iOS开发之第三方登录微博-- 史上最全最新第三方登录微博方式实现

热门文章

  1. ASQ分析1-基于AQS自定义锁分析
  2. Oracle学习笔记 --- Oracle ORA错误解决方案
  3. 分享这两个实用APP给你
  4. unity普通操作:animator播放,暂停,判断播放完成【(增加1个判断如果这个是动画融合的情况)】
  5. mysql查询错误 FUNCTION nvl does not exist
  6. ES安装启动及could not find java in bundled jdk at /opt/elasticsearch/elasticsearch-7.9.1/jdk/bin/java报错
  7. Linux基础命令 最后附教学视频
  8. 帝国竞技场一直连接服务器,仅玩一个蓝拳角色不要面子的?连帝国竞技场都进不去...
  9. JS递归无限级目录树
  10. wampserver时区设置