找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机实行的密码锁程序

[复制链接]
跳转到指定楼层
楼主
ID:119047 发表于 2016-5-7 16:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. uchar old1,old2,old3,old4,old5,old6; //原始密码000000
  5. uchar new1,new2,new3,new4,new5,new6;  //每次MCU采集到的密码输入
  6. uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入数码管显示的变量
  7. uchar wei,key,temp;

  8. bit allow,genggai,ok,wanbi,retry,close;         //各个状态位

  9. sbit dula=P2^6;
  10. sbit wela=P2^7;
  11. sbit beep=P2^3;

  12. unsigned char code table[]=
  13. {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  14. 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

  15. void delay(unsigned char i)
  16. {
  17.         uchar j,k;
  18.   for(j=i;j>0;j--)
  19.     for(k=125;k>0;k--);
  20. }

  21. void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
  22. {
  23.    dula=0;
  24.    P0=table[a];
  25.    dula=1;
  26.    dula=0;

  27.    wela=0;
  28.    P0=0xfe;
  29.    wela=1;
  30.    wela=0;
  31.    delay(5);

  32.    P0=table[b];
  33.    dula=1;
  34.    dula=0;

  35.    P0=0xfd;
  36.    wela=1;
  37.    wela=0;
  38.    delay(5);

  39.    P0=table[c];
  40.    dula=1;
  41.    dula=0;

  42.    P0=0xfb;
  43.    wela=1;
  44.    wela=0;
  45.    delay(5);

  46.    P0=table[d];
  47.    dula=1;
  48.    dula=0;

  49.    P0=0xf7;
  50.    wela=1;
  51.    wela=0;
  52.    delay(5);

  53.    P0=table[e];
  54.    dula=1;
  55.    dula=0;

  56.    P0=0xef;
  57.    wela=1;
  58.    wela=0;
  59.    delay(5);

  60.    P0=table[f];
  61.    dula=1;
  62.    dula=0;

  63.    P0=0xdf;
  64.    wela=1;
  65.    wela=0;
  66.    delay(5);
  67. }


  68. void keyscan()
  69. {
  70.   {        
  71.     P3=0xfe;
  72.     temp=P3;
  73.     temp=temp&0xf0;
  74.     if(temp!=0xf0)
  75.     {
  76.       delay(10);
  77.       if(temp!=0xf0)
  78.       {        
  79.         temp=P3;
  80.         switch(temp)
  81.         {
  82.           case 0xee:
  83.                key=0;
  84.                            wei++;
  85.                break;

  86.           case 0xde:
  87.                key=1;
  88.                            wei++;
  89.                break;

  90.           case 0xbe:
  91.                key=2;
  92.                            wei++;
  93.                break;

  94.           case 0x7e:
  95.                key=3;
  96.                            wei++;
  97.                break;
  98.          }
  99.          while(temp!=0xf0)
  100.         {
  101.            temp=P3;
  102.            temp=temp&0xf0;
  103.            beep=0;
  104.          }
  105.          beep=1;
  106.       }
  107.     }
  108.     P3=0xfd;
  109.     temp=P3;
  110.     temp=temp&0xf0;
  111.     if(temp!=0xf0)
  112.     {
  113.       delay(10);
  114.       if(temp!=0xf0)
  115.       {
  116.         temp=P3;
  117.         switch(temp)
  118.         {
  119.           case 0xed:
  120.                key=4;
  121.                            wei++;
  122.                break;

  123.           case 0xdd:
  124.                key=5;
  125.                            wei++;
  126.                break;

  127.           case 0xbd:
  128.                key=6;
  129.                            wei++;
  130.                break;

  131.           case 0x7d:
  132.                key=7;
  133.                            wei++;
  134.                break;
  135.          }
  136.          while(temp!=0xf0)
  137.          {
  138.            temp=P3;
  139.            temp=temp&0xf0;
  140.            beep=0;
  141.          }
  142.          beep=1;
  143.       }
  144.       }
  145.     P3=0xfb;
  146.     temp=P3;
  147.     temp=temp&0xf0;
  148.     if(temp!=0xf0)
  149.     {
  150.       delay(10);
  151.       if(temp!=0xf0)
  152.       {
  153.         temp=P3;
  154.         switch(temp)
  155.         {
  156.           case 0xeb:
  157.                key=8;
  158.                            wei++;
  159.                break;

  160.           case 0xdb:
  161.                key=9;
  162.                            wei++;
  163.                break;
  164.                            
  165.           case 0xbb:
  166.                genggai=1;
  167.                            wei=0;
  168.                break;

  169.           case 0x7b:
  170.                              if(allow)
  171.                ok=1;
  172.                break;
  173.          }
  174.         while(temp!=0xf0)
  175.          {
  176.            temp=P3;
  177.            temp=temp&0xf0;
  178.            beep=0;
  179.          }
  180.          beep=1;
  181.       }
  182.       }
  183.           P3=0xf7;
  184.     temp=P3;
  185.     temp=temp&0xf0;
  186.     if(temp!=0xf0)
  187.     {
  188.       delay(10);
  189.       if(temp!=0xf0)
  190.       {
  191.         temp=P3;
  192.         switch(temp)
  193.         {
  194.           case 0xe7:
  195.                              retry=1;
  196.                break;

  197.           case 0xd7:
  198.                              close=1;
  199.                break;
  200.          }
  201.         while(temp!=0xf0)
  202.          {
  203.            temp=P3;
  204.            temp=temp&0xf0;
  205.            beep=0;
  206.          }
  207.          beep=1;
  208.       }
  209.       }
  210. }
  211. }

  212. void shumima()                //对按键采集来的数据进行分配
  213. {
  214.         if(!wanbi)
  215.         {
  216.         switch(wei)
  217.         {
  218.                 case 1:new1=key;
  219.                             if(!allow)        a=17;
  220.                            else a=key;        break;
  221.                 case 2:new2=key;
  222.                                 if(a==17) b=17;
  223.                                 else b=key;        break;
  224.                 case 3:new3=key;
  225.                                 if(a==17) c=17;
  226.                                 else c=key;        break;
  227.                 case 4:new4=key;
  228.                                 if(a==17) d=17;
  229.                                 else d=key;        break;
  230.                 case 5:new5=key;
  231.                                 if(a==17) e=17;
  232.                                 else e=key;        break;
  233.                 case 6:new6=key;
  234.                                 if(a==17) f=17;
  235.                                 else f=key;
  236.                                 wanbi=1;        break;
  237.         }
  238.         }
  239. }

  240. void yanzheng()          //验证密码是否正确
  241. {
  242.         if(wanbi)         //只有当六位密码均输入完毕后方进行验证
  243.         {
  244.         if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))
  245.                 allow=1;        //当输入的密码正确,会得到allowe置一
  246.         }
  247. }

  248. void main()
  249. {
  250.         while(1)
  251.         {
  252.                 keyscan();
  253.                 shumima();
  254.                 yanzheng();
  255.                 if(allow)         //验证完后,若allow为1,则开锁
  256.                 {
  257.                         P1=0x00;
  258.                         if(!genggai)
  259.                                 wanbi=0;
  260.                 }
  261.                 if(genggai)          //当S16更改密码键被按下,genggai会被置一
  262.                 {
  263.                         if(allow)         //若已经把锁打开,才有更改密码的权限
  264.                         {
  265.                                 while(!wanbi)        //当新的六位密码没有设定完,则一直在这里循环
  266.                                 {
  267.                                          keyscan();
  268.                                         shumima();
  269.                                         if(retry|close)         //而当探测到重试键S18或者关闭密码锁键S19被按下时,则跳出
  270.                                         {        wanbi=1;
  271.                                                 break;
  272.                                         }
  273.                                         display(a,b,c,d,e,f);
  274.                                 }
  275.                         }
  276.                 }
  277.                 if(ok)          //更改密码时,当所有六位新密码均被按下时,可以按下此键,结束密码更改
  278.                 {                  //其他时间按下此键无效
  279.                         ok=0; wei=0;
  280.                         genggai=0;
  281.                         old1=new1;old2=new2;old3=new3; //此时,旧的密码将被代替
  282.                         old4=new4;old5=new5;old6=new6;
  283.                         a=16;b=16;c=16;d=16;e=16;f=16;
  284.                 }
  285.                 if(retry)        //当重试按键S18被按下,retry会被置位
  286.                 {
  287.                 retry=0; wei=0;wanbi=0;
  288.                 a=16;b=16;c=16;d=16;e=16;f=16;
  289.                 new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;               
  290.                 }
  291.                 if(close)  //当关闭密码锁按键被按下,close会被置位
  292.                 {
  293.                         close=0;genggai=0;//所有变量均被清零。
  294.                         wei=0;        wanbi=0;
  295.                         allow=0;
  296.                         P1=0xff;
  297.                         a=16;b=16;c=16;d=16;e=16;f=16;
  298.                         new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;
  299.                 }
  300.                 display(a,b,c,d,e,f); //实时显示
  301.         }
  302. }

复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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