找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4133|回复: 1
收起左侧

基于51单片机电子密码锁,Proteus8.6仿真+程序keil5

[复制链接]
ID:539024 发表于 2021-7-9 17:45 | 显示全部楼层 |阅读模式
1、在锁开的状态下输入密码,设置的密码共4位,矩阵键盘分别代表数字1290,输入的密码用数码管显示,最后输入的密码显示在最右边的数码管上,即每输入一位数,密码在数码管上的显示左移一位。可删除输入的数字,删除的是最后输入的数字,每删除一位,密码在数码管的显示右移一位,并在左边空出的位上补充“0”
2、用一位输出电平的状态代表锁的开闭状态,绿色发光管指示。
3、为保证密码锁主人能打开密码锁,设置一个万能密码(1111),在主人忘记密码时使用。
初始密码是1234;

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

protues仿真图

protues仿真图
51hei.gif

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

  4. typedef unsigned char uchar;
  5. typedef unsigned int  uint;

  6. sbit we1 = P2^0 ;
  7. sbit we2 = P2^1        ;
  8. sbit we3 = P2^2        ;
  9. sbit we4 = P2^3 ;

  10. sbit kai_s = P2^6;
  11. sbit guan_s = P2^7;
  12. sbit beep = P2^5;          //蜂鸣器
  13. uchar code table[]={0xc0,0xf9,0xa4,0xb0,
  14.                                         0x99,0x92,0x82,0xf8,
  15.                                         0x80,0x90,0x88,0x83,
  16.                                         0xc6,0xa1,0x86,0x8e};

  17. uchar anj=0,flag=0,mi=0;
  18. uchar temp,key;
  19. bit xiu=0;
  20. int anj1=0, mima = 1234,mima1=0;                  
  21. //延时子函数
  22. void delay1(uint z)
  23. {
  24.         uint x,y;
  25.         for(x=0;x<z;x++)
  26.                 for(y=0;y<110;y++);
  27. }
  28. void display1(int a)                        //显示程序
  29. {
  30.         P0 = 0xff;
  31.         we1=1;
  32.         P0=table[a/1000];
  33.         delay1(5);
  34.         we1=0;

  35.         P0 = 0xff;
  36.         we2=1;
  37.         P0=table[a/100%10];
  38.     delay1(5);
  39.         we2=0 ;

  40.         P0=0xff;
  41.         we3=1;
  42.         P0=table[a/10%10];
  43.         delay1(5);
  44.         we3=0 ;

  45.         P0=0xff;
  46.         we4=1;
  47.         P0=table[a%10];
  48.         delay1(5);
  49.         we4=0 ;


  50. }
  51. void display2()
  52. {
  53.         P0 = 0xbf;
  54.         we1=1;
  55.         we2=1;
  56.         we3=1;
  57.         we4=1;

  58. }


  59. void anjian()
  60. {
  61.         if(key<10&&mi<4)
  62.          {
  63.                  if(xiu==0)
  64.                 {
  65.                         anj1 = anj1 * 10 + key;
  66.                         mi++;
  67.                 }
  68.                 if(xiu==1)
  69.                 {
  70.                         mima1 = mima1 * 10 + key;
  71.                         mi++;
  72.                 }
  73.           }
  74.     else if( key==13 && mi>0)          //退格
  75.             {
  76.                           if(xiu==0)
  77.                           {
  78.                                  anj1        = anj1/10;
  79.                              mi--;
  80.                          }
  81.                          else                                 //修改密码
  82.                          {
  83.                                   mima1 = mima1/10;
  84.                                  mi--;
  85.                          }
  86.           }
  87.          else if(key==12)                     //确认
  88.          {
  89.                    if(anj1==1111 || anj1==mima)
  90.                           {
  91.                                 kai_s=1;
  92.                                 guan_s=0;
  93.                                 mi=0;
  94.                           }
  95.                         else
  96.                         {
  97.                                 beep=0;
  98.                                 delay1(100);
  99.                                 beep=1;
  100.                           delay1(100);
  101.                           beep=0;
  102.                                 delay1(100);
  103.                                 beep=1;
  104.                           delay1(100);
  105.                         }
  106.                         if(xiu==1)
  107.                         {
  108.                                 mima=mima1;
  109.                                 xiu=0;
  110.                                 kai_s=0;
  111.                                 guan_s=1;
  112.                                 anj1=0;
  113.                                 mi=0;
  114.                         }
  115.           }

  116.           else if( key==14)                    //关锁
  117.           {
  118.                   kai_s=0;
  119.                 guan_s=1;
  120.                 anj1=0;
  121.                 mi=0;
  122.           }
  123.            else if( kai_s==1&&key==16)                    //修改密码
  124.           {
  125.                         xiu = 1;

  126.           }
  127. }


  128. /**************************矩阵键盘函数*********/
  129. //矩阵按键扫描子函数
  130. uchar keyscan()
  131. {
  132.         key=0xff;
  133.         P1=0xfe; //将第一行线置低电平
  134.         temp=P1;//读JPJK的当前状态到 temp
  135.         temp&=0xf0;// temp = temp & 0xf0 按位与
  136.         if(temp!=0xf0)
  137.         {
  138.                 delay1(10);//延时去抖
  139.                 temp=P1;
  140.                 temp&=0xf0;
  141.           if(temp!=0xf0)//第一行有键被按下
  142.                 {
  143.                         temp=P1;//读被按下的键
  144.                         switch(temp)
  145.                         {
  146.                                 case 0xee:         key=1;
  147.                                                         break;
  148.                                 case 0xde:         key=2;
  149.                                                         break;
  150.                                 case 0xbe:         key=3;
  151.                                                         break;
  152.                                 case 0x7e:         key=100;   //显示密码
  153.                                                         break;
  154.                         }
  155.                         while(temp!=0xf0)//等待按键释放
  156.                         {
  157.                                 temp=P1;
  158.                                 temp&=0xf0;
  159.                        
  160.                         }
  161.                         if(key==100)    //显示密码
  162.                         {
  163.                                 flag++;
  164.                                 if(flag==2)flag=0;
  165.                         }
  166.                         anjian();
  167.                 }
  168.         }
  169.         P1=0xfd; //将第二行线置低电平
  170.         temp=P1;//读JPJK的当前状态到 temp
  171.         temp&=0xf0;// temp = temp & 0xf0
  172.         if(temp!=0xf0)
  173.         {
  174.                 delay1(10);//延时去抖
  175.                 temp=P1;
  176.                 temp&=0xf0;
  177.           if(temp!=0xf0)//第二行有键被按下
  178.                 {
  179.                         temp=P1;//读被按下的键
  180.                         switch(temp)
  181.                         {
  182.                                 case 0xed:         key=4;
  183.                                                         break;
  184.                                 case 0xdd:         key=5;
  185.                                                         break;
  186.                                 case 0xbd:         key=6;
  187.                                                         break;
  188.                                 case 0x7d:         key=16;           //修改密码
  189.                                                         break;
  190.                         }
  191.                         while(temp!=0xf0)//等待按键释放
  192.                         {
  193.                                 temp=P1;
  194.                                 temp&=0xf0;
  195.                        
  196.                         }
  197.                         anjian();
  198.                 }
  199.         }
  200.         P1=0xfb; //将第 三行线置低电平
  201.         temp=P1;//读JPJK的当前状态到 temp
  202.         temp&=0xf0;// temp = temp & 0xf0
  203.         if(temp!=0xf0)
  204.         {
  205.                 delay1(10);//延时去抖
  206.                 temp=P1;
  207.                 temp&=0xf0;
  208.           if(temp!=0xf0)//第三行有键被按下
  209.                 {
  210.                         temp=P1;//读被按下的键
  211.                         switch(temp)
  212.                         {
  213.                                 case 0xeb:         key=7;
  214.                                                         break;
  215.                                 case 0xdb:         key=8;
  216.                                                         break;
  217.                                 case 0xbb:         key=9;
  218.                                                         break;
  219.                                 case 0x7b:         key=12;  //确认
  220.                                                         break;
  221.                         }
  222.                         while(temp!=0xf0)//等待按键释放
  223.                         {
  224.                                 temp=P1;
  225.                                 temp&=0xf0;
  226.                                
  227.                         }
  228.                     anjian();
  229.                 }
  230.         }
  231.         P1=0xf7; //将第四行线置低电平
  232.         temp=P1;//读JPJK的当前状态到 temp
  233.         temp&=0xf0;// temp = temp & 0xf0
  234.         if(temp!=0xf0)
  235.         {
  236.                 delay1(10);//延时去抖
  237.                 temp=P1;
  238.                 temp&=0xf0;
  239.           if(temp!=0xf0)//第四行有键被按下
  240.                 {
  241.                         temp=P1;//读被按下的键
  242.                         switch(temp)
  243.                         {
  244.                                 case 0xe7:         key=10;         //空建
  245.                                                         break;
  246.                                 case 0xd7:         key=0;
  247.                                                         break;
  248.                                 case 0xb7:         key=13;        //退格
  249.                                                         break;
  250.                                 case 0x77:         key=14;         //关锁
  251.                                                         break;
  252.                         }
  253.                         while(temp!=0xf0)//等待按键释放
  254.                         {
  255.                                 temp=P1;
  256.                                 temp&=0xf0;
  257.                        
  258.                         }
  259.                    anjian();
  260.                 }
  261.         }
  262.            return key; //返回按下的键
  263. }

  264. /*********************************END OF LINE***************************/
  265. //主函数
  266. void main()
  267. {         
  268.         kai_s=0;   
  269.   guan_s=1;
  270.         while(1)
  271.         {
  272.                   keyscan();    //按键扫描
  273.                  if(flag&&xiu==0) display1(anj1);   
  274.                  else if(flag&&xiu==1)        display1(mima1);
  275.                  else          display2();
  276.         }
  277. }
复制代码

仿真程序资料51hei提供下载:
电子密码锁.zip (125.84 KB, 下载次数: 141)

评分

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

查看全部评分

回复

使用道具 举报

ID:995326 发表于 2021-12-23 21:34 | 显示全部楼层
如果加输入正确显示pass 错误显示err怎么弄
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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