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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1503|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機密碼鎖仿真程序 VB上位機

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1109011 發(fā)表于 2024-1-12 10:49 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
從經(jīng)濟實用的角度出發(fā),采用51單片機AT89S51與低功耗CMOS型E2PROM AT24C02作為主控芯片與數(shù)據(jù)存儲器單元,結(jié)合外圍的鍵盤輸入、顯示、報警、開鎖等電路,用匯編語言編寫主控芯片的控制程序,設(shè)計了一款可以多次更改密碼具有報警功能的電子密碼鎖。
只實現(xiàn)簡單通訊功能,能夠處理下位機傳上來的數(shù)據(jù)。繼電器打開(開鎖)上位機顯示1;繼電器關(guān)閉(關(guān)鎖)上位機顯示0。
本設(shè)計中的數(shù)據(jù)庫、手動發(fā)送未用到。

使用數(shù)字小鍵盤輸入六位密碼
密碼鎖在輸入密碼正確的條件下輸出開鎖電平,控制電控鎖開啟
同時顯示0【改成OK】字樣
當(dāng)輸入密碼錯誤時
發(fā)出錯誤警告聲音
同時顯示C【改成ERROR】字樣
當(dāng)六次誤碼【為簡便改成三次】輸入時產(chǎn)生報警信號
還可以實現(xiàn)對密碼的修改
修改成功后蜂鳴發(fā)出確認(rèn)音
電控鎖開啟
可以通過使步進電機轉(zhuǎn)動180度來模擬開鎖和關(guān)鎖動作
LED【改用LCD】顯示電子鎖當(dāng)前狀態(tài)

VB上位機

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


單片機源程序如下:
  1. /**************************************************************************************
  2.                                          矩陣鍵盤:
  3.                                          0      1      2       3
  4.                                          
  5.                                          4      5      6       7
  6.                                                                                    
  7.                                          8      9    返回    確定
  8.                                          
  9.                                          [        DISCUZ_CODE_1        ]nbsp;     [        DISCUZ_CODE_1        ]nbsp;     [        DISCUZ_CODE_1        ]nbsp;      [        DISCUZ_CODE_1        ]nbsp;                                                                                                                                                                 
  10. ***************************************************************************************/

  11. #include "reg52.h"               
  12. #include<intrins.h>                //左右移函數(shù)
  13. #include "lcd.h"
  14. #include "key.h"
  15. #include "i2c.h"

  16. #define u16 unsigned int  //對數(shù)據(jù)類型進行聲明定義
  17. #define u8 unsigned char

  18. sbit AS=P2^2;               //繼電器
  19. sbit beep=P2^3;                                   //蜂鳴器

  20. sbit MOTOA = P3^0;                        //步進電機
  21. sbit MOTOB = P3^1;
  22. sbit MOTOC = P3^2;
  23. sbit MOTOD = P3^3;         

  24. #define SPEED 200                         //步進電機脈沖

  25. /*****************************************************************************/
  26. u8 pw_num,Error_Num,Error_Num1,PassWord_Length=6;
  27. u8 PASSWORD[]={8,8,8,8,8,8,0,0,0,0};
  28. u8 INPUT_PW_Tab[10];
  29. u8 key_num,Step,Step5,Load_first_flag=0;
  30. u8 dianping;

  31. /*******************************************************************************/
  32. bit result_flag,Input_suc_flag;
  33. bit List1=0;

  34. /*******************************************************************************/
  35. void Step_0();
  36. void Step_1();
  37. void Step_2();
  38. void Step_3();
  39. void Step_4();
  40.          
  41. void Step_5();
  42. void Step5_0();
  43. void Step5_1();
  44. void Step5_2();
  45. void Step5_3();
  46. void Step5_4();
  47. void Step5_5();
  48. void Step_6();

  49. /*******************************************************************************/
  50. void CipherComparison();
  51. void input_password(bit m);
  52. void Read_Password();

  53. void init_serialcomm( )
  54. {
  55.         EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
  56.         ES = 1; //允許UART串口的中斷

  57.         TMOD = 0x20;        //定時器T/C1工作方式2
  58.         SCON = 0x50;        //串口工作方式1,允許串口接收(SCON = 0x40 時禁止串口接收)
  59.         TH1 = 0xF3;        //定時器初值高8位設(shè)置   //12MHZ晶振,波特率為4800 0xf3
  60.         TL1 = 0xF3;        //定時器初值低8位設(shè)置   //11.0592MHZ晶振,波特率為4800 0xf4   9600  0xfa   19200  0xfd
  61.         PCON = 0x80;        //波特率倍頻(屏蔽本句波特率為2400)
  62.         TR1 = 1;        //定時器啟動
  63.         TI = 1;  
  64. }

  65. void sendc(u8 ch)
  66. {
  67.         SBUF=ch;  
  68.         while(!TI);
  69.         TI=0;
  70. }

  71. void main()
  72. {        
  73.         u8 data1,a;
  74.         //        ShowString(0x00," Pechin Science ");  
  75.         //        At24c02Write(0,0);                                                //開機顯示密碼
  76.         init_serialcomm();         /**************串口初始化*************/
  77.         LcdWriteCom(0x01);  //清屏
  78.         for(data1=0;data1<PassWord_Length+2;data1++)
  79.         {
  80.                 a=At24c02Read(data1)+0x30;
  81.                  LcdWriteData(a);        
  82.                   delay(1000);        
  83.      }
  84.         
  85.         delay(1000);
  86.         LcdInit();
  87.         delay(1000);
  88.         Step=0;
  89.         Step5=0;
  90.         Error_Num=0x00;
  91.         Error_Num1=0x00;
  92.           Read_Password();
  93.         
  94.     //保存 密碼長度
  95. //                for(j=0;j<10;j++)
  96. //                {
  97. //                        At24c02Write(j,j);
  98. //                        delay(100);        
  99. //                }
  100. //        

  101.         while(1)
  102.         {        
  103.                 key_num=KeyDown();                   //讀取輸入值
  104.                 switch(Step)
  105.                 {
  106.                         case 0:
  107.                         {Step_0();break;}
  108.                         case 1:
  109.                         {Step_1();break;}
  110.                     case 2:
  111.                     {Step_2();break;}
  112.                         case 3:
  113.                         {Step_3();break;}        
  114.                         case 4:
  115.                     {Step_4();break;}        
  116.                         case 5:
  117.                         {Step_5();break;}        
  118.                         case 6:
  119.                         {Step_6();break;}        
  120.                                                                                                   
  121.                 }
  122.      }                                
  123. }

  124. /*******************************************************************************/
  125. void Step_0()
  126. {
  127.         LcdInit();
  128.         ShowString(0x00," Pechin Science ");                   //第一行顯示Pechin Science
  129.         ShowString(0x10,"    WELCOME!    ");                   // 第二行顯示 WELCOME!  
  130.         while(KeyDown()==0xff)Step=1;                          //  有按鍵按下進入下一步                                 
  131. }

  132. /*******************************************************************************/
  133. void Step_1()
  134. {
  135.                 LcdWriteCom(0x01);                                           //清屏
  136.           ShowString(0x00,"Unlock");
  137.                 ShowString(0x0f,"<");                                               //1602第一行顯示unlock
  138.           ShowString(0x10,"Change Password");
  139.                 ShowString(0x1f," ");                                                // 1602第二行顯示Change Password                                                                                    
  140.           Step=2;                                                              //
  141. }

  142. /*******************************************************************************/
  143. void Step_2()
  144. {
  145.         if(key_num!=0x0b)  
  146.         {
  147.                 if((key_num==0x01) ||( key_num==0x09))                    //1鍵或9鍵按下
  148.                 {
  149.                         List1=~List1;                           //Change Password
  150.                         if(List1==0)
  151.                         {                                                  
  152.                                 ShowString(0x0f,"<");                           // Unlock            <
  153.                                 ShowString(0x1f," ");                                  // Change Password  
  154.                         }
  155.                         else
  156.                         {
  157.                                 ShowString(0x0f," ");                           // Unlock            
  158.                                 ShowString(0x1f,"<");                                  // Change Password   <
  159.                         }
  160.                 }
  161.         }
  162.         else                                                           //確認(rèn)鍵按下
  163.         {
  164.                 if(List1==0){Step=3;}
  165.                 else  {Step=5;List1=0;}
  166.         }
  167. }

  168. /*******************************************************************************/
  169. void Step_3()                                             
  170. {
  171.         Step=4;
  172.         pw_num=0;
  173.         LcdInit();
  174.         ShowString(0x00,"Pass Word:  ");                                       
  175. }

  176. /*******************************************************************************/
  177. void Step_4()                                                
  178. {
  179.          input_password(0);                                              //輸入密碼并以*顯示
  180.          if(Input_suc_flag==1){Step=6;}                                  //密碼輸入完成進入下一步
  181.      Input_suc_flag=0;                                              //清除密碼輸入完成標(biāo)志
  182. }

  183. /*******************************************************************************/
  184. void Step_5()                                                        //修改密碼
  185. {
  186.         switch(Step5)
  187.         {
  188.                         case 0: {Step5_0();}  break;
  189.                         case 1: {Step5_1();}  break;
  190.                         case 2: {Step5_2();}  break;
  191.                         case 3: {Step5_3();}  break;
  192.                     case 4: {Step5_4();}  break;
  193.                         case 5:        {Step5_5();}  break;
  194.         }
  195. }

  196. /*******************************************************************************/
  197. void Step_6()
  198. {        
  199.         u8 i=0;
  200.         u8 j=0;
  201.         CipherComparison();                                //密碼比對
  202.         if(result_flag==1)                                 //密碼正確
  203.         {
  204.                 LcdInit();
  205.                 ShowString(0x00,"    WELCOME!");
  206.                 AS=0;                                         //開繼電器
  207.                 dianping=1;//串口數(shù)據(jù),表示鎖開
  208.                 sendc(dianping);
  209.                 delay(SPEED);
  210.                 for(;j<5;j++)        
  211.                 {
  212.                         MOTOA = 1;
  213.                         MOTOB = 0;
  214.                         MOTOC = 1;
  215.                         MOTOD = 1;
  216.                         delay(SPEED);

  217.                         MOTOA = 1;
  218.                         MOTOB = 1;
  219.                         MOTOC = 1;
  220.                         MOTOD = 0;
  221.                         delay(SPEED);

  222.                         MOTOA = 0;
  223.                         MOTOB = 1;
  224.                         MOTOC = 1;
  225.                         MOTOD = 1;
  226.                         delay(SPEED);

  227.                         MOTOA = 1;
  228.                         MOTOB = 1;
  229.                         MOTOC = 0;
  230.                         MOTOD = 1;
  231.                         delay(SPEED);
  232.                 }

  233.                 delay(60000);
  234.                 AS=1;                                              //關(guān)繼電器
  235.                 dianping=0;//串口數(shù)據(jù),表示鎖關(guān)        
  236.                 sendc(dianping);
  237.                 delay(SPEED);                                 
  238.                 for(j=0;j<5;j++)                                                                          //電機反轉(zhuǎn)
  239.                 {
  240.                         MOTOA = 1;
  241.                         MOTOB = 1;
  242.                         MOTOC = 0;
  243.                         MOTOD = 1;
  244.                         delay(SPEED);

  245.                         MOTOA = 0;
  246.                         MOTOB = 1;
  247.                         MOTOC = 1;
  248.                         MOTOD = 1;
  249.                         delay(SPEED);

  250.                         MOTOA = 1;
  251.                         MOTOB = 1;
  252.                         MOTOC = 1;
  253.                         MOTOD = 0;
  254.                         delay(SPEED);
  255.                
  256.                         MOTOA = 1;
  257.                         MOTOB = 0;
  258.                         MOTOC = 1;
  259.                         MOTOD = 1;
  260.                         delay(SPEED);
  261.                 }
  262.         }
  263.         else                                                //密碼錯誤
  264.         {
  265.                         if(Error_Num1<2)             //輸出錯誤次數(shù)小于3
  266.                         {
  267.                                         Error_Num1++;
  268.                                         LcdInit();
  269.                                         ShowString (0x00,"Error !");
  270.                                         delay(20000);
  271.                                         for(;i<200;i++)                                                        //密碼錯誤報警
  272.                                         {
  273.                                                 beep=~beep;
  274.                                                 delay(10);
  275.                                                 Step=0;
  276.                                         }
  277.                         else                          //密碼錯誤次數(shù)大于3
  278.                         {
  279.                                         ShowString (0x00," Warning !");                                                               
  280.                                         for(;i<250;i++)                        //防試探報警
  281.                                         {
  282.                                                 beep=~beep;
  283.                                                 delay(50);
  284.                                         }                                                                  
  285.                                         Error_Num1=0;
  286.                                         Step=0;
  287.                         }
  288.         }
  289.         Step=0;
  290. }

  291. /****************************************************************************************
  292. 密碼輸入函數(shù),密碼長度:pw_num
  293. 密碼輸入完成標(biāo)志:Input_suc_flag
  294. *****************************************************************************************/
  295. void Step5_0()                 
  296. {
  297.           LcdWriteCom(0x01);  //清屏
  298.           ShowString (0x00,"Input PassWord:");     //1602顯示:輸入密碼
  299.           Step5=1;
  300.           pw_num=0;
  301. }
  302. void Step5_1()               
  303. {
  304.         input_password(0);           //輸入密碼并以*顯示
  305.         if(Input_suc_flag==1)        //密碼輸入完成
  306.         {
  307.                 Step5=2;                  
  308.                 Input_suc_flag=0;         //清除密碼輸入完成標(biāo)志
  309.         }
  310. }
  311. void Step5_2()               
  312. {
  313.      CipherComparison();          //密碼比對
  314.          Step5=3;
  315. }
  316. void Step5_3()               
  317. {        u8 i=0;
  318.     if(result_flag==0)            //密碼錯誤
  319.         {
  320.                 if(Error_Num<2)             //輸出錯誤次數(shù)小于3
  321.                 {
  322.                         Error_Num++;
  323.                         LcdInit();
  324.                         ShowString (0x00,"Error !");
  325.                         delay(20000);
  326.                         Step5=0;
  327.                 }
  328.                 else                          //密碼錯誤次數(shù)大于3
  329.                 {
  330.                         ShowString (0x00," Warning !");                                                               
  331.                         for(;i<250;i++)                        //防試探報警
  332.                         {
  333.                                 beep=~beep;
  334.                                 delay(50);
  335.                         }                                                                  
  336.                         Error_Num=0;
  337.                         Step=0;
  338.                 }                        
  339.         }
  340.         else                                                                                                     //密碼正確
  341.         {
  342.                 LcdInit();
  343.                 ShowString (0x00,"New PassWord:");        
  344.                 pw_num=0;
  345.                 Step5=4;
  346.         }                                
  347. }
  348. void Step5_4()
  349. {
  350.                 u8 i=0;
  351.                 input_password(1);                                                    //輸入密碼并顯示
  352.                 if(Input_suc_flag==1)                  //輸入完成
  353.                 {
  354.                                 Step5=5;
  355.                                 Input_suc_flag=0;
  356.                                 LcdWriteCom(0x01);  //清屏
  357.                                 for(;i<100;i++)                //密碼修改成功提示音
  358.                                 {
  359.                                         beep=~beep;
  360.                                         delay(10);
  361.                                 }  
  362.                               ShowString (0x00,"      OK!");
  363.                 }
  364. }
  365. void Step5_5()
  366. {
  367.         unsigned char j;
  368.         PassWord_Length=pw_num;                         //讀取輸入密碼長度
  369.         At24c02Write(0,Load_first_flag);        
  370.         delay(100);        
  371.         At24c02Write(1,PassWord_Length);                //保存 密碼長度
  372.         delay(100);
  373.         for(j=0;j<PassWord_Length;j++)         
  374.         {
  375.                 PASSWORD[j]=INPUT_PW_Tab[j];                                //讀取密碼
  376.                 At24c02Write(j+2,INPUT_PW_Tab[j]);                          //保存密碼至EEPROM
  377.                 delay(100);
  378.         }
  379.         Step5=0;
  380.         Step=0;
  381. }

  382. void Read_Password()
  383. {
  384.         unsigned char j;
  385.         Load_first_flag=At24c02Read(0x00);
  386. //        if(Load_first_flag==0)                          //初次運行  初始密碼錯誤可以將此句打開重新編譯下載
  387.         {        
  388.                 Load_first_flag=1;
  389.                 At24c02Write(0,0x01);
  390.                 delay(100);
  391.                 At24c02Write(1,0x06);           //寫默認(rèn)密碼長度6至EEPROM
  392.                 delay(100);
  393.                 for(j=0;j<PassWord_Length;j++)
  394.                 {
  395.                         At24c02Write(j+2,8);              //寫默認(rèn)密碼888888至EEPROM
  396.                         PASSWORD[j]=INPUT_PW_Tab[j];     //讀密碼
  397.                         delay(100);
  398.                 }
  399.         }
  400.         
  401.         Load_first_flag=At24c02Read(0x00);
  402.         PassWord_Length=At24c02Read(0x01);  //讀取密碼長度
  403.         for(j=0;j<PassWord_Length;j++)       //讀取密碼
  404.         {
  405.                 PASSWORD[j]=At24c02Read(j+2);
  406.         }
  407. }
  408. void input_password(bit m)
  409. {
  410.         unsigned char j;
  411.         if(key_num!=0x0b)                                      //ok鍵沒有按下
  412.         {
  413.                 if(key_num<0x0a)                               //1-9按下
  414.                 {
  415.                         INPUT_PW_Tab[pw_num]=key_num;                //保存至輸入密碼數(shù)組
  416.                         pw_num=pw_num+1;                              //密碼長度+1
  417.                                                 
  418.                         LcdWriteCom(0xc0);
  419.                         for(j=0;j<pw_num;j++)
  420.                         {
  421.                                 if(m==0) {LcdWriteData('*');        }                        //密碼隱藏
  422.                                 else     {LcdWriteData(INPUT_PW_Tab[j]+0x30);}         //顯示密碼
  423.                         }                                                               
  424.                 }
  425.                 if(key_num==0x0a)                              //返回鍵按下
  426.                 {
  427.                         if(pw_num!=0) {pw_num=pw_num-1;}
  428.                         else          {Step=0;}
  429.                                                                         
  430.                         // ShowString (0x00,"Pass Word:");  
  431.             LcdWriteCom(0xc0);                                                
  432.                
  433.                         for(j=0;j<pw_num;j++)
  434.                         {
  435.                                 if(m==0) {LcdWriteData('*');        }                   //密碼隱藏
  436.                                 else     {LcdWriteData(INPUT_PW_Tab[j]+0x30);}    //顯示密碼        
  437.                         }
  438.                         LcdWriteData(' ');
  439.                 }
  440.         }
  441.         else                          //ok鍵按下
  442.         {
  443.                         if(pw_num==0)         
  444.                         {
  445.                                 Step=0;
  446.                                 LcdWriteCom(0x01);
  447.                                 ShowString (0x00,"Error 02!");
  448.                                 delay(10000);
  449.                         }
  450.                
  451.                         else
  452.                         {               
  453.                                 Input_suc_flag=1;
  454.                         }
  455.                         //AS=0;                        
  456.         }               
  457. }

  458. /*******************************************************
  459.                 密碼比對
  460. ********************************************************/
  461. void CipherComparison()
  462. {
  463.         u8 i,j=0;

  464.         if(PassWord_Length==pw_num)                       //密碼長度比對
  465.         {
  466.                 for(i=0;i<PassWord_Length;i++)                  //密碼比對
  467.                 {
  468.                         
  469.                                 if(PASSWORD[i]!=INPUT_PW_Tab[i])
  470.                                         {
  471.                                                 result_flag=0;break;                     //密碼錯誤
  472.                                         }
  473.                                 else
  474.                                         {
  475.                                                 result_flag=1;                          //密碼正確
  476.                                         }
  477.                                           INPUT_PW_Tab[i]=0XFF;                   //清除密碼緩存數(shù)組
  478.                 }
  479.         }
  480.         else
  481.         {result_flag=0;}
  482.         
  483. }
復(fù)制代碼

所有資料51hei附件下載:
電子密碼鎖51單片機設(shè)計(實物 仿真).7z (186.5 KB, 下載次數(shù): 27)


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:813932 發(fā)表于 2024-1-13 12:17 | 只看該作者
附件程序分為仿真程序和實物程序2個
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 伊人网在线看 | 国产一区亚洲二区三区 | 国产一级网站 | 狠狠艹| 色网在线看 | chengrenzaixian | 最新日韩在线视频 | 日本高清aⅴ毛片免费 | 精品美女在线观看视频在线观看 | 成人免费视频一区二区 | 亚洲成av人片在线观看 | 999免费观看视频 | 色婷婷av一区二区三区软件 | 欧美一区二区三区一在线观看 | 伦理午夜电影免费观看 | 日韩一区二区三区在线视频 | 色资源在线视频 | 国产精品乱码一二三区的特点 | 日韩精品一区二区三区 | 日韩免费 | 九九亚洲| 综合久久综合久久 | 久久69精品久久久久久久电影好 | 91免费看片 | 免费看黄视频网站 | 精品av | 久久中文网 | www.一区二区三区.com | 成人福利网 | 国户精品久久久久久久久久久不卡 | 麻豆91av | 狠狠综合久久av一区二区老牛 | 久久福利网站 | 国产一区二区 | 日本aa毛片a级毛片免费观看 | 国产激情精品视频 | 99久视频| 91视频免费黄 | 色网站在线免费观看 | 久久久激情 | 精品国产高清一区二区三区 |