找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9836|回复: 9
收起左侧

基于51单片机的红外遥控指纹电子密码锁程序

[复制链接]
ID:197991 发表于 2017-5-8 09:26 | 显示全部楼层 |阅读模式
这是我之前做过的红外指纹电子密码锁程序,采用12864液晶显示.
0.png

单片机源程序:
  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  0x86
  11. #define shanchu 0x84

  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  ErrorCount;
  24. //////////////////////////红外相关//////////////////////////
  25. //时间计算
  26. #define Imax 14000    //此处为晶振为11.0592时的取值,
  27. #define Imin 8000    //如用其它频率的晶振时,
  28. #define Inum1 1450    //要改变相应的取值。
  29. #define Inum2 7000
  30. #define Inum3 3000
  31. //解码变量
  32. unsigned char Im[4]={0x00,0x00,0x00,0x00};

  33. //全局变量
  34. uchar f;
  35. unsigned long m,Tc;
  36. unsigned char IrOK;
  37. //////////////////////////红外相关//////////////////////////
  38. uchar  code buffer[User][6]=
  39. {
  40. {"000000"}
  41. };
  42.         
  43.         
  44. uchar dz[4];
  45. uchar time[4];                         
  46. uchar mima[6];
  47. uchar mimag[6];
  48. uchar mimaID[6]={1,2,3,4,5,6};


  49. uchar Address1=20,tempx=20;
  50. uchar Address2=20;   
  51.         
  52. uchar data K;
  53. uchar data Key;
  54.         
  55. uint PageID;
  56. uchar data querenma=11;
  57. uchar sum[2];
  58. int summaf,summas;

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


  61. void Red_Init(void);
  62. #include "zhiwen.h"
  63. //检测脉冲宽度
  64. unsigned char check(void);

  65. unsigned char redchange(unsigned char rednum);
  66.         

  67. void delayms(unsigned int z)
  68. {
  69.         unsigned int x,y;
  70.         for(x=z;x>0;x--)
  71.                 for(y=110;y>0;y--);
  72. }

  73. /********************************************************************
  74. * 名称 : Chack(uchar User_Number)
  75. * 功能 : 单一用户密码检测
  76. * 输入 : User_Number
  77. * 输出 : 密码正确与错误,错误返回0,正确返回1
  78. ********************************************************************/
  79. uchar Chack(uchar User_Number)
  80. {
  81.         uchar flag, i,temp[6],Address;
  82.         Address=User_Number*10;
  83.         for(i=0;i<6;i++)
  84.         {
  85.                 temp[i]=x24c02_read(Address);
  86.                 delayms(10);
  87.                 Address++;
  88.         }
  89.         for(i=0;i<6;i++)
  90.         {
  91.                 if(temp[i]==UserPassword[i])
  92.                         flag=1;
  93.                 else        
  94.                         flag=0;               
  95.         }
  96.                 return flag;
  97. }

  98. /********************************************************************
  99. * 名称 : PassWord_Chack()
  100. * 功能 : 所有用户密码检测
  101. * 输入 : 无
  102. * 输出 : 密码正确与错误,错误返回0,正确返回1
  103. ********************************************************************/
  104. uchar PassWord_Chack()
  105. {
  106.         uchar i=0;
  107.         while(i<User)
  108.         {
  109.                 if(Chack(i)==1)
  110.                 {
  111.                         Member=i+1;
  112.                         return 1;
  113.                 }
  114.                 i++;       
  115.         }
  116.         return 0;       
  117. }
  118.    
  119. void delay(uchar tt)
  120. {  uchar i;
  121.    while(tt--)
  122.    {
  123.    for(i=0;i<125;i++);
  124.    }
  125. }
  126. /********************************************************************
  127. * 名称 : UART_Init()
  128. * 功能 : 单片机串口初始化
  129. * 单片机:晶振11.0592MHz 波特率为9600bps
  130. * 指纹模块:波特率为9600bps,
  131. ********************************************************************/        
  132. void UART_Init()
  133. {
  134.         SCON= 0x50;               //串口方式1        //REN=1; 允许接收
  135.         PCON=0x00;                //SMOD=0
  136.         IT1=1;
  137.         EX1=1;
  138.         TH0=0;
  139.         TL0=0;
  140.         TR0=0;
  141.         TMOD= 0x21;               //定时器1定时方式2
  142.         TH1= 0xFD;                //11.0592MHz  模块默认波特率为9600bps
  143.         TL1= 0xFD;                                                                                 
  144.         TR1= 1;                   //启动定时器
  145.         EA=1;      
  146. }
  147.    
  148. unsigned char Keycan(void) //按键扫描程序 P1.0--P1.3为行线 P1.4--P1.7为列线
  149. {
  150.   unsigned char rcode, ccode;
  151.   P1 = 0x0f;      // 发全0行扫描码,列线输入
  152.   if((P1&0x0f) != 0x0f) // 若有键按下
  153.   {
  154.     delay(1);// 延时去抖动
  155.     if((P1&0x0f) != 0x0f)
  156.     {  rcode = 0xFE;         // 逐行扫描初值
  157.     while((rcode&0x10) != 0)
  158.     {
  159.        P1 = rcode;         // 输出行扫描码
  160.       if((P1&0x0f) != 0x0f) // 本行有键按下
  161.       {
  162.        ccode = (P1&0x0f)|0x0f;
  163.        //do{;}
  164.            while((P1&0x0f) != 0x0f); //等待键释放
  165.             Feng=0;
  166.         delay(100);
  167.         Feng=1;
  168.        return ((~rcode) + (~ccode)); // 返回键编码
  169.       }
  170.     else
  171.     rcode = (rcode<<1)|0x01; // 行扫描码左移一位
  172.     }
  173.     }
  174.   }
  175.   if(IrOK==1)
  176.   {
  177.    IrOK=0;
  178.    Feng=0;
  179.    delay(100);
  180.    Feng=1;
  181.    switch (Im[2])
  182.    {
  183.     case 0x16: return 0x28;break;                  //0
  184.         case 0x0c: return 0x11;break;                         //1
  185.         case 0x18: return 0x71;break;                                //2
  186.         case 0x5e: return 0x41;break;                                  //3
  187.         case 0x08: return 0x12;break;                                        //4
  188.         case 0x1c: return 0x22;break;                           //5
  189.         case 0x5a: return 0x42;break;                                //6
  190.         case 0x42: return 0x14;break;                                  //7
  191.         case 0x52: return 0x24;break;                                  //8
  192.         case 0x4a: return 0x44;break;                                        //9
  193.         case 0x47: return 0x81;break;                                         //a
  194.         case 0x43: return 0x82;break;                                          //b
  195.         case 0x0d: return 0x74;break;                                           //c
  196.         case 0x15: return 0x88;break;                                                //d
  197.         case 0x19: return 0x48;break;
  198.    }
  199.   }  
  200.   return 0; // 无键按下,返回值为0
  201. }
  202.         
  203. void KeyDeal(unsigned char Key)
  204. {  //unsigned char n;
  205.    if(Key!=0)
  206. {
  207.            
  208.                    switch(Key)
  209.                    {
  210.                    case 0x11: K=1; break;         
  211.                    case 0x21: K=2; break;  
  212.                    case 0x71: K=3; break;  
  213.                    case 0x81:  break;      
  214.                    case 0x12: K=4; break;
  215.                    case 0x22: K=5; break;
  216.                    case 0x42: K=6; break;
  217.                    case 0x82: K=34;break;               
  218.                    case 0x14: K=7; break;
  219.                    case 0x24: K=8; break;
  220.                    case 0x44: K=9; break;
  221.                    case 0x74:  break;               
  222.                    case 0x18:  break;               
  223.                    case 0x28: K=0; break;
  224.                    case 0x48:  K=11; break;
  225.                    case 0x88:  break;               
  226.                    default: break;
  227.                    }
  228.   }
  229. }
  230.         

  231. void shuazhiwen()
  232. {
  233.     uchar IDs1,IDs2,IDs3;         
  234.         LcmClearTXT();
  235.         PutStr(1,1,"请按手指开锁");      
  236.         SFG_identify();
  237.         while(querenma==2)
  238.         SFG_identify();
  239.         if(querenma==0)
  240.    {
  241.                 LcmClearTXT();
  242.                 PutStr(1,2,"门已打开");
  243.                 IDs1=PageID/100;
  244.                 IDs2=PageID/10%10;
  245.                 IDs3=PageID%10;
  246.                 PutStr(2,1,"编号为:");
  247.                 WriteCommand(0x8D);                //指定第三行显示位置
  248.                 WriteData(0x30+IDs1);
  249.                 WriteData(0x30+IDs2);
  250.                 WriteData(0x30+IDs3);
  251.                 ErrorCount=0;
  252.                 Feng=1;
  253.                 jidianqi=0;
  254.                 delay(2500);
  255.                 jidianqi=1;
  256.                
  257.         }
  258.            else if(querenma==9)
  259.                 {
  260.                         LcmClearTXT();
  261.                         PutStr(1,1,"没搜索到指纹");
  262.                         PutStr(2,1,"请重新按手指");
  263.                         ErrorCount=3;
  264.                         Feng=0;
  265.                 }
  266.                    else
  267.                 {
  268.                         LcmClearTXT();
  269.                         PutStr(1,1,"接收包出错");
  270.                 }
  271.                 delay(2000);
  272.    //         while(Keycan()==0);
  273. }
  274. void addfinger()
  275. {
  276.         uchar IDa1,IDa2,IDa3;
  277.         LcmClearTXT();
  278.         PutStr(1,2,"请按手指");   
  279.         SFG_getimage();
  280.         while(querenma!=0)
  281.         SFG_getimage();
  282.         SFG_genchar(buffer1ID);
  283.         UART_Init();
  284.         SFG_fastsearch(buffer1ID);
  285.         while(querenma==1)
  286.         SFG_fastsearch(buffer1ID);

  287.         if(querenma==0)
  288.         {
  289.                 LcmClearTXT();
  290.                 PutStr(1,1,"该指纹已存储");
  291.                 PutStr(3,0,"  按任意键继续");
  292.             while(Keycan()==0);
  293.         }
  294.         else if(querenma==9)
  295.                 {
  296.                         LcmClearTXT();
  297.                         PutStr(1,1,"请再次按手指");
  298.                         SFG_enroll();
  299.                         while(querenma==2)
  300.                         SFG_enroll();
  301.                         LcmClearTXT();
  302.                         if(querenma==0)
  303.                         {
  304.                                 IDa1=PageID/100;IDa2=PageID/10%10;IDa3=PageID%10;
  305.                                 PutStr(1,1,"指纹采集成功");
  306.                                 PutStr(2,1,"编号为:");
  307.                                 WriteCommand(0x8D);
  308.                                 WriteData(0x30+IDa1);WriteData(0x30+IDa2);WriteData(0x30+IDa3);
  309.                           }
  310.                   else  if(querenma!=0)
  311.                           {
  312.                                
  313.                                 PutStr(1,1,"指纹采集失败");
  314.                                 PutStr(2,1,"请重新操作");
  315.                          }
  316.                 PutStr(3,0,"  按任意键继续");
  317.             while(Keycan()==0);
  318.                    }
  319.         LcmClearTXT();
  320.                          PutStr(0,0,"按键1 : 增加指纹");
  321.                 PutStr(1,0,"按键2 : 删去指纹");
  322.                 PutStr(2,0,"按键3 : 手动开锁");
  323.                 PutStr(3,0,"按键4 : 修改密码");
  324. }
  325. void deletfinger()
  326. {
  327.         uchar i,j=0;
  328.         LcmClearTXT();
  329.         PutStr(1,0,"输入删去的指纹号");
  330.         for(i=0;i<5;i++)dz[i]=0;       
  331.            Key=Keycan();
  332.            while(Key!=queren)
  333.            {
  334.              Key=Keycan();
  335.              KeyDeal(Key);
  336.              delay(30);                                                              //按键有抖动@@@
  337.              if(Key==0)K=10;
  338.              if((K>=0)&&(K<=9))
  339.              {
  340.               dz[j]=K;
  341.                   if(j<3)
  342.                   {       
  343.                                 WriteCommand(0x88+j);                //指定第三行显示位置
  344.                                 WriteData(0x30+dz[j]);       
  345.                   }
  346.               ++j;
  347.                   if(j==4)
  348.               j=3;                                                                                                   //@@#yinhuang
  349.              }   //显示LCD12864并行显示
  350.                  if(K==34)                //按了删除键
  351.                   {
  352.                     if(j==0)
  353.                         {
  354.                                 WriteCommand(0x88);                //指定第三行显示位置
  355.                                 WriteData(0x20);
  356.                         }
  357.                         else
  358.                         {
  359.                                 --j;
  360.                                 WriteCommand(0x88+j);            //指定第三行显示位置
  361.                                 WriteData(0x20);
  362.                         }
  363.                 }
  364.         }
  365.         if(j>=2)
  366.         PageID=dz[2]+dz[1]*10+dz[0]*100;
  367.         if(j==1)
  368.         PageID=dz[1]+dz[0]*10;
  369.         if(j==0)
  370.         PageID=dz[0];
  371.         SFG_deletchar(PageID);
  372.         if(querenma==0)
  373.         {
  374.                 LcmClearTXT();
  375.                 PutStr(1,1,"删去指纹号成功!");
  376.         }
  377.         else
  378.         {
  379.                 LcmClearTXT();
  380.                 PutStr(1,2,"删去指纹号失败!");  
  381.         }
  382.         PutStr(2,0,"  按任意键继续");
  383.         while(Keycan()==0);
  384.         LcmClearTXT();
  385.                          PutStr(0,0,"按键1 : 增加指纹");
  386.                 PutStr(1,0,"按键2 : 删去指纹");
  387.                 PutStr(2,0,"按键3 : 手动开锁");
  388.                 PutStr(3,0,"按键4 : 修改密码");
  389. }
  390.         
  391. void gaimima()
  392. {
  393.         uchar i,j=0,mima1[6],mima2[6];
  394.         uchar k,temp;
  395.         LcmClearTXT();
  396.         PutStr(1,1,"请输入新密码");
  397.         for(i=0;i<6;i++)mima1[i]=0;                                                                       
  398.            Key=Keycan();
  399.       while(Key!=queren)
  400.            {
  401.              Key=Keycan();
  402.              KeyDeal(Key);
  403.              delay(30);                                                             
  404.              if(Key==0)K=10;
  405.              if((K>=0)&&(K<=9))
  406.              {
  407.               mima1[j]=K;
  408.                   if(j<6)
  409.                   {       
  410.                                 WriteCommand(0x89+j);                //指定第三行显示位置
  411.                                 WriteData(0x0f);       
  412.                   }
  413.               ++j;
  414.                   if(j==7)
  415.               j=6;                                                                                                   //@@#yinhuang
  416.              }   //显示LCD12864并行显示
  417.                  if(K==34)                //按了删除键
  418.                   {
  419.                     if(j==0)
  420.                         {
  421.                                 WriteCommand(0x89);                //指定第三行显示位置
  422.                                 WriteData(0x20);
  423.                         }
  424.                         else
  425.                         {
  426.                                 --j;
  427.                                 WriteCommand(0x89+j);            //指定第三行显示位置
  428.                                 WriteData(0x20);
  429.                         }
  430.                 }
  431.         }
  432.         LcmClearTXT();
  433.         LcmClearTXT();
  434.         j=0;
  435.         PutStr(1,0,"请再次输入新密码");
  436.         for(i=0;i<6;i++)mima2[i]=0;                                                                       
  437.            Key=Keycan();
  438.       while(Key!=queren)
  439.            {
  440.              Key=Keycan();
  441.              KeyDeal(Key);
  442.              delay(30);                                                             
  443.              if(Key==0)K=10;
  444.              if((K>=0)&&(K<=9))
  445.              {
  446.               mima2[j]=K;
  447.                   if(j<6)
  448.                   {               
  449.                                 WriteCommand(0x89+j);                //指定第三行显示位置
  450.                                 WriteData(0x0f);       
  451.                   }
  452.               ++j;
  453.                   if(j==7)
  454.               j=6;                                                                                                   //@@#yinhuang
  455.              }   //显示LCD12864并行显示
  456.                  if(K==34)                //按了删除键
  457.                   {
  458.                     if(j==0)
  459.                         {
  460.                                 WriteCommand(0x89);                //指定第三行显示位置
  461.                                 WriteData(0x20);
  462.                         }
  463.                         else
  464.                         {
  465.                                 --j;
  466.                                 WriteCommand(0x89+j);            //指定第三行显示位置
  467.                                 WriteData(0x20);
  468.                         }
  469.                 }
  470.         }
  471.         LcmClearTXT();
  472.         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]))
  473.         {
  474.                 for(i=0;i<6;i++)
  475.                 mimaID[i]=mima1[i];
  476.                 /////////////////////////////////////////////////////
  477.                 for(i=0;i<6;i++)           //密码限制在6位以内
  478.                 {
  479.                         UserPassword[i]=mima1[i]+0x30;                                 
  480.                 }
  481.                 temp=(Member-1)*10;       
  482.                 delayms(5);
  483.                 for(k=0;k<6;k++)
  484.                 {
  485.                         x24c02_write(temp,UserPassword[k]);
  486.                         delayms(10);
  487.                         temp++;
  488.                 }  
  489.                 //////////////////////////////////////////////////////
  490.                 PutStr(0,1,"密码修改成功");
  491.                 PutStr(3,0,"  按任意键继续");
  492.                 ErrorCount=0;
  493.                 while(Keycan()==0);
  494.         }
  495.         else
  496.         {
  497.                 PutStr(0,0,"  密码修改失败  ");
  498.                 PutStr(1,0,"两次输入的密码不");
  499.                 PutStr(2,0,"一致,请重新操作");      
  500.                 PutStr(3,0,"  按任意键继续");
  501.                 while(Keycan()==0);
  502.         }
  503.         LcmClearTXT();
  504.                          PutStr(0,0,"按键1 : 增加指纹");
  505.                 PutStr(1,0,"按键2 : 删去指纹");
  506.                 PutStr(2,0,"按键3 : 手动开锁");
  507.                 PutStr(3,0,"按键4 : 修改密码");
  508. }


  509. void zhu()
  510. {           
  511.     LcmClearTXT();
  512.         PutStr(1,2,"门已打开");
  513.            jidianqi=0;
  514.         delay(2500);
  515.         jidianqi=1;
  516.         PutStr(3,0,"  按任意键继续");
  517.         while(Keycan()==0);
  518.                          PutStr(0,0,"按键1 : 增加指纹");
  519.                 PutStr(1,0,"按键2 : 删去指纹");
  520.                 PutStr(2,0,"按键3 : 手动开锁");
  521.                 PutStr(3,0,"按键4 : 修改密码");
  522. }


  523. void guanliyuan()
  524. {   
  525.       uchar i,j=0,x=1;
  526.              uchar Right_flag;
  527.       LcmClearTXT();
  528.           PutStr(1,1,"请输入密码:");       
  529.            for(i=0;i<6;i++)mima[i]=0;                                                                       
  530.            Key=Keycan();
  531.       while(Key!=queren)
  532.            {
  533.              Key=Keycan();
  534.              KeyDeal(Key);
  535.              delay(30);                                                             
  536.              if(Key==0)K=10;
  537.              if((K>=0)&&(K<=9))
  538.              {
  539.               mima[j]=K;

  540.                   if(j<6)
  541.                   {       
  542.                    WriteCommand(0x89+j);                //指定第三行显示位置
  543.                WriteData(0x0f);       

  544.                   }
  545.               ++j;
  546.                   if(j==7)
  547.               j=6;                                                                                                  
  548.              }   //显示LCD12864并行显示
  549.                  if(K==34)                //按了删除键
  550.                   {
  551.                     if(j==0)
  552.                         {
  553.                       WriteCommand(0x89);                //指定第三行显示位置
  554.                   WriteData(0x20);
  555.                         }
  556.                         else
  557.                         {
  558.                           --j;
  559.                       WriteCommand(0x89+j);            //指定第三行显示位置
  560.                   WriteData(0x20);
  561.                         }
  562.                   }
  563.            }
  564.     LcmClearTXT();


  565.           for(i=0;i<6;i++)
  566.          {
  567.             UserPassword[i]=mima[i]+0x30;
  568.        
  569.           }
  570.          if(j==6)
  571.           {
  572.            if(mima[0]==1&&mima[1]==3&&mima[2]==1&&mima[3]==4&&mima[4]==2&&mima[5]==0)
  573.             Right_flag=1;
  574.                 else
  575.                 Right_flag=0;
  576.                       }
  577.           if (Right_flag==1)
  578.          {
  579.                      Right_flag=0;
  580.                     
  581.                    for(i=0;i<6;i++)mima[i]=0;
  582.                 PutStr(0,0,"按键1 : 增加指纹");
  583.                 PutStr(1,0,"按键2 : 删去指纹");
  584.                 PutStr(2,0,"按键3 : 手动开锁");
  585.                 PutStr(3,0,"按键4 : 修改密码");
  586.      while(i!=tuichu)
  587.       {         
  588.                  i=Keycan();
  589.        
  590.                 KeyDeal(i);  
  591.             switch(K)
  592.             {
  593.              case 1:    addfinger();K=6; break;
  594.              case 2:    deletfinger();    break;
  595.                  case 3:         zhu();        K=8;  break;
  596.                  case 4:    gaimima();        break;
  597.              default: break;
  598.             }
  599.       }
  600.      }
  601.     else
  602.     {

  603.                 PutStr(1,2,"密码错误");
  604.                 PutStr(2,0,"  请重新操作!");
  605.                 PutStr(3,0,"  按任意键继续");
  606.              while(Keycan()==0);
  607.                 PutStr(0,0,"按键1 : 增加指纹");
  608.                 PutStr(1,0,"按键2 : 删去指纹");
  609.                 PutStr(2,0,"按键3 : 手动开锁");
  610.                 PutStr(3,0,"按键4 : 修改密码");
  611.     }
  612.   Key=0;
  613.    
  614. }
  615. void mimakaisuo()
  616. {
  617. uchar i,j=0,x=1;
  618.              uchar Right_flag;
  619.       LcmClearTXT();
  620.           PutStr(1,0,"请输入密码开锁:");       
  621.            for(i=0;i<6;i++)mima[i]=0;                                                                       
  622.            Key=Keycan();
  623.       while(Key!=queren)
  624.            {
  625.              Key=Keycan();
  626.              KeyDeal(Key);
  627.              delay(30);                                                             
  628.              if(Key==0)K=10;
  629.              if((K>=0)&&(K<=9))
  630.              {
  631.               mima[j]=K;

  632.                   if(j<6)
  633.                   {       
  634.                    WriteCommand(0x89+j);                //指定第三行显示位置
  635.                WriteData(0x0f);       

  636.                   }
  637.               ++j;
  638.                   if(j==7)
  639.               j=6;                                                                                                  
  640.              }   //显示LCD12864并行显示
  641.                  if(K==34)                //按了删除键
  642.                   {
  643.                     if(j==0)
  644.                         {
  645.                       WriteCommand(0x89);                //指定第三行显示位置
  646.                   WriteData(0x20);
  647.                         }
  648.                         else
  649.                         {
  650.                           --j;
  651.                       WriteCommand(0x89+j);            //指定第三行显示位置
  652.                   WriteData(0x20);
  653.                         }
  654.                   }
  655.            }
  656.     LcmClearTXT();


  657.           for(i=0;i<6;i++)
  658.          {
  659.             UserPassword[i]=mima[i]+0x30;
  660.        
  661.           }
  662.          if(j==6){Right_flag=PassWord_Chack(); }
  663.           if (Right_flag==1&&ErrorCount<3)
  664.          {
  665.               Right_flag=0;
  666.                    zhu();ErrorCount=0;  
  667.                  Feng=1;
  668.                   for(i=0;i<6;i++)mima[i]=0;
  669.      }
  670.     else
  671.     {
  672.             if(ErrorCount<3)
  673.                 ErrorCount++;
  674.                  if(ErrorCount==3)
  675.                 Feng=0;
  676.                  
  677.                 PutStr(1,2,"密码错误");
  678.                 PutStr(2,0,"  还有  次机会");
  679.                 PutStr(3,0,"  按任意键继续");
  680.                 WriteCommand(0x8a);
  681.                 WriteData(' ');
  682.                 WriteData(3-ErrorCount+0x30);
  683.                  
  684.                 delay(1000);
  685.           
  686.     }
  687.   Key=0;
  688.   LcmClearTXT();
  689. }
  690. void fan()
  691. {
  692. //        PutStr(1,2,"请先按键");
  693. //        PutStr(2,2,"再刷指纹");
  694.   if(Key!=0x81)                        //管理员操作
  695.   {
  696.         PutStr(0,2,"欢迎使用");
  697.         PutStr(1,0,"指纹密码门禁系统");
  698.         PutStr(2,0,"密码开锁请按 C键");
  699.         PutStr(3,1,"请按手指开锁");
  700.    }
  701.   Key=Keycan();
  702. if(k2==1)                //指纹刷机
  703.   {
  704.           LcmClearTXT();
  705.         shuazhiwen();
  706.         LcmClearTXT();
  707.   }
  708.   if(Key==0x81)                        //管理员操作
  709.   {
  710.         LcmClearTXT();
  711.         guanliyuan();
  712.     LcmClearTXT();
  713.   }
  714.   if(Key==0x84&&ErrorCount<3)                        //密码开锁
  715.   {
  716.         LcmClearTXT();
  717.         mimakaisuo();
  718.     LcmClearTXT();
  719.   }

  720. }       
  721.      
  722. void main()
  723. {        

  724. //PSB=0;
  725.         UART_Init();           //串口初始化                  
  726.           x24c02_init();     //24C02初始化
  727.         LcmInit();               //LCD12864初始化                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
  728.         LcmClearTXT();           //LCD12864清屏       
  729.         while(1)
  730.                 {
  731.                         fan();
  732.                         delay(100);                  
  733.                 }       
  734. }

  735. //外部中断解码程序_外部中断1
  736. void intersvr1(void) interrupt 2
  737. {
  738. TR0=1;
  739. Tc=TL0*256+TH0;//提取中断时间间隔时长
  740. TH0=0;
  741. TL0=0;         //定时中断重新置零

  742. if((Tc>Imin)&&(Tc<Imax))
  743. {
  744.         m=0;
  745.         f=1;
  746.         return;
  747. }       //找到启始码
  748. if(f==1)
  749. {
  750.         if(Tc>Inum1&&Tc<Inum3)
  751.     {
  752.            Im[m/8]=Im[m/8]>>1|0x80; m++;
  753.     }
  754.     if(Tc>Inum2&&Tc<Inum1)
  755.     {
  756.       Im[m/8]=Im[m/8]>>1; m++; //取码
  757.            }
  758.            if(m==32)
  759.     {
  760.       m=0;  
  761.       f=0;
  762.       if(Im[2]==~Im[3])
  763.       {
  764.            IrOK=1;
  765.                           TR0=0;
  766.            }
  767.       else IrOK=0;   //取码完成后判断读码是否正确


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

下载:
1-程序串行.zip (253.88 KB, 下载次数: 137)
回复

使用道具 举报

ID:164850 发表于 2018-1-29 22:34 | 显示全部楼层
楼主可以画个电路图吗
回复

使用道具 举报

ID:308257 发表于 2018-4-14 21:39 | 显示全部楼层
前来学习。
回复

使用道具 举报

ID:335170 发表于 2018-5-21 20:03 | 显示全部楼层
学习 学习
回复

使用道具 举报

ID:294596 发表于 2018-5-26 23:30 | 显示全部楼层
差图啊 兄弟
回复

使用道具 举报

ID:304358 发表于 2018-6-13 17:38 | 显示全部楼层
为啥我用密码可以解锁不能进入管理员系统呢???
回复

使用道具 举报

ID:59552 发表于 2018-10-27 23:29 | 显示全部楼层
程序是错的
回复

使用道具 举报

ID:416616 发表于 2018-10-28 10:59 | 显示全部楼层
鼓励一下
回复

使用道具 举报

ID:382912 发表于 2018-10-28 14:25 | 显示全部楼层
谢谢楼主~程序可好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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