找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机指纹密码锁电路原理图+源程序+实物制作

  [复制链接]
跳转到指定楼层
楼主
这是一个基于STC89C52的指纹识别和键盘密码锁。
里面包括程序,原理图,pcb图,原件清单和实物图。
请多多指教。


电路原理图如下:



指纹密码锁元件清单
1)    9*15万用板
2)    指纹传感器
3)    40脚IC座
4)    stc89c51单片机
5)    8脚IC座
6)    24c02芯片
7)    12864有字库液晶
8)    20p插针+6P插针
9)    20p单排母座
10)    矩阵键盘
11)    103蓝白电位器
12)    2.2k电阻
13)    1k电阻
14)    10k电
15)    10欧姆电阻
16)    9012三极管
17)    3p接线端子
18)    10uf电容
19)    30pf瓷片电容*2
20)    11.0592m晶振
21)    5v松乐继电器
22)    5MM红色LED
23)    自锁开关
24)    DC电源插口
25)    导线若干
26)    焊锡若干
27)    usb电源线


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>          //包含头文件
  3. #include"24C0x.h"                  //包含24C02函数
  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.         
  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. //检测脉冲宽度
  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. * 功能 : 单一用户密码检测
  59. * 输入 : User_Number
  60. * 输出 : 密码正确与错误,错误返回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. * 功能 : 所有用户密码检测
  84. * 输入 : 无
  85. * 输出 : 密码正确与错误,错误返回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. * 功能 : 单片机串口初始化
  112. * 单片机:晶振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;               //定时器1定时方式2
  120.         TH1= 0xFD;                //11.0592MHz  模块默认波特率为9600bps
  121.         TL1= 0xFD;                                                                                 
  122.         TR0= 1;                   //启动定时器
  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;      // 发全0行扫描码,列线输入
  130.         if((P1&0xF0) != 0xF0) // 若有键按下
  131.         {
  132.                 delay(1);// 延时去抖动
  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; // 无键按下,返回值为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  调用后单片机波特率变化@@@
  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号   sum、pagenum>255都会使程序卡@@@
  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号
  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()                                 //自动注册模板返回存储ID  =录图像+合并生成模板+储存模板
  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;           //校验和
  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)   //删除指纹                     校验和在2字节的页码处应分高低字节相加
  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()                                //自动验证指纹     录图像+生成特征+搜索
  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;           //校验和
  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,"请按手指开锁");      
  704.         SFG_identify();
  705.         while(querenma==2)
  706.         SFG_identify();
  707.         if(querenma==0)
  708.    {
  709.                 LcmClearTXT();
  710.                 PutStr(1,2,"门已打开");
  711.                 IDs1=PageID/100;
  712.                 IDs2=PageID/10%10;
  713.                 IDs3=PageID%10;
  714.                 PutStr(2,1,"编号为:");
  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,"没搜索到指纹");
  727.                         PutStr(2,1,"请重新按手指");
  728.                 }
  729.                    else
  730.                 {
  731.                         LcmClearTXT();
  732.                         PutStr(1,1,"接收包出错");
  733.                 }
  734.                 delay(2000);
  735.    //         while(Keycan()==0);
  736. }
  737. void addfinger()
  738. {
  739.         uchar IDa1,IDa2,IDa3;
  740.         LcmClearTXT();
  741.         PutStr(1,2,"请按手指");   
  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,"该指纹已存储");
  754.                 PutStr(3,0,"  按任意键继续");
  755.             while(Keycan()==0);
  756.         }
  757.         else if(querenma==9)
  758.                 {
  759.                         LcmClearTXT();
  760.                         PutStr(1,1,"请再次按手指");
  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,"编号为:");
  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,"请重新操作");
  777.                          }
  778.                 PutStr(3,0,"  按任意键继续");
  779.             while(Keycan()==0);
  780.                    }
  781.         LcmClearTXT();
  782. }
  783. void deletfinger()
  784. {
  785.         uchar i,j=0;
  786.         LcmClearTXT();
  787.         PutStr(1,0,"输入删去的指纹号");
  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);                                                              //按键有抖动@@@
  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,"删去指纹号成功!");
  834.         }
  835.         else
  836.         {
  837.                 LcmClearTXT();
  838.                 PutStr(1,2,"删去指纹号失败!");  
  839.         }
  840.         PutStr(2,0,"  按任意键继续");
  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,"请输入新密码");
  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,"请再次输入新密码");
  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位以内
  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,"  按任意键继续");
  946.                 while(Keycan()==0);
  947.         }
  948.         else
  949.         {
  950.                 PutStr(0,0,"  密码修改失败  ");
  951.                 PutStr(1,0,"两次输入的密码不");
  952.                 PutStr(2,0,"一致,请重新操作");      
  953.                 PutStr(3,0,"  按任意键继续");
  954.                 while(Keycan()==0);
  955.         }
  956.         LcmClearTXT();
  957. }


  958. void zhu()
  959. {           
  960.     LcmClearTXT();
  961.         PutStr(1,2,"门已打开");
  962.            jidianqi=0;
  963.         delay(2500);
  964.         jidianqi=1;
  965.         PutStr(3,0,"  按任意键继续");
  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,"请输入密码:");        
  973.            for(i=0;i<6;i++)mima[i]=0;                                                                        
  974.            Key=Keycan();
  975.       while(Key!=queren)
  976. ……………………

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

请大家多多指教:
程序已经写得差不多了,还存在一些小问题,大家帮忙一起修改.7z (3.64 MB, 下载次数: 762)


评分

参与人数 3黑币 +28 收起 理由
kljie1000 + 10
dww465757120 + 10 共享资料的黑币奖励!
穿着安踏去拉萨 + 8 赞一个!

查看全部评分

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

使用道具 举报

来自 2#
ID:280876 发表于 2018-7-13 10:06 | 只看该作者
这个代码是错的,就别发上来了
回复

使用道具 举报

来自 3#
ID:363376 发表于 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];
你这样等待接收应答包,万一哪次指纹头不返回应答包,那你的程序就死了,不管哪种指纹头都会存在不返回应答包的时候。
回复

使用道具 举报

来自 4#
ID:564706 发表于 2019-6-17 16:36 | 只看该作者
参考了一下你的程序,总体来说很不错,小错误确实有。
回复

使用道具 举报

来自 5#
ID:516928 发表于 2019-6-17 17:39 | 只看该作者
你的程序都没用,无显示,发上来也好的程序让大家学习?
回复

使用道具 举报

来自 6#
ID:516928 发表于 2019-6-17 17:41 | 只看该作者
发的程序原代码都是错
回复

使用道具 举报

7#
ID:238363 发表于 2018-6-11 13:09 | 只看该作者
参考参考,谢了
回复

使用道具 举报

8#
ID:227956 发表于 2018-7-6 11:55 | 只看该作者
程序好长,谢谢
回复

使用道具 举报

9#
ID:364531 发表于 2018-7-8 21:05 | 只看该作者
非常感谢,好资料,51黑有你更精彩!!!
回复

使用道具 举报

10#
ID:284488 发表于 2018-7-10 21:14 | 只看该作者
楼主请问下指纹传感器是用AS608 光学指纹传感器吗?还是别种型式的?谢谢。
回复

使用道具 举报

11#
ID:73182 发表于 2018-7-11 09:01 | 只看该作者
非常感谢,收藏先
回复

使用道具 举报

12#
ID:331563 发表于 2018-8-1 10:20 | 只看该作者
谢谢分享 值得参考
回复

使用道具 举报

13#
ID:185815 发表于 2018-11-13 00:22 | 只看该作者
好东西啊,感谢分享。准备DIY
回复

使用道具 举报

14#
ID:415247 发表于 2018-11-13 01:57 | 只看该作者
谢谢大佬,
回复

使用道具 举报

15#
ID:437267 发表于 2018-12-3 11:08 | 只看该作者
谢谢谢谢
回复

使用道具 举报

16#
ID:407940 发表于 2018-12-3 17:04 | 只看该作者

那该怎么改正。谢谢大佬
回复

使用道具 举报

17#
ID:407196 发表于 2018-12-3 20:25 | 只看该作者
大神!我只有膜拜中!
回复

使用道具 举报

18#
ID:89286 发表于 2018-12-4 13:59 | 只看该作者
thanks for sharing
回复

使用道具 举报

19#
ID:438823 发表于 2018-12-20 22:04 | 只看该作者
楼主   这个密码是错的啊
回复

使用道具 举报

20#
ID:458954 发表于 2019-1-4 14:14 | 只看该作者
不错,继续收藏
回复

使用道具 举报

21#
ID:458411 发表于 2019-1-4 14:23 | 只看该作者
很棒  学习了 受教
回复

使用道具 举报

22#
ID:461955 发表于 2019-1-4 17:00 | 只看该作者
666666666666刚好需要
回复

使用道具 举报

23#
ID:338078 发表于 2019-2-18 14:52 | 只看该作者
是错的 不要下载了
回复

使用道具 举报

24#
ID:304358 发表于 2019-2-27 11:43 | 只看该作者
楼主继续分享作品啊
回复

使用道具 举报

25#
ID:323102 发表于 2019-3-23 17:50 | 只看该作者
能直接用吗?
回复

使用道具 举报

26#
ID:110278 发表于 2019-3-25 10:27 | 只看该作者
不错。
回复

使用道具 举报

27#
ID:323102 发表于 2019-3-28 01:01 | 只看该作者
楼主请问密码是多少啊,为什么重新编译你的代码整个系统就不能用了呢?
回复

使用道具 举报

28#
ID:323102 发表于 2019-3-28 07:31 来自手机 | 只看该作者
发的程序是错了大家不要别下载了,等我做好直接发能用的
回复

使用道具 举报

29#
ID:507630 发表于 2019-4-10 12:34 | 只看该作者
元件清单里没有指纹模块吗?有人可以把原理图的各个元件标一下吗?
回复

使用道具 举报

30#
ID:73182 发表于 2019-4-10 15:33 | 只看该作者
感谢分享
回复

使用道具 举报

31#
ID:493382 发表于 2019-4-19 22:42 | 只看该作者
这个程序好长,不过感觉好高级
回复

使用道具 举报

32#
ID:426295 发表于 2019-4-20 02:27 | 只看该作者
管理员密码是什么?
回复

使用道具 举报

33#
ID:518403 发表于 2019-4-22 10:50 | 只看该作者
收藏先
回复

使用道具 举报

34#
ID:457649 发表于 2019-4-25 05:45 | 只看该作者
代码错了,定时器都开错了,显示屏能显示算我输
回复

使用道具 举报

35#
ID:526983 发表于 2019-5-4 16:15 | 只看该作者
请问可以发一下源代码的word版本的吗
回复

使用道具 举报

36#
ID:507104 发表于 2019-5-4 18:11 | 只看该作者
参考一下,好东西,值得顶一下
回复

使用道具 举报

37#
ID:271238 发表于 2019-5-7 16:41 | 只看该作者
很好的东西!
回复

使用道具 举报

38#
ID:466896 发表于 2019-5-11 09:51 来自手机 | 只看该作者
好东西啊。
回复

使用道具 举报

39#
ID:503813 发表于 2019-5-17 22:54 | 只看该作者
本帖最后由 莎粒坨 于 2019-5-18 11:12 编辑

好程序 只是少了点注释而已
回复

使用道具 举报

40#
ID:503813 发表于 2019-5-17 22:54 | 只看该作者
12864的显示都是问题!!!!
回复

使用道具 举报

41#
ID:372118 发表于 2019-6-7 09:01 | 只看该作者
谢谢分享
回复

使用道具 举报

42#
ID:555216 发表于 2019-6-14 00:28 | 只看该作者
请问这个可以锁程序吗?还是用来锁实体门?想找一个有管理员密码和用户密码的程序,输入可以烧录修改程序参数之类的
回复

使用道具 举报

43#
ID:455228 发表于 2019-6-17 09:35 | 只看该作者
小白一个,先收藏
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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