冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 646|回覆: 0
打印 上一主題 下一主題

[討論] PIC16F887-I/P 電子門鎖

[複製鏈接]

2609

主題

0

好友

993

積分

高級會員

Rank: 4

UID
373967
帖子
8779
主題
2609
精華
0
積分
993
楓幣
2637
威望
970
存款
31556
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
451 小時
註冊時間
2023-1-12
最後登入
2024-11-5

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-4-11 05:55:28 |只看該作者 |倒序瀏覽
基本零件清單

代碼:

所需零件:

PIC16F887-I/P 微控制器
16x2 LCD 液晶屏幕
4x4 矩陣按鍵
5V 電源模塊
12V 電動鎖
BC547 NPN 晶體管
1N4007 整流二極管
杜邦線、麵包板等
連接腳位:

PIC16F887-I/P:
RB0 - 液晶屏幕 D4
RB1 - 液晶屏幕 D5
RB2 - 液晶屏幕 D6
RB3 - 液晶屏幕 D7
RB4 - 矩陣按鍵列 1
RB5 - 矩陣按鍵列 2
RB6 - 矩陣按鍵列 3
RB7 - 矩陣按鍵列 4
RC0 - 電動鎖控制引腳
RC1 - 液晶屏幕 RS
RC2 - 液晶屏幕 E
RC3 - 矩陣按鍵行 1
RC4 - 矩陣按鍵行 2
RC5 - 矩陣按鍵行 3
RC6 - 矩陣按鍵行 4
4x4 矩陣按鍵:
行 1 - RC3
行 2 - RC4
行 3 - RC5
行 4 - RC6
列 1 - RB4
列 2 - RB5
列 3 - RB6
列 4 - RB7
示例代碼:


#include <xc.h>
#include <stdio.h>
#include "lcd.h"

#pragma config FOSC = HS       // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF      // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF     // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON      // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF       // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF       // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF       // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF        // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 20000000

#define lock RC0            //鎖控制引腳
#define keypad PORTB        //矩陣按鍵連接到PORTB

//初始化函數
void init() {
    TRISB = 0xF0;           //設置RB0~3輸出,RB4~7輸入
    TRISC = 0

ANSEL = 0;              //關閉模擬輸入
ANSELH = 0;
lcd_init();             //初始化液晶屏幕
}

//矩陣按鍵掃描函數
unsigned char keypad_scan() {
unsigned char row, col, key;
keypad = 0xFF; //矩陣按鍵設置為輸入模式
for (col = 0; col < 4; col++) {
keypad = (1 << (4 + col)); //設置當前列為低電平
for (row = 0; row < 4; row++) {
if (!(keypad & (1 << row))) { //檢測行是否為低電平
key = row * 4 + col + 1; //計算按鍵編號
return key;
}
}
}
return 0; //如果沒有按鍵按下,則返回0
}

//主函數
void main() {
unsigned char password[4] = {1, 2, 3, 4}; //設置密碼為1234
unsigned char key, count = 0;
lcd_clear();
lcd_puts("Enter Password:");
init();
while (1) {
key = keypad_scan();
if (key != 0) { //如果檢測到按鍵按下
lcd_putch('*');
if (key == password[count]) { //如果密碼正確
count++;
if (count == 4) { //如果密碼全部正確
lcd_clear();
lcd_puts("Password OK");
__delay_ms(500); //延時500ms
lock = 1; //打開鎖
lcd_clear();
lcd_puts("Door Open");
__delay_ms(2000); //延時2s
lock = 0; //關閉鎖
lcd_clear();
lcd_puts("Door Close");
count = 0; //重置計數器
}
} else { //如果密碼錯誤
lcd_clear();
lcd_puts("Password Error");
__delay_ms(500); //延時500ms
lcd_clear();
lcd_puts("Enter Password:");
count = 0; //重置計數器
}
}
}
}



注意事項:

1. 在使用 PIC16F887-I/P 之前,需要根據實際需要配置相應的寄存器位,以滿足您的應用程序要求。

在示例代碼中,使用了 MPLAB X IDE 自帶的配置位工具進行配置。

2. 本示例程序為演示用途,未對密碼進行加密或其他安全處理,請勿在實際應用中使用。

如果您需要在實際應用中使用,請考慮使用更為安全的密碼輸入方式。

3. 本示例程序使用了 LCD1602 液晶屏幕和 4x4 矩陣按鍵進行輸入和輸出。
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1彩票
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-11-5 22:07

回頂部