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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 40236|回復: 59
收起左側

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

  [復制鏈接]
ID:559277 發表于 2019-6-10 19:18 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
0.png

0.png

3.6 開鎖機構
在基于單片機的電子密碼鎖設計中,用戶需要輸入密碼,密碼正確則發出開鎖信號開鎖。
在這次基于單片機的電子密碼鎖設計中,通過控制蜂鳴器的發音來指示系統的開鎖功能。蜂鳴器是一種采用直流電壓供電的電子訊響器。圖3-9是用蜂鳴器指示的開鎖機構仿真圖。因為在設計中是以蜂鳴器發生來指示開鎖是否成功,當密碼輸入正確時蜂鳴器響起來,代表鎖開了。
圖3-9開鎖機構指示電路
3.7 報警機構
在這次基于單片機的電子密碼鎖設計中,通過控制報警顯示LED來指示系統的報警功能。圖3-10是用基于LED的報警機構仿真圖。控制RELAY輸出高低電平,即P3.4引腳,就可以控制報警顯示LED的亮滅,從而指示相關信息。
圖3-10報警機構模擬仿真圖
當用戶輸入密碼錯誤次數達到預設警告次數時,系統調用報警子程序,使LED亮起來,同時禁止鍵盤輸入。
3.8 硬件綜合設計
根據電路原理,在PROTEUS中畫出各功能模塊的仿真圖,各個功能模塊驗證正確后,將所有模塊集合到一個電路設計圖中,畫出具有所有功能的總體硬件仿真圖。
待程序編寫好后,將KEIL和PROTEUS聯調,觀察此電路設計圖可以知道各個功能模塊和器件的工作情況。屆時,根據實際情況可以適當修改電路圖或者程序,以達到設計的目的。

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

  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;          //設置
  8. sbit LCK=P0^6;          //關鎖

  9. #define LOCK_TIME_second 10
  10. #define SU 1/256
  11. #define GPIO_KEY P1        //4X4矩陣鍵盤輸入
  12. unsigned char KeyValue; //用來存放讀取到的鍵值
  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. //存儲芯片存儲的內容
  21. /*===============================================
  22. 地址: 0    1    2     3    4    5      6     
  23. 數據:無   密碼 密碼  密碼 密碼         無  錯誤次數
  24. =================================================*/

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

  29. //====主函數入口======
  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();   //初始化定時器

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

  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);  //顯示當前按鍵的值
  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;         //聲音報警
  72.                                   delay_ddll = 1;
  73.                                   LcdWriteCom(0x80+i+2);
  74.                                   LcdWriteData('O');
  75.                                   LcdWriteData('K');
  76.                                   At24c02Write(6,0);        ////清除錯誤輸入次數
  77.                                 }
  78.                                 else
  79.                                 {
  80.                                   BUZZER=1;
  81.                                   LcdWriteCom(0x80+i+2);
  82.                                   LcdWriteData('E');
  83.                                   LcdWriteData('R');

  84.                                   temp00=At24c02Read(6);  ////存儲輸入錯誤次數
  85.                                   if (temp00>=2)              //連續輸入錯誤超過3次
  86.                                   {         
  87.                                     LOCK_flg=1;
  88.                                         RELAY=0;  /////指示燈起來
  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);  //顯示當前按鍵的值
  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;  //設置狀態指示燈亮起來
  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;         ///可以進行下一步操作                                                  
  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);  ////存儲輸入錯誤次數
  148.                                                   if (temp00>=2)        
  149.                                                   {         
  150.                                                     LOCK_flg=1;
  151.                                                         RELAY=0;  /////指示燈起來
  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)  //有按鍵按下,關上鎖,清除窗口!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. * 函 數 名         : KeyDown
  197. * 函數功能                   : 檢測有按鍵按下并讀取鍵值
  198. * 輸    入         : 無
  199. * 輸    出         : 無
  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); //延時10ms進行消抖
  210.                 if(GPIO_KEY!=0x0f)    //再次檢測鍵盤是否按下
  211.                 {               
  212.                         //測試列
  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.                         //測試行
  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))         //檢測按鍵松手檢測
  231.                         {
  232.                                 Lcd1602_Delay1ms(2);
  233.                                 a++;
  234.                         }
  235.                 }
  236.         }
  237. }

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

  266. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
仿真代碼.7z (398.91 KB, 下載次數: 2407)

評分

參與人數 2黑幣 +55 收起 理由
山科大 + 5 絕世好帖!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:560088 發表于 2019-6-11 16:40 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:564145 發表于 2019-6-17 09:24 | 顯示全部樓層
能不能發個聯系方式,有問題不懂
回復

使用道具 舉報

ID:554248 發表于 2019-6-17 10:22 | 顯示全部樓層
能不能給個聯系方式
回復

使用道具 舉報

ID:435101 發表于 2019-7-5 16:51 | 顯示全部樓層
如何修改為斷電記憶密碼?求大家指導
回復

使用道具 舉報

ID:581274 發表于 2019-7-11 10:16 | 顯示全部樓層
真是太有愛了
回復

使用道具 舉報

ID:632812 發表于 2019-10-30 17:26 | 顯示全部樓層
萬分感謝
回復

使用道具 舉報

ID:646452 發表于 2019-11-21 12:56 | 顯示全部樓層
如果51換成stm32的有哪些地方需要改動?
回復

使用道具 舉報

ID:646231 發表于 2019-11-21 13:32 來自手機 | 顯示全部樓層
感謝感謝,這網站太好用了
回復

使用道具 舉報

ID:649766 發表于 2019-11-26 15:28 | 顯示全部樓層
初始密碼是什么?

回復

使用道具 舉報

ID:660359 發表于 2019-12-13 09:41 | 顯示全部樓層
兄弟,三次密碼輸入錯誤以后就不能再輸入密碼了呀,復位鍵沒用啊
回復

使用道具 舉報

ID:569937 發表于 2019-12-26 17:38 | 顯示全部樓層
復位電路  沒有用  什么情況
回復

使用道具 舉報

ID:675096 發表于 2019-12-27 08:27 | 顯示全部樓層
真是太有愛了
回復

使用道具 舉報

ID:675096 發表于 2019-12-28 09:04 | 顯示全部樓層
感謝感謝,這網站太好用了
回復

使用道具 舉報

ID:675760 發表于 2019-12-28 23:06 | 顯示全部樓層
可以設置密碼位數可以讓它多幾位或者少幾位嗎
回復

使用道具 舉報

ID:680994 發表于 2020-1-5 21:30 | 顯示全部樓層
清水煮魚 發表于 2020-1-4 14:05
沒有黑幣呀,這上面的代碼全嗎?

請問如何將4位改成6位可以嗎?
回復

使用道具 舉報

ID:705869 發表于 2020-3-15 10:38 | 顯示全部樓層

密碼是6767
回復

使用道具 舉報

ID:539798 發表于 2020-4-2 15:50 | 顯示全部樓層
感謝感謝,這網站太好用了
回復

使用道具 舉報

ID:478073 發表于 2020-4-3 10:30 | 顯示全部樓層
|一|枝|獨|秀| 發表于 2020-4-2 15:50
感謝感謝,這網站太好用了

好用就多上來聊聊
回復

使用道具 舉報

ID:718173 發表于 2020-4-3 15:55 來自手機 | 顯示全部樓層
樓主,按照你的的代碼,鍵盤鎖定之后該怎么解除鎖定啊,在找就解答
回復

使用道具 舉報

ID:705465 發表于 2020-4-7 09:12 | 顯示全部樓層
89c51沒有IIC總線呀,只能模擬,那我要怎么實現呀
回復

使用道具 舉報

ID:764847 發表于 2020-6-1 10:58 | 顯示全部樓層

請問一下。上面的程序是不是不全呀。我下載了但是沒有全部源代碼
回復

使用道具 舉報

ID:768360 發表于 2020-6-6 10:05 | 顯示全部樓層
666 感謝兄弟
回復

使用道具 舉報

ID:773076 發表于 2020-6-8 17:18 | 顯示全部樓層
謝謝分享,感覺受益匪淺!
回復

使用道具 舉報

ID:777060 發表于 2020-6-24 15:43 | 顯示全部樓層
問一下怎么設置讓它顯示輸入的數字呢
回復

使用道具 舉報

ID:777060 發表于 2020-6-24 15:44 | 顯示全部樓層
大神啊,怎么讓它顯示輸入的數字呢,就輸入一個顯示一個
回復

使用道具 舉報

ID:777060 發表于 2020-6-24 15:46 | 顯示全部樓層
+++++++++++ 發表于 2020-6-1 10:58
請問一下。上面的程序是不是不全呀。我下載了但是沒有全部源代碼

有的,下載的全了,你現在還需要嗎
回復

使用道具 舉報

ID:769553 發表于 2020-6-28 12:58 | 顯示全部樓層
啊,我輸入初始密碼6767怎么直接鎖了
回復

使用道具 舉報

ID:637237 發表于 2020-10-20 16:22 | 顯示全部樓層
已下載,等有空的時候好好學習一下
回復

使用道具 舉報

ID:298850 發表于 2020-11-5 17:12 | 顯示全部樓層
這主程序都辣么長?赐暧悬c暈
回復

使用道具 舉報

ID:839241 發表于 2020-11-8 12:08 來自手機 | 顯示全部樓層
找到了跟我一致想法的帖子
回復

使用道具 舉報

ID:849142 發表于 2020-12-5 09:37 | 顯示全部樓層
DSN文件需要什么版本proteus才能打開呀
回復

使用道具 舉報

ID:861954 發表于 2020-12-22 08:08 | 顯示全部樓層
我確實沒想過一個鎖的程序都這么多
回復

使用道具 舉報

ID:865733 發表于 2020-12-22 19:04 | 顯示全部樓層
非常有用的程序,謝樓主分享
回復

使用道具 舉報

ID:870507 發表于 2020-12-29 19:41 | 顯示全部樓層
太棒了,就是我想要的。
回復

使用道具 舉報

ID:28992 發表于 2021-6-4 07:14 | 顯示全部樓層
thank you for your sharing!
回復

使用道具 舉報

ID:941265 發表于 2021-11-18 17:20 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:978751 發表于 2021-11-18 19:21 | 顯示全部樓層
aaasym 發表于 2019-7-5 16:51
斷電不能記憶密碼-有弊端!

肯定可以了,24C02可以掉電存儲啊
回復

使用道具 舉報

ID:982352 發表于 2021-11-18 21:22 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:985818 發表于 2021-11-30 20:39 | 顯示全部樓層
做實物的話都需要買啥哇
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频成人 | 看片地址 | 国产乱性| 亚洲视频免费 | 懂色av色香蕉一区二区蜜桃 | 天天草视频 | 久久综合九九 | 欧美成人专区 | 希岛爱理在线 | h视频免费在线观看 | 美女午夜影院 | 国产精品久久99 | 亚洲一区二区三区高清 | 欧美日韩精品一区二区三区四区 | 日韩在线中文字幕 | 日韩一区在线播放 | 精精国产xxxx视频在线野外 | 97日韩精品 | 在线观看中文字幕 | 日日日操 | 在线观看www视频 | 国产精品久久久久久久久久久久久 | 中文字字幕一区二区三区四区五区 | 精品免费av | 亚洲欧美日韩成人在线 | 国产精品一区一区三区 | 亚洲精品一区二区三区蜜桃久 | 亚洲国产成人精品女人久久久 | 一区观看 | 国产精品小视频在线观看 | 99在线视频观看 | 久久久久久99 | 亚洲97| 亚洲成人av| 91精品国产91久久久久福利 | 久久精品久久久久久 | 国产一区二区三区久久 | 日韩一区二区三区视频 | 天堂久| 国产性生活一级片 | 国产精品视屏 |