找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+1602显示的密码锁设计 仿真与代码都有

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /*
  2. 上电显示8个*
  3. 输入8个按键
  4. 按*开锁
  5. 错误报警
  6. 再次按*修改密码
  7. 输入8个按键
  8. 按#保存密码
  9. 按*返回主菜单


  10. */
  11. #include<AT89x51.h>
  12. #include"intrins.h"
  13. #include"key.h"
  14. #include"xsh.h"
  15. #include"24c02.h"
  16. #include"1602.h"
  17. #define ulong unsigned long
  18. bit  BJCB=0;//报警标志                                          
  19.      XG=0,//修改密码标志位
  20.      BJ=0,//报警标志位
  21.      SJ=0;//锁键盘标志位
  22.     // xg=0;//修改密码标志位
  23. uchar PSWD0_0[16]={0};//密码输入缓存存储单元
  24. //uchar code PSWD0_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};//用户初始密码存储单元
  25. //uchar PSWD1_0[16]={0};//读出密码缓存存储单元
  26. uchar PSWD1_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};////管理员初始密码存储单元
  27. sbit OUT=P2^7;//输出端口
  28. sbit L1=P3^2;//上电指示
  29. sbit L2=P3^1;//开锁指示
  30. sbit L3=P3^0;//报警指示
  31. uint   mg=0,//密码个数
  32.        KSC=0,//开锁次数
  33.        BJC=0,//报警次数
  34.            TCNTY=0,//用户按键定时次数累加
  35.            TCNTG=0,//管理员输入密码定时次数
  36.            yhsh,//用户输入标志位
  37.            glsh,//管理员输标志位
  38.            shw;//密码输完标志位
  39. void yhmimaxig();//密码修改程序
  40. void glmimaxig();//管理员修改程序
  41. void bjyin(ulong t)
  42. {
  43. ulong c;
  44. uint n;
  45. for(c=0;c<t;c++)
  46. {
  47. for(n=0;n<50;n++); //延时
  48. BEEP=~BEEP; //取反输出到喇叭的信号
  49. }
  50. }
  51. void delay_10ms(void)
  52. {
  53.         uint i = 1000;
  54.         while(i--);
  55. }
  56. //////////////定时中断服务函数//////////////////////////////////////
  57. void timer0() interrupt 1
  58. {
  59. uint i;
  60. TH0=(65536-50000)/256; //对TH0 TL0赋值50MS定时
  61. TL0=(65536-50000)%256; //重装计数初值
  62. if(yhsh==1)
  63. {
  64.   TCNTY++;//用户定时计数
  65.   if(shw==1)
  66. {
  67.   TR0=0;
  68.   TCNTY=0;
  69.   }
  70.   if(TCNTY==400)
  71.   {
  72.    TR0=0;//关闭T0定时器
  73.    TCNTY=0;
  74.     mg=0;//密码个数清零
  75.         L1=1;
  76.         for(i=0;i<2;i++)//声光报警电路
  77.          {
  78.                   L3=0;
  79.                   bjyin(1000);
  80.                   L3=1;
  81.                   delay(1000);
  82.           }
  83.           L1=0;
  84.      }
  85.     }
  86.         else if(glsh==1)
  87.             {
  88.                  TCNTG++;//管理员定时计数
  89.          if(shw==1)
  90.         {
  91.            TR0=0;
  92.            TCNTG=0;
  93.          }
  94.        if(TCNTG==400)
  95.        {
  96.         TR0=0;//关闭T0定时器
  97.         TCNTG=0;
  98.         mg=0;//密码个数清零
  99.                 L1=1;
  100.              for(i=0;i<2;i++)//声光报警电路
  101.             {
  102.                   L3=0;
  103.                   bjyin(1000);
  104.                   L3=1;
  105.                   delay(1000);
  106.                  }
  107.                  L1=0;
  108.                 }
  109.                 }          
  110.                 }                      
  111.             
  112. void main()
  113. {  uint i;///////////密码输入/////////////////
  114. init_1602();

  115. /////////////////////////////开锁前显示///////////////////////////  
  116. loop:  L1=0;//上电红灯亮
  117.                     L2=1;//开锁成功后绿灯亮
  118.                     L3=1;//输错时黄灯亮报警
  119.                     OUT=0;//开信号关闭
  120.         write_string(0,0,"qsrmm");
  121.               write_com(0xc0);
  122.               for(i=0;i<8;i++)
  123.                 {
  124.                  write_data(0x2a);
  125.                     }//开锁前显示
  126.             
  127.         ////////////////////密码输入///////////////////////////////////
  128. if(SJ==0)//锁键盘标志位为0
  129. {
  130.   do
  131.    {
  132.     flag=0;//键盘标志位
  133.     key();

  134.            if(flag==1&&num<=9)
  135.            {
  136.             PSWD0_0[mg]=num;
  137.                         write_com(0xc0+mg);
  138.                   write_data(0x30+num);
  139.             mg++;//密码个数
  140.             }
  141.                  //删除未使用//
  142.           if(flag==1&&num==14&&mg>=1)//输入错误删除
  143.            {
  144.             mg=mg-1;
  145.             }
  146.           if(mg==1) //有密码键按下开定时器限时
  147.            {
  148.             TR0=1;
  149.             yhsh=1;
  150.            }
  151.    }       
  152.    while(num!=11);
  153.          //////////////////密码比较////////////////////////
  154. if(flag==1&&num==11)  
  155. { flag=0;
  156.    yhsh=0;
  157.    shw=1;
  158.    num=0;
  159.   for(i=0;i<8;i++)        //从24c02里读出16个密码
  160.   {
  161.     PSWD1_1[i]=i2cRead24LC16B(i);
  162.     delay_10ms;  
  163.   }
  164.   for(i=0;i<8;i++)
  165. {
  166.    if(PSWD1_1[i]!=PSWD0_0[i])
  167.    {
  168.      BJCB=1;
  169.      break;
  170.         }
  171.    else
  172.      BJCB=0;       
  173.    
  174.   }
  175. /////////////////////////////////////////////////////////////
  176. ///////////////////////////////////////////////////////////////
  177.         //////////////////////报警/////////////////////////////////
  178.    if(BJCB!=0)
  179.        {
  180.              BJC++;
  181.                  if(BJC!=3) //输错3次密码         
  182.             {
  183.                  BJCB=0; //第一次和第二次报警
  184.              delay(500);
  185.                  mg=0;//密码个数清零
  186.                  L1=1;//上电指示
  187.                  for(i=0;i<3;i++)//声光报警电路
  188.                  {
  189.                   L3=0;//报警指示
  190.                   write_string(0,0,"mimacuowu BJ");  //显示报警
  191.                   bjyin(1000);
  192.                   L3=1;//报警指示
  193.                   delay(1000);
  194.                   }
  195.                  goto loop;         //开锁前显示
  196.                 }
  197.                         //第三次输错密码//
  198.           else if(BJC==3)
  199.             {
  200.                    BJC=0;
  201.              BJCB=0;
  202.              write_string(0,0,"mima3cuowu BJ");//显示三次输入密码失败,自锁
  203.              SJ=1;//锁键盘标志位
  204.              mg=0;//密码个数清零
  205.                    L1=1;//上电
  206.                    for(i=0;i<2;i++)//声光报警电路
  207.                    {
  208.                      L3=0;//报警
  209.                      bjyin(1000);
  210.                      L3=1;
  211.                      delay(1000);
  212.                   }
  213.              goto loop;
  214.                 }
  215.                         /////没有报警//
  216.                 }               
  217.            else
  218.            if(BJCB==0)
  219.           {
  220.            KSC++;
  221.            write_string(0,0,"ok-KS");         //显示开锁ok
  222.            i2cWrite24LC16B(KSC,0X20);//写入开锁次数到24c01 0x20
  223.            if(KSC==100)
  224.            {
  225.             SJ=1;
  226.                  }
  227.            L2=0;//开锁成功后绿灯亮
  228.            L1=1;
  229.            OUT=1;//开信号打开
  230.            mg=0;//密码个数清零
  231. loop1:do           //键盘扫描等待功能键按下
  232.            {
  233.             flag=0;
  234.             key();
  235.                 if(flag)
  236.            {       
  237.              flag=0;
  238.             switch(num)
  239.            {   
  240.             case 11:         //按#开始修改密码  
  241.                 {
  242.                                          write_string(0,0,"xg_mm");
  243.                  write_com(0xc0);
  244.                  for(i=0;i<8;i++)
  245.                  {
  246.                  write_data(0x2a);
  247.                     }//开锁前显示
  248.                              do
  249.             {
  250.              flag=0;//键盘标志位
  251.              key();
  252.                                                         //修改密码
  253.                                                         if(flag==1&&num<=9)
  254.                       {
  255.                        PSWD0_0[mg]=num;
  256.                                    write_com(0xc0+mg);
  257.                              write_data(0x30+num);
  258.                        mg++;//密码个数
  259.                          }
  260.                      if(mg==8)
  261.                        {
  262.                          do           //键盘扫描等待功能键按下
  263.                     {
  264.                            flag=0;
  265.                            key();
  266.                              }
  267.                          while(num!=12);
  268.                         }
  269.                  }       
  270.                while(num!=12);
  271.       if(mg!=8&&num==12)
  272.      {
  273.       for(i=mg;i<8;i++)
  274.          {
  275.            PSWD0_0[i]=0;
  276.           }
  277.          }
  278.         if(flag==1&&num==12)
  279.    {
  280.      flag=0;       
  281.          mg=0;
  282.    for(i=0;i<8;i++)        //用一次写一个向24c02里写
  283.   {
  284.    i2cWrite24LC16B(PSWD0_0[i],i);
  285.    delay_10ms;  
  286.   }
  287.            write_string(0,1,"XG_OK      ");         //显示开锁ok
  288.            delay(1000);
  289.            goto loop;
  290.        
  291.    do           //键盘扫描等待功能键按下
  292.    {
  293.          flag=0;
  294.          key();
  295.         }
  296.         while(num!=11); //按下返回键,锁锁返回
  297.         {
  298.       goto loop;
  299.         }
  300.     }
  301.         };break;
  302.                

  303.                     }
  304.                         }
  305.                         }
  306.           while(flag!=0);//如果设置密码键按下
  307.           goto loop1;
  308. // i2cWrite24c02_page(0x00,PSWD1_1,mg);
  309.    }
  310.    }
  311.   }
  312. }
复制代码

所有资料51hei提供下载:
8位密码锁ok.rar (128.59 KB, 下载次数: 37)

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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