找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机电子密码锁

[复制链接]
跳转到指定楼层
楼主
密码锁的文件、仿真图
单片机仿真图(proteus)


源码展示:
  1. #include <reg52.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;


  4. #define key P1                   //按键io口
  5. sbit fen=P3^0;                   //蜂鸣器io口
  6. sbit rs=P3^1;        //LCD控制口
  7. sbit rw=P3^2;
  8. sbit e=P3^3;
  9. sbit led=P3^4;       //LED灯io口

  10. //bit 位变量声明:定义一个位变量的值
  11. u8 keyz=17,j=0,biao1=0,a=10,b=10,c=10,d=10;
  12. bit biao=0;
  13. u16 zh;

  14. u8 shu[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
  15.           0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
  16. u8 zi[]={"password:"};
  17. u8 num[]={"0123456789ABCDEF"};


  18. void delay(u16 i){
  19.          while(i--);
  20.                         }

  21. /*蜂鸣器*/
  22. void Fen(u8 a,b)   //蜂鸣器发声函数
  23. {
  24.         u8 i,j;        
  25.         for(i=0;i<a;i++)
  26.         {
  27.                 for(j=0;j<100;j++)
  28.                  {fen=~fen;delay(b);}
  29.                                           }
  30.                   }


  31. /*LCD*/
  32. void writecom(u8 com){                //LCD写指令
  33.          rs=0;
  34.          rw=0;
  35.          e=0;
  36.          P0=com;
  37.          delay(5);
  38.          e=1;
  39.          e=0;
  40.                      }

  41. void writedat(u8 dat){                //LCD写数据
  42.          rs=1;
  43.          rw=0;
  44.          e=0;
  45.          P0=dat;
  46.          delay(5);
  47.          e=1;
  48.          e=0;
  49.                      }

  50. void initlcd(){                           //LCD初始化函数
  51.            writecom(0x38);   //显示模式设置
  52.            writecom(0x0c);
  53.            writecom(0x06);

  54.                           }

  55. void xian(){         //LCD显示数字函数
  56.                       writedat(num[keyz]);
  57.                                       if(a==10){a=keyz; }                   //对abcd,四位数的单独赋值
  58.                                           else if(b==10){b=keyz;}
  59.                                           else if(c==10){c=keyz;}
  60.                                           else{d=keyz;}
  61.                                           if(j!=3){j++;}biao=0;

  62. }

  63. /*键盘*/
  64. void Key(){u8 a=0;                         //矩形式键盘函数

  65.          if(key!=0x0f){delay(1000);
  66.          if(key!=0x0f){
  67.                  key=0x0f;
  68.                 switch(key){
  69.                            case 0x07: keyz=0;biao=1;break;
  70.                            case 0x0b: keyz=1;biao=1;break;
  71.                            case 0x0d: keyz=2;biao=1;break;
  72.                            case 0x0e: keyz=3;biao=1;break;
  73.                 }
  74.                 key=0xf0;
  75.                 switch(key){
  76.                            case 0x70: keyz=keyz;biao=1;break;
  77.                            case 0xb0: keyz=keyz+4;biao=1;break;
  78.                            case 0xd0: keyz=keyz+8;biao=1;break;
  79.                            case 0xe0: keyz=keyz+12;biao=1;break;
  80.                 }

  81.          }
  82.          while((a<50)&&(key!=0xf0)){a++;delay(10000);}
  83.          }
  84.             }
  85.                                                 
  86. void shi(){u8 i;          // 按键值判断函数
  87.          if(biao&&keyz!=15){  //判断标志位biao是否为1,为1则有按键操作并且按键的值不等于15                 
  88.                         
  89.                          writecom(0x80+0x40+j);                          //数字显示位置进行累加操作
  90.                          if(j<0){j=0;}                                          //数字显示位置边界
  91.                   switch(keyz){                                                  //switch判断按键并执行对应操作
  92.                           case 0:xian(); break;
  93.                                 case 1:xian(); break;
  94.                                 case 2:xian(); break;
  95.                                 case 3:xian(); break;
  96.                                 case 4:xian(); break;
  97.                                 case 5:xian(); break;
  98.                                 case 6:xian(); break;
  99.                                 case 7:xian(); break;
  100.                                 case 8:xian(); break;
  101.                                 case 9:xian(); break;
  102.                                 case 10:writedat(num[keyz]);
  103.                                        
  104.                                                 j++;biao=0;break;
  105.                                 case 11:writedat(num[keyz]);
  106.                                        
  107.                                                 j++;biao=0;break;
  108.                                 case 12:
  109.                                                 biao1=0;                                                  //重置标志位biao1,上锁
  110.                                         biao=0;break;
  111.                                 case 13:writecom(0x01);        delay(1000);          //全屏清除
  112.                                                 for(i=0;i<sizeof(zi);i++){
  113.                             writecom(0x80+i);
  114.                             writedat(zi[i]);                }
  115.                                         j=0;biao=0;break;
  116.                                 case 14:                                                                   //对当前数字位删除的操作
  117.                                                 writedat(' ');
  118.                                                 j--;
  119.                                                 writecom(0x80+0x40+j);writedat(' ');
  120.                                                 biao=0;break;
  121.                                 case 15:                          //确定按键
  122.                                         j++;biao=0;break;
  123.                                        }
  124.                                   }
  125.                         if(keyz==15){                                                                  //判断按键值如果等于15,便视为按下确定键
  126.                         writecom(0x01);delay(1000);
  127.                          zh=a*1000+b*100+c*10+d;                                         //将ABCD,四位数合并并进行判断是否为正确密码
  128.                           if(zh==1234){  //设密码为1234
  129.                         j=0;
  130.                     biao1=1;                                                                         //将biao1标志位置1便为密码正确
  131.                     keyz=17;                                                                           //使按键值跳出最大值15便不会循坏显示
  132.                                                 }
  133.                 else{
  134.                            j=0;
  135.                   biao1=0;                                                                                 //反之密码错误
  136.                            keyz=17;        
  137.                         Fen(20,200);                                    //蜂鸣器报警
  138.                         }
  139.                         zh=0;a=10,b=10,c=10,d=10;                                         //重置ABCD变量
  140.                     for(i=0;i<sizeof(zi);i++){
  141.               writecom(0x80+i);
  142.               writedat(zi[i]);                           }
  143.                                                                         }         
  144.                             }
  145.                   
  146. void main(){u8 i; led=1;
  147.      initlcd();                        //LCD初始化函数
  148.          for(i=0;i<sizeof(zi);i++){
  149.          writecom(0x80+i);
  150.          writedat(zi[i]);                           }
  151.          while(1){
  152.                    Key();               //定义键盘函数
  153.                   shi();               //按键判断函数,灯亮或报警
  154.                   P2=shu[keyz];        //数码管显示当前输入值
  155.                   if(biao1==1){ led=0;                                            //判断标志位biao1 为1则密码正确显示ok
  156.                   writecom(0x80+0x40+10);
  157.               writedat('O');
  158.                   writecom(0x80+0x41+10);
  159.               writedat('K'); }

  160.                   else if(biao1==0){led=1;                                   //biao1为0则显示密码错误显示no
  161.                   writecom(0x80+0x40+10);
  162.               writedat('N');
  163.                   writecom(0x80+0x41+10);
  164.               writedat('O');}
  165.                       }
  166.            }
复制代码



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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