找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5675|回复: 5
收起左侧

51单片机电子密码锁设计PCB制版和原理图及仿真和源码

[复制链接]
ID:346669 发表于 2018-6-7 09:10 | 显示全部楼层 |阅读模式
Altium Designer画的电子密码锁原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png 0.png

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #define GPIO_DIG P0
  3. #define GPIO_KEY P1
  4. sbit JINGBAO=P2^0;
  5. sbit SUO=P2^1;
  6. void KeyDown();
  7. unsigned char  DIG_CODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  8. unsigned char  A[6],X,Q;
  9. unsigned S,M,H;
  10. unsigned char KeyValue;
  11. void Delay10ms(unsigned int c)
  12. {
  13.         unsigned char a,b;
  14.         for(;c>0;c--)
  15.   for        (b=38;b>0;b--)
  16.         for(a=13;a>0;a--);
  17. }
  18. void KeyDown(void)
  19. {
  20.         char a=0,K,CWCS;
  21.         GPIO_DIG=0x00;
  22.         GPIO_KEY=0X0f;
  23.         if(GPIO_KEY!=0x0f)
  24.         {
  25.                 Delay10ms(1);
  26.                 if(GPIO_KEY!=0x0f)
  27.                 {
  28.                         GPIO_KEY=0X0F;
  29.                         switch(GPIO_KEY)
  30.                         {
  31.                                 case(0x07):KeyValue=1;break;//0000 0111
  32.                                 case(0x0b):KeyValue=2;break;//0000 1011
  33.                                 case(0x0d):KeyValue=3;break;//0000 1101
  34.                         }
  35.                         GPIO_KEY=0XF0;
  36.                         switch(GPIO_KEY)
  37.                         {
  38.                                 case(0xe0):if(KeyValue==1)K=0;if(KeyValue==2)K=10;if(KeyValue==3)K=11;break;
  39.                                 case(0xd0):K=KeyValue;break;
  40.                                 case(0xb0):K=KeyValue+3;break;
  41.                                 case(0x70):K=KeyValue+6;break;
  42.                         }
  43.                         if(K<10&&X<6)
  44.                                 {
  45.                                 A[X]=K;
  46.                                 X++;
  47.                           }
  48.                         if(K==10&&X>0) X--;//删除功能
  49.                         if(X==6&&K==11)//输入6位数后,按确认键
  50.                                 {
  51.                                 if(A[0]==6&&A[1]==6&&A[2]==6&&A[3]==6&&A[4]==6&&A[5]==6)//判断和设置密码
  52.                                         {
  53.                 X=0;//密码正确要将X重新置0
  54.                                         SUO=1;//密码正确,开锁
  55.                                         Delay10ms(2500);//开锁后延时
  56.                                         SUO=0;//延时一定时间后自动上锁
  57.                                         CWCS=0;        //将之前的错误次数清零                               
  58.                                   }
  59.                                 else
  60.                                         {
  61.                                         CWCS++;
  62.                                         P3=0x00;
  63.                                         X=0;
  64.                                         while(CWCS==3)
  65.                                                 {
  66.                                                 JINGBAO=1;//报警
  67.                                                 Delay10ms(5000);//报警延时
  68.                                                 JINGBAO=0;//报警解除
  69.                                                 CWCS=0;//将之前的错误次数清零       
  70.                                           }
  71.                                   }
  72.                           }
  73.                         while((a<20)&&(GPIO_KEY!=0xf0))
  74.                                 {
  75.                                  Delay10ms(35);
  76.                 if(X>=1)
  77.                         {               
  78.                         Q=A[0];
  79.                         P0=DIG_CODE[Q];
  80.                         P3=0x01;
  81.                         Delay10ms(1);
  82.                         P3=0x00;
  83.                   }
  84.       
  85.                 if(X>=2)
  86.                         {
  87.                         Q=A[1];
  88.                         P0=DIG_CODE[Q];
  89.                         P3=0x02;
  90.                         Delay10ms(1);
  91.                         P3=0x00;
  92.                   }
  93.                        
  94.                 if(X>=3)
  95.                         {
  96.                         Q=A[2];
  97.                         P0=DIG_CODE[Q];
  98.                         P3=0x04;       
  99.                         Delay10ms(1);
  100.                         P3=0x00;
  101.                   }
  102.                        
  103.                 if(X>=4)
  104.                         {
  105.                         Q=A[3];
  106.                         P0=DIG_CODE[Q];
  107.                         P3=0x08;               
  108.                         Delay10ms(1);
  109.                         P3=0x00;
  110.                   }
  111.                        
  112.                 if(X>=5)
  113.                         {
  114.                         Q=A[4];
  115.                         P0=DIG_CODE[Q];
  116.                         P3=0x10;                       
  117.                         Delay10ms(1);
  118.                         P3=0x00;
  119.                   }
  120.                        
  121.                 if(X>=6)
  122.                         {
  123.                         Q=A[5];
  124.                         P0=DIG_CODE[Q];
  125.                         P3=0x20;                       
  126.                         Delay10ms(1);
  127.                         P3=0x00;
  128.                   }
  129.                                  a++;
  130.                         }
  131.                 }
  132.         }
  133.         else{                    //不输入密码时显示时间
  134.                 if(X==0)
  135.                         {
  136.                   P0=DIG_CODE[S%10];
  137.       P3=0x20;
  138.                   Delay10ms(1);
  139.             P3=0x00;
  140.          
  141.             P0=DIG_CODE[S/10];
  142.       P3=0x10;
  143.             Delay10ms(1);
  144.                   P3=0x00;
  145.       
  146.             P0=DIG_CODE[M%10];
  147.       P3=0x08;
  148.             Delay10ms(1);
  149.                   P3=0x00;
  150.       
  151.       P0=DIG_CODE[M/10];
  152.       P3=0x04;
  153.             Delay10ms(1);
  154.                   P3=0x00;
  155.          
  156.             P0=DIG_CODE[H%10];
  157.       P3=0x02;
  158.                   Delay10ms(1);
  159.                   P3=0x00;
  160.       
  161.             P0=DIG_CODE[H/10];
  162.       P3=0x01;
  163.             Delay10ms(1);
  164.             P3=0x00;
  165.                 }
  166.         }
  167. }
  168.        
  169.        
  170. void main()
  171. {
  172.         JINGBAO=0;
  173.   SUO=0;
  174.         TMOD=0x01;//0000 0001 16位定时器
  175.         EA=1;
  176.         ET0=1;
  177.         TH0=(65536-1000)/256;//赋初值,设置定时时间1毫秒
  178.         TL0=(65536-1000)%256;
  179.         TR0=1;
  180.         while(1)
  181.                 {
  182.                         P3=0x00;
  183.                         P1=0x0f;
  184.                         KeyDown();
  185.                         if(X>=1)
  186.                         {               
  187.                         Q=A[0];
  188.                         P0=DIG_CODE[Q];
  189.                         P3=0x01;
  190.                         Delay10ms(1);
  191.                         P3=0x00;
  192.                   }
  193.       
  194.                 if(X>=2)
  195.                         {
  196.                         Q=A[1];
  197.                         P0=DIG_CODE[Q];
  198.                         P3=0x02;
  199.                         Delay10ms(1);
  200.                         P3=0x00;
  201.                   }
  202.                        
  203.                 if(X>=3)
  204.                         {
  205.                         Q=A[2];
  206.                         P0=DIG_CODE[Q];
  207.                         P3=0x04;       
  208.                         Delay10ms(1);
  209.                         P3=0x00;
  210.                   }
  211.                        
  212.                 if(X>=4)
  213.                         {
  214.                         Q=A[3];
  215.                         P0=DIG_CODE[Q];
  216.                         P3=0x08;               
  217.                         Delay10ms(1);
  218.                         P3=0x00;
  219.                   }
  220.                        
  221.                 if(X>=5)
  222.                         {
  223.                         Q=A[4];
  224.                         P0=DIG_CODE[Q];
  225.                         P3=0x10;                       
  226.                         Delay10ms(1);
  227.                         P3=0x00;
  228.                   }
  229.                        
  230.                 if(X>=6)
  231.                         {
  232.                         Q=A[5];
  233.                         P0=DIG_CODE[Q];
  234.                         P3=0x20;                       
  235.                         Delay10ms(1);
  236. ……………………

  237. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电子密码锁.rar (781.07 KB, 下载次数: 136)
回复

使用道具 举报

ID:356205 发表于 2018-7-7 19:09 | 显示全部楼层
请问能附一张流程图吗,谢谢
回复

使用道具 举报

ID:356205 发表于 2018-7-7 19:10 | 显示全部楼层
请问能附一张流程图吗,谢谢
回复

使用道具 举报

ID:1029707 发表于 2022-5-26 13:44 | 显示全部楼层
请问可以带一下流程图吗比较需要
回复

使用道具 举报

ID:1042648 发表于 2022-9-7 01:05 | 显示全部楼层
谢谢楼主分享!要是有流行图就更好了。
回复

使用道具 举报

ID:1047969 发表于 2022-10-21 08:25 | 显示全部楼层
附件在哪 没有proteus下载啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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