• 方案介紹
    • 一、前言
    • 二、硬件選型介紹
    • 三、整體設(shè)計思路
    • 四、項目代碼
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

基于STC89C52單片機(jī)設(shè)計的電子柜鎖

11小時前
202
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細(xì)資料請聯(lián)系.docx

共1個文件

一、前言

隨著現(xiàn)代社會的不斷發(fā)展,電子柜鎖的應(yīng)用越來越廣泛。傳統(tǒng)的機(jī)械柜鎖存在一些不便之處,例如鑰匙容易丟失、密碼容易泄露等問題。設(shè)計一款基于單片機(jī)的電子柜鎖系統(tǒng)成為了一個有趣而有意義的項目。

該電子柜鎖系統(tǒng)通過電磁鎖作為柜鎖的開關(guān),通過繼電器控制電磁鎖的開關(guān)狀態(tài)。用戶可以通過矩陣鍵盤輸入密碼進(jìn)行開鎖,并且密碼數(shù)據(jù)會通過LCD1602液晶顯示屏進(jìn)行顯示。同時,系統(tǒng)還支持輸入密碼驗證開鎖和修改密碼的功能。當(dāng)用戶成功輸入正確的密碼并開鎖時,系統(tǒng)會通過蜂鳴器發(fā)出提示音。

這款電子柜鎖系統(tǒng)的設(shè)計為了提高柜鎖的安全性和便利性。相比傳統(tǒng)的機(jī)械柜鎖,電子柜鎖具有以下優(yōu)勢:

【1】密碼安全性:電子柜鎖采用密碼作為開鎖方式,相比傳統(tǒng)鑰匙更加安全可靠,用戶可以根據(jù)需要設(shè)置較復(fù)雜的密碼,有效防止密碼泄露和非法開鎖。

【2】方便易用:用戶只需要通過矩陣鍵盤輸入密碼即可開鎖,無需攜帶鑰匙或記憶復(fù)雜的機(jī)械操作步驟,操作簡單方便。

【3】修改密碼功能:用戶可以根據(jù)需要隨時修改密碼,提高了柜鎖的靈活性和可維護(hù)性。

【4】提示音提示:系統(tǒng)通過蜂鳴器發(fā)出提示音,讓用戶在輸入密碼和開鎖成功時得到明確的反饋,提升了用戶體驗。

電子柜鎖系統(tǒng)的設(shè)計不僅具有實用性,而且可以為學(xué)習(xí)嵌入式系統(tǒng)設(shè)計和單片機(jī)編程的初學(xué)者提供一個非常好的實踐項目。通過這個項目,可以學(xué)習(xí)和掌握單片機(jī)的輸入輸出控制、按鍵掃描、LCD顯示、蜂鳴器控制等相關(guān)知識和技術(shù)。還涉及到密碼輸入和驗證的算法設(shè)計和實現(xiàn),鍛煉了邏輯思維和程序設(shè)計能力。

通過這個電子柜鎖系統(tǒng)項目,可以體驗到現(xiàn)代電子技術(shù)的魅力,提高柜鎖的安全性和便利性,為用戶提供更好的使用體驗。

image-20230823170732930

image-20230823170655846

二、硬件選型介紹

硬件選型方面,根據(jù)需求,下面是電子柜鎖的最終硬件選型:

【1】主控芯片STC89C52單片機(jī)是一款常用的8位單片機(jī),具有豐富的外設(shè)資源和較大的存儲容量,適合作為電子柜鎖的主控芯片。

【2】電磁鎖:選擇適合的電磁鎖作為柜鎖的開關(guān),確保其能提供足夠的安全性和可靠性??紤]使用12V電磁鎖,滿足電源控制信號要求。

【3】繼電器:使用繼電器來控制電磁鎖的通斷,確保信號隔離和電流放大。

【4】矩陣鍵盤:選擇適用的矩陣鍵盤用于輸入密碼。選擇4x4矩陣鍵盤,具有16個按鍵,支持?jǐn)?shù)字和功能鍵。

【5】LCD1602液晶顯示屏:作為密碼輸入和狀態(tài)顯示的界面,LCD1602具有兩行16列的字符顯示,能夠清晰顯示輸入的密碼和相關(guān)提示信息。

【6】蜂鳴器:用于發(fā)出開鎖成功、密碼輸入錯誤等提示音。

【7】電源模塊:有穩(wěn)定可靠的電源供應(yīng)非常重要,選擇使用AC/DC 5/12V適配器供電。

三、整體設(shè)計思路

軟件設(shè)計邏輯和思路如下:

【1】初始化:在程序開始時,進(jìn)行系統(tǒng)初始化設(shè)置,包括配置IO口、定時器和外設(shè)等。同時,需要初始化密碼存儲區(qū)、LCD1602顯示屏和蜂鳴器等。

【2】密碼輸入和驗證:通過矩陣鍵盤讀取用戶輸入的密碼。可以采用一個固定長度的密碼,例如4位。用戶每按下一個數(shù)字鍵,將其添加到密碼緩沖區(qū)中,并在LCD1602上顯示相應(yīng)的“*”字符表示已輸入。當(dāng)輸入的密碼長度達(dá)到預(yù)設(shè)長度時,即可觸發(fā)密碼驗證操作。

【3】密碼驗證:將密碼緩沖區(qū)中的數(shù)字轉(zhuǎn)換為字符串形式,與預(yù)先設(shè)置好的正確密碼進(jìn)行比較。如果密碼輸入正確,則進(jìn)行開鎖操作;否則,進(jìn)行密碼錯誤提示處理。

【4】開鎖操作:當(dāng)密碼驗證成功后,控制繼電器通斷,打開或關(guān)閉電磁鎖。同時,通過蜂鳴器發(fā)出開鎖成功的提示音,并在LCD1602上顯示開鎖成功信息。

【5】修改密碼:提供修改密碼的功能。在成功驗證密碼后,用戶可以輸入新密碼進(jìn)行修改。修改完成后,將新密碼存儲起來,供下次驗證使用。

【6】狀態(tài)顯示:將相關(guān)的狀態(tài)信息實時顯示在LCD1602上,例如輸入密碼錯誤提示、修改密碼成功提示等。

【7】系統(tǒng)保護(hù):為了保護(hù)系統(tǒng)安全,可以設(shè)置安全策略,例如密碼輸入錯誤次數(shù)限制、鎖定時間等。當(dāng)達(dá)到錯誤次數(shù)上限或鎖定時間到達(dá)時,系統(tǒng)會自動進(jìn)行相應(yīng)的保護(hù)處理。

【8】中斷服務(wù):使用定時器中斷等方式進(jìn)行按鍵檢測和LCD1602刷新等操作,提高系統(tǒng)的實時性。

【9】循環(huán)檢測:設(shè)計一個主循環(huán)函數(shù),不斷檢測矩陣鍵盤的按鍵輸入、執(zhí)行開鎖、密碼驗證、密碼修改以及狀態(tài)顯示等功能。

四、項目代碼

#include <reg51.h>
#include <intrins.h>

#define PASSWORD_LENGTH 4    // 密碼長度
#define MAX_ATTEMPTS 3    // 最大嘗試次數(shù)

sbit Buzzer = P1^0;    // 蜂鳴器控制引腳
sbit ElectromagneticLock = P1^1;    // 電磁鎖控制引腳

unsigned char password[PASSWORD_LENGTH] = {1, 2, 3, 4};    // 初始密碼
unsigned char enteredPassword[PASSWORD_LENGTH];    // 輸入的密碼
unsigned char attempts = 0;    // 嘗試次數(shù)

// 延時函數(shù)
void delay(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 110; j++)
            ;
}

// 初始化LCD1602
void LCD_Init() {
    LCD_WriteCommand(0x38);    // 設(shè)置8位數(shù)據(jù)總線,2行顯示,5x8點陣字符
    LCD_WriteCommand(0x0c);    // 顯示器開,光標(biāo)關(guān)閉
    LCD_WriteCommand(0x06);    // 光標(biāo)右移,字符不移動
    LCD_WriteCommand(0x01);    // 清屏
}

// 寫入命令到LCD1602
void LCD_WriteCommand(unsigned char cmd) {
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 1;
    P0 = cmd;
    _nop_();
    _nop_();
    LCD_EN = 0;
}

// 寫入數(shù)據(jù)到LCD1602
void LCD_WriteData(unsigned char dat) {
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 1;
    P0 = dat;
    _nop_();
    _nop_();
    LCD_EN = 0;
}

// 在LCD1602上顯示字符串
void LCD_ShowString(unsigned char x, unsigned char y, unsigned char *str) {
    unsigned char i = 0;
    if (x < 16) {
        if (y == 0)
            LCD_WriteCommand(0x80 + x);
        else if (y == 1)
            LCD_WriteCommand(0xc0 + x);
        while (str[i] != '?') {
            LCD_WriteData(str[i]);
            i++;
        }
    }
}

// 初始化矩陣鍵盤
void Keypad_Init() {
    Keypad_Row1 = 1;
    Keypad_Row2 = 1;
    Keypad_Row3 = 1;
    Keypad_Row4 = 1;
}

// 讀取矩陣鍵盤按鍵值
unsigned char Keypad_Read() {
    unsigned char row, col;
    unsigned char keyVal;

    for (col = 0; col < 4; col++) {
        Keypad_Col1 = 1;
        Keypad_Col2 = 1;
        Keypad_Col3 = 1;
        Keypad_Col4 = 1;
        switch (col) {
            case 0:
                Keypad_Col1 = 0;
                break;
            case 1:
                Keypad_Col2 = 0;
                break;
            case 2:
                Keypad_Col3 = 0;
                break;
            case 3:
                Keypad_Col4 = 0;
                break;
        }
        for (row = 0; row < 4; row++) {
            if (Keypad_Row1 == 0) {
                delay(5);
                if (Keypad_Row1 == 0) {
                    while (Keypad_Row1 == 0)
                        ;
                    keyVal = row * 4 + col + 1;
                    return keyVal;
                }
            }
            if (Keypad_Row2 == 0) {
                delay(5);
                if (Keypad_Row2 == 0) {
                    while (Keypad_Row2 == 0)
                        ;
                    keyVal = row * 4 + col + 5;
                    return keyVal;
                }
            }
            if (Keypad_Row3 == 0) {
                delay(5);
                if (Keypad_Row3 == 0) {
                    while (Keypad_Row3 == 0)
                        ;
                    keyVal= row * 4 + col + 9;
                    return keyVal;
                }
            }
            if (Keypad_Row4 == 0) {
                delay(5);
                if (Keypad_Row4 == 0) {
                    while (Keypad_Row4 == 0)
                        ;
                    keyVal = row * 4 + col + 13;
                    return keyVal;
                }
            }
        }
    }

    return 0xFF;    // 返回0xFF表示沒有按鍵按下
}

// 檢查輸入的密碼是否與設(shè)定密碼一致
bit CheckPassword() {
    unsigned char i;
    for (i = 0; i < PASSWORD_LENGTH; i++) {
        if (enteredPassword[i] != password[i])
            return 0;    // 密碼不一致
    }
    return 1;    // 密碼一致
}

// 輸入密碼
bit EnterPassword() {
    unsigned char i;
    unsigned char key;
    for (i = 0; i < PASSWORD_LENGTH; i++) {
        while ((key = Keypad_Read()) == 0xFF)
            ;
        enteredPassword[i] = key;
        LCD_WriteData('*');
        delay(300);
    }
    return CheckPassword();
}

// 修改密碼
void ChangePassword() {
    unsigned char i;
    LCD_ShowString(0, 1, "Enter New Password");
    for (i = 0; i < PASSWORD_LENGTH; i++) {
        while ((enteredPassword[i] = Keypad_Read()) == 0xFF)
            ;
        LCD_WriteData('*');
        delay(300);
    }
    for (i = 0; i < PASSWORD_LENGTH; i++)
        password[i] = enteredPassword[i];
    LCD_ShowString(0, 1, "Password Changed ");
    delay(1000);
    LCD_ShowString(0, 1, "Enter Password: ");
}

// 開鎖
void Unlock() {
    LCD_ShowString(0, 1, "Unlocking...");
    Buzzer = 1;    // 發(fā)出提示音
    ElectromagneticLock = 0;    // 解鎖狀態(tài)
    delay(2000);
    Buzzer = 0;    // 關(guān)閉提示音
    ElectromagneticLock = 1;    // 上鎖狀態(tài)
    LCD_ShowString(0, 1, "Enter Password: ");
}

// 主函數(shù)
void main() {
    LCD_Init();    // 初始化LCD1602
    Keypad_Init();    // 初始化矩陣鍵盤

    LCD_ShowString(0, 0, "Electronic Lock");
    LCD_ShowString(0, 1, "Enter Password: ");

    while (1) {
        if (EnterPassword()) {
            Unlock();    // 密碼正確,開鎖
            attempts = 0;    // 嘗試次數(shù)清零
        } else {
            attempts++;    // 嘗試次數(shù)加一
            if (attempts >= MAX_ATTEMPTS) {
                LCD_ShowString(0, 1, "Max Attempts Exceeded");
                Buzzer = 1;    // 發(fā)出警報音
                delay(2000);
                Buzzer = 0;    // 關(guān)閉警報音
                attempts = 0;    // 嘗試次數(shù)清零
            } else {
                LCD_ShowString(0, 1, "Wrong Password     ");
                delay(1000);
                LCD_ShowString(0, 1, "Enter Password: ");
            }
        }

        while ((Keypad_Read()) != 0xFF)
            ;    // 等待按鍵釋放

        if (Keypad_Read() == '#') {
            ChangePassword();    // 輸入'#'進(jìn)入修改密碼模式
        }
    }
}
  • 更多詳細(xì)資料請聯(lián)系.docx
    下載

相關(guān)推薦