找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9789|回复: 15
收起左侧

基于51单片机和LCD1602的电子密码锁设计 实物和仿真程序都有

  [复制链接]
ID:204728 发表于 2017-5-25 15:51 | 显示全部楼层 |阅读模式
P70525-153326.jpg
本设计主要任务

(1)共8位密码,每位的取值范围为1~8。
(2)用户可以自行设定和修改密码。
(3)按每个密码键时都有声、光提示。
(4)若键入的8位开锁密码不完全正确,则报警5秒钟,以提醒他人注意。
(5)开锁密码错3次要报警10分钟,报警期间输入密码无效,以防窃贼多次试探密码。
(6)键入的8位开锁密码完全正确才能开锁,开锁时要有1秒的提示音。
(7)密码键盘上只允许有8个密码按键和1个发光管。锁内有备用电池,只有内部上电复位时才能设置或修改密码,因此,仅在门外按键是不能修改或设置密码的。
(8)密码设定完毕后要有2秒的提示音。
以上是初步设定的电子密码锁的主要功能。
本系统主要由单片机系统、键盘、报警系统组成。系统能完成开锁、超时报警、超次锁定、管理员解密、修改用户密码基本的密码锁的功能。除上述基本的密码锁功能外,还具有调电存储、声光提示等功能,依据实际的情况还可以添加遥控功能。本系统成本低廉,功能实用。本设计要完成的软件任务主要有:一是键盘输入的识别;二是8位LED的显示;三是密码的比较、修改、存储;;四是报警和开锁控制电平的输出。
根据以上任务,结合硬件结构,可以将键盘输入的识别用来作为系统的监控程序(主程序),用显示程序来延时,不断查询键盘。如果有键按下,就得到相应的键值。结合当前系统所处的状态,调用不同的操作模块,实现相应的功能。而执行模块主要有数字输入模块、确定键模块、修改键模块、显示模块及报警模块。
存储单元的分配
该密码锁中RAM存储单元的分配方案如下:
31H~38H:依次存放8位设定的密码,首位密码存放在31H单元;
R0:指向密码地址;
R2:已经键入密码的位数;
R3:存放允许的错码次数3与实际错码次数的差值;
R4至R7:延时用;
00H:错码标志位。
对于ROM存储单元的分配,由于程序比较短,而且占用的存储空间比较少,因此,在无特殊要求时,可以从0030H单元(其它地址也可以)开始存放主程序。
若按键AN1~AN7分别代表数码1~7,按键AN0代表数码8。在没有键按下时,P1.0~P1.7全是高电平1,若某个键被按下,相应的口线就变为低电平0。假如设定的密码是61234578,当按键AN6被按下时,P1.6变为低电平,P1端口其余口线为高电平,此时从P1端口读入的数值为10111111,存到31H单元的密码值就是10111111,也就是BFH。依此类推,存到32H至38H单元的密码值分别是FDH、FBH、F7H、EFH、DFH、7FH、FEH。开锁时必须先按AN6,使从P1口读入的第一个密码值与31H单元存储的设定值相同,再顺序按AN1、AN2、AN3、AN4、AN5、AN7、AN0才能开锁。否则不能开锁,同时开始报警。

实物图:
P70525-153341.jpg P70525-153402.jpg P70525-153404.jpg P70525-153418.jpg P70525-153434.jpg

proteus仿真原理图:
电路图 .jpg
0.png

单片机源程序如下:
  1. //南阳理工学院
  2. //学习是遗忘的最好的方式
  3. //只花了很少时间写的,有很多不足的算法与编程序方式,见谅!
  4. #include"at89x51.h"
  5. #include"key.h"
  6. #include"lcd.h"
  7. uchar code show_0[]="Please input the password:";
  8. uchar code show_1[]="The cipher is:" ;
  9. uchar code show_2[]="********";
  10. uchar code show_3[]="The password is wrong!";
  11. uchar code show_4[]="This is the last time,";
  12. uchar code show_5[]="Please try it tomorrow!";
  13. uchar code show_6[]="you are right!";
  14. uchar code show_7[]="Please input the new cipher:";
  15. uchar code show_8[]="Input it again!";
  16. uchar code show_9[]="Establishes successful! ";
  17. uchar code show_10[]="(^_^)";
  18. uchar  init_pswd[]={8,8,8,8,8,8,8,8};
  19. uchar  pswd[8]={0};
  20. uchar  pswd_1[8]={0};
  21. void play(uchar *j,uchar k)          //K是显示的个数,j是地址
  22. {
  23.    uchar  i;
  24.    for(i=0;i<k;i++)
  25.    {
  26.     dat_w(*(j+i));
  27.         delay(20);
  28.    }
  29. }
  30. main()
  31. {
  32.   uchar j=0,i=0,sum_1=0;
  33.   loop:init();
  34.   clear();
  35.   gotoxy(1,0);
  36.   play(show_0,16);
  37.   gotoxy(2,0);
  38.   play(show_0+17,10);
  39.   /****密码输入****/
  40.   do
  41.   {
  42.     key();
  43.   }
  44.   while(ki!=15);
  45.   clear();
  46.   gotoxy(1,0);
  47.   play(show_1,15);
  48.   do
  49.   {
  50.     flag=0;
  51.     key();
  52.         gotoxy(2,0);
  53.         if(flag==1&&ki<=9)
  54.          {
  55.           pswd[i]=ki;
  56.           play(show_2,i);
  57.           i++;
  58.          }
  59.         if(ki==14)        //14则退出.
  60.           break;
  61.    }       
  62.    while(i<=8);
  63.    for(i=0;i<=7;i++)
  64.    {
  65.      sum_1=init_pswd[i]-pswd[i]+sum_1;
  66.      if(sum_1!=0)
  67.          {
  68.            clear();
  69.            j++;
  70.            if(j==3)
  71.            {
  72.             clear();
  73.             gotoxy(1,0);
  74.             play(show_4,16);
  75.                 gotoxy(2,0);
  76.                 play(show_4+16,14);
  77.                 delay(500);
  78.                 delay(500);
  79.                 clear();
  80.                 gotoxy(1,0);
  81.                 play(show_5+7,16);
  82.                 gotoxy(2,5);
  83.                 play(show_10,5);
  84.             while(1);   //三次输入密码失败,自锁
  85.            }
  86.            gotoxy(1,0);
  87.            play(show_3,16);
  88.            gotoxy(2,5);
  89.            play(show_3+15,7);
  90.            delay(500);
  91.            clear();
  92.            gotoxy(1,0);
  93.            play(show_8,15);
  94.            goto loop;
  95.           }
  96.           if(sum_1==0)
  97.           {
  98.           
  99.            clear();
  100.            gotoxy(1,0);
  101.            play(show_6,15);
  102.            do
  103.            {
  104.            key();
  105.            }
  106.            while(ki!=13);
  107.            loop1:clear();
  108.            gotoxy(1,0);
  109.            play(show_7,13);
  110.            gotoxy(2,0);
  111.            play(show_7+13,15);
  112.            /****第一次输密码***/
  113.            i=0;
  114.             do
  115.             {
  116.                   flag=0;
  117.           key();
  118.                   if(flag==1&&ki<=9)
  119.               {
  120.                pswd[i]=ki;
  121.                    i++;
  122.                    clear();
  123.                    gotoxy(1,0);
  124.                    play(show_2,i);
  125.                    }
  126.                     }while(i<=7);
  127.                  clear();
  128.                  gotoxy(1,0);
  129.              play(show_8,15);
  130.            /***第二次输密码****/
  131.                  i=0;
  132.                  sum_1=0;
  133.             do
  134.             {
  135.                   flag=0;
  136.           key();
  137.                   if(flag==1&&ki<=9)
  138.               {
  139.                pswd_1[i]=ki;
  140.                    i++;
  141.                    clear();
  142.                    gotoxy(1,0);
  143.                    play(show_2,i);
  144.                    }
  145.                     }
  146.                  while(i<=7);
  147.                  for(i=0;i<=7;i++)
  148.                   {
  149.                    sum_1=sum_1+ pswd_1[i]-pswd[i];
  150.                    }
  151.                  if(sum_1==0)
  152.                    {
  153.                     clear();
  154.                            gotoxy(1,2);
  155.                         play(show_9,12);
  156.                         gotoxy(2,2);
  157. ……………………

  158. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电子密码锁 1602显示仿真程序.zip (292.21 KB, 下载次数: 395)
回复

使用道具 举报

ID:308279 发表于 2018-4-14 22:07 | 显示全部楼层
没有黑币
回复

使用道具 举报

ID:396478 发表于 2018-9-12 14:54 | 显示全部楼层
谢谢楼主!
回复

使用道具 举报

ID:398790 发表于 2018-9-18 20:23 | 显示全部楼层
可以 ,很有用,很难得的八位密码,找了好久才找到
回复

使用道具 举报

ID:435643 发表于 2018-12-7 12:20 | 显示全部楼层
谢谢楼主!学习了!
回复

使用道具 举报

ID:443622 发表于 2018-12-12 12:27 | 显示全部楼层
为什么下载之后打开没有
回复

使用道具 举报

ID:439603 发表于 2018-12-12 18:51 | 显示全部楼层
密码锁实现外部是要连线的吗
回复

使用道具 举报

ID:447904 发表于 2018-12-17 13:30 | 显示全部楼层
这里面的源代码和教程是不是都有,详细吗?我是第一次做不知道有困难不?我很需要
回复

使用道具 举报

ID:447904 发表于 2018-12-17 13:32 | 显示全部楼层
这个压缩包里的文件是不是特别详细,我是新手,求解答
回复

使用道具 举报

ID:467396 发表于 2019-1-13 14:46 | 显示全部楼层
谢谢LZ
回复

使用道具 举报

ID:467396 发表于 2019-1-13 15:07 | 显示全部楼层
太实用了,谢谢!
回复

使用道具 举报

ID:396940 发表于 2019-3-23 18:51 | 显示全部楼层
下来学习一下意见看了好几个不同的方案 了
回复

使用道具 举报

ID:507769 发表于 2019-4-16 23:25 | 显示全部楼层
为什么打不开,联调死机?
回复

使用道具 举报

ID:502407 发表于 2019-4-17 09:59 | 显示全部楼层
黑币不够啦,项目收官阶段。求楼主发邮箱,谢谢啦!邮箱614837496@qq.com
回复

使用道具 举报

ID:470939 发表于 2019-12-9 17:20 | 显示全部楼层
可以,感谢,下载学习
回复

使用道具 举报

ID:711792 发表于 2020-3-28 16:21 | 显示全部楼层
好用,感谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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