找回密码
 立即注册

QQ登录

只需一步,快速开始

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

6位电子密码锁仿真设计与单片机程序源码 AT24C02存储

[复制链接]
跳转到指定楼层
楼主
一个简易的电子密码锁,6位密码,初始密码是12345
51单片机采用IIC和AT24C02通信
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <IIC.h>
  3. #include <LCD1602.h>

  4. #define U 6

  5. void delay(unsigned int i)
  6. {
  7.     while(i--);
  8. }


  9. int Time30s=30;

  10. unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-',' '};

  11. unsigned char code Led1[]={0x00,0x1F,0x04,0x04,0x1F,0x04,0x0D,0x17};//无
  12. unsigned char code Led2[]={0x04,0x0F,0x19,0x06,0x1C,0x0F,0x09,0x0F};//名
  13. unsigned char code Led3[]={0x04,0x04,0x04,0x15,0x15,0x04,0x14,0x0C};//小
  14. unsigned char code Led4[]={0x04,0x04,0x00,0x1F,0x00,0x0A,0x0A,0x11};//六

  15. char code c1[]="Input  Password:";
  16. char code c2[]="Input New Again:";
  17. char code c3[][16]={"    Correct     ",
  18.                     "     (^_^)      "};
  19. char code c4[][16]={"     Error      ",
  20.                    "     (@_@)      "};
  21. char code c5[][16]={"Set New Password",
  22.                                    "YES    or     NO"};
  23. char code c6[]="QQ:  1031594831 ";
  24. char code c7[16]={"                "};
  25. char code c8[]="Wait 30s:   30s ";
  26. char code c9[][16]={" Confirm   exit ",
  27.                     "YES    or     NO"};
  28. char code c10[]="New  Password:  ";
  29. char code c11[]="Set    Success  ";
  30.                           
  31. char Word[U];        //初始密码

  32. bit ai=0;  //判断按键是否按下位

  33. //**********定时器0初始化函数*********//
  34. void TIME0_INIT()
  35. {
  36.    TMOD=0x01;
  37.    TH0=0x3C;
  38.    TL0=0xB0;
  39.    ET0=1;
  40.    EA=1;
  41.    TR0=0;
  42. }

  43. /**************按键判断函数*********************/
  44. int keypross()
  45. {
  46.    int A;
  47.    if(P1!=0xf0)
  48.    {
  49.       delay(1000);
  50.           if(P1!=0xf0)
  51.           {
  52.               ai=1;                 //按键按下
  53.               switch(P1)
  54.               {
  55.                    case 0xe0:
  56.                                 A=1;break;
  57.                             case 0xd0:
  58.                                                A=2;break;
  59.                             case 0xb0:
  60.                                                A=3;break;
  61.                             default:
  62.                                 ai=0;break;      
  63.               }
  64.               P1=0x0f;
  65.                   if(P1!=0x0f)
  66.                   {
  67.                               switch (P1)
  68.                               {
  69.                                          case 0x0e:
  70.                                                       A=A;break;
  71.                                            case 0x0d:
  72.                                                             A=A+3;break;
  73.                                             case 0x0b:
  74.                                                     A=A+6;break;
  75.                                            case 0x07:
  76.                                                     A=A+9;break;
  77.                                            default:
  78.                                                    break;
  79.                               }
  80.                    }
  81.                   while(P1!=0x0f);//判断按键是否松开
  82.           }
  83.    }
  84.    P1=0xf0;
  85.    return A;
  86. }


  87. /**************开机密码判断函数****************/
  88. bit OpenKey()
  89. {
  90.    int i,a;
  91.    bit b=0,c=0;
  92.    char w1[U];
  93.    ai=0;
  94.    while(1)
  95.    {
  96.        for(i=0;i<U+1;i++)
  97.        {
  98.           while(!ai)
  99.              {
  100.                     P1=0xf0;
  101.             a=keypross();
  102.                         if(i==U)
  103.                         {
  104.                            ai=0;
  105.                            if(a==10||a==12)
  106.                            {
  107.                               break;
  108.                            }
  109.                         }
  110.              }
  111.                 ai=0;
  112.                 switch (a)
  113.                 {
  114.                   case 10:
  115.                              b=1;break;
  116.                       case 11:
  117.                              a=0;break;
  118.                       case 12:
  119.                              c=1;break;
  120.                       default:
  121.                              break;  
  122.                 }
  123.                           if(b||c) break;
  124.                         w1[i]=ASCII[a];
  125.                         DisplayOneChar(i+2,1,'*');         //密码输入时显示‘ * ’符号
  126.                         
  127.                    }
  128.                    if(b)
  129.                    {
  130.                       for(i=0;i<U;i++)
  131.                           {
  132.                              if(w1[i]!=Word[i])
  133.                                  {
  134.                                     return 0;                 //密码错误,退出
  135.                                  }
  136.                           }
  137.                   return 1;    //密码正确,退出
  138.                    }
  139.                    if(c)
  140.                    {
  141.                         a=0;
  142.                         b=0;
  143.                         return 0;
  144.                    }
  145.         }
  146. }

  147. /*******************************************
  148. *******       显示函数        **************
  149. *******************************************/
  150. void LcdPross(char *p,char *q)
  151. {
  152.    int i;
  153.    LCD1602_WRITERCOM(0x80);
  154.    for(i=0;i<16;i++)
  155.    {
  156.        LCD1602_WRITERDAT(*p++);
  157.    }
  158.    LCD1602_WRITERCOM(0xC0);
  159.    for(i=0;i<16;i++)
  160.    {
  161.        LCD1602_WRITERDAT(*q++);
  162.    }
  163. }

  164. bit LcdTime30s()
  165. {
  166.             
  167.         
  168.         if(Time30s==-1)
  169.         {
  170.            TR0=0;
  171.            Time30s=30;
  172.            return 0         ;
  173.         }
  174.         else
  175.         {
  176.           TR0=1;
  177.           return 1;
  178.         }
  179. }

  180. //************倒计时30s函数***************//
  181. bit SetPassword()
  182. {
  183.     int i,j=0,a;
  184.         char w1[U],w2[U];
  185.         bit b=0,c=0;
  186.         ai=0;   
  187.         for(j;j<2;j++)
  188.         {
  189.             if(j==0)
  190.                 {
  191.                            LcdPross(c10,c7);
  192.                 }
  193.                 else
  194.                 {
  195.                     LcdPross(c2,c7);
  196.                 }
  197.             for(i=0;i<U+1;i++)
  198.                    {
  199.                        while(!ai)
  200.                     {
  201.                       a=keypross();
  202.                                   if(i==U)
  203.                                   {
  204.                                         ai=0;
  205.                                      if(a==10||a==12)
  206.                                         break;
  207.                                   }
  208.                        }
  209.                 ai=0;
  210.                 switch (a)
  211.                 {
  212.                           case 10:
  213.                              b=1;break;
  214.                               case 11:
  215.                              a=0;break;
  216.                               case 12:
  217.                              c=1;break;
  218.                               default:
  219.                              break;  
  220.                 }
  221.                           if(b&&i<U)
  222.                         {
  223.                                 b=0;
  224.                                 return 0;                                          
  225.                         }
  226.                         if(b&&i==U)
  227.                         {
  228.                                 b=0;
  229.                                 break;
  230.                         }
  231.                         if(c)
  232.                         {
  233.                                 c=0;
  234.                                 return 0;
  235.                         }
  236.                         if(j==0)
  237.                         {
  238.                                   w1[i]='0'+a;
  239.                                 DisplayOneChar(i+2,1,w1[i]);
  240.                         }
  241.                         else
  242.                         {
  243.                                   w2[i]='0'+a;
  244.                                 DisplayOneChar(i+2,1,w2[i]);
  245.                         }                                         
  246.                 }
  247.         }
  248.         for(i=0;i<U;i++)
  249.         {
  250.             if(w1[i]!=w2[i])
  251.                 {
  252.                      return 0;
  253.                 }
  254.         }
  255.         for(i=0;i<U;i++)
  256.         {
  257.           Word[i]=w2[i];
  258.         }
  259.         return 1;
  260. }
  261.         


  262. void LcdDisplay()
  263. {
  264.     int i,a;
  265.         while(1)
  266.         {
  267.             i=4;
  268.                 while(--i)
  269.                 {
  270.                     LcdPross(c1,c7);//显示输入密码
  271.                         if(OpenKey())        //判断密码是否正确
  272.                         {
  273.                                    LcdPross(c3[0],c3[1]);        //显示正确
  274.                                 delay(50000);
  275.                                 break;
  276.                         }               
  277.                         else
  278.                         {
  279.                                    LcdPross(c4[0],c4[1]);        //显示错误
  280.                                 delay(50000);
  281.                         }
  282.                 }
  283.                 if(i==0)
  284.                 {
  285.                     LcdPross(c8,c7);
  286.                            while(LcdTime30s());
  287.                 }
  288.                 else
  289.                 break;
  290.         }
  291.         while(1)
  292.         {
  293.                 while(1)                                          
  294.                 {
  295.                     LcdPross(c5[0],c5[1]);          //显示改密码界面
  296.                         ai=0;
  297.                     while(!ai)
  298.                     {
  299.                         a=keypross();
  300.                         if(a!=10&&a!=12)
  301.                         {
  302.                                 ai=0;
  303.                         }                        
  304.                     }
  305.                         if(a==12)
  306.                         {
  307.                                break;
  308.                         }
  309.                     if(a==10)
  310.                     {
  311.                         if(SetPassword())
  312.                                 {
  313.                                            LcdPross(c11,c7);                 //显示改密成功
  314.                                            delay(50000);
  315.                                         for(i=0;i<U;i++)
  316.                                         {
  317.                                            AT24C02Writer(i,Word[i]);
  318.                                            delay(100);
  319.                                         }
  320.                                         delay(50000);
  321.                                 }        
  322.                                 else
  323.                                 {
  324.                                            LcdPross(c4[0],c4[1]);
  325.                                            delay(50000);
  326.                                 }
  327.                     }
  328.                 }
  329.                 LcdPross(c9[0],c9[1]);                   //显示  是否退出界面
  330.                 ai=0;
  331.                 while(!ai)
  332.             {
  333.                 a=keypross();
  334.                 if(a!=10&&a!=12)
  335.                 {
  336.                                ai=0;
  337.                 }                        
  338.             }
  339.                 if(a==10)
  340.                 {                    
  341.                   break;
  342.                 }
  343.    }
  344. }

  345. void main()
  346. {
  347.     int i;
  348.     TIME0_INIT();
  349.         LCD1602_INIT();
  350.         P1=0xf0;
  351.         /*
  352.         for(i=0;i<U;i++)
  353.         {
  354.            DisplayOneChar(i+2,1,AT24C02Read(i));  //开机之前显示密码
  355.         }
  356.         delay(50000);
  357.         delay(50000);
  358.         delay(50000);
  359.         */
  360.     LCD1602_Custom(4,0,0,Led1);        //无
  361.         LCD1602_Custom(6,0,1,Led2);        //名
  362.         LCD1602_Custom(8,0,2,Led3);        //小
  363.         LCD1602_Custom(10,0,3,Led4);//六
  364.         LCD1602_WRITERCOM(0xC0);
  365.     for(i=0;i<16;i++)
  366.     {
  367.        LCD1602_WRITERDAT(c6[i]); //QQ号
  368.     }
  369.         while(!ai)
  370.         {
  371.           keypross();  //按键按下跳转密码输入页面
  372.         }
  373.         ai=0;

  374.         for(i=0;i<U;i++)
  375.         {
  376.            Word[i]=AT24C02Read(i);         //读取密码
  377.         }
  378.         while(1)
  379.         {
  380.        LcdDisplay();
  381.         }
  382. }


  383. void Time00() interrupt 1
  384. {
  385.    static unsigned int i;
  386.    TH0=0x3C;
  387.    TL0=0xB0;
  388.    i++;
  389.    if(i==20)
  390.    {
  391.       i=0;
  392.           Time30s--;
  393.           DisplayOneChar(12, 0, ASCII[Time30s/10]);
  394.           DisplayOneChar(13, 0, ASCII[Time30s%10]);
  395.    }
  396. }
复制代码

所有资料51hei提供下载:
电子密码锁.zip (123.8 KB, 下载次数: 53)



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:232524 发表于 2018-9-21 22:18 来自手机 | 只看该作者
初始密码是123456
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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