找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13124|回复: 34
收起左侧

自己做的单片机指纹锁,附带PCB文件和电路程序

  [复制链接]
ID:223119 发表于 2019-7-10 14:39 | 显示全部楼层 |阅读模式
自己做的一个指纹锁,各路大神欢迎指导
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
指纹锁PCB.png 0.png 0.png

单片机源程序如下:
  1. #include"reg52.h"
  2. #include"12864.h"
  3. //#include"eeprom.h"
  4. #include"matrixkey.h"
  5. #include"AT24CXX.h"
  6. #include"finger.h"
  7. uchar code table4[]="  请按手指开锁  ";
  8. uchar code table5[]="请输入密码开锁: ";

  9. uchar code table6[]="按键1:  增加指纹";
  10. uchar code table7[]="按键2:  删去指纹";
  11. uchar code table8[]="按键3:  手动开锁";
  12. uchar code table9[]="按键4:  修改密码";
  13. uchar code table10[]="请输入密码:     ";
  14. uchar code table11[]="    门已打开    ";
  15. uchar code table12[]="请按任意按键继续";
  16. uchar code table13[]="  编号为:      ";
  17. uchar code table14[]="    请按手指    ";
  18. uchar code table15[]="    请再按一次  ";
  19. uchar code table16[]="  采集指纹成功  ";
  20. uchar code table17[]="输入删去的指纹号";
  21. uchar code table18[]="删去指纹号成功  ";
  22. uchar code table19[]="删去指纹号失败  ";
  23. uchar code table20[]="  请输入新密码  ";
  24. uchar code table21[]="请再次输入新密码";
  25. uchar code table22[]="  密码修改成功  ";
  26. uchar code table23[]="  两次密码不一样";
  27. uchar code table24[]="  输入密码错误  ";
  28. uchar code table25[]="  还有  机会    ";
  29. uchar code table26[]="  该指纹已存储  ";
  30. uchar code table27[]="  采集指纹失败  ";
  31. uchar code     admin[6]={1,3,1,4,2,0};//管理员的固定密码
  32. uchar code init_code[6]={0,0,0,0,0,0};//上电第一次一般的初始化密码

  33. uchar   now_code[6]={0,0,0,0,0,0};//当前存储器中存储的密码
  34. uchar        user[6]={0,0,0,0,0,0};//用户输入的密码
  35. uchar       user2[6]={0,0,0,0,0,0};//输入第二次修改的密码
  36. sbit relay=P3^7;//开锁继电器
  37. sbit wake=P3^6;//检测手指按压,有手指按下就是高电平
  38. uchar  err_user=3;//用户三次输入错误密码
  39. uchar err_admin=3;//管理员三次输入错误密码
  40. uchar num;//存储矩阵键盘转换的对应按键值
  41. uchar number=0;//输入密码的个数默认0
  42. uchar key_flag=0;//进入手动密码标志
  43. uchar i;
  44. uchar code_flag=0;//密码修改标志第一次输入密码时候是等于0再次输入是等于1
  45. void init_dispay(void)//初始化界面
  46. {
  47.           PutStr(0,0,table1);
  48.     PutStr(1,0,table2);
  49.                 PutStr(2,0,table3);
  50.                 PutStr(3,0,table4);
  51. }
  52. void admin_dispay(void)//管理员界面
  53. {
  54.          PutStr(0,0,table6);       
  55.    PutStr(1,0,table7);
  56.    PutStr(2,0,table8);       
  57.    PutStr(3,0,table9);                               
  58. }
  59. void key(void)
  60. {   
  61.            num=keynum();
  62.                  if((num==11)&&(key_flag==0))//如果按下C按键进入
  63.                  {
  64.                          key_flag=1;
  65.                          //只显示“请输入密码开锁:“
  66.                          LcmClearTXT();//清屏
  67.        PutStr(1,0,table5);                 
  68.                  }
  69.                  if((num==3)&&(key_flag==0))//如果按下A按键管理员模式
  70.                  {
  71.                          key_flag=2;//进入输入管理员密码界面
  72.                          //只显示“请输入密码:“
  73.                          LcmClearTXT();//清屏
  74.        PutStr(1,0,table10);               
  75.                  }
  76.                  if((key_flag==1)&&(num!=0xff))//非管理员模式下输入密码
  77.                  {
  78.                           num=coding(num);//转换成可以识别的
  79.                           if((number<6)&&(num<10))
  80.                                 {
  81.                                         user[number]=num;//用户输入的密码进行记忆
  82.                                         WriteCommand(0x88+number);                //指定第三行显示位置
  83.                                         WriteData('*');
  84.                                         //WriteData(num+0x30);//明码显示       
  85.                                         number++;
  86.                                 }
  87.                                 if((num=='B')&&(number>0))//密码删除按键
  88.                                                 {  number--;
  89.                                                         WriteCommand(0x88+number);                //指定第三行显示位置
  90.                                             WriteData(' ');       
  91.                                                 }
  92.                                 if((num=='D')&&(number==6))//按下D键确定按键并且输入六位密码之后
  93.                                         {  
  94.                                                    LcmClearTXT();//清屏
  95.                                                    number=0;
  96.                                                          key_flag=0;
  97.                                                   //如果管理员密码正确,进入添加指纹,删除指纹,收到开锁,修改密码界面
  98.                                                          if((user[0]==now_code[0])&&(user[1]==now_code[1])&&(user[2]==now_code[2])&&(user[3]==now_code[3])&&(user[4]==now_code[4])&&(user[5]==now_code[5]))
  99.                                                          {    //只显示“门已打开“
  100.                    PutStr(1,0,table11);               
  101.                                                                          relay=0;
  102.                                                                          Delay(8000000);
  103.                                                                          relay=1;
  104.                                                                          Delay(3000000);
  105.                                                       err_user=3;
  106.                                                     }
  107.                                                          else//密码错误
  108.                                                            {  err_user--;
  109.                                                                           PutStr(1,0,table24);//显示输入密码错误
  110.                                                                           PutStr(2,0,table25);//显示输入密码错误
  111.                                                                           WriteCommand(0x88+3);                //指定第三行显示位置
  112.                                                                                 WriteData(' ');
  113.                                                                                 WriteData(err_user+0x30);                                         
  114.                                                                  }
  115.                                                          PutStr(3,0,table12);               
  116.                                                          while((keynum()>=16)&&(err_user!=0));
  117.                                                          init_dispay();//初始化界面         
  118.                                         }
  119.                           
  120.                  }
  121.                  if((key_flag==2)&&(num!=0xff))//管理员模式下输入数字按键
  122.                  {
  123.                                                 num=coding(num);//转换成可以识别的
  124.                                                 if((number<6)&&(num<10))
  125.                                                 {
  126.                                                         user[number]=num;//用户输入的密码进行记忆
  127.                                                         WriteCommand(0x88+number);                //指定第三行显示位置
  128.                                                         WriteData('*');
  129.                                            // WriteData(num+0x30);        //明码显示
  130.                                                         number++;
  131.                                                 }
  132.                                                 if((num=='D')&&(number==6))//按下D键确定按键并且输入六位密码之后
  133.                                                 {  //如果管理员密码正确,进入添加指纹,删除指纹,收到开锁,修改密码界面
  134.                                                          if((user[0]==admin[0])&&(user[1]==admin[1])&&(user[2]==admin[2])&&(user[3]==admin[3])&&(user[4]==admin[4])&&(user[5]==admin[5]))
  135.                                                          {     
  136.                                                                      key_flag=3;
  137.                                                                      admin_dispay();//管理员设置界面       
  138.                      err_admin=3;
  139.                                                                                                           
  140.                                                          }
  141.                                                          else//管理员密码错误
  142.                                                              {   
  143.                                                                                   err_admin--;
  144.                                                                                         PutStr(1,0,table24);//显示输入密码错误
  145.                                                                                         PutStr(2,0,table25);//显示还 机会
  146.                                                                                         WriteCommand(0x88+3);                //指定第三行显示位置
  147.                                                                                         WriteData(' ');
  148.                                                                                         WriteData(err_admin+0x30);
  149.                       PutStr(3,0,table12);                                                                                 
  150.                                                                                         while((keynum()>=16)&&(err_admin!=0));
  151.                                                                                         init_dispay();//初始化界面
  152.                       number=0;
  153.                       key_flag=0;                                                                                 
  154.                                                                          }
  155.                               }
  156.                                                 if((num=='B')&&(number>0))
  157.                                                 {  
  158.                                                         number--;
  159.                                                         WriteCommand(0x88+number);                //指定第三行显示位置
  160.                                             WriteData(' ');       
  161.                                                 }
  162.                                                
  163.                           
  164.                  }
  165.                  if((key_flag==3)&&(num!=0xff))
  166.                  {
  167.                           num=coding(num);//转换成可以识别的
  168.                           if(num=='C')//返回初始界面
  169.                                 {
  170.                                         number=0;
  171.           key_flag=0;       
  172.           init_dispay();//返回初始界面                                       
  173.                                 }
  174.                           if(num==1)//增加指纹
  175.                                 {
  176.                                           //只显示“门已打开“
  177.                                          LcmClearTXT();//清屏
  178.            PutStr(1,0,table14);        //显示请按指纹
  179.                                          if(regist(0)==1)//如果第一次按手指成功
  180.                                          {
  181.                                                    PutStr(1,0,table15);        //显示请再按一次
  182.                                                    Delay(10);//延时一会
  183.                                                    if(regist(1)==1)//两次采集手指成功
  184.                                                          {
  185.                                                                    PutStr(1,0,table16);        //采集指纹成功
  186.                    PutStr(2,0,table13);        //指纹编号:
  187.                                                                    WriteCommand(0x88+5);//指定第三行显示位置
  188.                                                                          WriteData(' ');
  189.                                                                          WriteData(id/100+0x30);
  190.                                                                          WriteData(id%100/10+0x30);
  191.                                                                          WriteData(id%10+0x30);                       
  192.                                                                                                          
  193.                                                          }
  194.                                                          else PutStr(1,0,table27);        //采集指纹失败
  195.                                          }
  196.                                          else   if(regist(0)==2)//已经注册过指纹
  197.                                                                          {
  198.                                                                                          PutStr(1,0,table26);        //指纹已经存储
  199.                                                                          }
  200.                                        
  201.                                          PutStr(3,0,table12);        //请按任意键退出
  202.                                          while(keynum()>=16);          
  203.                                          admin_dispay();//管理员设置界面       
  204.                                          key_flag=3;
  205.                                          num=0xff;
  206.                                 }
  207.                                 if(num==2)//删除指纹
  208.                                 {
  209.                                           //只显示“门已打开“
  210.                                          LcmClearTXT();//清屏
  211.            PutStr(1,0,table17);//输入删去的指纹号
  212.            number=0;
  213.                                          key_flag=32;
  214.                                          num=0xff;//防止后面key_flag=32误动作
  215.                                                   
  216.                                 }
  217.                           if(num==3)//按下按键3直接打开锁
  218.                                 {
  219.                                           //只显示“门已打开“
  220.                                          LcmClearTXT();//清屏
  221.            PutStr(1,0,table11);       
  222.                                          relay=0;
  223.                                          Delay(40);
  224.                                          relay=1;
  225.                                          Delay(20);
  226.                                          PutStr(3,0,table12);       
  227.                                          while(keynum()>=16);   
  228.                                          admin_dispay();//管理员设置界面       
  229.                                 }
  230.                                 if(num==4)//修改密码
  231.                                 {
  232.                                           //只显示“门已打开“
  233.                                          LcmClearTXT();//清屏
  234.            PutStr(0,0,table20);//显示请输入新密码
  235.                                          number=0;
  236.                                          key_flag=34;
  237.                                          num=0xff;//防止后面key_flag=32误动作
  238.            code_flag=0;//密码修改标志第一次输入密码时候是等于0再次输入是等于1                                       
  239.                                 }
  240.                  }
  241.                  if((key_flag==32)&&(num!=0xff))//进入删除指纹操作
  242.                  {
  243.                            num=coding(num);//转换成可以识别的
  244.                                  if((number<3)&&(num<10))
  245.                                                 {
  246.                                                         user[number]=num;//用户输入的密码进行记忆
  247.                                                         WriteCommand(0x88+number);                //指定第三行显示位置
  248.                                             WriteData(num+0x30);       
  249.                                                         number++;
  250.                                                 }
  251.                                         if((num=='D')&&(number==3))//按下D键确定按键并且并且输入了3位数号码
  252.                                         {
  253.                                                   if(cancel((user[0]*100+user[1]*10+user[2]))==1)
  254.                                                         {
  255.                                                                  PutStr(0,0,table18);//输入删去的指纹号成功
  256.                                                         }
  257.                                                         else
  258.                                                         {
  259.                                                                  PutStr(0,0,table19);//输入删去的指纹号失败
  260.                                                         }
  261.                                                        
  262.                                                         PutStr(3,0,table12);       
  263.                                             while(keynum()>=16);   
  264.                                             admin_dispay();//管理员设置界面
  265.               number=0;
  266.               key_flag=3;                                                       
  267.                                         }
  268.                  }
  269.                  if((key_flag==34)&&(num!=0xff))//进入删除指纹操作
  270.                  {
  271.                            num=coding(num);//转换成可以识别的
  272.                                  if((number<6)&&(num<10))
  273.                                                 {
  274.                                                         if(code_flag==0)
  275.                                                               user[number]=num;//用户输入第一次的密码进行记忆
  276.                                                   else  user2[number]=num;//用户输入第二次的密码进行记忆
  277.                                                         WriteCommand(0x88+number);                //指定第三行显示位置
  278.                                             WriteData(num+0x30);       
  279.                                                         number++;
  280.                                                 }
  281.                                         if((num=='D')&&(number==6))//按下D键确定按键并且并且输入了6位数密码
  282.                                         {
  283.                                                  LcmClearTXT();//清屏
  284.                                            if(code_flag==0)
  285.                                                          {
  286.                                                                          PutStr(0,0,table21);//显示请再次输入新密码
  287.                                                                          number=0;
  288.                                                                          num=0xff;//防止后面key_flag=32误动作
  289.                                                                          code_flag=1;//密码修改标志第一次输入密码时候是等于0再次输入是等于1               
  290.                                                          }
  291.                                                  else
  292.                                                          {       
  293.                                                                   if((user[0]==user2[0])&&(user[1]==user2[1])&&(user[2]==user2[2])&&(user[3]==user2[3])&&(user[4]==user2[4])&&(user[5]==user2[5]))//如果两次密码一样密码修改成功
  294.                                                                       {
  295.                                                                                                    PutStr(0,0,table22);//修改密码成功
  296.                                                                                                    for(i=0;i<6;i++)    //复制新密码
  297.                                                                                                         now_code[i]=user[i];
  298.                                                                                                    write_data(20,user,6);//进行数据保存
  299.                                                                                         }
  300.                                                                         else
  301.                                                                                   {
  302.                                                                                                    PutStr(0,0,table23);//两次修改密码不一样
  303.                                                                             }
  304.                                                                         PutStr(3,0,table12);       
  305.                                                                         while(keynum()>=16);   
  306.                                                                         admin_dispay();//管理员设置界面
  307.                                                                         number=0;
  308.                                                                         key_flag=3;
  309.                                                          }                                                         
  310.                                         }
  311.                  }
  312. }
  313. void main()       
  314. {  
  315.         for(i=0;i<6;i++)//读取存储器中的密码
  316.      {
  317.                           now_code[i]=read_add(20+i);
  318.               Delay(5);
  319.                  }       
  320.          for(i=0;i<6;i++)
  321.                  {
  322.                           if(now_code[i]>9)
  323.                                 {
  324.                                          i=10;
  325.                                          break;
  326.                                 }
  327.                  }
  328.          if(i>9)//设置初始化密码
  329.          
  330.          {
  331.                     for(i=0;i<6;i++)
  332.                                  {
  333.                                                 now_code[i]=init_code[i];
  334.                                                 Delay(5);
  335. ……………………

  336. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
指纹锁原理图.zip (1.75 MB, 下载次数: 377)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:613538 发表于 2019-9-19 14:03 | 显示全部楼层
感谢楼主,学习了
回复

使用道具 举报

ID:69408 发表于 2019-9-20 12:17 | 显示全部楼层
感谢楼主,下载学习了!!
回复

使用道具 举报

ID:606251 发表于 2019-9-21 08:48 | 显示全部楼层
谢谢分享,感谢楼主
回复

使用道具 举报

ID:443649 发表于 2019-11-16 14:18 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:111376 发表于 2019-11-24 17:27 | 显示全部楼层

谢谢分享,感谢楼主
回复

使用道具 举报

ID:648615 发表于 2019-11-24 20:46 | 显示全部楼层
大老,谢谢了。
回复

使用道具 举报

ID:546589 发表于 2019-11-25 00:17 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:292518 发表于 2019-11-28 23:53 | 显示全部楼层

谢谢分享,感谢楼主
回复

使用道具 举报

ID:652346 发表于 2019-11-29 13:44 | 显示全部楼层
想做个单片机指纹锁,来看看,谢谢楼主
回复

使用道具 举报

ID:654749 发表于 2019-12-2 22:51 | 显示全部楼层
感谢大佬
回复

使用道具 举报

ID:644095 发表于 2019-12-3 09:53 来自手机 | 显示全部楼层
请问一下怎么把密码改成ABC000000
回复

使用道具 举报

ID:208849 发表于 2019-12-3 17:27 | 显示全部楼层
确实不错的分享,不错
回复

使用道具 举报

ID:521247 发表于 2019-12-3 20:07 | 显示全部楼层
楼主好厉害 感谢楼主
回复

使用道具 举报

ID:370638 发表于 2019-12-3 21:12 | 显示全部楼层
crazy_eight 发表于 2019-12-3 09:53
请问一下怎么把密码改成ABC000000

你的可以存指纹吗
回复

使用道具 举报

ID:632402 发表于 2019-12-4 15:40 来自手机 | 显示全部楼层
感谢楼主宝贵的分享!
回复

使用道具 举报

ID:660091 发表于 2019-12-21 18:31 | 显示全部楼层
感谢楼主的分享
回复

使用道具 举报

ID:283591 发表于 2019-12-21 22:58 | 显示全部楼层
快速收藏!!!
回复

使用道具 举报

ID:548607 发表于 2019-12-27 23:33 | 显示全部楼层
请问楼主可以把原理图库和PCB封装库发出来吗?
回复

使用道具 举报

ID:60026 发表于 2020-1-3 16:21 | 显示全部楼层

感谢楼主,学习了!!1
回复

使用道具 举报

ID:682624 发表于 2020-1-7 09:18 | 显示全部楼层

谢谢分享
回复

使用道具 举报

ID:693055 发表于 2020-2-14 09:18 | 显示全部楼层
谢谢分享,感谢楼主
回复

使用道具 举报

ID:697979 发表于 2020-3-9 18:17 | 显示全部楼层
proteus中,指纹模块用什么代替呢,有没有这个电路仿真
回复

使用道具 举报

ID:706454 发表于 2020-3-11 16:05 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:696438 发表于 2020-3-21 00:39 | 显示全部楼层
很好的设计
回复

使用道具 举报

ID:23844 发表于 2020-3-21 09:21 | 显示全部楼层
谢谢分享,感谢楼主
回复

使用道具 举报

ID:608007 发表于 2020-3-21 10:13 | 显示全部楼层
感谢楼主的设计 值得好好学习
回复

使用道具 举报

ID:716703 发表于 2020-4-1 16:34 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:705465 发表于 2020-4-7 09:23 | 显示全部楼层
89c51实际有IIC接口吗?好像没有只能模拟吗?那我要实现怎么弄
回复

使用道具 举报

ID:671874 发表于 2020-4-8 14:29 | 显示全部楼层
楼主 指纹程序用不了
回复

使用道具 举报

ID:692045 发表于 2020-4-30 17:55 | 显示全部楼层
感谢楼主,学习了
回复

使用道具 举报

ID:730070 发表于 2020-5-10 02:03 来自手机 | 显示全部楼层
正是所需要的,51黑果然强大
回复

使用道具 举报

ID:689425 发表于 2020-5-10 13:04 | 显示全部楼层
硬货,感谢楼主分享
回复

使用道具 举报

ID:367724 发表于 2020-5-30 10:03 | 显示全部楼层
然丶并卵灬 发表于 2020-4-8 14:29
楼主 指纹程序用不了

您解决了吗?我也遇到相同问题
回复

使用道具 举报

ID:744327 发表于 2020-5-30 11:00 | 显示全部楼层
感谢楼主,现在社会很实用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表