找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3919|回复: 3
收起左侧

一种基于LCD1602和AT24C02的多功能电子密码锁设计(附仿真+C程序+PCB等全套资料)

  [复制链接]
ID:596401 发表于 2019-8-30 14:29 | 显示全部楼层 |阅读模式
概要

多功能电子密码锁系统由AT89C52单片机最小系统、4×4矩阵键盘、LCD1602显示、AT24C02存储模块以及报警系统等组成,具有设置、修改六位用户密码、超次报警、超次锁定、密码错误报警等功能。
设计要求
1.  本设计为了防止密码被窃取要求在输入密码时在LCD屏幕上显示*号;
2.  设计开锁密码位六位密码的电子密码锁;
3.  能够LCD显示在密码正确时显示OPEN,密码错误时显示 ERROR,输入密码时显示INPUT  PASSWORD;
4.  实现输入密码错误超过限定的三次电子密码锁定;
5.  4×4的矩阵键盘其中包括0-9的数字键和确认、重设、清除以及关锁功能键;
6.  本产品具备报警功能,当输入密码错误时蜂鸣器响并且LED灯亮;
7.  密码可以由用户自己修改设定(只支持6位密码),修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作;
系统框图
系统框架.jpg

仿真电路图
仿真全图.jpg


操作说明春节.jpg


PCB原理图
PCB.jpg


运行分析
(1)51单片机加载Lock程序的Hex文件,进行仿真运行,此时LCD显示初始密码输入界面。
11.png

(2)输入初始密码6个0后,点击“确认”键,LCD显示Open状态,密码锁打开,继电器动作,绿色LED灯点亮,开锁成功。
12.png

13.png

(3)重设密码过程为:在密码锁开锁成功的状态下,即LCD显示Open时,再次输入6位旧密码,点击“确认”键,此时LCD显示Set NewWord Enable,重设密码进程激活。
14.png

(4)此时,输入6位新密码,点击“重设”键,LCD显示“inputagain”,再次输入6位新密码,点击“重设”键,密码重设成功,此时LCD显示“ResetPassword OK”,新密码被写入AT24C02存储器。即使仿真结束,或单片机复位,AT24C02存储的密码都不会丢失。
15.png

(5)如果忘记密码,可输入管理员密码:131420,点击“确认”键后,LCD显示“Init Password”,密码锁密码被重置为:000000。
16.png

(6)密码输入过程中,均会产生提示音。一声提示音,表示按键每次的有效输入;两声提示音,表示开锁或密码重设重置成功;三声提示音,表示输入错误等。密码输入错误3次,键盘被锁死,提示音长鸣报警。
17.png

(7)开锁成功后,可以点击“关锁”键,模拟锁密码关锁,此时继电器失电,绿色LED灯熄灭,LCD显示密码输入界面。当密码输入过程中输入错误时,可以通过“清除”清除错误的某位密码数字,重新输入即可。


程序设计
  1. voidStart(void)
  2. {
  3.     Sda=1;
  4.     Scl=1;
  5.     Nop();
  6.     Sda=0;
  7.     Nop();
  8. }
  9. voidStop(void)
  10. {
  11.     Sda=0;
  12.     Scl=1;
  13.     Nop();
  14.     Sda=1;
  15.     Nop();
  16. }
  17. voidAck(void)
  18. {
  19.     Sda=0;
  20.     Nop();
  21.     Scl=1;
  22.     Nop();
  23.     Scl=0;
  24. }
  25. voidNoAck(void)
  26. {
  27.     Sda=1;
  28.     Nop();
  29.     Scl=1;
  30.     Nop();
  31.     Scl=0;
  32. }
  33. voidSend(uchar Data)
  34. {
  35.     ucharBitCounter=8;
  36.     uchartemp;
  37.     do
  38.     {
  39.        temp=Data;
  40.        Scl=0;
  41.        Nop();
  42.        if((temp&0x80)==0x80)
  43.        Sda=1;
  44.        else
  45.        Sda=0;
  46.        Scl=1;
  47.        temp=Data<<1;
  48.        Data=temp;
  49.        BitCounter--;
  50.     }
  51.     while(BitCounter);   
  52.     Scl=0;
  53. }
  54. ucharRead(void)
  55. {
  56.     uchar temp=0;
  57.     uchar temp1=0;
  58.     uchar BitCounter=8;
  59.     Sda=1;
  60.     do
  61.     {
  62.        Scl=0;
  63.        Nop();
  64.        Scl=1;
  65.        Nop();
  66.        if(Sda)   
  67.            temp=temp|0x01;     
  68.        else   
  69.            temp=temp&0xfe;   
  70.        if(BitCounter-1)
  71.        {
  72.            temp1=temp<<1;
  73.            temp=temp1;
  74.        }
  75.        BitCounter--;
  76.     }
  77.     while(BitCounter);   
  78.     return(temp);
  79. }
  80. voidWrToROM(uchar Data[],uchar Address,uchar Num)
  81. {
  82.   uchar i;
  83.   uchar *PData;
  84.   PData=Data;
  85.   for(i=0;i<Num;i++)
  86.   {
  87.   Start();
  88.   Send(0xa0);
  89.   Ack();
  90.   Send(Address+i);
  91.   Ack();
  92.   Send(*(PData+i));
  93.   Ack();
  94.   Stop();
  95.   mDelay(20);
  96.   }
  97. }
  98. voidRdFromROM(uchar Data[],uchar Address,uchar Num)
  99. {
  100.   uchar i;
  101.   uchar *PData;
  102.   PData=Data;
  103.   for(i=0;i<Num;i++)
  104.   {
  105.   Start();
  106.   Send(0xa0);
  107.   Ack();
  108.   Send(Address+i);
  109.   Ack();
  110.   Start();
  111.   Send(0xa1);
  112.   Ack();
  113.   *(PData+i)=Read();
  114.   Scl=0;
  115.   NoAck();
  116.   Stop();
  117.   }
  118. }
  119. #defineyi 0x80
  120. #defineer 0x80+0x40
  121. voiddelay(uint xms)
  122. {
  123.     uint x,y;
  124.     for(x=xms;x>0;x--)
  125.      for(y=110;y>0;y--);
  126. }
  127. voidwrite_1602com(uchar com)
  128. {
  129.     lcd1602_rs=0;
  130.     lcd1602_rw=0;
  131.     P0=com;
  132.     delay(1);
  133.     lcd1602_en=1;
  134.     delay(1);
  135.     lcd1602_en=0; }
  136. voidwrite_1602dat(uchar dat)
  137. {
  138.     lcd1602_rs=1;
  139.     lcd1602_rw=0;
  140.     P0=dat;
  141.     delay(1);
  142.     lcd1602_en=1;
  143.     delay(1);
  144.     lcd1602_en=0;
  145. }
  146. voidlcd_init(void)
  147. {
  148.     write_1602com(0x38);
  149.     write_1602com(0x0c);
  150.     write_1602com(0x06);
  151.     write_1602com(0x01);
  152. }
  153. unsignedchar coding(unsigned char m)   
  154. {
  155.     unsigned char k;
  156.     switch(m)
  157.     {
  158.        case (0x11): k=1;break;
  159.        case (0x21): k=2;break;
  160.        case (0x41): k=3;break;
  161.        case (0x81): k='A';break;
  162.        case (0x12): k=4;break;
  163.        case (0x22): k=5;break;
  164.        case (0x42): k=6;break;
  165.        case (0x82): k='B';break;
  166.        case (0x14): k=7;break;
  167.        case (0x24): k=8;break;
  168.        case (0x44): k=9;break;
  169.        case (0x84): k='C';break;
  170.        case (0x18): k='*';break;
  171.        case (0x28): k=0;break;
  172.        case (0x48): k='#';break;
  173.        case (0x88): k='D';break;
  174.     }
  175.     return(k);
  176. }
  177. unsignedchar keynum(void)
  178. {
  179.     unsignedchar row,col,i;
  180.     P1=0xf0;
  181.     if((P1&0xf0)!=0xf0)
  182.     {
  183.         Delay5Ms();
  184.         Delay5Ms();
  185.        if((P1&0xf0)!=0xf0)
  186.        {
  187.            row=P1^0xf0;
  188.            i=0;
  189.            P1=a;   
  190.            while(i<4)
  191.            {
  192.                if((P1&0xf0)!=0xf0)
  193.                {
  194.                   col=~(P1&0xff);
  195.                   break;
  196.                }
  197.               else
  198.                {
  199.                   i++;
  200.                   P1=a;
  201.                }
  202.            }
  203.        }
  204.        else
  205.        {
  206.            return 0;
  207.        }
  208.        while((P1&0xf0)!=0xf0);
  209.        return (row|col);
  210.     }
  211.     elsereturn 0;
  212. }
  213. //=====一声提示音,表示有效输入=====//
  214. voidOneAlam(void)
  215. {
  216.     ALAM=0;
  217.     Delay5Ms();
  218.     ALAM=1;
  219. }
  220. //======二声提示音,表示操作成功=====//
  221. voidTwoAlam(void)
  222. {
  223.     ALAM=0;
  224.     Delay5Ms();
  225.     ALAM=1;
  226.     Delay5Ms();
  227.     ALAM=0;
  228.     Delay5Ms();
  229.     ALAM=1;
  230. }
  231. //======三声提示音,表示错误==========//
  232. voidThreeAlam(void)
  233. {
  234.     ALAM=0;
  235.     Delay5Ms();
  236.     ALAM=1;
  237.     Delay5Ms();
  238.     ALAM=0;
  239.     Delay5Ms();
  240.     ALAM=1;
  241.     Delay5Ms();
  242.     ALAM=0;
  243.     Delay5Ms();
  244.     ALAM=1;
  245. }
  246. //========显示提示输入========//
  247. voidDisplayChar(void)
  248. {
  249.     unsigned char i;
  250.     if(pass==1)
  251.     {
  252.        write_1602com(er);   
  253.        for(i=0;i<16;i++)
  254.        {
  255.            write_1602dat(LockOpen);        }
  256.     }
  257.     else
  258.     {
  259.        if(N==0)
  260.        {
  261.            //DisplayListChar(0,1,Error);
  262.            write_1602com(er);
  263.            for(i=0;i<16;i++)
  264.            {
  265.               write_1602dat(Error);
  266.            }
  267.        }
  268.        else
  269.        {
  270.            //DisplayListChar(0,1,start_line);
  271.            write_1602com(er);
  272.            for(i=0;i<16;i++)
  273.            {
  274.               write_1602dat(start_line);
  275.            }
  276.        }
  277.     }
  278. }
  279. //=====重置密码=======//
  280. voidResetPassword(void)
  281. {
  282.     unsigned char i;  
  283.     unsigned char j;
  284.     if(pass==0)
  285.     {
  286.        pass=0;
  287.        DisplayChar();     
  288.        ThreeAlam();  
  289.     }
  290.     else   
  291.     {
  292.        if(ReInputEn==1)
  293.        {
  294.            if(N==6)
  295.            {
  296.               ReInputCont++;
  297.               if(ReInputCont==2)
  298.               {
  299.                   for(i=0;i<6;)
  300.                   {
  301.                      if(TempPassword==InputData)
  302.                          i++;
  303.                      else   
  304.                      {
  305.                          //DisplayListChar(0,1,Error);
  306.                          write_1602com(er);
  307.                          for(j=0;j<16;j++)
  308.                          {
  309.                             write_1602dat(Error[j]);
  310.                          }
  311.                          ThreeAlam();  
  312.                          pass=0;   
  313.                          ReInputEn=0;  
  314.                          ReInputCont=0;
  315.                          DisplayChar();
  316.                          break;
  317.                      }
  318.                   }
  319.                   if(i==6)
  320.                   {
  321.                      //DisplayListChar(0,1,ResetOK);
  322.                      write_1602com(er);
  323.                      for(j=0;j<16;j++)
  324.                      {
  325.                          write_1602dat(ResetOK[j]);  
  326.                      }
  327.                      TwoAlam();
  328.                       WrToROM(TempPassword,0,6);
  329.                      ReInputEn=0;
  330.                   }
  331.                   ReInputCont=0;
  332.                   CorrectCont=0;
  333.               }
  334.               else   
  335.               {
  336.                   OneAlam();
  337.                   //DisplayListChar(0, 1,again);
  338.                   write_1602com(er);
  339.                   for(j=0;j<16;j++)
  340.                   {
  341.                      write_1602dat(again[j]);
  342.                   }                 
  343.                   for(i=0;i<6;i++)
  344.                   {
  345.                      TempPassword=InputData;
  346.                   }
  347.               }
  348.            N=0;
  349.          }
  350.         }
  351.     }
  352. }
复制代码

全套资料分享如下
压缩包截图.jpg
附件:
内容不完整 已删除

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:390496 发表于 2019-9-10 15:08 | 显示全部楼层
在哪里啊
回复

使用道具 举报

ID:79874 发表于 2019-12-30 15:05 | 显示全部楼层
下载不了了哥们再传一份呢啥
回复

使用道具 举报

ID:406001 发表于 2020-1-14 17:05 | 显示全部楼层
哥哥 再传一下啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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