找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3593|回复: 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.51hei.com/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, 下载次数: 30)


评分

参与人数 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 单片机教程网

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