找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 41056|回復(fù): 59
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)電子密碼鎖Proteus仿真+程序+視頻

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:559277 發(fā)表于 2019-6-10 19:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)





3.6 開(kāi)鎖機(jī)構(gòu)
在基于單片機(jī)的電子密碼鎖設(shè)計(jì)中,用戶需要輸入密碼,密碼正確則發(fā)出開(kāi)鎖信號(hào)開(kāi)鎖。
在這次基于單片機(jī)的電子密碼鎖設(shè)計(jì)中,通過(guò)控制蜂鳴器的發(fā)音來(lái)指示系統(tǒng)的開(kāi)鎖功能。蜂鳴器是一種采用直流電壓供電的電子訊響器。圖3-9是用蜂鳴器指示的開(kāi)鎖機(jī)構(gòu)仿真圖。因?yàn)樵谠O(shè)計(jì)中是以蜂鳴器發(fā)生來(lái)指示開(kāi)鎖是否成功,當(dāng)密碼輸入正確時(shí)蜂鳴器響起來(lái),代表鎖開(kāi)了。
圖3-9開(kāi)鎖機(jī)構(gòu)指示電路
3.7 報(bào)警機(jī)構(gòu)
在這次基于單片機(jī)的電子密碼鎖設(shè)計(jì)中,通過(guò)控制報(bào)警顯示LED來(lái)指示系統(tǒng)的報(bào)警功能。圖3-10是用基于LED的報(bào)警機(jī)構(gòu)仿真圖�?刂芌ELAY輸出高低電平,即P3.4引腳,就可以控制報(bào)警顯示LED的亮滅,從而指示相關(guān)信息。
圖3-10報(bào)警機(jī)構(gòu)模擬仿真圖
當(dāng)用戶輸入密碼錯(cuò)誤次數(shù)達(dá)到預(yù)設(shè)警告次數(shù)時(shí),系統(tǒng)調(diào)用報(bào)警子程序,使LED亮起來(lái),同時(shí)禁止鍵盤輸入。
3.8 硬件綜合設(shè)計(jì)
根據(jù)電路原理,在PROTEUS中畫(huà)出各功能模塊的仿真圖,各個(gè)功能模塊驗(yàn)證正確后,將所有模塊集合到一個(gè)電路設(shè)計(jì)圖中,畫(huà)出具有所有功能的總體硬件仿真圖。
待程序編寫(xiě)好后,將KEIL和PROTEUS聯(lián)調(diào),觀察此電路設(shè)計(jì)圖可以知道各個(gè)功能模塊和器件的工作情況。屆時(shí),根據(jù)實(shí)際情況可以適當(dāng)修改電路圖或者程序,以達(dá)到設(shè)計(jì)的目的。

單片機(jī)源程序如下:
  1. #include<reg51.h>    //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義

  2. #include"lcd1602.h"
  3. #include"i2c.h"

  4. sbit LED=P3^3;  //繼電器控制引腳
  5. sbit RELAY=P3^4;  //繼電器控制引腳
  6. sbit BUZZER=P3^5; //蜂鳴器控制引腳
  7. sbit SET=P0^7;          //設(shè)置
  8. sbit LCK=P0^6;          //關(guān)鎖

  9. #define LOCK_TIME_second 10
  10. #define SU 1/256
  11. #define GPIO_KEY P1        //4X4矩陣鍵盤輸入
  12. unsigned char KeyValue; //用來(lái)存放讀取到的鍵值
  13. unsigned char saved_Value[4]={6,7,6,7};          //初始密碼
  14. unsigned char input_Value[4];
  15. unsigned char Right_flg=0,Right_flg0=0;
  16. unsigned char set_flg=0,LOCK_flg=0;
  17. unsigned char temp00;
  18. unsigned int  time_cnt,time_remember,delay_ddll;
  19. long int DECvalue=0;

  20. //存儲(chǔ)芯片存儲(chǔ)的內(nèi)容
  21. /*===============================================
  22. 地址: 0    1    2     3    4    5      6     
  23. 數(shù)據(jù):無(wú)   密碼 密碼  密碼 密碼         無(wú)  錯(cuò)誤次數(shù)
  24. =================================================*/

  25. void TimerConfiguration(void);  //定時(shí)中斷
  26. void KeyDown();                            //檢測(cè)按鍵函數(shù)
  27. void At24c02Write(unsigned char addr,unsigned char dat);
  28. unsigned char At24c02Read(unsigned char addr);

  29. //====主函數(shù)入口======
  30. void main()
  31. {
  32.    char i=0,j=0;
  33.    //unsigned char aa;
  34.    char k=0;

  35.    LcdInit();    //液晶初始化
  36.    clear_window();
  37.    TimerConfiguration();   //初始化定時(shí)器

  38.    Lcd1602_Delay1ms(5);
  39.    At24c02Write(1,6);   //初始化存儲(chǔ)芯片,實(shí)際電路中就不需要
  40.    At24c02Write(2,7);
  41.    At24c02Write(3,6);
  42.    At24c02Write(4,7);
  43.    At24c02Write(6,0);        ////清除錯(cuò)誤輸入次數(shù)

  44.    RELAY=1;
  45.    BUZZER=1;

  46.         while(1)
  47.                 {
  48.                    KeyDown();         ////按鍵掃描

  49.                   ///===========正常輸入密碼操作======================
  50.                    if (KeyValue<=9 && !set_flg && !LOCK_flg) //有按鍵按下
  51.                    {
  52.                      input_Value[i]=KeyValue;                                                  
  53.                          if (Right_flg0)
  54.                          {  clear_window();
  55.                                  Right_flg0=0;
  56.                          }

  57.                          LcdWriteCom(0x80+i);  //顯示當(dāng)前按鍵的值
  58.                          LcdWriteData('*');

  59.                          i++;
  60.                             if(i>=4)  //判斷
  61.                          {
  62.                                  Right_flg0=0;
  63.                             for (j=0;j<4;j++)
  64.                                 {
  65.                                     if (input_Value[j]!=saved_Value[j])
  66.                                            Right_flg0=1;                                
  67.                                 }
  68.                                 clear_window();
  69.                                 if(!Right_flg0)                  ////密碼輸入正確
  70.                                 {
  71.                                   BUZZER=0;         //聲音報(bào)警
  72.                                   delay_ddll = 1;
  73.                                   LcdWriteCom(0x80+i+2);
  74.                                   LcdWriteData('O');
  75.                                   LcdWriteData('K');
  76.                                   At24c02Write(6,0);        ////清除錯(cuò)誤輸入次數(shù)
  77.                                 }
  78.                                 else
  79.                                 {
  80.                                   BUZZER=1;
  81.                                   LcdWriteCom(0x80+i+2);
  82.                                   LcdWriteData('E');
  83.                                   LcdWriteData('R');

  84.                                   temp00=At24c02Read(6);  ////存儲(chǔ)輸入錯(cuò)誤次數(shù)
  85.                                   if (temp00>=2)              //連續(xù)輸入錯(cuò)誤超過(guò)3次
  86.                                   {         
  87.                                     LOCK_flg=1;
  88.                                         RELAY=0;  /////指示燈起來(lái)
  89.                                         LcdWriteCom(0x80+i+2);
  90.                                     LcdWriteData('L');
  91.                                     LcdWriteData('K');                                            
  92.                                   }
  93.                                   At24c02Write(6,temp00+1);                                                            
  94.                                 }

  95.                                 i=0;                    
  96.                          }
  97.                    }
  98.                 ///===========正常輸入密碼操作 end======================


  99.                  ///===========修改密碼操作======================
  100.                    if (KeyValue<=9 && set_flg && !LOCK_flg) //有按鍵按下 KeyValue!=66
  101.                    {
  102.                          input_Value[k]=KeyValue;
  103.                         
  104.                          LcdWriteCom(0x80+k);  //顯示當(dāng)前按鍵的值
  105.                          LcdWriteData('*');

  106.                           k++;
  107.                           if(k>=4)  //判斷
  108.                           {
  109.                                   if (set_flg==2)
  110.                                   {                                       
  111.                                         for (j=0;j<4;j++)
  112.                                                 {
  113.                                                   saved_Value[j]=input_Value[j];
  114.                                                   At24c02Write(j+1,saved_Value[j]);                                                                                                                                                                                                                                            
  115.                                                 }
  116.                                                 clear_window();

  117.                                                   set_flg=0;
  118.                                                 LED = 0;  //設(shè)置狀態(tài)指示燈亮起來(lái)
  119.                                                 delay_ddll =1;
  120. //                                                  LcdWriteCom(0x80+k+2);
  121. //                                                LcdWriteData('O');
  122. //                                                LcdWriteData('K');
  123.                                   }

  124.                                    if (set_flg==1)
  125.                                   {///============================================                                                                                                  
  126.                                                 Right_flg=0;
  127.                                             for (j=0;j<4;j++)
  128.                                                 {
  129.                                                   if(input_Value[j]!=saved_Value[j])
  130.                                                     Right_flg=1;                                    
  131.                                                 }
  132.                                                 clear_window();
  133.                                                 if(!Right_flg)                  ///舊密碼輸入正確
  134.                                                 {
  135.                                                   set_flg=2;         ///可以進(jìn)行下一步操作                                                  
  136.                                                   LcdWriteCom(0x80+0x40);  //
  137.                                                   LcdWriteData('N');
  138.                                                   LcdWriteData('E');
  139.                                                   LcdWriteData('W');         
  140.                                                 }
  141.                                                 else
  142.                                                 {
  143.                                                   LcdWriteCom(0x80+k+2);
  144.                                                   LcdWriteData('E');
  145.                                                   LcdWriteData('R');
  146.                                                   
  147.                                                   temp00=At24c02Read(6);  ////存儲(chǔ)輸入錯(cuò)誤次數(shù)
  148.                                                   if (temp00>=2)        
  149.                                                   {         
  150.                                                     LOCK_flg=1;
  151.                                                         RELAY=0;  /////指示燈起來(lái)
  152.                                                         LcdWriteCom(0x80+i+2);
  153.                                                     LcdWriteData('L');
  154.                                                     LcdWriteData('K');                                            
  155.                                                   }
  156.                                                   At24c02Write(6,temp00+1);                        
  157.                                                 }
  158.                                   }          ///============================================
  159.                                                                           

  160.                                 k=0;                    
  161.                          }
  162.                    }
  163.           ///===========修改密碼操作 end======================

  164.                    if (KeyValue==0x0A && !LOCK_flg)  //有按鍵按下         
  165.                    {
  166.                            clear_window();
  167.                            set_flg=1;
  168.                            LcdWriteCom(0x80+0x40);  //
  169.                            LcdWriteData('O');
  170.                            LcdWriteData('L');
  171.                            LcdWriteData('D');

  172.                             k=0;  //=================                                             
  173.                    }
  174.          ////=============############================================
  175.                    else if (KeyValue==0x0B && !LOCK_flg)  //有按鍵按下,關(guān)上鎖,清除窗口!LCK
  176.                    {        
  177.                           BUZZER=1;
  178.                           clear_window();                                             
  179.                    }
  180.                   
  181.                   if (delay_ddll)
  182.                   {
  183.                              delay_ddll++;
  184.                            if (delay_ddll>2000)
  185.                            {
  186.                                       LED = 1;
  187.                                    BUZZER = 1;
  188.                                    delay_ddll = 0;
  189.                            }
  190.                   }
  191.            ////=============================================
  192.                  Lcd1602_Delay1ms(1);

  193.                 }
  194. }


  195. /*******************************************************************************
  196. * 函 數(shù) 名         : KeyDown
  197. * 函數(shù)功能                   : 檢測(cè)有按鍵按下并讀取鍵值
  198. * 輸    入         : 無(wú)
  199. * 輸    出         : 無(wú)
  200. *******************************************************************************/
  201. void KeyDown(void)
  202. {
  203.         unsigned char a=0;
  204.                  
  205.         KeyValue=66;
  206.         GPIO_KEY=0x0f;
  207.         if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
  208.         {
  209.                 Lcd1602_Delay1ms(10); //延時(shí)10ms進(jìn)行消抖
  210.                 if(GPIO_KEY!=0x0f)    //再次檢測(cè)鍵盤是否按下
  211.                 {               
  212.                         //測(cè)試列
  213.                         GPIO_KEY=0X0F;
  214.                         switch(GPIO_KEY)
  215.                         {
  216.                                 case(0X07):        KeyValue=0;break;
  217.                                 case(0X0b):        KeyValue=1;break;
  218.                                 case(0X0d): KeyValue=2;break;
  219.                                 case(0X0e):        KeyValue=3;break;
  220.                         }
  221.                         //測(cè)試行
  222.                         GPIO_KEY=0XF0;
  223.                         switch(GPIO_KEY)
  224.                         {
  225.                                 case(0X70):        KeyValue=KeyValue;break;
  226.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  227.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  228.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  229.                         }

  230.                         while((a<250)&&(GPIO_KEY!=0xf0))         //檢測(cè)按鍵松手檢測(cè)
  231.                         {
  232.                                 Lcd1602_Delay1ms(2);
  233.                                 a++;
  234.                         }
  235.                 }
  236.         }
  237. }

  238. /*******************************************************************************
  239. * 函數(shù)名         : void At24c02Write(unsigned char addr,unsigned char dat)
  240. * 函數(shù)功能                   : 往24c02的一個(gè)地址寫(xiě)入一個(gè)數(shù)據(jù)
  241. * 輸入           : 無(wú)
  242. * 輸出                  : 無(wú)
  243. *******************************************************************************/
  244. void At24c02Write(unsigned char addr,unsigned char dat)
  245. {
  246.         I2cStart();
  247.         I2cSendByte(0xa0);//發(fā)送寫(xiě)器件地址
  248.         I2cSendByte(addr);//發(fā)送要寫(xiě)入內(nèi)存地址
  249.         I2cSendByte(dat);        //發(fā)送數(shù)據(jù)
  250.         I2cStop();
  251. }
  252. /*******************************************************************************
  253. * 函數(shù)名         : unsigned char At24c02Read(unsigned char addr)
  254. * 函數(shù)功能                   : 讀取24c02的一個(gè)地址的一個(gè)數(shù)據(jù)
  255. * 輸入           : 無(wú)
  256. * 輸出                  : 無(wú)
  257. *******************************************************************************/
  258. unsigned char At24c02Read(unsigned char addr)
  259. {
  260.         unsigned char num;
  261.         I2cStart();
  262.         I2cSendByte(0xa0); //發(fā)送寫(xiě)器件地址
  263.         I2cSendByte(addr); //發(fā)送要讀取的地址
  264.         I2cStart();
  265. ……………………

  266. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
仿真代碼.7z (398.91 KB, 下載次數(shù): 2407)
演示視頻.7z (9.91 MB, 下載次數(shù): 286)

評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
山科大 + 5 絕世好帖!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:560088 發(fā)表于 2019-6-11 16:40 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:564145 發(fā)表于 2019-6-17 09:24 | 只看該作者
能不能發(fā)個(gè)聯(lián)系方式,有問(wèn)題不懂
回復(fù)

使用道具 舉報(bào)

地板
ID:554248 發(fā)表于 2019-6-17 10:22 | 只看該作者
能不能給個(gè)聯(lián)系方式
回復(fù)

使用道具 舉報(bào)

5#
ID:435101 發(fā)表于 2019-7-5 16:51 | 只看該作者
如何修改為斷電記憶密碼?求大家指導(dǎo)
回復(fù)

使用道具 舉報(bào)

6#
ID:581274 發(fā)表于 2019-7-11 10:16 | 只看該作者
真是太有愛(ài)了
回復(fù)

使用道具 舉報(bào)

7#
ID:632812 發(fā)表于 2019-10-30 17:26 | 只看該作者
萬(wàn)分感謝
回復(fù)

使用道具 舉報(bào)

8#
ID:646452 發(fā)表于 2019-11-21 12:56 | 只看該作者
如果51換成stm32的有哪些地方需要改動(dòng)?
回復(fù)

使用道具 舉報(bào)

9#
ID:646231 發(fā)表于 2019-11-21 13:32 來(lái)自觸屏版 | 只看該作者
感謝感謝,這網(wǎng)站太好用了
回復(fù)

使用道具 舉報(bào)

10#
ID:649766 發(fā)表于 2019-11-26 15:28 | 只看該作者
初始密碼是什么?

回復(fù)

使用道具 舉報(bào)

11#
ID:660359 發(fā)表于 2019-12-13 09:41 | 只看該作者
兄弟,三次密碼輸入錯(cuò)誤以后就不能再輸入密碼了呀,復(fù)位鍵沒(méi)用啊
回復(fù)

使用道具 舉報(bào)

12#
ID:569937 發(fā)表于 2019-12-26 17:38 | 只看該作者
復(fù)位電路  沒(méi)有用  什么情況
回復(fù)

使用道具 舉報(bào)

13#
ID:675096 發(fā)表于 2019-12-27 08:27 | 只看該作者
真是太有愛(ài)了
回復(fù)

使用道具 舉報(bào)

14#
ID:675096 發(fā)表于 2019-12-28 09:04 | 只看該作者
感謝感謝,這網(wǎng)站太好用了
回復(fù)

使用道具 舉報(bào)

15#
ID:675760 發(fā)表于 2019-12-28 23:06 | 只看該作者
可以設(shè)置密碼位數(shù)可以讓它多幾位或者少幾位嗎
回復(fù)

使用道具 舉報(bào)

16#
ID:680994 發(fā)表于 2020-1-5 21:30 | 只看該作者
清水煮魚(yú) 發(fā)表于 2020-1-4 14:05
沒(méi)有黑幣呀,這上面的代碼全嗎?

請(qǐng)問(wèn)如何將4位改成6位可以嗎?
回復(fù)

使用道具 舉報(bào)

17#
ID:705869 發(fā)表于 2020-3-15 10:38 | 只看該作者

密碼是6767
回復(fù)

使用道具 舉報(bào)

18#
ID:539798 發(fā)表于 2020-4-2 15:50 | 只看該作者
感謝感謝,這網(wǎng)站太好用了
回復(fù)

使用道具 舉報(bào)

19#
ID:478073 發(fā)表于 2020-4-3 10:30 | 只看該作者
|一|枝|獨(dú)|秀| 發(fā)表于 2020-4-2 15:50
感謝感謝,這網(wǎng)站太好用了

好用就多上來(lái)聊聊
回復(fù)

使用道具 舉報(bào)

20#
ID:718173 發(fā)表于 2020-4-3 15:55 來(lái)自觸屏版 | 只看該作者
樓主,按照你的的代碼,鍵盤鎖定之后該怎么解除鎖定啊,在找就解答
回復(fù)

使用道具 舉報(bào)

21#
ID:705465 發(fā)表于 2020-4-7 09:12 | 只看該作者
89c51沒(méi)有IIC總線呀,只能模擬,那我要怎么實(shí)現(xiàn)呀
回復(fù)

使用道具 舉報(bào)

22#
ID:764847 發(fā)表于 2020-6-1 10:58 | 只看該作者

請(qǐng)問(wèn)一下。上面的程序是不是不全呀。我下載了但是沒(méi)有全部源代碼
回復(fù)

使用道具 舉報(bào)

23#
ID:768360 發(fā)表于 2020-6-6 10:05 | 只看該作者
666 感謝兄弟
回復(fù)

使用道具 舉報(bào)

24#
ID:773076 發(fā)表于 2020-6-8 17:18 | 只看該作者
謝謝分享,感覺(jué)受益匪淺!
回復(fù)

使用道具 舉報(bào)

25#
ID:777060 發(fā)表于 2020-6-24 15:43 | 只看該作者
問(wèn)一下怎么設(shè)置讓它顯示輸入的數(shù)字呢
回復(fù)

使用道具 舉報(bào)

26#
ID:777060 發(fā)表于 2020-6-24 15:44 | 只看該作者
大神啊,怎么讓它顯示輸入的數(shù)字呢,就輸入一個(gè)顯示一個(gè)
回復(fù)

使用道具 舉報(bào)

27#
ID:777060 發(fā)表于 2020-6-24 15:46 | 只看該作者
+++++++++++ 發(fā)表于 2020-6-1 10:58
請(qǐng)問(wèn)一下。上面的程序是不是不全呀。我下載了但是沒(méi)有全部源代碼

有的,下載的全了,你現(xiàn)在還需要嗎
回復(fù)

使用道具 舉報(bào)

28#
ID:769553 發(fā)表于 2020-6-28 12:58 | 只看該作者
啊,我輸入初始密碼6767怎么直接鎖了
回復(fù)

使用道具 舉報(bào)

29#
ID:637237 發(fā)表于 2020-10-20 16:22 | 只看該作者
已下載,等有空的時(shí)候好好學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

30#
ID:298850 發(fā)表于 2020-11-5 17:12 | 只看該作者
這主程序都辣么長(zhǎng)�?赐暧悬c(diǎn)暈
回復(fù)

使用道具 舉報(bào)

31#
ID:839241 發(fā)表于 2020-11-8 12:08 來(lái)自觸屏版 | 只看該作者
找到了跟我一致想法的帖子
回復(fù)

使用道具 舉報(bào)

32#
ID:849142 發(fā)表于 2020-12-5 09:37 | 只看該作者
DSN文件需要什么版本proteus才能打開(kāi)呀
回復(fù)

使用道具 舉報(bào)

33#
ID:861954 發(fā)表于 2020-12-22 08:08 | 只看該作者
我確實(shí)沒(méi)想過(guò)一個(gè)鎖的程序都這么多
回復(fù)

使用道具 舉報(bào)

34#
ID:865733 發(fā)表于 2020-12-22 19:04 | 只看該作者
非常有用的程序,謝樓主分享
回復(fù)

使用道具 舉報(bào)

35#
ID:870507 發(fā)表于 2020-12-29 19:41 | 只看該作者
太棒了,就是我想要的。
回復(fù)

使用道具 舉報(bào)

36#
ID:28992 發(fā)表于 2021-6-4 07:14 | 只看該作者
thank you for your sharing!
回復(fù)

使用道具 舉報(bào)

37#
ID:941265 發(fā)表于 2021-11-18 17:20 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

38#
ID:978751 發(fā)表于 2021-11-18 19:21 | 只看該作者
aaasym 發(fā)表于 2019-7-5 16:51
斷電不能記憶密碼-有弊端!

肯定可以了,24C02可以掉電存儲(chǔ)啊
回復(fù)

使用道具 舉報(bào)

39#
ID:982352 發(fā)表于 2021-11-18 21:22 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

40#
ID:985818 發(fā)表于 2021-11-30 20:39 | 只看該作者
做實(shí)物的話都需要買啥哇
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表