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

QQ登錄

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

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

只用按鍵和燈做一個(gè)便攜式保險(xiǎn)箱

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
按鍵隨機(jī)對(duì)應(yīng)一個(gè)燈,按下按鍵亮起的燈的位置必須在前一個(gè)亮起的燈下面,否則密碼輸入錯(cuò)誤,所有燈滅,重新輸入。當(dāng)所有燈按順序正確亮起后,成功解鎖!靈感源于生化危機(jī)2重制版里的便攜式保險(xiǎn)箱,有玩過(guò)的好兄弟會(huì)很好理解。

大致演示流程是這個(gè)視頻:
https://www.bilibili.com/video/BV1xY4y1y7N6/

51hei圖片_20230528105727.jpg (4.5 MB, 下載次數(shù): 59)

流程圖

流程圖

51hei圖片_20230528105905.png (1.56 MB, 下載次數(shù): 47)

按鍵對(duì)應(yīng)燈

按鍵對(duì)應(yīng)燈

51hei圖片_20230528105909.png (1.39 MB, 下載次數(shù): 46)

依次按下按鍵順序正確即將完成解鎖

依次按下按鍵順序正確即將完成解鎖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1080265 發(fā)表于 2023-5-27 15:48 | 只看該作者
本帖最后由 violet233 于 2023-5-28 11:09 編輯

主要就是我不熟悉指針,變量的關(guān)系,無(wú)法實(shí)現(xiàn)想要的邏輯效果,望各位大佬指點(diǎn)!
八個(gè)按鍵八個(gè)燈,按鍵就是正常數(shù)字鍵盤(pán)類(lèi)排序,燈可以是從上到下排成一列,解鎖順序是從上到下一盞盞依次亮起,不一定從第一盞燈開(kāi)始,但是每下一盞得在前一盞亮起位置的下面一位。按鍵隨機(jī)對(duì)應(yīng)燈,但是每次完整解鎖過(guò)程都是對(duì)應(yīng)同一盞燈,按該按鍵就對(duì)應(yīng)亮這盞燈,直至解鎖成功,進(jìn)行下一次解鎖按鍵和燈的順序從新編排。
回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2023-5-27 17:20 | 只看該作者
violet233 發(fā)表于 2023-5-27 15:48
主要就是我不熟悉指針,變量的關(guān)系,無(wú)法實(shí)現(xiàn)想要的邏輯效果,望各位大佬指點(diǎn)!

《按鍵隨機(jī)對(duì)應(yīng)一個(gè)燈,按下按鍵亮起的燈的位置必須在前一個(gè)亮起的燈下面》怎么理解?幾個(gè)按鍵幾個(gè)燈?按鍵與燈的排列布局如何?
回復(fù)

使用道具 舉報(bào)

地板
ID:1080331 發(fā)表于 2023-5-27 21:20 | 只看該作者
隨機(jī)對(duì)應(yīng):首先,我們需要將LED燈和按鍵一一對(duì)應(yīng),并將它們的位置隨機(jī)排列。在單片機(jī)中定義一個(gè)變量表示當(dāng)前亮起的燈的位置,初始值為-1(即沒(méi)有任何燈亮起),每按下一個(gè)按鍵,就將當(dāng)前亮起的燈的位置加1。如果該位置大于等于最后一個(gè)燈的位置,說(shuō)明密碼正確,解鎖成功。否則,所有燈都會(huì)熄滅,并重新開(kāi)始輸入密碼。

按順序正確亮起:為了確保按鍵與LED燈按順序正確亮起,我們可以在按下按鍵后使用邏輯運(yùn)算比較當(dāng)前燈的位置和上一個(gè)亮起的燈的位置,如果當(dāng)前燈的位置大于上一個(gè)亮起的燈的位置,則將當(dāng)前燈的位置設(shè)置為上一個(gè)燈的位置加1。

使用計(jì)時(shí)器:為了避免機(jī)械化攻擊或無(wú)限制地嘗試密碼,我們可以使用計(jì)時(shí)器在一定時(shí)間內(nèi)限制密碼輸入的次數(shù),如果超過(guò)了設(shè)置的次數(shù),系統(tǒng)將鎖定一段時(shí)間,防止不正常的嘗試。

狀態(tài)顯示:我們可以使用LED燈來(lái)顯示當(dāng)前系統(tǒng)的狀態(tài),例如借助三個(gè)LED燈來(lái)表示解鎖成功、解鎖失敗和輸入密碼中等狀態(tài),方便用戶(hù)進(jìn)行操作。

電源管理:在系統(tǒng)設(shè)計(jì)中需要考慮供電問(wèn)題,可以使用電池等不間斷電源以確保該系統(tǒng)的長(zhǎng)期穩(wěn)定運(yùn)行。
以下是實(shí)例代碼:
#include <reg51.h>

sbit key1 = P1^0; //按鍵引腳定義
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit led1 = P2^0; //LED引腳定義
sbit led2 = P2^1;
sbit led3 = P2^2;
int current_led = -1; //當(dāng)前亮起的燈位置
int last_led = -1; //上一個(gè)亮起的燈位置

void init() {
    key1 = 1; //按鍵初始化為高電平
    key2 = 1;
    key3 = 1;
    led1 = 0; //LED初始化為低電平熄滅狀態(tài)
    led2 = 0;
    led3 = 0;
}

void delay(int t) { //延時(shí)函數(shù)
    for(int i=0; i<t; i++) {
        for(int j=0; j<120; j++);
    }
}

void main() {
    init();
    while(1) {
        if(!key1) { //按鍵1被按下
            if(current_led == -1 || current_led == last_led + 1) { //密碼正確
                current_led++;
                last_led = current_led;
                switch(current_led) { //根據(jù)當(dāng)前亮起的LED位置控制LED燈亮滅
                    case 0:
                        led1 = 1;
                        break;
                    case 1:
                        led2 = 1;
                        break;
                    case 2:
                        led3 = 1;
                        break;
                }
                if(current_led == 2) { //所有LED燈都亮起,解鎖成功
                    delay(500);
                    led1 = 0;
                    led2 = 0;
                    led3 = 0;
                    current_led = -1;
                    last_led = -1;
                }
            } else { //密碼錯(cuò)誤
                delay(500);
                led1 = 0;
                led2 = 0;
                led3 = 0;
                current_led = -1;
                last_led = -1;
            }
        }
        if(!key2) { //按鍵2被按下
            if(current_led == -1 || current_led == last_led + 1) { //密碼正確
                current_led++;
                last_led = current_led;
                switch(current_led) {
                    case 0:
                        led1 = 1;
                        break;
                    case 1:
                        led2 = 1;
                        break;
                    case 2:
                        led3 = 1;
                        break;
                }
                if(current_led == 2) {
                    delay(500);
                    led1 = 0;
                    led2 = 0;
                    led3 = 0;
                    current_led = -1;
                    last_led = -1;
                }
            } else { //密碼錯(cuò)誤
                delay(500);
                led1 = 0;
                led2 = 0;
                led3 = 0;
                current_led = -1;
                last_led = -1;
            }
        }
        if(!key3) { //按鍵3被按下
            if(current_led == -1 || current_led == last_led + 1) { //密碼正確
                current_led++;
                last_led = current_led;
                switch(current_led) {
                    case 0:
                        led1 = 1;
                        break;
                    case 1:
                        led2 = 1;
                        break;
                    case 2:
                        led3 = 1;
                        break;
                }
                if(current_led == 2) {
                    delay(500);
                    led1 = 0;
                    led2 = 0;
                    led3 = 0;
                    current_led = -1;
                    last_led = -1;
                }
            } else { //密碼錯(cuò)誤
                delay(500);
                led1 = 0;
                led2 = 0;
                led3 = 0;
                current_led = -1;
                last_led = -1;
            }
        }
    }
}

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:73992 發(fā)表于 2023-5-27 23:59 | 只看該作者
畫(huà)邏輯框圖
回復(fù)

使用道具 舉報(bào)

6#
ID:86450 發(fā)表于 2023-5-28 00:00 | 只看該作者
那是 幾個(gè)按鍵 幾個(gè)燈
回復(fù)

使用道具 舉報(bào)

7#
ID:1080265 發(fā)表于 2023-5-28 10:46 | 只看該作者
wulin 發(fā)表于 2023-5-27 17:20
《按鍵隨機(jī)對(duì)應(yīng)一個(gè)燈,按下按鍵亮起的燈的位置必須在前一個(gè)亮起的燈下面》怎么理解?幾個(gè)按鍵幾個(gè)燈?按 ...

八個(gè)按鍵八個(gè)燈,按鍵就是正常數(shù)字鍵盤(pán)類(lèi)排序,燈是從上到下排成一列,解鎖順序從上到下,不一定從第一盞燈開(kāi)始,但是每下一盞得在前一盞亮起位置的下面。
回復(fù)

使用道具 舉報(bào)

8#
ID:1080265 發(fā)表于 2023-5-28 10:58 | 只看該作者

大致邏輯圖

51hei圖片_20230528105727.jpg (4.5 MB, 下載次數(shù): 39)

51hei圖片_20230528105727.jpg
回復(fù)

使用道具 舉報(bào)

9#
ID:1080265 發(fā)表于 2023-5-28 11:00 | 只看該作者
violet233 發(fā)表于 2023-5-27 15:48
主要就是我不熟悉指針,變量的關(guān)系,無(wú)法實(shí)現(xiàn)想要的邏輯效果,望各位大佬指點(diǎn)!

附上各類(lèi)說(shuō)明

51hei圖片_20230528105727.jpg (4.5 MB, 下載次數(shù): 45)

大致邏輯圖

大致邏輯圖

51hei圖片_20230528105905.png (1.56 MB, 下載次數(shù): 38)

類(lèi)似動(dòng)畫(huà)效果

類(lèi)似動(dòng)畫(huà)效果

51hei圖片_20230528105909.png (1.39 MB, 下載次數(shù): 53)

按正確順序即將完成

按正確順序即將完成
回復(fù)

使用道具 舉報(bào)

10#
ID:1080265 發(fā)表于 2023-5-28 12:12 | 只看該作者
597329015 發(fā)表于 2023-5-27 21:20
隨機(jī)對(duì)應(yīng):首先,我們需要將LED燈和按鍵一一對(duì)應(yīng),并將它們的位置隨機(jī)排列。在單片機(jī)中定義一個(gè)變量表示當(dāng) ...

首先感謝你的回答。
你的邏輯清晰,給我提供了一定的新思路。以你的效果燈必然是固定順序亮起的,按鍵排列是隨機(jī)的,就是已經(jīng)設(shè)置好亂序鍵盤(pán)再來(lái)輸入密碼,像蘋(píng)果手機(jī)解鎖界面,但是鍵盤(pán)是亂序的,上面一排燈是用來(lái)提示密碼總共位數(shù)和已輸入位數(shù),因此是必然一盞盞亮起表示依次被填滿,與我所設(shè)計(jì)的不同。
此外密碼輸入次數(shù)是不受限制的,嚴(yán)格來(lái)講這不是密碼鎖,只是一個(gè)訓(xùn)練短時(shí)記憶的小游戲。
如果可以,我想再問(wèn)一個(gè)問(wèn)題:燈和按鍵已經(jīng)按順序集成在了電路板上,不可再調(diào)序,如何按下按鍵亮起固定隨機(jī)對(duì)應(yīng)的燈?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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