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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5297|回復(fù): 2
收起左側(cè)

基于stc15單片機(jī)的4位電子密碼鎖設(shè)計分享 代碼+PCB+實(shí)物

[復(fù)制鏈接]
ID:128314 發(fā)表于 2019-3-5 23:41 | 顯示全部樓層 |閱讀模式
這是我上學(xué)期學(xué)校實(shí)訓(xùn)做的電子密碼鎖,主控芯片選擇的是stc15f2k60s2,4位數(shù)碼管作為顯示模塊,設(shè)置密碼存放在單片機(jī)內(nèi)部的eeprom中。附件中包含4位電子密碼鎖的原理圖和PCB設(shè)計以及源代碼,分享給大家,希望大家一起進(jìn)步。

密碼鎖的詳細(xì)的操作說明如下:
1、密碼鎖初始密碼是2019,密碼修改成功后一定要記住自己設(shè)置密碼,否則下次不能正常
   開鎖。
2、初始上電情況下,密碼鎖處于關(guān)閉狀態(tài),數(shù)碼管顯示"OFF"。此時短按按鍵S3進(jìn)入輸入
   密碼狀態(tài)。通過按鍵完成4位密碼的輸入,s1按鍵代表加,s2按鍵代表減,s3按鍵代表移
   位(通過s3按鍵完成不同密碼位的切換輸入),當(dāng)四位密碼輸入完成后,長按s3按鍵,系統(tǒng)
   進(jìn)行輸入密碼和實(shí)際密碼的校驗(yàn)
3、輸入密碼正確,密碼鎖進(jìn)入開鎖狀態(tài),數(shù)碼管顯示"OPEN"。此時短按按鍵s1(正常按下),
   密碼鎖進(jìn)入關(guān)閉狀態(tài),數(shù)碼管顯示"OFF"。輸入密碼錯誤,數(shù)碼管上閃爍'----'4次,然后顯
   示OFF想要再次開鎖還需重復(fù)2的操作。
4、密碼鎖只有處于開鎖狀態(tài)情況下才能設(shè)置新的密碼。密碼鎖處于開鎖狀態(tài)下,長按(一直按
   住按鍵,直到數(shù)碼管提示密碼輸入)S2按鍵進(jìn)入設(shè)置新密碼狀態(tài)。新密碼輸入完成后,長按
   S3鍵,密碼保存到EEPROM中。如果新密碼設(shè)置成功,數(shù)碼管上會閃爍"666"4次,然后顯示
   OPEN;如果新密碼設(shè)置失敗,數(shù)碼管會閃爍 "FFFF"4次,然后顯示OPEN。設(shè)置新密碼失敗如
   果重新設(shè)置密碼鎖,重復(fù)步驟3操作。

實(shí)物圖

密碼鎖關(guān)閉

密碼鎖關(guān)閉


輸入密碼

輸入密碼


密碼鎖打開

密碼鎖打開


Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png 0.png 0.png

+-------------------------------------------------------------------+
*        +    由于按鍵資源有限,某些按鍵必須支持復(fù)用功能,長按、短按操作一   +     
*        +    定要注意                                                       +
            +              S1按鍵---------------->P0.5端口                      +
*        +              S2按鍵---------------->P0.6端口                      +
*        +              S3按鍵---------------->P0.7端口                      +
*        +                                                                   +
*        +     本代碼完全按照實(shí)驗(yàn)提供原理圖編寫,如果你在設(shè)置硬件時更改原理  +
*        +     圖(可能是因?yàn)樘峁┰韴D 單層布線完全),你需要根據(jù)自己原理圖 +
*        +     更改數(shù)碼管位選和段選(bsp_smg.c文件)                           +
*        +-------------------------------------------------------------------+  

單片機(jī)程序代碼如下:
  1. /*
  2. *********************************************************************************************************
  3. *
  4. *        模塊名稱 : 電子密碼鎖核心模塊。
  5. *        文件名稱 : code_lock.c
  6. *        版    本 : V1.0
  7. *        說    明 : 電子密碼鎖
  8. *
  9. *
  10. *********************************************************************************************************
  11. */
  12. #include "bsp.h"
  13. #include "code_lock.h"

  14. #define SUCCESS               1
  15. #define FALSE                 0

  16. #define CALIBRATION           0x80

  17. /* 第一個扇區(qū)EEPROM的起始地址 */
  18. #define PASSWORD_SAVE_ADDR    0x00                /* 密碼存放在單片機(jī)EEPROM中初始地址 */
  19. /* 第二個扇區(qū)EEPROM的起始地址 */
  20. #define PASSWORD_IS_MODIFY    0x300               /* 讀取此地址內(nèi)容,判斷默認(rèn)密碼是否被
  21.                                                      修改,如果被修改每次上電后必須從密
  22.                                                                                                                                           碼存放地址處讀取密碼,并將其存放到結(jié)
  23.                                                                                                                                           構(gòu)體成員變量password數(shù)組中 */

  24.                                                                                                                                                      
  25. LOCK_T s_tLock;

  26. static void WiatUnlock(LOCK_T * p_Lock);
  27. static void AreUnlock(LOCK_T * p_Lock);
  28. static void HaveUnlock(LOCK_T * p_Lock);
  29. static void SetPassword(LOCK_T * p_Lock);
  30. static uint8_t CheckWriteStatus(LOCK_T * p_Lock);

  31. /*
  32. *********************************************************************************************************
  33. *        函 數(shù) 名: Init_Lock_Var
  34. *        功能說明: 初始化密碼鎖初始密碼
  35. *        形    參: 無
  36. *        返 回 值: 無
  37. *********************************************************************************************************
  38. */
  39. void Init_Lock(void)
  40. {
  41.         uint8_t tmp;
  42.         uint8_t pBuffer[PASSWORD_MAX_BIT] = {2, 0, 1, 9};
  43.         uint8_t n;
  44.         
  45.         for(n = 0; n < 4; n++)
  46.                 s_tLock.Password[n] = pBuffer[n];
  47.         
  48.         /* 讀取PASSWORD_IS_MODIFY地址內(nèi)容,判斷默認(rèn)密碼是否被修改 */
  49.         EEPROM_read_n(PASSWORD_IS_MODIFY,&tmp,1);
  50.         /* 默認(rèn)密碼已經(jīng)被修改,從eeprom中讀入密碼到password數(shù)組 */
  51.         if(tmp == CALIBRATION)
  52.         {
  53.                 EEPROM_read_n(PASSWORD_SAVE_ADDR,pBuffer,PASSWORD_MAX_BIT);
  54.                 for(n = 0; n < 4; n++)
  55.                         s_tLock.Password[n] = pBuffer[n];
  56.         }
  57.         
  58.         s_tLock.LockStatus = LOCK;
  59. }

  60. /*
  61. *********************************************************************************************************
  62. *        函 數(shù) 名: Run_Lock
  63. *        功能說明: 電子密碼鎖
  64. *        形    參: 無
  65. *        返 回 值: 無
  66. *********************************************************************************************************
  67. */
  68. void Run_Lock(void)
  69. {        
  70.         LOCK_ENUM LockStatus;
  71.         
  72.         while(1)
  73.         {
  74.                 LockStatus = s_tLock.LockStatus;
  75.                 switch(LockStatus)
  76.                 {
  77.                         case LOCK:
  78.                                 WiatUnlock(&s_tLock);
  79.                                 break;
  80.                         
  81.                         case ISLOCK:
  82.                                 AreUnlock(&s_tLock);
  83.                                 break;
  84.                         
  85.                         case UNLOCK:
  86.                                 HaveUnlock(&s_tLock);
  87.                                 break;
  88.                         
  89.                         case SET_PASSWORD:
  90.                                 SetPassword(&s_tLock);
  91.                                 break;
  92.                         
  93.                         
  94.                         
  95.                         default:
  96.                                 break;
  97.                 }
  98.         }
  99. }


  100. /*
  101. *********************************************************************************************************
  102. *        函 數(shù) 名: WiatUnlock
  103. *        功能說明: 等待S3按鍵按下,進(jìn)入輸入密碼狀態(tài)
  104. *        形    參: p_Lock: LOCK_T結(jié)構(gòu)體
  105. *        返 回 值: 無
  106. *********************************************************************************************************
  107. */
  108. static void WiatUnlock(LOCK_T * p_Lock)
  109. {
  110.         uint8_t KeyState;
  111.         
  112.         for(;;)
  113.         {
  114.                 KeyState = bsp_GetKey();
  115.                 if(KeyState == KEY_DOWN_K3)
  116.                 {
  117.                         p_Lock->LockStatus = ISLOCK;
  118.                         break;
  119.                 }
  120.                 bsp_Display();
  121.         }
  122. }

  123. /*
  124. *********************************************************************************************************
  125. *        函 數(shù) 名: AreUnlock
  126. *        功能說明: 進(jìn)行密碼輸入
  127. *        形    參: p_Lock: LOCK_T結(jié)構(gòu)體
  128. *        返 回 值: 無
  129. *********************************************************************************************************
  130. */
  131. static void AreUnlock(LOCK_T * p_Lock)
  132. {
  133.         uint8_t KeyState;
  134.         uint8_t n;
  135.         
  136.         
  137.         for(n = 0; n < PASSWORD_MAX_BIT; n++)
  138.                 p_Lock->Input[n] = 0;
  139.         
  140.         p_Lock->Count = 0;
  141.         
  142.         for(;;)
  143.         {
  144.                 KeyState = bsp_GetKey();
  145.                
  146.                 if(KeyState != KEY_NONE)
  147.                 {
  148.                         switch(KeyState)
  149.                         {
  150.                                 case KEY_DOWN_K1:
  151.                                         if(++p_Lock->Input[p_Lock->Count] >= 10)
  152.                                                 p_Lock->Input[p_Lock->Count] = 9;
  153.                                         break;
  154.                                        
  155.                                 case KEY_DOWN_K2:
  156.                                         if(p_Lock->Input[p_Lock->Count]-- <= 0)
  157.                                                 p_Lock->Input[p_Lock->Count] = 0;
  158.                                         break;
  159.                                        
  160.                                 case KEY_DOWN_K3:                /* k3按鍵短按,用于密碼輸入時移位 */
  161.                                         if(++p_Lock->Count >= 4)
  162.                                         {
  163.                                                         p_Lock->Count = 0;
  164.                                         }
  165.                                         break;
  166.                                        
  167.                                 case KEY_LONG_K3:                /* k3按鍵長按,校驗(yàn)輸入密碼 */
  168.                                         for(n = 0; n < PASSWORD_MAX_BIT; n++)
  169.                                         {
  170.                                                 if(p_Lock->Input[n] != p_Lock->Password[n])
  171.                                                         break;
  172.                                         }
  173.                                         if(n != PASSWORD_MAX_BIT)
  174.                                         {
  175.                                                 p_Lock->LockStatus = PASSWORD_ERR;
  176.                                                 
  177.                                                 //此處添加密碼校驗(yàn)錯誤顯示
  178.                                                 bsp_Display();
  179.                                        
  180.                                                 p_Lock->LockStatus = LOCK;
  181.                                         }
  182.                                         else
  183.                                         {
  184.                                                 p_Lock->LockStatus = UNLOCK;
  185.                                         }
  186.                                         break;
  187.                                        
  188.                                 default:
  189.                                         break;
  190.                         }
  191.                 }
  192.                
  193.                 if((p_Lock->LockStatus == UNLOCK) || (p_Lock->LockStatus == LOCK))
  194.                         break;
  195.                
  196.                 bsp_Display();
  197.         }
  198. }

  199. /*
  200. *********************************************************************************************************
  201. *        函 數(shù) 名: HaveUnlock
  202. *        功能說明: 密碼校驗(yàn)正確,解鎖成功
  203. *        形    參: p_Lock: LOCK_T結(jié)構(gòu)體
  204. *        返 回 值: 無
  205. *********************************************************************************************************
  206. */
  207. static void HaveUnlock(LOCK_T * p_Lock)
  208. {
  209.         uint8_t KeyState;
  210.         
  211.         /*
  212.          * 密碼校驗(yàn)正確,解鎖成功可以在此處調(diào)用用戶回調(diào)函數(shù)
  213.          * 回調(diào)函數(shù)功能一般是開鎖
  214.          */
  215.         //p_Lock->callbackFun
  216.         
  217.         for(;;)
  218.         {
  219.                 KeyState = bsp_GetKey();
  220.                
  221.                 if(KeyState != KEY_NONE)
  222.                 {
  223.                         switch(KeyState)
  224.                         {
  225.                                 case KEY_1_DOWN:
  226.                                         p_Lock->LockStatus = LOCK;
  227.                                         break;
  228.                                 
  229.                                 case KEY_2_LONG:
  230.                                         p_Lock->LockStatus = SET_PASSWORD;
  231.                                         break;
  232.                                 
  233.                                 default:
  234.                                         break;
  235.                         }
  236.                 }
  237.                
  238.                 if(p_Lock->LockStatus != UNLOCK)
  239.                         break;
  240.                
  241.                 bsp_Display();
  242.         }
  243. }

  244. /*
  245. *********************************************************************************************************
  246. *        函 數(shù) 名: SetPassword
  247. *        功能說明: 重新設(shè)置按鍵密碼,只能在開鎖之后調(diào)用
  248. *        形    參: p_Lock: LOCK_T結(jié)構(gòu)體
  249. *        返 回 值: 無
  250. *********************************************************************************************************
  251. */
  252. static void SetPassword(LOCK_T * p_Lock)
  253. {
  254.         uint8_t KeyState;
  255.         uint8_t n;
  256.         uint8_t Verify, WriteStatus;
  257.         uint8_t bakBuf[PASSWORD_MAX_BIT];
  258.         
  259.         /* 設(shè)置之前先備份密碼 */
  260.         for(n = 0; n < PASSWORD_MAX_BIT; n++)
  261.                 bakBuf[n] = p_Lock->Password[n];
  262.         
  263.         for(n = 0; n < PASSWORD_MAX_BIT; n++)
  264.                 p_Lock->Password[n] = 0;
  265.         
  266.         p_Lock->Count = 0;
  267.         Verify = CALIBRATION;
  268.         
  269.         for(;;)
  270.         {
  271.                 KeyState = bsp_GetKey();
  272.                
  273.                 if(KeyState != KEY_NONE)
  274.                 {
  275.                         switch(KeyState)
  276.                         {
  277.                                 case KEY_DOWN_K1:
  278.                                         if(++p_Lock->Password[p_Lock->Count] >= 10)
  279.                                                 p_Lock->Password[p_Lock->Count] = 9;
  280.                                         break;
  281.                                 
  282.                                 case KEY_DOWN_K2:
  283.                                         if(p_Lock->Password[p_Lock->Count]-- <= 0)
  284.                                                 p_Lock->Password[p_Lock->Count] = 0;
  285.                                         break;
  286.                                        
  287.                                 case KEY_DOWN_K3:
  288.                                         if(++p_Lock->Count >= 4)
  289.                                                 p_Lock->Count = 0;
  290.                                         break;
  291.                                        
  292.                                 case KEY_LONG_K3:                        /* 長按寫入密碼到eeprom中 */
  293.                                         //先擦除EEPROM要寫入地址扇區(qū),扇區(qū)1
  294.                                         EEPROM_SectorErase(PASSWORD_SAVE_ADDR);
  295.                                         //寫入新的密碼
  296.                                         EEPROM_write_n(PASSWORD_SAVE_ADDR,p_Lock->Password,PASSWORD_MAX_BIT);
  297.                                        
  298.                                         //先擦除EEPROM要寫入地址扇區(qū),扇區(qū)2
  299.                                         //EEPROM_SectorErase(PASSWORD_IS_MODIFY);
  300.                                         //寫入更新標(biāo)志位
  301.                                         EEPROM_write_n(PASSWORD_IS_MODIFY,&Verify,1);
  302.                                 
  303.                                         //檢測是否寫入成功
  304.                                         WriteStatus = CheckWriteStatus(p_Lock);
  305.                                        
  306.                                         if(WriteStatus)
  307.                                         {
  308.                                                 s_tLock.LockStatus = WE_PASSWORD_SES;
  309.                                                 //顯示寫入密碼成功
  310.                                                 bsp_Display();
  311.                                         }
  312.                                         else
  313.                                         {
  314.                                                 //顯示寫入密碼失敗
  315.                                                 s_tLock.LockStatus = WE_PASSWORD_ERR;
  316.                                 
  317.                                                 //恢復(fù)原始密碼到Password數(shù)組中
  318.                                                 for(n = 0; n < PASSWORD_MAX_BIT; n++)
  319.                                                         p_Lock->Password[n] = bakBuf[n];
  320.                                                 
  321.                                                 //顯示寫入密碼失敗
  322.                                                 bsp_Display();
  323.                                         }
  324. ……………………

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

所有資料51hei提供下載:
源代碼和PCB.7z (674.28 KB, 下載次數(shù): 71)


評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:355122 發(fā)表于 2019-3-6 13:31 | 顯示全部樓層
有沒有仿真
回復(fù)

使用道具 舉報

ID:128314 發(fā)表于 2019-3-6 19:56 | 顯示全部樓層

沒有仿真,有pcb圖和源代碼
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一二三四在线视频观看社区 | 欧美精品成人影院 | 欧洲成人 | 激情五月婷婷综合 | 成人亚洲视频 | 欧美一区二区二区 | 色黄视频在线 | 久久成人人人人精品欧 | 超碰在线人人 | 国产精品久久久久久婷婷天堂 | 神马福利 | 中文字幕国产视频 | 涩涩导航 | 国产精品免费一区二区三区四区 | 亚洲aⅴ | 美女久久视频 | 亚洲永久免费观看 | 久久国产一区二区三区 | 日韩欧美一区二区三区在线播放 | 亚洲国产视频一区 | 亚洲一区中文字幕在线观看 | 国产精品久久久久久久久久妇女 | 成人在线中文字幕 | 天天射影院| 免费看爱爱视频 | 91精品久久久久久久久中文字幕 | 欧美亚洲激情 | a级片在线观看 | 亚洲天堂成人在线视频 | 黑人巨大精品欧美一区二区免费 | 欧美精品在线播放 | 国产一区二区视频在线 | 久久成人一区 | 午夜精品影院 | 激情网五月天 | 久久天堂网 | 久久久久九九九女人毛片 | 久久精品一区 | 国产成人精品在线播放 | 久久99精品视频 | av在线一区二区 |