久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4451|回復: 1
打印 上一主題 下一主題
收起左側

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

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

二、PCB提醒

1、本次上傳的PCB的1602的1.2引腳正負極已經調整過來(實物PCB的1.2腳反了,當時沒注意,都燒壞了一塊1602··········其他沒有問題)。
2、我這里還有一版的PCB,硬件設計的請移步我的另一個貼,上面有更正的硬件說明。http://www.zg4o1577.cn/bbs/dpj-183892-1.html

三、最后說幾句
1、有電子相關專業(專科)的同學們,可以用這個作為畢業設計,應該問題不大。
2、自己用動手能力的朋友,可以自己改成簡易的電子密碼箱,用來裝禮物,給自己的朋友或者女朋友都可以。個人感覺還挺不錯,感興趣的朋友可以嘗試,我有空了你也會做一個這樣的。
3、我的一些實物視頻可以去我的抖音上看,抖音號:5946BNYZD。
4、嗶哩嗶哩視頻:https://www.bilibili.com/video/BV1QK411W7w9/

制作出來的實物圖如下:

單片機源程序如下:
  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,   //矩陣數字鍵盤鍵值
  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,  //設定的密碼
  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;  //藍燈
  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數據/命令選擇端

  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++)                   //延時程序
  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);            //延時一小會兒,讓1602準備接收數據      
  52.         en=1;
  53.                 delay(10);          //使能線電平變化,命令送入1602的8位數據口      
  54.         en=0;  
  55. }
  56. void lcd_wdat(uchar dat)        //1602寫數據函數        
  57. {      
  58.         rs=1;        //選擇數據寄存器      
  59.         rw=0;        //選擇寫      
  60.         P0=dat;        //把要顯示的數據送入P2      
  61.         delay(10);
  62.                 en=0;
  63.                 delay(10);       //延時一小會兒,讓1602準備接收數據      
  64.         en=1;
  65.         delay(10);         //使能線電平變化,數據送入1602的8位數據口  
  66.         en=0;
  67. }
  68. void lcd_init()  
  69. {      
  70. lcd_wcom(0x38);       //8位數據,雙列,5*7字形            
  71. lcd_wcom(0x0c);      //開啟顯示屏,關光標,光標不閃爍      
  72. lcd_wcom(0x06);    //顯示地址遞減,即寫一個數據后,顯示位置右移一位      
  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[]中的數據依次寫入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[]中的數據依次寫入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);   //顯示地址上排第九位,顯示輸入的*號         
  95. for(m=0;m<s;m++)     //將table[]中的數據依次寫入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[]中的數據依次寫入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[]中的數據依次寫入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[]中的數據依次寫入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;         //定時器T1,設置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)              //定時1S
  194.         {
  195.           T1_NUM=0;
  196.           T1_NUM1++;  
  197.           p++;
  198.           lcd_wcom(0x80+0x0f);           //顯示個位秒
  199.       lcd_wdat(table6[p]);          
  200.           }
  201.         if(T1_NUM1==5)                           //定時5S
  202.         {
  203.          T1_NUM1=0;
  204.         if(flag==1)                                  
  205.            {
  206.                 red=~red;
  207.             bao=1;                                  //紅燈狀態反轉
  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;                                        //計時秒開始
  217.            d++;
  218.            if(d==6)                                //計時分開始
  219.            d=0;
  220.            }

  221. }

  222. void jishuqi1( )
  223. {
  224.     TMOD=0x10;
  225.         TH0=(65536-40000)/256;
  226.         TL0=(65536-40000)%256;                 //定時器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;          //設置50ms
  237.         T0_NUM++;
  238.         if(T0_NUM==100)                          //定時1S(正常來說T0_NUM應該=20就是1S,由于有誤差,所以設置為100)
  239.         {
  240.           
  241.            T0_NUM=0;                         
  242.            T0_NUM1++;
  243.            l++;
  244.            if(l==10)
  245.            {
  246.            l=0;                                        //個位定時
  247.            z++;
  248.            if(z==6)                                //十位定時
  249.            z=0;
  250.            }
  251.            if(j-1!=flag2)           //每1S檢測是否有按鍵按下
  252.            flag1=1;                           //沒有按下,則賦值為1;
  253.           
  254.           
  255.         }
  256.         if(T0_NUM1==50)                   //定時50S
  257.         {
  258.            T0_NUM1=0;
  259.                      if(flag1>0&&flag1==1)         //按鍵沒有按下
  260.                   {
  261.                   flag1=0;                                 //清零
  262.                   if(j==flag2&&P2==0xf0) //按鍵未操作且鍵盤按下次數未增加
  263.                    {
  264.                     red=0;
  265.                         delay(30);
  266.                         red=1;                                //超過50S未動作,清除數據并且清屏
  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);        //鎖定鍵盤并且報警
  284.            xianshi5();
  285.           
  286.            }
  287.           else
  288.           {
  289.           P2=0xf0;
  290.           if(P2!=0xf0)
  291.            {                                  //按鍵去抖動
  292.            delay(10);
  293.            if(P2!=0xf0)
  294.             {
  295.                 j=j+1; //數字按鍵計數
  296.                 k=k+1; //功能按鍵計數
  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];                 //對比數字按鍵
  305.                           szjianpan1=i;                                                 //具體按鍵數字保存起來,可作用數碼管顯示,此可以不用理會
  306.                           sign=0;                                                         //是數字按鍵按下標記
  307.                           break;
  308.                         }
  309.                   }
  310.                   for(i=0;i<6;i++)
  311.                    {
  312.                     if(jianzhi==gnjianzhibiao[i])
  313.                      {
  314.                           gnjianhao=i;                                                //對比功能按鍵
  315.                           sign=1;                                                        //是功能按鍵按下標記
  316.                           break;
  317.                          }
  318.                         }
  319.                         while(P2!=0x0f);
  320.                         delay(10);
  321.                        
  322.            }
  323.            if(sign==0)                                                           //數字按鍵按下判斷
  324.                         {
  325.                          bao=0;
  326.                  delay(30);                                                  //蜂鳴器提示音
  327.                  bao=1;
  328.                          if(j==9)                                                 //連續九次輸入數字按鍵
  329.               {
  330.                                 xianshi3();
  331.                                 delay(30000);
  332.                                 xianshi5();
  333.                 j=0;
  334.                                 k=0;                                                 //錯誤提示、報警并且清除數據
  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;                //正確輸入并且暫存儲密碼
  347.                                   szjianhao2[i]=szjianpan1;                //具體按鍵數字保存起來,可作用數碼管顯示,此可以不用理會
  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) //確認鍵判斷
  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; //對比計數
  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)           //密碼錯誤
  400.                                    {
  401.                                      bao=0;
  402.                                          delay(200);
  403.                                          bao=1;
  404.                                          y++;            //密碼錯誤次數標記
  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;                 //三次密碼錯誤,鎖定鍵盤參數賦值
  421.                                                   bao=0;
  422.                               jishuqi();        //鎖定10S計數開始
  423.                                             }
  424.                                          
  425.                                    }
  426.                 }
  427.                else
  428.                             {
  429.                                   k=0;
  430.                                   j=0;
  431.                                   xianshi3();//請繼續輸入8位完整密碼后在按確認鍵!
  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();//錯誤,請輸入8位完整密碼!
  453.                                   delay(30000);
  454.                                   xianshi5();
  455.                                
  456.                                    red=0;
  457.                                    delay(200);
  458.                                    red=1;
  459.                                    delay(200);
  460.                                    red=0;
  461. ……………………

  462. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:188940 發表于 2020-5-24 09:32 | 只看該作者
我這里還有幾塊的PCB,有需要的,可以免費給,郵費幾塊錢就可以拿到手
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产黄色在线观看 | 国产精品日韩在线观看 | 国产综合精品一区二区三区 | av片毛片 | 成人字幕网zmw| 国产在线中文字幕 | 四虎影院在线观看免费视频 | 国产欧美日韩综合精品一区二区 | 91av免费观看| 精品欧美一区二区精品久久久 | 最新毛片网站 | 欧美日韩视频 | 水蜜桃亚洲一二三四在线 | 国产一区二区三区免费 | www.99精品 | 成人在线观看免费爱爱 | 欧美久久精品一级黑人c片 91免费在线视频 | 国产真实乱对白精彩久久小说 | 老司机狠狠爱 | 在线播放国产一区二区三区 | 欧美精品国产精品 | 久操福利 | 免费成人高清在线视频 | 午夜精品在线观看 | 性国产丰满麻豆videosex | 女女百合av大片一区二区三区九县 | 成人av免费在线观看 | 久久精品视频亚洲 | 国产一区二区三区免费 | 午夜影院中文字幕 | 欧美九九 | 欧美日韩在线精品 | 一区二区三区视频播放 | 91久久精品一区二区二区 | 成人二区| 亚洲精品福利视频 | 欧美美女爱爱视频 | 午夜视频在线免费观看 | 日本午夜在线视频 | 亚洲成人一区二区三区 | 涩涩视频网站在线观看 |