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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機密碼鎖仿真電路程序設計 6位密碼

  [復制鏈接]
跳轉到指定樓層
樓主
實物圖:


仿真原理圖如下(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, 下載次數: 362)




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

使用道具 舉報

沙發
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 | 只看該作者
路過學習,謝謝分享!
回復

使用道具 舉報

10#
ID:1142224 發表于 2025-1-2 20:21 | 只看該作者
蜂鳴器是密碼錯幾次回響
回復

使用道具 舉報

11#
ID:1148061 發表于 2025-4-14 22:35 | 只看該作者
學習一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产在线网址 | av色站 | 激情黄色在线观看 | 日韩成人av在线 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲免费精品 | 国产成人精品一区二区三区 | 久久精品日产第一区二区三区 | 国产欧美综合在线 | 成人a视频片观看免费 | 久久91精品国产 | 午夜电影福利 | 男女羞羞视频在线观看 | 国产一区二区在线播放视频 | 在线超碰| 国产精品亚洲精品 | 欧美男人的天堂 | 日韩有码一区 | 日本高清视频在线播放 | 欧美淫片 | 青青艹在线视频 | 久久一区二区免费视频 | 日韩精品视频在线观看一区二区三区 | 99久久国产综合精品麻豆 | av中文字幕网站 | 蜜桃臀av一区二区三区 | 超碰在线播 | 麻豆91av| 正在播放国产精品 | 看av网 | 亚洲啊v | 成人免费观看男女羞羞视频 | 免费观看www7722午夜电影 | 午夜天堂 | 美女天天操 | 午夜视频一区二区三区 | 免费在线视频一区二区 | av网站在线播放 | 在线精品观看 | av网站在线免费观看 | 亚洲一区二区在线播放 |