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

QQ登錄

只需一步,快速開始

搜索
查看: 4483|回復(fù): 1
收起左側(cè)

DIY簡(jiǎn)單的電子密碼鎖,可以外加改裝為密碼箱,用于送女朋友禮物的容器!

[復(fù)制鏈接]
ID:188940 發(fā)表于 2020-5-24 09:26 | 顯示全部樓層 |閱讀模式
今天給大家介紹一款業(yè)余制作的電子密碼鎖,有PCB、原理圖、仿真圖(前期用,后期直接上PCB板)。此程序沒有做用外部存儲(chǔ)器,所以不支持修改密碼,我后續(xù)有時(shí)間慢慢在改進(jìn)加上去,然后在添加指紋識(shí)別模塊,有時(shí)間再繼續(xù)更新。畢竟是業(yè)余時(shí)間做的,可能在有些方面不是很完善,希望大家都來觀摩觀摩,出出建議。
一、功能介紹:
1、輸入8位密碼,即可開鎖。
2、輸入9次純數(shù)字,顯示錯(cuò)誤,并紅燈提醒。
3、沒有輸入完8位密碼,按下確認(rèn)鍵,提醒錯(cuò)誤并紅燈提醒。
4、密碼輸入錯(cuò)誤三次,鎖定鍵盤并且蜂鳴器提醒5秒左右。
5、輸入錯(cuò)誤可以退格、清零。
6、1602顯示模塊會(huì)有60秒定時(shí)顯示,沒操作鍵盤50秒后,清楚數(shù)據(jù),并且閃紅燈提醒。
7、1602顯示模塊會(huì)有輸入位數(shù)顯示,提醒輸入密碼。
8、程序有密碼數(shù)值存儲(chǔ)在數(shù)組,可用于顯示等操作。(制作禮品盒的時(shí)候可用)
9、本PCB,設(shè)計(jì)有外部存儲(chǔ)器24C02的硬件位置,方便后期可添加!

二、PCB提醒

1、本次上傳的PCB的1602的1.2引腳正負(fù)極已經(jīng)調(diào)整過來(實(shí)物PCB的1.2腳反了,當(dāng)時(shí)沒注意,都燒壞了一塊1602··········其他沒有問題)。
2、我這里還有一版的PCB,硬件設(shè)計(jì)的請(qǐng)移步我的另一個(gè)貼,上面有更正的硬件說明。http://www.torrancerestoration.com/bbs/dpj-183892-1.html

三、最后說幾句
1、有電子相關(guān)專業(yè)(?疲┑耐瑢W(xué)們,可以用這個(gè)作為畢業(yè)設(shè)計(jì),應(yīng)該問題不大。
2、自己用動(dòng)手能力的朋友,可以自己改成簡(jiǎn)易的電子密碼箱,用來裝禮物,給自己的朋友或者女朋友都可以。個(gè)人感覺還挺不錯(cuò),感興趣的朋友可以嘗試,我有空了你也會(huì)做一個(gè)這樣的。
3、我的一些實(shí)物視頻可以去我的抖音上看,抖音號(hào):5946BNYZD。
4、嗶哩嗶哩視頻:https://www.bilibili.com/video/BV1QK411W7w9/

制作出來的實(shí)物圖如下:

實(shí)物圖二

實(shí)物圖二

實(shí)物圖一

實(shí)物圖一

兩版電路板

兩版電路板

單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #define         uchar unsigned        char
  3. #define uint unsigned int

  4. uchar code szjianzhibiao[]={0x77,0x7b,0x7d,
  5.                              0xb7,0xbb,0xbd,   //矩陣數(shù)字鍵盤鍵值
  6.                                                  0xd7,0xdb,0xdd,
  7.                                                          0xeb};

  8. uchar code gnjianzhibiao[]={0x7e,0xbe,0xde,          //矩陣功能鍵盤鍵值
  9.                                                          0xee,0xed,0xe7};
  10.                                                           
  11. uchar code           mima[]={0x77,0x7d,0x77,0xb7,  //設(shè)定的密碼
  12.                              0x77,0x7d,0x77,0xb7};

  13. uchar code table[]="HOLLE!  User";
  14. uchar code table1[]="Password";
  15. uchar code table2[]="********";
  16. uchar code table3[]="  error!";
  17. uchar code table4[]="  OK!   ";
  18. uchar code table5[]="        ";         //抹除輸入痕跡的空字符串
  19. uchar code table6[]="0123456789";
  20. uchar code table7[]="012345";
  21. //uchar code table8[]="you did it! Do you think I will love you? no! What I love is not you,but all of you! I will love you forever!";
  22. uchar code table9[]="  You did it!   ";
  23. uchar code table10[]="     Good!      ";
  24. uchar code table11[]="The gift belongs";
  25. uchar code table12[]="    to you.     ";
  26. uchar code table13[]="   I love you   ";
  27. uchar code table14[]="    forever!    ";

  28. sbit  green=P3^2;  //綠燈
  29. sbit  blue=P3^3;  //藍(lán)燈
  30. sbit  red=P3^4;  //紅燈
  31. sbit  bao=P1^3; //蜂鳴器
  32. sbit  jdq=P3^7; //繼電器
  33. sbit  en=P1^2; //定義LCD1602使能端
  34. sbit  rw=P1^1;//定義LCD1602讀/寫選擇端
  35. sbit  rs=P1^0;//定義LCD1602數(shù)據(jù)/命令選擇端

  36. uchar T1_NUM=0,T1_NUM1=0,T0_NUM=0,T0_NUM1=0;
  37. uchar j=0,k=0,h=0,y=0,l=0,z=0,flag=0,flag1=0,flag2=0,p=0,d=0;

  38. void delay (uchar del)
  39. {
  40.     uint i,j;
  41.         for(i=0;i<del;i++)                   //延時(shí)程序
  42.            for(j=0;j<130;j++)
  43.            ;

  44. }


  45. void lcd_wcom(uchar com)
  46. {       rs=0;            //選擇指令寄存器      
  47.         rw=0;            //選擇寫      
  48.         P0=com;            //把命令字送入P0      
  49.         delay(10);
  50.                 en=0;
  51.                 delay(10);            //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù)      
  52.         en=1;
  53.                 delay(10);          //使能線電平變化,命令送入1602的8位數(shù)據(jù)口      
  54.         en=0;  
  55. }
  56. void lcd_wdat(uchar dat)        //1602寫數(shù)據(jù)函數(shù)        
  57. {      
  58.         rs=1;        //選擇數(shù)據(jù)寄存器      
  59.         rw=0;        //選擇寫      
  60.         P0=dat;        //把要顯示的數(shù)據(jù)送入P2      
  61.         delay(10);
  62.                 en=0;
  63.                 delay(10);       //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù)      
  64.         en=1;
  65.         delay(10);         //使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口  
  66.         en=0;
  67. }
  68. void lcd_init()  
  69. {      
  70. lcd_wcom(0x38);       //8位數(shù)據(jù),雙列,5*7字形            
  71. lcd_wcom(0x0c);      //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍      
  72. lcd_wcom(0x06);    //顯示地址遞減,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位      
  73. lcd_wcom(0x01);    //清屏
  74. }
  75. void xianshi()  
  76. {
  77. uchar n,m=0;                              
  78. lcd_wcom(0x80+0x02);   //顯示地址上排第三位            
  79. for(m=0;m<12;m++)     //將table[]中的數(shù)據(jù)依次寫入1602顯示  
  80. {               
  81. lcd_wdat(table[m]);                        
  82. delay(5);     
  83. }
  84. lcd_wcom(0x80+0x40);//顯示地址為0xc4,即下排第1位     
  85. for(n=0;n<8;n++)   //將table1[]中的數(shù)據(jù)依次寫入1602顯示     
  86.   {                  
  87.   lcd_wdat(table1[n]);            
  88.   delay(5);      
  89.   }
  90. }

  91. void xianshi1(uchar s)  
  92. {
  93. uchar m;                              
  94. lcd_wcom(0x80+0x48);   //顯示地址上排第九位,顯示輸入的*號(hào)         
  95. for(m=0;m<s;m++)     //將table[]中的數(shù)據(jù)依次寫入1602顯示      
  96. {               
  97. lcd_wdat(table2[m]);                        
  98. delay(1);     
  99. }
  100. }

  101. void xianshi2()  
  102. {
  103. uchar m;                              
  104. lcd_wcom(0x80+0x48);   //顯示地址上排第九位,顯示OK           
  105. for(m=0;m<8;m++)     //將table[]中的數(shù)據(jù)依次寫入1602顯示      
  106. {               
  107. lcd_wdat(table4[m]);                        
  108. delay(100);     
  109. }
  110. }

  111. void xianshi3()  
  112. {
  113. uchar m;                              
  114. lcd_wcom(0x80+0x48);   //顯示地址上排第九位,顯示error            
  115. for(m=0;m<8;m++)     //將table[]中的數(shù)據(jù)依次寫入1602顯示      
  116. {               
  117. lcd_wdat(table3[m]);                        
  118. delay(100);     
  119. }
  120. }


  121. void xianshi5()
  122. {
  123. uchar m=0;                              
  124. lcd_wcom(0x80+0x48);   //顯示地上排第九位,清除顯示                             
  125. for(m=0;m<8;m++)     //將table[]中的數(shù)據(jù)依次寫入1602顯示      
  126. {               
  127. lcd_wdat(table5[m]);                        
  128. delay(1);     
  129. }   
  130. }

  131. void xianshi6()
  132. {
  133. uchar m=0;
  134. lcd_wcom(0x80+0x00);                              
  135. for(m=0;m<16;m++)         
  136. {               
  137. lcd_wdat(table9[m]);                        
  138. delay(100);     
  139. }
  140. delay(100);

  141. lcd_wcom(0x80+0x40);                                
  142. for(m=0;m<16;m++)           
  143. {               
  144. lcd_wdat(table10[m]);                        
  145. delay(100);     
  146. }
  147. delay(100);

  148. lcd_wcom(0x80+0x00);                                
  149. for(m=0;m<16;m++)           
  150. {               
  151. lcd_wdat(table11[m]);                        
  152. delay(100);     
  153. }
  154. delay(100);

  155. lcd_wcom(0x80+0x40);                                
  156. for(m=0;m<16;m++)           
  157. {               
  158. lcd_wdat(table12[m]);                        
  159. delay(100);
  160. }
  161. delay(100);

  162. lcd_wcom(0x80+0x00);                                
  163. for(m=0;m<16;m++)           
  164. {               
  165. lcd_wdat(table13[m]);                        
  166. delay(100);   
  167. }
  168. delay(100);
  169.   
  170. lcd_wcom(0x80+0x40);                                
  171. for(m=0;m<16;m++)           
  172. {               
  173. lcd_wdat(table14[m]);                        
  174. delay(100);   
  175. }
  176. delay(100);   
  177. }

  178. void jishuqi( )
  179. {
  180.     TMOD=0x10;
  181.         TH1=(65536-40000)/256;
  182.         TL1=(65536-40000)%256;         //定時(shí)器T1,設(shè)置40ms
  183.         ET1=1;
  184.         EA=1;
  185.         TR1=1;
  186.                
  187. }

  188. void time1() interrupt 3
  189. {
  190.     TH1=(65536-40000)/256;
  191.         TL1=(65536-40000)%256;
  192.         T1_NUM++;
  193.         if(T1_NUM==25)              //定時(shí)1S
  194.         {
  195.           T1_NUM=0;
  196.           T1_NUM1++;  
  197.           p++;
  198.           lcd_wcom(0x80+0x0f);           //顯示個(gè)位秒
  199.       lcd_wdat(table6[p]);          
  200.           }
  201.         if(T1_NUM1==5)                           //定時(shí)5S
  202.         {
  203.          T1_NUM1=0;
  204.         if(flag==1)                                  
  205.            {
  206.                 red=~red;
  207.             bao=1;                                  //紅燈狀態(tài)反轉(zhuǎn)
  208.             flag=0;
  209.                 TR1=0;
  210.                 lcd_wcom(0x80+0x0e);
  211.       lcd_wdat(table6[d]);                  //顯示十位秒
  212.            }
  213.           }
  214.           if(p==10)
  215.            {
  216.            p=0;                                        //計(jì)時(shí)秒開始
  217.            d++;
  218.            if(d==6)                                //計(jì)時(shí)分開始
  219.            d=0;
  220.            }

  221. }

  222. void jishuqi1( )
  223. {
  224.     TMOD=0x10;
  225.         TH0=(65536-40000)/256;
  226.         TL0=(65536-40000)%256;                 //定時(shí)器T1
  227.         ET0=1;
  228.         EA=1;
  229.         TR0=1;
  230.        
  231.                        
  232. }

  233. void time0() interrupt 1
  234. {
  235.     TH0=(65536-50000)/256;
  236.         TL0=(65536-50000)%256;          //設(shè)置50ms
  237.         T0_NUM++;
  238.         if(T0_NUM==100)                          //定時(shí)1S(正常來說T0_NUM應(yīng)該=20就是1S,由于有誤差,所以設(shè)置為100)
  239.         {
  240.           
  241.            T0_NUM=0;                         
  242.            T0_NUM1++;
  243.            l++;
  244.            if(l==10)
  245.            {
  246.            l=0;                                        //個(gè)位定時(shí)
  247.            z++;
  248.            if(z==6)                                //十位定時(shí)
  249.            z=0;
  250.            }
  251.            if(j-1!=flag2)           //每1S檢測(cè)是否有按鍵按下
  252.            flag1=1;                           //沒有按下,則賦值為1;
  253.           
  254.           
  255.         }
  256.         if(T0_NUM1==50)                   //定時(shí)50S
  257.         {
  258.            T0_NUM1=0;
  259.                      if(flag1>0&&flag1==1)         //按鍵沒有按下
  260.                   {
  261.                   flag1=0;                                 //清零
  262.                   if(j==flag2&&P2==0xf0) //按鍵未操作且鍵盤按下次數(shù)未增加
  263.                    {
  264.                     red=0;
  265.                         delay(30);
  266.                         red=1;                                //超過50S未動(dòng)作,清除數(shù)據(jù)并且清屏
  267.                     xianshi5();
  268.                         j=0;
  269.                         k=0;
  270.                    }
  271.                   }       
  272.         }
  273.          
  274.    
  275.    
  276. }

  277. void key ()
  278. {
  279.     uchar lie,jianzhi,szjianhao,szjianpan1,gnjianhao,caijimima[7],szjianhao2[7],sign,i;
  280.           if(flag==1)
  281.            {
  282.            xianshi3();
  283.            delay(100);        //鎖定鍵盤并且報(bào)警
  284.            xianshi5();
  285.           
  286.            }
  287.           else
  288.           {
  289.           P2=0xf0;
  290.           if(P2!=0xf0)
  291.            {                                  //按鍵去抖動(dòng)
  292.            delay(10);
  293.            if(P2!=0xf0)
  294.             {
  295.                 j=j+1; //數(shù)字按鍵計(jì)數(shù)
  296.                 k=k+1; //功能按鍵計(jì)數(shù)
  297.                 lie=P2;
  298.                 P2=0x0f;
  299.                 jianzhi=lie|P2;
  300.                  for(i=0;i<10;i++)
  301.                   {
  302.                    if(jianzhi==szjianzhibiao[i])
  303.                     {
  304.                           szjianhao=szjianzhibiao[i];                 //對(duì)比數(shù)字按鍵
  305.                           szjianpan1=i;                                                 //具體按鍵數(shù)字保存起來,可作用數(shù)碼管顯示,此可以不用理會(huì)
  306.                           sign=0;                                                         //是數(shù)字按鍵按下標(biāo)記
  307.                           break;
  308.                         }
  309.                   }
  310.                   for(i=0;i<6;i++)
  311.                    {
  312.                     if(jianzhi==gnjianzhibiao[i])
  313.                      {
  314.                           gnjianhao=i;                                                //對(duì)比功能按鍵
  315.                           sign=1;                                                        //是功能按鍵按下標(biāo)記
  316.                           break;
  317.                          }
  318.                         }
  319.                         while(P2!=0x0f);
  320.                         delay(10);
  321.                        
  322.            }
  323.            if(sign==0)                                                           //數(shù)字按鍵按下判斷
  324.                         {
  325.                          bao=0;
  326.                  delay(30);                                                  //蜂鳴器提示音
  327.                  bao=1;
  328.                          if(j==9)                                                 //連續(xù)九次輸入數(shù)字按鍵
  329.               {
  330.                                 xianshi3();
  331.                                 delay(30000);
  332.                                 xianshi5();
  333.                 j=0;
  334.                                 k=0;                                                 //錯(cuò)誤提示、報(bào)警并且清除數(shù)據(jù)
  335.                                 red=0;
  336.                                 delay(150);
  337.                                 red=1;
  338.                                 for(i=0;i<8;i++)
  339.                    caijimima[i]=0;
  340.                           }
  341.              else
  342.               {
  343.             
  344.                            for(i=j-1;i<j;i++)
  345.                 {
  346.                   caijimima[i]=szjianhao;                //正確輸入并且暫存儲(chǔ)密碼
  347.                                   szjianhao2[i]=szjianpan1;                //具體按鍵數(shù)字保存起來,可作用數(shù)碼管顯示,此可以不用理會(huì)
  348.                                   green=0;
  349.                                   delay(150);
  350.                                   green=1;

  351.                 }
  352.                                 xianshi1(i);
  353.               }
  354.                          }
  355.                         if(sign==1)                                                   //功能按鍵判斷
  356.                         {
  357.                          flag1=0;
  358.                          if(gnjianhao==3) //確認(rèn)鍵判斷
  359.               {                          
  360.                if(k==9)
  361.                 {
  362.                  for(i=0;i<8;i++)
  363.                                  {
  364.                                   if(mima[i]==caijimima[i])
  365.                                    {
  366.                                    h=h+1; //對(duì)比計(jì)數(shù)
  367.                                    }
  368.                                    else
  369.                                     {
  370.                                       h=1;
  371.                                       break;
  372.                                     }
  373.                                   }
  374.                                   
  375.                                  
  376.                                   if(h==8)          //密碼正確
  377.                                    {
  378.                                      k=0;
  379.                                      j=0;
  380.                                      h=0;
  381.                                          blue=0;
  382.                                          delay(150);
  383.                                          blue=1;
  384.                                          for(i=0;i<8;i++)
  385.                                            caijimima[i]=0;
  386.                                            xianshi2();
  387.                                            delay(10000);
  388.                                            xianshi5();                                //開鎖
  389.                                            jdq=0;
  390.                                            delay(100);
  391.                                            jdq=1;
  392.                                            lcd_wcom(0x01);
  393.                                            xianshi6();
  394.                                            lcd_wcom(0x01);
  395.                                            xianshi();

  396.                                           
  397.                                      
  398.                                   }

  399.                                   if(h==1)           //密碼錯(cuò)誤
  400.                                    {
  401.                                      bao=0;
  402.                                          delay(200);
  403.                                          bao=1;
  404.                                          y++;            //密碼錯(cuò)誤次數(shù)標(biāo)記
  405.                                          h=0;
  406.                                          k=0;
  407.                                          j=0;
  408.                                          red=0;
  409.                                          delay(150);
  410.                                          red=1;
  411.                                          for(i=0;i<8;i++)
  412.                                            caijimima[i]=0;
  413.                                            xianshi3();
  414.                                            delay(30000);
  415.                                            xianshi5();
  416.                                            if(y==3)                  
  417.                                             {
  418.                                                   y=0;
  419.                                                   red=0;
  420.                                       flag=1;                 //三次密碼錯(cuò)誤,鎖定鍵盤參數(shù)賦值
  421.                                                   bao=0;
  422.                               jishuqi();        //鎖定10S計(jì)數(shù)開始
  423.                                             }
  424.                                          
  425.                                    }
  426.                 }
  427.                else
  428.                             {
  429.                                   k=0;
  430.                                   j=0;
  431.                                   xianshi3();//請(qǐng)繼續(xù)輸入8位完整密碼后在按確認(rèn)鍵!
  432.                                   delay(30000);
  433.                                   xianshi5();
  434.                                
  435.                                 }
  436.                }

  437.               if(gnjianhao==2) //清零鍵判斷
  438.                {
  439.                 for(i=0;i<7;i++)
  440.                  {
  441.                    caijimima[i]=0;
  442.                  }
  443.                                  lcd_wcom(0x01);
  444.                                  xianshi();
  445.                                  k=0;
  446.                                  j=0;
  447.                }

  448.               if(gnjianhao==1) //退格鍵判斷
  449.                {
  450.                 if(k==1&&j==1)
  451.                  {
  452.                                   xianshi3();//錯(cuò)誤,請(qǐng)輸入8位完整密碼!
  453.                                   delay(30000);
  454.                                   xianshi5();
  455.                                
  456.                                    red=0;
  457.                                    delay(200);
  458.                                    red=1;
  459.                                    delay(200);
  460.                                    red=0;
  461. ……………………

  462. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
簡(jiǎn)單電子密碼鎖.7z (962.95 KB, 下載次數(shù): 32)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:188940 發(fā)表于 2020-5-24 09:32 | 顯示全部樓層
我這里還有幾塊的PCB,有需要的,可以免費(fèi)給,郵費(fèi)幾塊錢就可以拿到手。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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