单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:10448|回复:8
打印上一主题下一主题

51单片机密码锁仿真电路程序设计 6位密码

 [复制链接]
跳转到指定楼层
楼主
ID:361698发表于 2018-6-29 12:33|只看该作者|只看大图回帖奖励
实物图:


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



矩阵键盘按键说明

   1     2     3     确认键
   4     5     6     手动关闭锁
   7     8     9     修改密码
密码还原  0     删除键   退出键

接电磁锁说明:
本身是不带电磁锁的,买家可以自己外接也可以和我们联系购买。如果要接电磁锁的话,需要外接电磁锁的电源,我们是用的12V的电磁锁,外接了12V的直流电源,照片和视频里面没有拍出来。
请买家自己要理解的是继电器只是相当一个开关,只是开和关,上面是没有电压和电流的,需要自己外接电磁锁的电源。

买多少V的电磁锁就要买多少V的直流电源供电。

单片机源程序如下:
  1. #include< reg52.h>             //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义       变量范围0~255
  3. #define uint  unsigned int       //无符号整型 宏定义       变量范围0~65535

  4. #include "lcd1602.h"
  5. #include "iic.h"

  6. uchar value,i;           //变量

  7. uchar flag_lj_en;  //边加
  8. uchar flag_lj_en_value;

  9. sbit relay = P2^2;  //继电器定义
  10. sbit beep  = P3^3;  //蜂鸣器定义

  11. sbit beiguan = P2^3;  //背光

  12. uint flag_time;

  13. uint flag_guan;

  14. uchar smg_i;
  15. uchar dis_smg[7]={0};

  16. uchar password[7]={6,5,4,3,2,1};         //密码保存
  17. uchar password_bj[7]={1,2,3,4,5,6};       //密码比较
  18. uchar code password_r[6] = {1,2,3,1,2,3} ;
  19. uchar code password_gl[6] = {5,2,0,0,2,5} ;
  20. uchar password_xg[6];       //密码修改
  21. uchar flag_password;     //密码正确否
  22. uchar flag_password_cichu1;//密码错误次数

  23. bit flag_200ms=1;     //200ms标志位

  24. uchar key_can;

  25. uchar menu_1,menu_i;



  26. #include "iic.h"


  27. /***********************1ms延时函数*****************************/
  28. void delay_1ms(uint q)
  29. {
  30.        uint i,j;
  31.        for(i=0;i<q;i++)
  32.            for(j=0;j<120;j++);
  33. }


  34. void key()       //独立按键程序
  35. {
  36.        static uchar key_new = 0, key_l;
  37.        key_can = 20;             //按键值还原
  38.        P1 = 0x0f;
  39.        if((P1& 0x0f) != 0x0f)           //按键按下
  40.        {
  41.            delay_1ms(1);               //按键消抖动
  42.            if(((P1& 0x0f) != 0x0f)&& (key_new == 1))
  43.            {                                 //确认是按键按下
  44.                  key_new = 0;
  45.                  key_l = (P1 | 0xf0);   //矩阵键盘扫描
  46.                  P1 = key_l;
  47.                  switch(P1)
  48.                  {
  49.                        case 0xee:  key_can = 1;  break;  //得到按键值
  50.                        case 0xde:  key_can = 4;  break;   //得到按键值
  51.                        case 0xbe:  key_can = 7;  break;   //得到按键值
  52.                        case 0x7e:  key_can = 10;  break;   //得到按键值
  53.       
  54.                        case 0xed:  key_can = 0;  break;  //得到按键值
  55.                        case 0xdd:  key_can = 8;  break;   //得到按键值
  56.                        case 0xbd:  key_can = 5;  break;   //得到按键值
  57.                        case 0x7d:  key_can = 2;  break;   //得到按键值
  58.       
  59.                        case 0xeb:  key_can = 3;  break;  //得到按键值
  60.                        case 0xdb:  key_can = 6;  break;   //得到按键值
  61.                        case 0xbb:  key_can = 9;  break;   //得到按键值
  62.                        case 0x7b:  key_can = 11;  break;   //得到按键值
  63.       
  64.                        case 0xe7:  key_can = 15;  break;  //得到按键值
  65.                        case 0xd7:  key_can = 14;  break;  //得到按键值
  66.                        case 0xb7:  key_can = 13;  break;   //得到按键值
  67.                        case 0x77:  key_can = 12;  break;  //得到按键值  

  68.                  }      
  69.            }                
  70.        }
  71.        else
  72.        {
  73.            key_new = 1;
  74.            flag_lj_en = 0;
  75.        }      
  76. }


  77. /*****************密码还原********************/
  78. void password_return()
  79. {
  80.       
  81.        if(flag_lj_en == 1)
  82.        {
  83.            flag_lj_en_value ++;
  84.            if(flag_lj_en_value > 13)       //按下3秒钟就自动密码还原      
  85.            {
  86.                  flag_lj_en_value = 0;      
  87.                  flag_lj_en = 0;
  88.                  write_24c02_8(6,0,password_r);          
  89.                  beep = 0;
  90.                  delay_1ms(500);
  91.                  beep = 1;      
  92.                  read_24c02_8(6,0,password);
  93.            }
  94.        }          
  95. }

  96. /***************把数组清空**********************/
  97. void clear_shuzu(uchar *p)
  98. {
  99.        for(i=0;i<7;i++)
  100.            p[i] = 0;
  101. }

  102. /*************定时器0初始化程序***************/
  103. void time_init()      
  104. {
  105.        EA   = 1;             //开总中断
  106.        TMOD = 0X01;       //定时器0、工作方式1
  107.        ET0  = 1;             //开定时器0中断
  108.        TR0  = 1;             //允许定时器0定时
  109. }

  110. /******************下载程序密码初始化**********************/        
  111. void password_chushifa()
  112. {
  113.        scl = 0;
  114.        value = read_24c02(10) ;
  115.        if(value != 75)
  116.        {
  117.            value = 75;
  118.            beep = 0;
  119.            write_24c02(10,value);
  120.            delay_1ms(200);
  121.            write_24c02_8(6,0,password_r);
  122.            delay_1ms(200);
  123.            read_24c02_8(6,0,password);
  124.            beep = 1;      
  125.        }
  126. }


  127. /****************按键功能处理********************/        
  128. void key_with()
  129. {
  130.        static uchar value;
  131.        if(key_can == 14)   //手动关闭密码锁
  132.            relay = 1;
  133.        if(key_can == 10)       //用做密码从新回到初始值
  134.        {                      
  135.          flag_lj_en = 1;       //连加使能
  136.          flag_lj_en_value = 0;
  137.        }
  138.        if(menu_1 == 0)
  139.        {
  140.            if(key_can< = 9)
  141.            if(menu_i< 6)   //密码输入
  142.            {
  143.                  menu_i ++;
  144.                  if(menu_i > 6)
  145.                        menu_i = 6;
  146.                  smg_i = menu_i;
  147.                  for(i=6;i>0;i--)
  148.                        password_bj[i] = password_bj[i-1];      
  149.                  password_bj[0] = key_can;
  150.                  for(i=0;i<smg_i;i++)
  151.                        dis_smg[i] ='*';//0x30 + password_bj[i];
  152.                  write_string(2,7,dis_smg);      
  153.                  lcd1602_guanbiao(1,7 + menu_i + 0x40);  //开光标
  154.            }      
  155.            if(key_can == 11)       //密码删除
  156.            {
  157.                  for(i=0;i<menu_i;i++)
  158.                        password_bj[i] = password_bj[i+1];      
  159.                  menu_i --;
  160.                  password_bj[menu_i] = ' ';      
  161.                  dis_smg[menu_i] = ' ';
  162.                  write_string(2,7,dis_smg);      
  163.                  lcd1602_guanbiao(1,7 + menu_i + 0x40);  //开光标
  164.            }
  165.            if(key_can == 15)  //确认键
  166.            {
  167.                  value = 0;
  168.                  for(i=0;i<6;i++)
  169.                  {
  170.                        if(password_bj[i] == password_gl[i]) //判断管理员密码
  171.                        {
  172.                              value ++;
  173.                            if(value >= 6)  //密码正确
  174.                            {
  175.                                  write_string(2,0,"   return     ");
  176.                                  beep = 0;
  177.                                  delay_1ms(200);
  178.                                  read_24c02_8(6,0,password);
  179.                                  beep = 1;      
  180.                                  delay_1ms(2000);
  181.                            }
  182.                        }
  183.                  }
  184.                  if(value< 6)
  185.                  for(i=0;i<6;i++)
  186.                  {
  187.                        if(password_bj[i] == password[i])
  188.                        {
  189.                            flag_password = 1;       //密码正确
  190.                            relay = 0;     //打开密码锁
  191.                            for(i=0;i<6;i++)
  192.                                  dis_smg[i] = 0xbf;
  193.                        }
  194.                        else
  195.                        {
  196.                            flag_password = 0;
  197.                            flag_password_cichu1 ++;
  198.                            write_string(1,0," Password error ");      
  199.                            write_string(2,0,"   cishu:     ");
  200.                            write_sfm2(2,9,flag_password_cichu1);
  201.                            delay_1ms(280);
  202.                 
  203.                            for(i=0;i<6;i++)
  204.                            {
  205.                                  beep = ~beep;
  206.                                  delay_1ms(200);
  207.                            }
  208.                            beep = 1;
  209.                            delay_1ms(800);
  210.                            break;           //密码不正确
  211.                        }
  212.                  }
  213.                  clear_shuzu(dis_smg);
  214.                  write_string(1,0," Password Lock  ");      
  215.                  write_string(2,0," Input:       ");
  216.                  lcd1602_guanbiao(1,7+0x40);  //开光标
  217.                  menu_i = 0;
  218.            }
  219.        }                                                
  220. }

  221. /****************修改密码********************/        
  222. void xiugai_password()
  223. {
  224.        if(key_can == 13)   //修改密码
  225.        {
  226.            if((relay == 0)&& (menu_1 == 0))
  227.            {
  228.                  menu_1 = 1;       menu_i = 0;
  229.                  clear_shuzu(password_bj);       //数据清空
  230.                  clear_shuzu(dis_smg);
  231.                  write_string(1,0,"Input1:       ");      
  232.                  write_string(2,0,"Input2:       ");
  233.                  lcd1602_guanbiao(1,7);  //开光标
  234.            }      
  235.        }
  236.        if(menu_1 == 1)   //第一次输入修改的密码
  237.        {
  238.            if(key_can< = 9)
  239.            {
  240.                  if(menu_i< 6)
  241.                  {
  242.                        menu_i ++;
  243.                        if(menu_i > 6)
  244.                            menu_i = 6;
  245.                        smg_i = menu_i;
  246.                        for(i=7;i>0;i--)
  247.                            password_bj[i] = password_bj[i-1];      
  248.                        password_bj[0] = key_can;
  249.                        for(i=0;i<menu_i;i++)
  250.                            dis_smg[i] ='*';
  251.                        write_string(1,7,dis_smg);
  252.                        lcd1602_guanbiao(1,7 + menu_i);  //开光标      
  253.                  }      
  254.            }
  255.            if(key_can == 11)  //删除键
  256.            {
  257.                  for(i=0;i<menu_i;i++)
  258.                        password_bj[i] = password_bj[i+1];      
  259.                  menu_i --;
  260.                  password_bj[menu_i] = ' ';      
  261.                  dis_smg[menu_i] = ' ';
  262.                  write_string(1,7,dis_smg);      
  263.                  lcd1602_guanbiao(1,7 + menu_i);  //开光标      
  264.            }      
  265.            if(key_can == 15)  //确定键
  266.            {
  267.                  clear_shuzu(password_xg);
  268.                  clear_shuzu(dis_smg);
  269.                  lcd1602_guanbiao(1,8 + 0x40);  //开光标
  270.                  menu_1 = 2;
  271.                menu_i = 0;
  272.                  key_can = 20;
  273.            }
  274.        }
  275.        if(menu_1 == 2)   //第二次输入修改的密码
  276.        {
  277.            if(key_can< = 9)
  278.            {
  279.                  if(menu_i< 6)
  280.                  {
  281.                        menu_i ++;          
  282.                        if(menu_i > 6)
  283.                            menu_i = 6;
  284.                        for(i=5;i>0;i--)
  285.                            password_xg[i] = password_xg[i-1];      
  286.                        password_xg[0] = key_can;
  287.                        for(i=0;i<menu_i;i++)
  288.                            dis_smg[i] ='*';//0x30 + password_xg[i];
  289.                        write_string(2,7,dis_smg);        
  290.                        lcd1602_guanbiao(1,7 + menu_i + 0x40);  //开光标
  291.                  }      
  292.            }
  293.            if(key_can == 11)  //删除键
  294.            {
  295.                  for(i=0;i<menu_i;i++)
  296.                        password_xg[i] = password_xg[i+1];      
  297.                  password_xg[menu_i] = ' ';      
  298.                  dis_smg[menu_i] = ' ';
  299.                  write_string(2,7,dis_smg);      
  300.                  lcd1602_guanbiao(1,7 + menu_i + 0x40);  //开光标
  301.            }      
  302.            if(key_can == 15)  //确定键
  303.            {
  304.                  for(i=0;i<6;i++)
  305.                  {
  306.                        if(password_bj[i] == password_xg[i])
  307.                        {
  308.                            flag_password = 1;       //两次输入的密码一样                
  309.                        }
  310.                        else
  311.                        {
  312.                            flag_password = 0;
  313.                            write_string(1,0," Password Error ");      
  314.                            write_string(2,0,"     reenter   ");
  315.                            delay_1ms(300);
  316.                            for(i=0;i<6;i++)
  317.                            {
  318.                                  beep = ~beep;           //提示三声
  319.                                  delay_1ms(300);
  320.                            }
  321.                            beep = 1;
  322.                            delay_1ms(1000);
  323.                            break;           //密码不正确
  324.                        }
  325.                  }
  326.                  if(flag_password == 1)             //两次输入的密码一样的
  327.                  {                
  328.                        for(i=0;i<6;i++)
  329.                        {
  330.                            write_string(1,0,"   Password   ");      
  331.                            write_string(2,0,"   Succeed     ");
  332.                            password[i] = password_bj[i];   //保存密码
  333.                        }
  334.                        write_24c02_8(6,0,password);
  335.                        delay_1ms(300);
  336.                        beep = 0;
  337.                        delay_1ms(2000);
  338.                        beep = 1;
  339.                  }
  340.                  clear_shuzu(password_xg);
  341.                  clear_shuzu(dis_smg);
  342.                  write_string(1,0," Password Lock  ");      
  343.                  write_string(2,0," Input:       ");
  344.                  lcd1602_guanbiao(1,7+0x40);  //开光标
  345.                  menu_1 = 0;
  346.                menu_i = 0;

  347.            }
  348.        }      
  349. }


  350. /******************主程序**********************/        
  351. void main()
  352. {
  353.        static uint value ;
  354.        password_chushifa();
  355.        time_init();   //定时器初始化
  356.        read_24c02_8(6,0,password);
  357.        init_1602();
  358.        beiguan = 0;
  359.        while(1)
  360.        {      
  361.            if(flag_password_cichu1< 3)     //错误三次按键不能用了
  362.            {
  363.                  key();                             //按键函数
  364.                  if(key_can< 20)
  365.                  {
  366.                        if(beiguan == 0)
  367.                        {
  368.                            if(menu_1 == 0)
  369.                                  key_with();                 //按键处理函数
  370.                            xiugai_password();     //修改密码
  371.                        }
  372.                        else
  373.                            beiguan = 0;
  374.                        flag_time = 0;          
  375.                  }
  376.            }

  377.            if(flag_200ms == 1)
  378.            {
  379.                  flag_200ms = 0;      
  380.                  if(beiguan == 0)       //延时关闭锁20秒关闭背光
  381.                  {
  382. ……………………

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


仿真程序等资料,密码123123:
单片机电子密码锁 1602.7z(2.12 MB, 下载次数: 360)




沙发
ID:777173发表于 2020-6-12 13:37|只看该作者
谢谢分享
板凳
ID:663502发表于 2020-6-22 11:21|只看该作者
我也试一试,谢谢分享!!!
地板
ID:783189发表于 2020-6-23 01:36|只看该作者
感谢大佬
5#
ID:611032发表于 2020-6-23 14:25|只看该作者
感谢大佬
6#
ID:774009发表于 2020-6-23 19:04|只看该作者
初始密码是多少鸭?
7#
ID:897137发表于 2021-4-29 23:39|只看该作者
楼主给的源程序跟仿真hex文件,源程序有很多问题,楼主有最终的源程序吗?改了好久改不出来,源程序的键盘扫描模块有问题,求正确的程序
8#
ID:1092027发表于 2023-8-27 11:24|只看该作者
uchar flag_lj_en;  //边加
uchar flag_lj_en_value;
这个起什么作用呢?
uchar password[7]={6,5,4,3,2,1}; 还有这个数组,六个数字前面怎么是7呢
9#
ID:884711发表于 2024-5-5 09:52|只看该作者
路过学习,谢谢分享!

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

Powered by 单片机教程网