找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4679|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

一種基于LCD1602和AT24C02的多功能電子密碼鎖設(shè)計(jì)(附仿真+C程序+PCB等全套資料)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
概要

多功能電子密碼鎖系統(tǒng)由AT89C52單片機(jī)最小系統(tǒng)、4×4矩陣鍵盤、LCD1602顯示、AT24C02存儲(chǔ)模塊以及報(bào)警系統(tǒng)等組成,具有設(shè)置、修改六位用戶密碼、超次報(bào)警、超次鎖定、密碼錯(cuò)誤報(bào)警等功能。
設(shè)計(jì)要求
1.  本設(shè)計(jì)為了防止密碼被竊取要求在輸入密碼時(shí)在LCD屏幕上顯示*號(hào);
2.  設(shè)計(jì)開鎖密碼位六位密碼的電子密碼鎖;
3.  能夠LCD顯示在密碼正確時(shí)顯示OPEN,密碼錯(cuò)誤時(shí)顯示 ERROR,輸入密碼時(shí)顯示INPUT  PASSWORD;
4.  實(shí)現(xiàn)輸入密碼錯(cuò)誤超過限定的三次電子密碼鎖定;
5.  4×4的矩陣鍵盤其中包括0-9的數(shù)字鍵和確認(rèn)、重設(shè)、清除以及關(guān)鎖功能鍵;
6.  本產(chǎn)品具備報(bào)警功能,當(dāng)輸入密碼錯(cuò)誤時(shí)蜂鳴器響并且LED燈亮;
7.  密碼可以由用戶自己修改設(shè)定(只支持6位密碼),修改密碼之前必須再次輸入密碼,在輸入新密碼時(shí)候需要二次確認(rèn),以防止誤操作;
系統(tǒng)框圖


仿真電路圖






PCB原理圖



運(yùn)行分析
(1)51單片機(jī)加載Lock程序的Hex文件,進(jìn)行仿真運(yùn)行,此時(shí)LCD顯示初始密碼輸入界面。


(2)輸入初始密碼6個(gè)0后,點(diǎn)擊“確認(rèn)”鍵,LCD顯示Open狀態(tài),密碼鎖打開,繼電器動(dòng)作,綠色LED燈點(diǎn)亮,開鎖成功。




(3)重設(shè)密碼過程為:在密碼鎖開鎖成功的狀態(tài)下,即LCD顯示Open時(shí),再次輸入6位舊密碼,點(diǎn)擊“確認(rèn)”鍵,此時(shí)LCD顯示Set NewWord Enable,重設(shè)密碼進(jìn)程激活。


(4)此時(shí),輸入6位新密碼,點(diǎn)擊“重設(shè)”鍵,LCD顯示“inputagain”,再次輸入6位新密碼,點(diǎn)擊“重設(shè)”鍵,密碼重設(shè)成功,此時(shí)LCD顯示“ResetPassword OK”,新密碼被寫入AT24C02存儲(chǔ)器。即使仿真結(jié)束,或單片機(jī)復(fù)位,AT24C02存儲(chǔ)的密碼都不會(huì)丟失。


(5)如果忘記密碼,可輸入管理員密碼:131420,點(diǎn)擊“確認(rèn)”鍵后,LCD顯示“Init Password”,密碼鎖密碼被重置為:000000。


(6)密碼輸入過程中,均會(huì)產(chǎn)生提示音。一聲提示音,表示按鍵每次的有效輸入;兩聲提示音,表示開鎖或密碼重設(shè)重置成功;三聲提示音,表示輸入錯(cuò)誤等。密碼輸入錯(cuò)誤3次,鍵盤被鎖死,提示音長(zhǎng)鳴報(bào)警。


(7)開鎖成功后,可以點(diǎn)擊“關(guān)鎖”鍵,模擬鎖密碼關(guān)鎖,此時(shí)繼電器失電,綠色LED燈熄滅,LCD顯示密碼輸入界面。當(dāng)密碼輸入過程中輸入錯(cuò)誤時(shí),可以通過“清除”清除錯(cuò)誤的某位密碼數(shù)字,重新輸入即可。


程序設(shè)計(jì)
  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. //======三聲提示音,表示錯(cuò)誤==========//
  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. }
復(fù)制代碼

全套資料分享如下

附件:
內(nèi)容不完整 已刪除

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:390496 發(fā)表于 2019-9-10 15:08 | 只看該作者
在哪里啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:79874 發(fā)表于 2019-12-30 15:05 | 只看該作者
下載不了了哥們?cè)賯饕环菽厣?/td>
回復(fù)

使用道具 舉報(bào)

地板
ID:406001 發(fā)表于 2020-1-14 17:05 | 只看該作者
哥哥 再傳一下啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表