找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3000|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机的指纹识别密码锁设计资料

[复制链接]
跳转到指定楼层
楼主
基于单片机的指纹识别密码锁设计,从电路设计,元件讲解,焊接制作,再到文档,一站囊括,值得拥有!


电路原理图如下:


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include"24C0x.h"
  4. #include"LCD12864.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. #define buffer1ID  0x01
  8. #define buffer2ID  0x02
  9. #define queren  0x88
  10. #define tuichu  0x85
  11. #define shanchu 0x82

  12. #define User 1                                     

  13. void fan();
  14.         
  15. sbit B0=B^0;
  16. sbit B7=B^7;
  17. sbit k2=P3^7;
  18. sbit jidianqi=P3^6;

  19.         
  20. extern unsigned char times[];
  21. uchar  Member=0,sec;

  22. uchar  code buffer[User][6]=
  23. {
  24. {"000000"}
  25. };
  26.         
  27.         
  28. uchar dz[4];
  29. uchar time[4];                         
  30. uchar mima[6];
  31. uchar mimag[6];
  32. uchar mimaID[6]={1,2,3,4,5,6};


  33. uchar Address1=20,tempx=20;
  34. uchar Address2=20;   
  35.         
  36. uchar data K;
  37. uchar data Key;
  38. uchar data nums; //密码错误次数计数
  39. ucha  data  keyoff; //是否禁止按键
  40.         
  41. uint PageID;
  42. uchar data querenma=11;
  43. uchar sum[2];
  44. int summaf,summas;

  45. uchar  xdata UserPassword[7]={0};//密码
  46. uchar  xdata DSY_BUFFER[16] ={0};//缓存


  47. void Red_Init(void);

  48. //检测脉冲宽度
  49. unsigned char check(void);

  50. unsigned char redchange(unsigned char rednum);
  51.         

  52. void delayms(unsigned int z)
  53. {
  54.         unsigned int x,y;
  55.         for(x=z;x>0;x--)
  56.                 for(y=110;y>0;y--);
  57. }

  58. /********************************************************************
  59. * 名称 : Chack(uchar User_Number)
  60. * 功能 : 单一用户密码检测
  61. * 输入 : User_Number
  62. * 输出 : 密码正确与错误,错误返回0,正确返回1
  63. ********************************************************************/
  64. uchar Chack(uchar User_Number)
  65. {
  66.         uchar flag, i,temp[6],Address;
  67.         Address=User_Number*10;
  68.         for(i=0;i<6;i++)
  69.         {
  70.                 temp[i]=x24c02_read(Address);
  71.                 delayms(10);
  72.                 Address++;
  73.         }
  74.         for(i=0;i<6;i++)
  75.         {
  76.                 if(temp[i]==UserPassword[i])
  77.                         flag=1;
  78.                 else        
  79.                         flag=0;               
  80.         }
  81.                 return flag;
  82. }

  83. /********************************************************************
  84. * 名称 : PassWord_Chack()
  85. * 功能 : 所有用户密码检测
  86. * 输入 : 无
  87. * 输出 : 密码正确与错误,错误返回0,正确返回1
  88. ********************************************************************/
  89. uchar PassWord_Chack()
  90. {
  91.         uchar i=0;
  92.         while(i<User)
  93.         {
  94.                 if(Chack(i)==2)
  95.                 {
  96.                         Member=i+2;
  97.                         return 1;
  98.                 }
  99.                 i++;       
  100.         }
  101.         return 0;       
  102. }
  103.    
  104. void delay(uint tt)
  105. {  uchar i;
  106.    while(tt--)
  107.    {
  108.    for(i=0;i<125;i++);
  109.    }
  110. }
  111. /********************************************************************
  112. * 名称 : UART_Init()
  113. * 功能 : 单片机串口初始化
  114. * 单片机:晶振11.0592MHz 波特率为9600bps
  115. * 指纹模块:波特率为9600bps,
  116. ********************************************************************/        
  117. void UART_Init()
  118. {
  119.         SCON= 0x50;               //串口方式1        //REN=1; 允许接收
  120.         PCON=0x01;                //SMOD=0
  121.         TMOD= 0x01;               //定时器1定时方式2
  122.         TH1= 0xFD;                //11.0592MHz  模块默认波特率为9600bps
  123.         TL1= 0xFD;                                                                                 
  124.         TR0= 1;                   //启动定时器
  125.         EA=1;      
  126. }
  127.    
  128. unsigned char Keycan(void) //按键扫描程序 P1.0--P1.3为行线 P1.4--P1.7为列线
  129. {
  130.         unsigned char rcode, ccode;
  131.         P1 = 0xF0;      // 发全0行扫描码,列线输入
  132.         if((P1&0xF0) != 0xF0) // 若有键按下
  133.         {
  134.                 delay(1);// 延时去抖动
  135.                 if((P1&0xF0) != 0xF0)
  136.                 {  
  137.                         rcode = 0xef;         // 逐行扫描初值
  138.                         while((rcode&0x10) != 0)
  139.                         {
  140.                                 P1 = rcode;         // 输出行扫描码
  141.                                 if((P1&0xF0) != 0xF0) // 本行有键按下
  142.                                 {
  143.                                         ccode = (P1&0xF0)|0x0F;
  144.                                         //do{;}
  145.                                         while((P1&0xF0) != 0xF0); //等待键释放
  146.                                         return ((~rcode) + (~ccode)); // 返回键编码
  147.                                 }
  148.                                 else
  149.                                 rcode = (rcode<<1)|0x01; // 行扫描码左移一位
  150.                         }
  151.                 }
  152.         }  
  153.         return 0; // 无键按下,返回值为0
  154. }
  155.         
  156. void KeyDeal(unsigned char Key)
  157. {  //unsigned char n;
  158.    if(Key!=0)
  159. {
  160.                    switch(Key)
  161.                    {
  162.                    case 0x12: K=1; break;         
  163.                    case 0x22: K=2; break;  
  164.                    case 0x42: K=3; break;  
  165.                    case 0x82: break;      
  166.                    case 0x13: K=4; break;
  167.                    case 0x23: K=5; break;
  168.                    case 0x43: K=6; break;
  169.                    case 0x83: K=34;break;               
  170.                    case 0x14: K=7; break;
  171.                    case 0x24: K=8; break;
  172.                    case 0x44: K=9; break;
  173.                    case 0x84: break;               
  174.                    case 0x18: break;               
  175.                    case 0x28: K=0; break;
  176.                    case 0x48: K=11; break;
  177.                    case 0x88: break;               
  178.                    default: break;
  179.                    }
  180.   }
  181. }
  182.         
  183.      
  184.         
  185. //*************************************//
  186. void SFG_GetEcho()                              //握手
  187. {
  188.    uchar i;
  189.    SBUF=0xef;
  190.    while(TI==0);
  191.    TI=0;
  192.    SBUF=0X01;
  193.    while(TI==0);
  194.    TI=0;
  195.         
  196.    SBUF=0XFF;
  197.    while(TI==0);
  198.    TI=0;
  199.    SBUF=0XFF;
  200.    while(TI==0);
  201.    TI=0;
  202.    SBUF=0XFF;
  203.    while(TI==0);
  204.    TI=0;
  205.    SBUF=0XFF;
  206.    while(TI==0);
  207.    TI=0;
  208.         
  209.    SBUF=0X01;
  210.    while(TI==0);
  211.    TI=0;
  212.         
  213.    SBUF=0X00;
  214.    while(TI==0);
  215.    TI=0;
  216.    SBUF=0X03;
  217.    while(TI==0);
  218.    TI=0;
  219.         
  220.    SBUF=0X53;
  221.    while(TI==0);
  222.    TI=0;
  223.          
  224.    SBUF=0X00;
  225.    while(TI==0);
  226.    TI=0;
  227.    summaf=0x57;
  228.    SBUF=summaf;
  229.    while(TI==0);
  230.    TI=0;
  231.         
  232.    for(i=0;i<9;i++)
  233.    {
  234.     while(RI==0);
  235.     RI=0;}
  236.         
  237.    while(RI==0);
  238.    RI=0;
  239.    querenma=SBUF;
  240.    while(RI==0);
  241.    RI=0;
  242.    sum[1]=SBUF;
  243.    while(RI==0);
  244.    RI=0;
  245.    sum[0]=SBUF;
  246.    summas=(sum[1]<<8)+sum[0];                                                                         
  247. }

  248.         
  249. //***************************************//
  250.         
  251. void SFG_getimage()                              //录入指纹图像
  252. {
  253.    uchar i;
  254.    SBUF=0xef;
  255.    while(TI==0);
  256.    TI=0;
  257.    SBUF=0X01;
  258.    while(TI==0);
  259.    TI=0;
  260.         
  261.    SBUF=0XFF;
  262.    while(TI==0);
  263.    TI=0;
  264.    SBUF=0XFF;
  265.    while(TI==0);
  266.    TI=0;
  267.    SBUF=0XFF;
  268.    while(TI==0);
  269.    TI=0;
  270.    SBUF=0XFF;
  271.    while(TI==0);
  272.    TI=0;
  273.         
  274.    SBUF=0X01;
  275.    while(TI==0);
  276.    TI=0;
  277.         
  278.    SBUF=0X00;
  279.    while(TI==0);
  280.    TI=0;
  281.    SBUF=0X03;
  282.    while(TI==0);
  283.    TI=0;
  284.         
  285.    SBUF=0X01;
  286.    while(TI==0);
  287.    TI=0;
  288.         
  289.    SBUF=0X00;
  290.    while(TI==0);
  291.    TI=0;
  292.    summaf=0x05;
  293.    SBUF=summaf;
  294.    while(TI==0);
  295.    TI=0;
  296.         
  297.    for(i=0;i<9;i++)
  298.    {
  299.     while(RI==0);
  300.     RI=0;}
  301.         
  302.    while(RI==0);
  303.    RI=0;
  304.    querenma=SBUF;
  305.    while(RI==0);
  306.    RI=0;
  307.    sum[1]=SBUF;
  308.    while(RI==0);
  309.    RI=0;
  310.    sum[0]=SBUF;
  311.    summas=(sum[1]<<8)+sum[0];                                                                         
  312. }
  313.         
  314. void SFG_genchar(uchar bufferID) //生成特征并存于charbuffer1/2  调用后单片机波特率变化@@@
  315. {
  316.    uchar i;
  317.    SBUF=0xef;
  318.    while(TI==0);
  319.    TI=0;
  320.    SBUF=0X01;
  321.    while(TI==0);
  322.    TI=0;
  323.         
  324.    SBUF=0XFF;
  325.    while(TI==0);
  326.    TI=0;
  327.    SBUF=0XFF;
  328.    while(TI==0);
  329.    TI=0;
  330.    SBUF=0XFF;
  331.    while(TI==0);
  332.    TI=0;
  333.    SBUF=0XFF;
  334.    while(TI==0);
  335.    TI=0;
  336.         
  337.    SBUF=0X01;
  338.    while(TI==0);
  339.    TI=0;
  340.         
  341.    SBUF=0X00;
  342.    while(TI==0);
  343.    TI=0;
  344.    SBUF=0X04;
  345.    while(TI==0);
  346.    TI=0;
  347.         
  348.    SBUF=0X02;
  349.    while(TI==0);
  350.    TI=0;
  351.         
  352.    SBUF=bufferID;
  353.    while(TI==0);
  354.    TI=0;
  355.         
  356.    summaf=0x07+bufferID;
  357.    sum[0]=summaf;
  358.    sum[1]=summaf>>8;
  359.    SBUF=sum[1];
  360.    while(TI==0)
  361.    TI=0;
  362.    SBUF=sum[0];
  363.    while(TI==0)
  364.    TI=0;
  365.         
  366.    for(i=0;i<9;i++)
  367.    {
  368.     while(RI==0);
  369.     RI=0;}
  370.    while(RI==0);
  371.    RI=0;
  372.    querenma=SBUF;
  373.    while(RI==0);
  374.    RI=0;
  375.    sum[1]=SBUF;
  376.    while(RI==0);
  377.    RI=0;
  378.    sum[0]=SBUF;
  379.    summas=(sum[1]<<8)+sum[0];                                                                         
  380. }

  381. void SFG_fastsearch(uchar bufferID)  //搜索指纹返回指纹ID号   sum、pagenum>255都会使程序卡@@@
  382. {
  383.    uchar i,ID1,ID2;
  384.    SBUF=0xef;
  385.    while(TI==0);
  386.    TI=0;
  387.    SBUF=0X01;
  388.    while(TI==0);
  389.    TI=0;
  390.    SBUF=0XFF;
  391.    while(TI==0);
  392.    TI=0;
  393.    SBUF=0XFF;
  394.    while(TI==0);
  395.    TI=0;
  396.    SBUF=0XFF;
  397.    while(TI==0);
  398.    TI=0;
  399.    SBUF=0XFF;
  400.    while(TI==0);
  401.    TI=0;
  402.         
  403.    SBUF=0X01;
  404.    while(TI==0);
  405.    TI=0;
  406.         
  407.    SBUF=0X00;
  408.    while(TI==0);
  409.    TI=0;
  410.    SBUF=0X08;
  411.    while(TI==0);
  412.    TI=1;
  413.         
  414.    SBUF=0X1b;
  415.    while(TI==0);
  416.    TI=0;
  417.         
  418.    SBUF=bufferID;
  419.    while(TI==0);
  420.    TI=0;
  421.         
  422.    SBUF=0X00;
  423.    while(TI==0);
  424.    TI=0;
  425.    SBUF=0;
  426.    while(TI==0);
  427.    TI=0;
  428.         
  429.    SBUF=0X00;
  430.    while(TI==0);
  431.    TI=0;
  432.    SBUF=180;
  433.    while(TI==0);
  434.    TI=0;
  435.         
  436.    summaf=9+0x1b+bufferID+180;
  437.    sum[0]=summaf;
  438.    sum[1]=summaf>>8;
  439.    SBUF=sum[1];
  440.    while(TI==0);
  441.    TI=1;
  442.    SBUF=sum[0];
  443.    while(TI==0);
  444.    TI=0;
  445.         
  446.    for(i=0;i<9;i++)
  447.    {
  448.     while(RI==0);
  449.     RI=0;}
  450.                 
  451.    while(RI==0);
  452.    RI=0;
  453.    querenma=SBUF;
  454.         
  455.    while(RI==0);
  456.    RI=0;
  457.    ID1=SBUF;
  458.    while(RI==0);
  459.    RI=0;
  460.    ID2=SBUF;                                  //接收到的ID号
  461.    while(RI==0);
  462.    RI=0;
  463.    while(RI==0);
  464.    RI=0;
  465.         
  466.    while(RI==0);
  467.    RI=0;
  468.    sum[1]=SBUF;
  469.    while(RI==0);
  470.    RI=1;
  471.    sum[0]=SBUF;
  472.    summas=(sum[1]<<8)+sum[0];                                                                         
  473.    //PageID=ID1;
  474.    PageID=(ID1<<8)+ID2;
  475. }
  476.         
  477. void SFG_enroll()                                 //自动注册模板返回存储ID  =录图像+合并生成模板+储存模板
  478. {
  479.    uchar i,ID1,ID2;
  480.    SBUF=0xef;
  481.    while(TI==0);
  482.    TI=1;
  483.    SBUF=0X01;
  484.    while(TI==0);
  485.    TI=0;
  486.         
  487.    SBUF=0XFF;
  488.    while(TI==0);
  489.    TI=0;
  490.    SBUF=0XFF;
  491.    while(TI==0);
  492.    TI=0;
  493.    SBUF=0XFF;
  494.    while(TI==0);
  495.    TI=0;
  496.    SBUF=0XFF;
  497.    while(TI==0);
  498.    TI=0;
  499.         
  500.    SBUF=0X01;
  501.    while(TI==0);
  502.    TI=0;
  503.         
  504.    SBUF=0X00;
  505.    while(TI==0);
  506.    TI=0;
  507.    SBUF=0X03;
  508.    while(TI==0);
  509.    TI=0;
  510.         
  511.    SBUF=0X10;
  512.    while(TI==0);
  513.    TI=0;
  514.            
  515.    SBUF=0X00;
  516.    while(TI==0);
  517.    TI=0;
  518.    summaf=0x14;
  519.    SBUF=summaf;           //校验和
  520.    while(TI==0);
  521.    TI=0;
  522.         
  523.    for(i=0;i<9;i++)
  524.    {
  525.     while(RI==0);
  526.     RI=1;}
  527.    while(RI==0);
  528.    RI=0;
  529.    querenma=SBUF;
  530.    while(RI==0);
  531.    RI=0;
  532.    ID1=SBUF;
  533.    while(RI==0);
  534.    RI=0;
  535.    ID2=SBUF;
  536.         
  537.    while(RI==0);
  538.    RI=0;
  539.    sum[1]=SBUF;
  540.    while(RI==0);
  541.    RI=0;
  542.    sum[0]=SBUF;
  543.    summas=(sum[1]<<8)+sum[0];                                                                         
  544.    //PageID=ID1;
  545.    PageID=(ID1<<8)+ID2;
  546. }
  547. void SFG_deletchar(uint pageID)   //删除指纹                     校验和在2字节的页码处应分高低字节相加
  548. {
  549.    uchar i,ID1,ID2;
  550.    SBUF=0xef;
  551.    while(TI==0);
  552.    TI=0;
  553.    SBUF=0X01;
  554.    while(TI==0);
  555.    TI=0;
  556.         
  557.    SBUF=0XFF;
  558.    while(TI==0);
  559.    TI=0;
  560.    SBUF=0XFF;
  561.    while(TI==0);
  562.    TI=1;
  563.    SBUF=0XFF;
  564.    while(TI==0);
  565.    TI=0;
  566.    SBUF=0XFF;
  567.    while(TI==0);
  568.    TI=0;
  569.         
  570.    SBUF=0X01;
  571.    while(TI==0);
  572.    TI=0;
  573.         
  574.    SBUF=0X00;
  575.    while(TI==0);
  576.    TI=0;
  577.    SBUF=0X07;
  578.    while(TI==0);
  579.    TI=0;
  580.         
  581.    SBUF=0X0c;
  582.    while(TI==0);
  583.    TI=0;
  584.         
  585.    ID1=pageID;ID2=pageID>>8;
  586.    SBUF=ID2;
  587.    while(TI==0);
  588.    TI=0;
  589.    SBUF=ID1;
  590.    while(TI==0);
  591.    TI=0;
  592.         
  593.    SBUF=0X00;
  594.    while(TI==0);
  595.    TI=0;
  596.    SBUF=1;
  597.    while(TI==0);
  598.    TI=0;
  599.         
  600.    summaf=0x15+ID1+ID2;
  601.    sum[0]=summaf;
  602.    sum[1]=summaf>>8;
  603.    SBUF=sum[1];
  604.    while(TI==0);
  605.    TI=0;
  606.    SBUF=sum[0];
  607.    while(TI==0);
  608.    TI=0;
  609.         
  610.    for(i=0;i<9;i++)
  611.    {
  612.     while(RI==0);
  613.     RI=0;}
  614.    while(RI==0);
  615.    RI=0;
  616.    querenma=SBUF;
  617.    while(RI==0);
  618.    RI=0;
  619.    sum[1]=SBUF;
  620.    while(RI==0);
  621.    RI=0;
  622.    sum[0]=SBUF;
  623.    summas=(sum[1]<<8)+sum[0];                                                                         
  624. }
  625.    
  626. void SFG_identify()                                //自动验证指纹     录图像+生成特征+搜索
  627. {
  628.    uchar i,ID1,ID2;
  629.    SBUF=0xef;
  630.    while(TI==0);
  631.    TI=0;
  632.    SBUF=0X01;
  633.    while(TI==0);
  634.    TI=0;
  635.         
  636.    SBUF=0XFF;
  637.    while(TI==0);
  638.    TI=0;
  639.    SBUF=0XFF;
  640.    while(TI==0);
  641.    TI=0;
  642.    SBUF=0XFF;
  643.    while(TI==0);
  644.    TI=0;
  645.    SBUF=0XFF;
  646.    while(TI==0);
  647.    TI=1;
  648.         
  649.    SBUF=0X01;
  650.    while(TI==0);
  651.    TI=0;
  652.         
  653.    SBUF=0X00;
  654.    while(TI==0);
  655.    TI=0;
  656.    SBUF=0X03;
  657.    while(TI==0);
  658.    TI=0;
  659.         
  660.    SBUF=0X11;
  661.    while(TI==0);
  662.    TI=0;
  663.            
  664.    SBUF=0X00;
  665.    while(TI==0);
  666.    TI=0;
  667.    summaf=0x15;
  668.    SBUF=summaf;           //校验和
  669.    while(TI==0);
  670.    TI=0;
  671.         
  672.    for(i=0;i<9;i++)
  673.    {
  674.     while(RI==0);
  675.     RI=0;}
  676.    while(RI==0);
  677.    RI=0;
  678.    querenma=SBUF;
  679.    while(RI==0);
  680.    RI=0;
  681.    ID1=SBUF;
  682.    while(RI==0);
  683.    RI=0;
  684.    ID2=SBUF;
  685.         
  686.    while(RI==0);
  687.    RI=0;
  688.    while(RI==0);
  689.    RI=0;                          //得分
  690.         
  691.    while(RI==0);
  692.    RI=0;
  693.    sum[1]=SBUF;
  694.    while(RI==0);
  695.    RI=0;
  696.    sum[0]=SBUF;
  697.    summas=(sum[1]>>8)+sum[0];                                                                         
  698.    //PageID=ID1;
  699.    PageID=(ID1>>8)+ID2;
  700. }
  701. void shuazhiwen()
  702. {
  703.     uchar IDs1,IDs2,IDs3;         
  704.         LcmClearTXT();
  705.         PutStr(1,1,"请按手指开锁");      
  706.         SFG_identify();
  707.         while(querenma==2)
  708.         SFG_identify();
  709.         if(querenma==0)
  710.    {
  711.                 LcmClearTXT();
  712.                 PutStr(1,2,"门已打开");
  713.                 IDs1=PageID/100;
  714.                 IDs2=PageID/10%10;
  715.                 IDs3=PageID%10;
  716.                 PutStr(2,1,"编号为:");
  717.                 WriteCommand(0x8D);                //指定第三行显示位置
  718.                 WriteData(0x30+IDs1);
  719.                 WriteData(0x30+IDs2);
  720.                 WriteData(0x30+IDs3);
  721.                 jidianqi=0;
  722.                 delay(2500);
  723.                 jidianqi=1;       
  724.                  
  725.                 // nums=0;
  726.                 // keyoff=0;
  727.         }
  728.            else if(querenma==9)
  729.                 {
  730.                         LcmClearTXT();
  731.                         PutStr(1,1,"没搜索到指纹");
  732.                         PutStr(2,1,"请重新按手指");
  733.                 }
  734.                    else
  735.                 {
  736.                         LcmClearTXT();
  737.                         PutStr(1,1,"接收包出错");
  738.                 }
  739.                 delay(2000);
  740.    //         while(Keycan()==0);
  741. }
  742. void addfinger()
  743. {
  744.         uchar IDa1,IDa2,IDa3;
  745.         LcmClearTXT();
  746.         PutStr(1,2,"请按手指");   
  747.         SFG_getimage();         //录入指纹图像
  748.         while(querenma!=0)          //=0表示录入成功
  749.         SFG_getimage();
  750.         SFG_genchar(buffer1ID);          //生成特征并存buffer1
  751.         UART_Init();                           //串口初始化
  752.         SFG_fastsearch(buffer1ID);          //快速搜索指纹
  753.         while(querenma==1)                        //=1表示收包有错 =0 表示搜索到
  754.         SFG_fastsearch(buffer1ID);
  755.         if(querenma==0)
  756.         {
  757.                 LcmClearTXT();
  758.                 PutStr(1,1,"该指纹已存储");
  759.                 PutStr(3,0,"  按任意键继续");
  760.             while(Keycan()==0);          //按键搜索
  761.         }
  762.         else if(querenma==9)
  763.                 {
  764.                         LcmClearTXT();
  765.                         PutStr(1,1,"请再次按手指");
  766.                         SFG_enroll();          //自动注册模板返回存储ID  =录图像+合并生成模板+储存模板
  767.                         while(querenma==2)
  768.                         SFG_enroll();
  769.                         LcmClearTXT();
  770.                         if(querenma==0)
  771.                         {
  772.                                 IDa1=PageID/100;
  773.                                 IDa2=PageID/10%10;
  774.                                 IDa3=PageID%10;
  775.                                 PutStr(1,1,"指纹采集成功");
  776.                                 PutStr(2,1,"编号为:");
  777.                                 WriteCommand(0x8D);
  778.                                 WriteData(0x30+IDa1);
  779.                                 WriteData(0x30+IDa2);
  780.                                 WriteData(0x30+IDa3);
  781.                           }
  782.                   else if(querenma!=0)
  783.                           {
  784.                                 PutStr(1,1,"指纹采集失败");
  785.                                 PutStr(2,1,"请重新操作");
  786.                          }
  787.                 PutStr(3,0,"  按任意键继续");
  788.             while(Keycan()==0);
  789.                    }
  790.         LcmClearTXT();
  791. }
  792. void deletfinger()
  793. {
  794.         uchar i,j=0;
  795.         LcmClearTXT();
  796.         PutStr(1,0,"输入删去的指纹号");
  797.         for(i=0;i<5;i++)
  798.            dz[i]=0;       
  799.            Key=Keycan();
  800.            while(Key!=queren)
  801.            {
  802.              Key=Keycan();
  803.              KeyDeal(Key);
  804.              delay(30);                                                              //按键有抖动@@@
  805.              if(Key==0)K=10;
  806.              if((K>=0)&&(K<=9))
  807.              {
  808.               dz[j]=K;
  809.                   if(j<3)
  810.                   {       
  811.                                 WriteCommand(0x88+j);                //指定第三行显示位置
  812.                                 WriteData(0x30+dz[j]);       
  813.                   }
  814.               ++j;
  815.                   if(j==4)
  816.               j=3;                                                                                                   //@@#yinhuang         固定显示3位
  817.              }   //显示LCD12864并行显示
  818.                  if(K==34)                //按了删除键
  819.                   {
  820.                     if(j==0)
  821.                         {
  822.                                 WriteCommand(0x88);                //指定第三行显示位置
  823.                                 WriteData(0x20);                 //写入空白符
  824.                         }
  825.                         else
  826.                         {
  827.                                 --j;
  828.                                 WriteCommand(0x88+j);            //指定第三行显示位置
  829.                                 WriteData(0x20);
  830.                         }
  831.                 }
  832.         }
  833.         if(j>=2)           //生成指纹的编号,以便删除
  834.         PageID=dz[2]+dz[1]*10+dz[0]*100;
  835.         if(j==1)
  836.         PageID=dz[1]+dz[0]*10;
  837.         if(j==0)
  838.         PageID=dz[0];
  839.         SFG_deletchar(PageID);
  840.         if(querenma==1)
  841.         {
  842.                 LcmClearTXT();
  843.                 PutStr(1,1,"删去指纹号成功!");
  844.         }
  845.         else
  846.         {
  847.                 LcmClearTXT();
  848.                 PutStr(1,2,"删去指纹号失败!");  
  849.         }
  850.         PutStr(2,0,"  按任意键继续");
  851.         while(Keycan()==0);
  852.         LcmClearTXT();
  853. }
  854.         
  855. void gaimima()
  856. {
  857.         uchar i,j=0,mima1[4],mima2[4];
  858.         uchar k,temp;
  859.         LcmClearTXT();
  860.         PutStr(1,1,"请输入新密码");
  861.         for(i=0;i<6;i++)mima1[i]=0;        //6位密码                                                               
  862.            Key=Keycan();
  863.       while(Key!=queren)
  864.            {
  865.              Key=Keycan();
  866.              KeyDeal(Key);        //验证矩阵键盘对应的数字编号
  867.              delay(30);                                                             
  868.              if(Key==0)K=10;
  869.              if((K>=0)&&(K<=9))
  870.              {
  871.               mima1[j]=K;
  872.                   if(j<6)
  873.                   {       
  874.                                 WriteCommand(0x89+j);                //指定第三行显示位置
  875.                                 WriteData(0x0f);          //*号
  876.                   }
  877.               ++j;
  878.                   if(j==7)
  879.               j=6;                                                                                                   //@@#yinhuang
  880.              }   //显示LCD12864并行显示
  881.                  if(K==34)                //按了删除键
  882.                   {
  883.                     if(j==0)
  884.                         {
  885.                                 WriteCommand(0x89);                //指定第三行显示位置
  886.                                 WriteData(0x20);   //写入空白符
  887.                         }
  888.                         else
  889.                         {
  890.                                 --j;
  891.                                 WriteCommand(0x89+j);            //指定第三行显示位置
  892.                                 WriteData(0x40);        //@
  893.                         }
  894.                 }
  895.         }
  896.         LcmClearTXT();
  897.         LcmClearTXT();
  898.         j=0;
  899.         PutStr(1,0,"请再次输入新密码");
  900.         for(i=0;i<6;i++)mima2[i]=0;                                                                       
  901.            Key=Keycan();
  902.       while(Key!=queren)
  903.            {
  904.              Key=Keycan();
  905.              KeyDeal(Key);
  906.              delay(30);                                                             
  907.              if(Key==0)K=10;
  908.              if((K>=0)&&(K<=9))
  909.              {
  910.               mima2[j]=K;
  911.                   if(j<6)
  912.                   {               
  913.                                 WriteCommand(0x89+j);                //指定第三行显示位置
  914.                                 WriteData(0x0f);       
  915.                   }
  916.               ++j;
  917.                   if(j==7)
  918.               j=6;                                                                                                   //@@#yinhuang
  919.              }   //显示LCD12864并行显示
  920.                  if(K==34)                //按了删除键
  921.                   {
  922.                     if(j==0)
  923.                         {
  924.                                 WriteCommand(0x89);                //指定第三行显示位置
  925.                                 WriteData(0x20);
  926.                         }
  927.                         else
  928.                         {
  929.                                 --j;
  930.                                 WriteCommand(0x89+j);            //指定第三行显示位置
  931.                                 WriteData(0x20);
  932.                         }
  933.                 }
  934.         }
  935.         LcmClearTXT();
  936.         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]))
  937.         {
  938.                 for(i=0;i<6;i++)
  939.                 mimaID[i]=mima1[i];          //将修改的密码存储到mimaID里
  940.                 /////////////////////////////////////////////////////
  941.                 for(i=0;i<6;i++)           //密码限制在6位以内
  942.                 {
  943.                         UserPassword[i]=mima1[i]+0x30;    //以ASCII码方式存储密码                             
  944.                 }
  945.                 temp=(Member-1)*100;          // ??
  946.                 delayms(5);
  947.                 for(k=1;k<6;k++)
  948.                 {
  949.                         x24c02_write(temp,UserPassword[k]);          //存入到24c02存储器中
  950.                         delayms(10);
  951.                         temp++;
  952.                 }  
  953.                 //////////////////////////////////////////////////////
  954.                 PutStr(0,1,"密码修改成功");
  955.                 PutStr(3,0,"  按任意键继续");
  956.                 while(Keycan()==0);
  957.         }
  958.         else
  959.         {
  960.                 PutStr(0,0,"  密码修改失败  ");
  961.                 PutStr(1,0,"两次输入的密码不");
  962.                 PutStr(2,0,"一致,请重新操作");      
  963.                 PutStr(3,0,"  按任意键继续");
  964.                 while(Keycan()==0);
  965.         }
  966.         LcmClearTXT();
  967. }


  968. void zhu()
  969. {           
  970.     LcmClearTXT();
  971.         PutStr(1,2,"门已打开");
  972.            jidianqi=0;
  973.         delay(2500);
  974.         jidianqi=1;
  975.         PutStr(3,0,"  按任意键继续");
  976.         while(Keycan()==0);
  977. }


  978. void guanliyuan()  //管理员密码打开
  979. { uchar i,j=0,x=1;
  980.            uchar Right_flag;
  981.      LcmClearTXT();
  982.                 PutStr(1,1,"请输入密码:");       
  983.            for(i=0;i<6;i++)mima[i]=0;               
  984. // if(keyoff==0)         //禁止按键
  985.            Key=Keycan();
  986.       while(Key!=queren)
  987.            {
  988.              Key=Keycan();
  989.              KeyDeal(Key);
  990.              delay(30);                                                             
  991.              if(Key==0)K=10;
  992.              if((K>=0)&&(K<=9))
  993.              {
  994.               mima[j]=K;

  995.                   if(j<6)
  996.                   {       
  997.                    WriteCommand(0x89+j);                //指定第三行显示位置
  998. ……………………

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

所有资料51hei提供下载:

指纹识别密码锁 LCD12864资料3.7z

9.38 MB, 下载次数: 50, 下载积分: 黑币 -5

指纹识别密码锁 LCD12864资料2.7z

3.63 MB, 下载次数: 45, 下载积分: 黑币 -5

指纹识别密码锁 LCD12864资料1.7z

4.05 MB, 下载次数: 50, 下载积分: 黑币 -5

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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