找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机的指纹密码锁代码

[复制链接]
跳转到指定楼层
楼主
ID:443496 发表于 2018-12-10 17:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1黑币
基于单片机的指纹密码锁程序
  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  0x84
  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. sbit Feng=P2^0;

  20.         
  21. extern unsigned char times[];
  22. uchar  Member=1,sec;

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


  34. uchar Address1=20,tempx=20;
  35. uchar Address2=20;   
  36.         
  37. uchar data K;
  38. uchar data Key;
  39.         
  40. uint PageID;
  41. uchar data querenma=11;
  42. uchar sum[2];
  43. int summaf,summas;

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


  46. void Red_Init(void);

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

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

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

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

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

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

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


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


  974. void guanliyuan()
  975. {
  976.         uchar i,j=0,x=1;
  977.         uchar Right_flag;
  978.         LcmClearTXT();
  979.         PutStr(1,1,"请输入密码:");        
  980.         for(i=0;i<6;i++)mima[i]=0;                                                                        
  981.         Key=Keycan();
  982.         while(Key!=queren)
  983.         {
  984.                 Key=Keycan();
  985.                 KeyDeal(Key);
  986.                 delay(30);                                                              
  987.                 if(Key==0)K=10;
  988.                 if((K>=0)&&(K<=9))
  989.                 {
  990.                         mima[j]=K;
  991.                         
  992.                         if(j<6)
  993.                         {        
  994.                                 WriteCommand(0x89+j);                //指定第三行显示位置
  995.                                 WriteData(0x0f);               
  996.                         }
  997.                         ++j;
  998.                         if(j==7)
  999.                         j=6;                                                                                                  
  1000.                 }   //显示LCD12864并行显示
  1001.                 if(K==34)                //按了删除键
  1002.                 {
  1003.                         if(j==0)
  1004.                         {
  1005.                                 WriteCommand(0x89);                //指定第三行显示位置
  1006.                                 WriteData(0x20);
  1007.                         }
  1008.                         else
  1009.                         {
  1010.                                 --j;
  1011.                                 WriteCommand(0x89+j);            //指定第三行显示位置
  1012.                                 WriteData(0x20);
  1013.                         }
  1014.                 }
  1015.         }
  1016.         LcmClearTXT();
  1017.         for(i=0;i<6;i++)
  1018.         {
  1019.                 UserPassword[i]=mima[i]+0x30;
  1020.         }
  1021.         if(j==6)
  1022.         {
  1023.                 Right_flag=Chack(0);
  1024.         }
  1025.         if(Right_flag==1)
  1026.         {
  1027.                 Right_flag=0;
  1028.                 Feng=1;
  1029.                 while(Keycan()!=tuichu)
  1030.                 {         
  1031.                         PutStr(0,0,"按键1 : 增加指纹");
  1032.                         PutStr(1,0,"按键2 : 删去指纹");
  1033.                         PutStr(2,0,"按键3 : 手动开锁");
  1034.                         PutStr(3,0,"按键4 : 修改密码");
  1035.                         KeyDeal(Keycan());  
  1036.                         switch(K)
  1037.                         {
  1038.                                 case 1:    addfinger();K=6; break;
  1039.                                 case 2:    deletfinger();    break;
  1040.                                 case 3:         zhu();        K=8;  break;
  1041.                                 case 4:    gaimima();        break;
  1042.                                 default: break;
  1043.                         }
  1044.                 }
  1045.         }
  1046.         else
  1047.         {
  1048.                 PutStr(1,2,"密码错误");
  1049.                 PutStr(2,0,"  请重新操作!");
  1050.                 PutStr(3,0,"  按任意键继续");
  1051.                 Feng=0;
  1052.                 while(Keycan()==0);
  1053.         }
  1054.         Key=0;
  1055.         LcmClearTXT();
  1056. }

  1057. void fan()

  1058. {
  1059. //        PutStr(1,2,"请先按键");
  1060. //        PutStr(2,2,"再刷指纹");
  1061.         PutStr(0,2,"欢迎使用");
  1062.         PutStr(1,1,"指纹门禁系统");
  1063.         PutStr(3,1,"请按手指开锁");
  1064.   Key=Keycan();
  1065. if(k2==1)                //指纹刷机
  1066.   {
  1067.           LcmClearTXT();
  1068.         shuazhiwen();
  1069.         LcmClearTXT();
  1070.   }
  1071.   if(Key==0x81)                        //管理员操作
  1072.   {
  1073.         LcmClearTXT();
  1074.         guanliyuan();
  1075.     LcmClearTXT();
  1076.   }

  1077. }        
  1078.      
  1079. void main()
  1080. {         

  1081. //PSB=0;
  1082.         UART_Init();           //串口初始化                  
  1083.           x24c02_init();     //24C02初始化
  1084.         LcmInit();               //LCD12864初始化                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
  1085.         LcmClearTXT();           //LCD12864清屏        
  1086.         while(1)
  1087.                 {
  1088.                         fan();
  1089.                         delay(100);                  
  1090.                 }        
  1091. }
复制代码


1-程序.rar

154.11 KB, 下载次数: 32, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:1 发表于 2018-12-10 18:05 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

板凳
ID:438823 发表于 2018-12-20 22:00 | 只看该作者
楼主    管理员密码是啥
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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