標(biāo)題: 單片機(jī)指紋密碼鎖電路原理圖+源程序+實(shí)物制作 [打印本頁(yè)]

作者: kruijie0422    時(shí)間: 2018-5-23 19:45
標(biāo)題: 單片機(jī)指紋密碼鎖電路原理圖+源程序+實(shí)物制作
這是一個(gè)基于STC89C52的指紋識(shí)別和鍵盤(pán)密碼鎖。
里面包括程序,原理圖,pcb圖,原件清單和實(shí)物圖。
請(qǐng)多多指教。


電路原理圖如下:



指紋密碼鎖元件清單
1)    9*15萬(wàn)用板
2)    指紋傳感器
3)    40腳IC座
4)    stc89c51單片機(jī)
5)    8腳IC座
6)    24c02芯片
7)    12864有字庫(kù)液晶
8)    20p插針+6P插針
9)    20p單排母座
10)    矩陣鍵盤(pán)
11)    103藍(lán)白電位器
12)    2.2k電阻
13)    1k電阻
14)    10k電
15)    10歐姆電阻
16)    9012三極管
17)    3p接線端子
18)    10uf電容
19)    30pf瓷片電容*2
20)    11.0592m晶振
21)    5v松樂(lè)繼電器
22)    5MM紅色LED
23)    自鎖開(kāi)關(guān)
24)    DC電源插口
25)    導(dǎo)線若干
26)    焊錫若干
27)    usb電源線


單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>          //包含頭文件
  3. #include"24C0x.h"                  //包含24C02函數(shù)
  4. #include"LCD12864.h"          //包含液晶函數(shù)
  5. #define uchar unsigned char
  6. #define uint unsigned int         //宏定義

  7. #define buffer1ID  0x01
  8. #define buffer2ID  0x02
  9. #define queren  0x88                //確認(rèn)
  10. #define tuichu  0x85                //退出
  11. #define shanchu 0x82                //刪除

  12. #define User 1                                //用戶     

  13. void fan();                                        //主界面刷指紋管理員函數(shù)
  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.         
  39. uint PageID;
  40. uchar data querenma=11;
  41. uchar sum[2];
  42. int summaf,summas;

  43. uchar  xdata UserPassword[7]={0};//密碼
  44. uchar  xdata DSY_BUFFER[16] ={0};//緩存


  45. void Red_Init(void);

  46. //檢測(cè)脈沖寬度
  47. unsigned char check(void);

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

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

  56. /********************************************************************
  57. * 名稱 : Chack(uchar User_Number)
  58. * 功能 : 單一用戶密碼檢測(cè)
  59. * 輸入 : User_Number
  60. * 輸出 : 密碼正確與錯(cuò)誤,錯(cuò)誤返回0,正確返回1
  61. ********************************************************************/
  62. uchar Chack(uchar User_Number)
  63. {
  64.         uchar flag, i,temp[6],Address;
  65.         Address=User_Number*10;
  66.         for(i=0;i<6;i++)
  67.         {
  68.                 temp[i]=x24c02_read(Address);
  69.                 delayms(10);
  70.                 Address++;
  71.         }
  72.         for(i=0;i<6;i++)
  73.         {
  74.                 if(temp[i]==UserPassword[i])
  75.                         flag=1;
  76.                 else         
  77.                         flag=0;               
  78.         }
  79.                 return flag;
  80. }

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

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

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


  958. void zhu()
  959. {           
  960.     LcmClearTXT();
  961.         PutStr(1,2,"門(mén)已打開(kāi)");
  962.            jidianqi=0;
  963.         delay(2500);
  964.         jidianqi=1;
  965.         PutStr(3,0,"  按任意鍵繼續(xù)");
  966.         while(Keycan()==0);
  967. }


  968. void guanliyuan()
  969. { uchar i,j=0,x=1;
  970.            uchar Right_flag;
  971.      LcmClearTXT();
  972.                 PutStr(1,1,"請(qǐng)輸入密碼:");        
  973.            for(i=0;i<6;i++)mima[i]=0;                                                                        
  974.            Key=Keycan();
  975.       while(Key!=queren)
  976. ……………………

  977. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

請(qǐng)大家多多指教:
程序已經(jīng)寫(xiě)得差不多了,還存在一些小問(wèn)題,大家?guī)兔σ黄鹦薷?7z (3.64 MB, 下載次數(shù): 773)



作者: woshinh    時(shí)間: 2018-6-11 13:09
參考參考,謝了

作者: hitaoliu    時(shí)間: 2018-7-6 11:55
程序好長(zhǎng),謝謝
作者: cczy    時(shí)間: 2018-7-8 21:05
非常感謝,好資料,51黑有你更精彩!!!
作者: lon7085    時(shí)間: 2018-7-10 21:14
樓主請(qǐng)問(wèn)下指紋傳感器是用AS608 光學(xué)指紋傳感器嗎?還是別種型式的?謝謝。
作者: ptlantu    時(shí)間: 2018-7-11 09:01
非常感謝,收藏先
作者: wushiye54    時(shí)間: 2018-7-13 10:06
這個(gè)代碼是錯(cuò)的,就別發(fā)上來(lái)了
作者: 15873002171    時(shí)間: 2018-7-14 23:36
for(i=0;i<9;i++)    {     while(RI==0);     RI=0;}             while(RI==0);    RI=0;    querenma=SBUF;    while(RI==0);    RI=0;    sum[1]=SBUF;    while(RI==0);    RI=0;    sum[0]=SBUF;    summas=(sum[1]<<8)+sum[0];
你這樣等待接收應(yīng)答包,萬(wàn)一哪次指紋頭不返回應(yīng)答包,那你的程序就死了,不管哪種指紋頭都會(huì)存在不返回應(yīng)答包的時(shí)候。
作者: aimer    時(shí)間: 2018-8-1 10:20
謝謝分享 值得參考
作者: 老河口    時(shí)間: 2018-11-13 00:22
好東西啊,感謝分享。準(zhǔn)備DIY
作者: 南湖小水草    時(shí)間: 2018-11-13 01:57
謝謝大佬,
作者: Lemon.    時(shí)間: 2018-12-3 11:08
謝謝謝謝
作者: 1468216262    時(shí)間: 2018-12-3 17:04
15873002171 發(fā)表于 2018-7-14 23:36
for(i=0;i

那該怎么改正。謝謝大佬
作者: ebingyu01    時(shí)間: 2018-12-3 20:25
大神!我只有膜拜中!
作者: faridzled    時(shí)間: 2018-12-4 13:59
thanks for sharing
作者: 孤獨(dú)一生背鍋狗    時(shí)間: 2018-12-20 22:04
樓主   這個(gè)密碼是錯(cuò)的啊

作者: 157297414    時(shí)間: 2019-1-4 14:14
不錯(cuò),繼續(xù)收藏
作者: xiaob123    時(shí)間: 2019-1-4 14:23
很棒  學(xué)習(xí)了 受教
作者: qq1154422954    時(shí)間: 2019-1-4 17:00
666666666666剛好需要
作者: wsong701203    時(shí)間: 2019-2-18 14:52
是錯(cuò)的 不要下載了
作者: 1498972336    時(shí)間: 2019-2-27 11:43
樓主繼續(xù)分享作品啊
作者: HUA1314HL    時(shí)間: 2019-3-23 17:50
能直接用嗎?

作者: linnyshow    時(shí)間: 2019-3-25 10:27
不錯(cuò)。
作者: HUA1314HL    時(shí)間: 2019-3-28 01:01
樓主請(qǐng)問(wèn)密碼是多少啊,為什么重新編譯你的代碼整個(gè)系統(tǒng)就不能用了呢?
作者: HUA1314HL    時(shí)間: 2019-3-28 07:31
發(fā)的程序是錯(cuò)了大家不要?jiǎng)e下載了,等我做好直接發(fā)能用的
作者: szz000    時(shí)間: 2019-4-10 12:34
元件清單里沒(méi)有指紋模塊嗎?有人可以把原理圖的各個(gè)元件標(biāo)一下嗎?

作者: ptlantu    時(shí)間: 2019-4-10 15:33
感謝分享
作者: me我    時(shí)間: 2019-4-19 22:42
這個(gè)程序好長(zhǎng),不過(guò)感覺(jué)好高級(jí)
作者: lsf88524    時(shí)間: 2019-4-20 02:27
管理員密碼是什么?
作者: 矮窮挫001    時(shí)間: 2019-4-22 10:50
收藏先
作者: langzicheng    時(shí)間: 2019-4-25 05:45
代碼錯(cuò)了,定時(shí)器都開(kāi)錯(cuò)了,顯示屏能顯示算我輸
作者: huang1996a    時(shí)間: 2019-5-4 16:15
請(qǐng)問(wèn)可以發(fā)一下源代碼的word版本的嗎
作者: xya644    時(shí)間: 2019-5-4 18:11
參考一下,好東西,值得頂一下
作者: xiaoshi3268    時(shí)間: 2019-5-7 16:41
很好的東西!
作者: rtc900    時(shí)間: 2019-5-11 09:51
好東西啊。
作者: 莎粒坨    時(shí)間: 2019-5-17 22:54
本帖最后由 莎粒坨 于 2019-5-18 11:12 編輯

好程序 只是少了點(diǎn)注釋而已
作者: 莎粒坨    時(shí)間: 2019-5-17 22:54
12864的顯示都是問(wèn)題!�。�!
作者: 藍(lán)雨塘    時(shí)間: 2019-6-7 09:01
謝謝分享
作者: contactdeshine    時(shí)間: 2019-6-14 00:28
請(qǐng)問(wèn)這個(gè)可以鎖程序嗎?還是用來(lái)鎖實(shí)體門(mén)?想找一個(gè)有管理員密碼和用戶密碼的程序,輸入可以燒錄修改程序參數(shù)之類的
作者: 1416951071@qq.c    時(shí)間: 2019-6-17 09:35
小白一個(gè),先收藏
作者: 15546413162    時(shí)間: 2019-6-17 16:36
參考了一下你的程序,總體來(lái)說(shuō)很不錯(cuò),小錯(cuò)誤確實(shí)有。
作者: q0420    時(shí)間: 2019-6-17 17:39
你的程序都沒(méi)用,無(wú)顯示,發(fā)上來(lái)也好的程序讓大家學(xué)習(xí)?
作者: q0420    時(shí)間: 2019-6-17 17:41
發(fā)的程序原代碼都是錯(cuò)
作者: hou1997    時(shí)間: 2019-7-12 02:59
15873002171 發(fā)表于 2018-7-14 23:36
for(i=0;i

為什么指紋只能按幾次,讓后就卡死了,顯示屏提示請(qǐng)重按手指,需要復(fù)位才能恢復(fù)正常?
作者: hou1997    時(shí)間: 2019-7-12 03:00
為什么指紋只能用幾次,讓后就卡在請(qǐng)重按手指,需要復(fù)位才能恢復(fù)繼續(xù)按指紋??
作者: tieq1952    時(shí)間: 2019-7-12 06:48
謝謝分享!!!
作者: 鵬博士PBs    時(shí)間: 2019-7-12 09:28
代碼有誤 是個(gè)什么鬼
作者: 大象    時(shí)間: 2019-9-1 14:49
我先看看吧,雖然看評(píng)論說(shuō)i代碼是錯(cuò)誤的
作者: 小笨蛋    時(shí)間: 2019-9-29 22:41
這個(gè)頂一下 對(duì)我很有幫助
作者: 放過(guò)我    時(shí)間: 2019-10-9 22:03
您好我問(wèn)一下12864是怎么接的呀
作者: Shang1    時(shí)間: 2020-1-12 15:24
謝謝樓主好東西
作者: 我是白白    時(shí)間: 2020-4-22 14:42
lon7085 發(fā)表于 2018-7-10 21:14
樓主請(qǐng)問(wèn)下指紋傳感器是用AS608 光學(xué)指紋傳感器嗎?還是別種型式的?謝謝。

是AS608,指紋儲(chǔ)量300枚
作者: sheji    時(shí)間: 2020-5-18 10:42
博主分享的很詳細(xì)啊
作者: sheji    時(shí)間: 2020-5-18 10:44
想知道元件的型號(hào)
作者: 楊杰1    時(shí)間: 2020-5-27 11:34
密碼鎖666
作者: lsq011020    時(shí)間: 2020-10-23 22:58
問(wèn)一下樓主,有這個(gè)的原理圖嗎
作者: lsq011020    時(shí)間: 2020-10-24 00:05
樓主,你有仿真圖嗎?不懂那個(gè)12864液晶屏和指紋模塊的仿真圖怎么弄
作者: su9527    時(shí)間: 2020-12-14 20:39
請(qǐng)問(wèn)有這個(gè)指紋密碼鎖的PCB源文件嗎
作者: 恒心6    時(shí)間: 2021-5-7 15:24
HUA1314HL 發(fā)表于 2019-3-28 07:31
發(fā)的程序是錯(cuò)了大家不要下載了,等我做好直接發(fā)能用的

能把對(duì)的程序分享一下嘛,我很想知道,
作者: qq473697121    時(shí)間: 2022-11-3 15:43
可以講解一下嗎
作者: 1085100383    時(shí)間: 2023-5-4 10:07
參考一下,DIY小玩意做的這個(gè)




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1