1 概述
1.1 選題背景
安全是現代社會更加關注的現象之一。盜竊事件常有發生,因此更需要一種工具來維護門戶安全。在此之前,掛鎖、子彈鎖和插入式鎖被廣泛使用。這些鎖結構簡單、安全性低。撬鎖入室和入室盜竊的案件越來越多。因此,我們的團隊設計了一款電子智能密碼鎖。產品的設計主要考慮了保證人們安全使用、使用方便、使用方便等綜合因素。電路產品設計包括防探鍵盤輸入、智能控制解鎖、鎖定、報警、密碼重置等功能。其次,由于采用多位密鑰設置,具有保密性好、靈敏度高等優點。
1.2 方案描述
(1)輸入密碼功能。輸入密碼時,用“*”代替真實的密碼以防密碼泄露。在輸入密碼時,具有清除前一位/或多位的密碼功能(用清除鍵)。密碼輸入完畢,按(確認/開鎖鍵)確認并生效。
(2)上鎖功能。在鎖開狀態下,通過上鎖鍵上鎖。
(3)在鎖合的狀態下,通過輸入密碼開鎖功能。開鎖時,先按確認/開鎖鍵后,再在鍵盤上輸入六位密碼,然后按確認/開鎖鍵,如果密碼正確,進入鎖開狀態。
(4)在鎖開狀態下,設置新密碼功能。按設置新密碼鍵,在鍵盤上輸入六位新的密碼,按(確認/開鎖)鍵確認,代替舊密碼。
(5)在開鎖時,如果輸入密碼三次錯誤,產生聲、光報警功能。每錯誤一次,告警一次, 若連續三次錯誤,則系統屏蔽輸入功能,直到系統復位后重新開始。
1.3 設計的目的
在信息產業迅速發展的今天,我們生活中必不可少的設備都向著小型化、微型化、智能化、自動化的方向發展。避免用鑰匙開啟旋芯式鎖的一切煩惱。安全性能高,成本低,功耗低,易操作,從而實現了對鎖的電子控制,突破了傳統的機械鎖的單一性,保密性低,易撬性的缺點,具有使用靈活性好,安全系數高的優點。它的主要工作部分是將輸入密碼與設定密碼進行比較,密碼正確時,控制繼電器開鎖,密碼錯誤時,數碼管清屏,繼電器保持關閉狀態。它的電路結構簡單,密碼破譯難度較大,操作簡單。
2 方案設計
2.1 硬件選擇
基于AT89C51單片機的電子密碼鎖硬件設計選用AT89C51單片機作為本設計的核心元件, 于AT89C51單片機的電子密碼鎖硬件設計利用AT89C51單片機靈活的編程設計和豐富的I/O端口, 及其控制的準確性, 基于AT89C51單片機的電子密碼鎖實現基本的密碼鎖功能。在AT89C51單片機的外圍電路外接輸入鍵盤用于密碼的輸入和一些功能的控制,基于AT89C51單片機的電子密碼鎖硬件設計選用LM016L用于顯示作用。
2.2 功能介紹
當用戶需要開鎖時, 先按基于AT89C51單片機的電子密碼鎖的鍵盤開鎖鍵之后按鍵盤的數字鍵0-9輸入密碼。基于AT89C51單片機的電子密碼鎖的密碼輸完后按下確認鍵, 如果基于AT89C51單片機的電子密碼鎖的密碼輸入正確則開鎖, 不正確顯示密碼錯誤重新輸入密碼, 當三次密碼錯誤則發出報警;當用戶需要修改基于AT89C51單片機的電子密碼鎖的密碼時, 先按下基于AT89C51單片機的電子密碼鎖的鍵盤設置鍵后可以設置新密碼。新密碼輸入無誤后按基于AT89C51單片機的電子密碼鎖的確認鍵使新密碼將得到存儲, 密碼修改成功。
2.3 總體設計
圖2-1 電子密碼鎖結構框架圖
3 硬件設置
3.1 硬件組成
基于AT89C51單片機的電子密碼鎖的外圍電路包括基于AT89C51單片機的電子密碼鎖鍵盤輸入部分、基于AT89C51單片機的電子密碼鎖的顯示部分、基于AT89C51單片機的電子密碼鎖的報警部分、基于AT89C51單片機的電子密碼鎖的開鎖知識部分組成, 根據基于AT89C51單片機的電子密碼鎖的實際情況鍵盤輸入部分選擇4*4矩陣鍵盤, 基于AT89C51單片機的電子密碼鎖的顯示部分選擇字符型液晶顯示LM016L。
3.2 LCD顯示器設置
LM016L液晶模塊采用HD44780控制器,hd44780具有簡單而功能較強的指令集,可以實現字符移動,閃爍等功能,LM016L與單片機MCU通訊可采用8位或4位并行傳輸兩種方式,hd44780控制器由兩個8位寄存器,指令寄存器(IR)和數據寄存器(DR)忙標志(BF),顯示數RAM(DDRAM),字符發生器ROMA(CGOROM)字符發生器RAM(CGRAM),地址計數器RAM(AC)。
圖3-1 LCD顯示器
3.3 矩陣按鍵電路設計
本設計中采用的4*4矩陣共有16個鍵位,4根行線連PI口低4位,4根列線連PI口高4位。在按鍵未被按下時,每條行線與列線的交叉處互不相通,當莫格按鍵被按下后,該鍵所在的行線和列線連通。這樣PI口的高4位和低4位中各有一位互相連通。通過行列掃描檢測出這兩位,即可識別出被按下的鍵。
圖3-2 矩陣按鍵設計
基于AT89C51單片機的電子密碼鎖的輸入密碼輸入過程中可以進行退格, 輸入完成后按下確認鍵, 電子密碼鎖會將所輸入與系統密碼進行比對。若輸入密碼正確則顯示“Open”開鎖, 按下電子密碼鎖的B選擇上鎖, 鎖重新回到閉鎖狀態, 電子密碼鎖LCD液晶顯示回到初始化狀態。電子密碼鎖如果密碼輸入錯誤, 基于AT89C51單片機的電子密碼鎖的錯誤警告燈亮,電子密碼鎖的LCD液晶顯示器會顯示錯誤, 并顯示輸入錯誤限制次數。一段時間后, 進入閉鎖狀態。若連續在電子密碼鎖上操作錯誤超過3次, 一定時間內電子密碼鎖的系統會鎖定鍵盤, 并報警用以防止惡意試探密碼。如果在規定次數以內密碼輸入正確, 則鎖開, 且錯誤次數清空, 不會影響到下一次的開鎖。
3.4 報警器設置
蜂鳴器模塊部分的電路如下圖3-2 報警器設置,就是用P2.1口控制一個有源蜂鳴器發聲,作為提示音或報警音。蜂鳴器有兩個引腳,其中長腳為正極,短腳為負極。其發聲原理是電流通過電磁線圈,使電磁線圈產生磁場來驅動振動膜發聲的,因此需要一定的電流才能驅動它。由于單片機I/O引腳輸出的電流較小,基本上驅動不了蜂鳴器,因此需要增加一個電流放大的電路,一般使用三極管來放大電流就可以了。本設計中使用三極管,P2.1口高電平時三極管截至,蜂鳴器不發聲;P2.1口低電平時,三極管導通,這樣蜂鳴器的電流形成回路,發出聲音。因此,我們可以通過程序控制P2.1腳的電平來使蜂鳴器發出聲音和關閉。
圖3-3 報警器設置
3.5 系統電路設置
下圖為基于AT89C51單片機的電子密碼鎖的系統主電路圖:
圖3-4 電子密碼鎖主電路
4 程序設計
4.1 系統流程
系統初始化并讀取密碼完成后,液晶顯示"Password:”,提示用戶可以輸入密碼。此時程序即不斷測試按鍵,檢査是否有按鍵被按下。如果有,則進行按鍵識別:行列掃描法識別出的鍵位與對應BUFF的值。如果沒有按鍵按下,或者按下的按鍵沒有被識別,BUFF賦值0FFH,并跳轉至按鍵測試。
4.2 源程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define GPIO_KEY P1
sbit RS=P2^2;
sbit RW=P2^3;
sbit E=P2^4;
sbit LED = P2^0;
sbit BEEZ = P2^1;
uchar welcome[]="Hello Welcom";
uchar pw_error[]="Password Error";
uchar Lock[]="XXXXXXXXXXXXXXXX";
uchar set_pw[]="Set PassWord";
uchar input_pw[]="Please Input";
uchar pw[6]={0,0,0,0,0,0};
uchar temp_pw[6]={0,0,0,0,0,0};
uchar KeyValue;
uchar flag=0;
uchar pw_count;
uchar pw_errnum=0;
void lcd_int();
void lcd_w_cmd(unsigned char com);
void lcd_w_dat(unsigned char dat);
unsigned char lcd_r_start();
void show_Status(uchar *str);
void show_pw(uchar num);
void Input_Key();
void KeyDown(void);
void open();
void alarm();
void Lock_Device();
void delay(uint j)
{ uint x;
for(x=0;x
}
void main()
{ lcd_int();
show_Status(&input_pw);
show_pw(0);
while(1){
Input_Key();
}
}
void KeyDown(void)
{
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{ delay(3);
if(GPIO_KEY!=0x0f)
{ GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while(GPIO_KEY!=0xf0);
return ;
}
}
KeyValue = 0xff;
}
void open() { }
void alarm()
{ uchar i;
LED = 0;
for(i = 0;i<100;i++)
{ BEEZ = ~BEEZ;
delay(100);
}
LED = 1;
}
void Lock_Device()
{ while(1)
{ alarm();
}
}
void Input_Key()
{ KeyDown();
if(KeyValue == 0xff||pw_errnum>=3)return;
if(KeyValue>=0&&KeyValue<=9)
{ if((flag == 0 || flag ==2)&&pw_count<6)
{ pw_count++;
temp_pw[pw_count] = KeyValue;
show_pw(pw_count);
}
}
else if(KeyValue == 12)
{ if(flag == 1)
{ flag = 0;
show_Status(&input_pw);
}
}
else if(KeyValue == 13)
{ if(pw_count>0)pw_count--;
show_pw(pw_count);
}
else if(KeyValue == 14)
{ if(pw_count == 6)
{ if(flag == 0)
{if(temp_pw[0] == pw[0]&&temp_pw[1] == pw[1]&&temp_pw[2] == pw[2]&&temp_pw[3] == pw[3]&&temp_pw[4] == pw[4]&&temp_pw[5] == pw[5]){
show_Status(&welcome);
flag = 1;
pw_count = 0;
pw_errnum = 0;
show_pw(pw_count);
open();
}
else{ pw_errnum++;
pw_count = 0;
show_pw(pw_count);
show_Status(&pw_error);
alarm();
if(pw_errnum>=3)
{ show_Status(&Lock);
Lock_Device();
}
}
}
else if(flag == 1)
{ }
else if(flag == 2)
{ pw[0] = temp_pw[0];
pw[1] = temp_pw[1];
pw[2] = temp_pw[2];
pw[3] = temp_pw[3];
pw[4] = temp_pw[4];
pw[5] = temp_pw[5];
show_Status(&welcome);
flag = 1; pw_count = 0; show_pw(pw_count);
}
}else{ LED = 0;
}
}
else if(KeyValue == 15)
{ if(flag == 1)
{ show_Status(set_pw);
flag = 2;
}
}
}
void show_pw(uchar num)
{ uchar i;
lcd_w_cmd(0xC5);
for(i=0;i<6;i++)
{ lcd_w_dat(' ');
}
lcd_w_cmd(0xC5);
for(i=0;i
{ lcd_w_dat('*');
}
}
void show_Status(uchar *str)
{ uchar i=0;
lcd_w_cmd(0x80);
for(i=0;str[i]!='\\0';i++)
{ lcd_w_dat(str[i]);
}
}
void lcd_int()
{ lcd_w_cmd(0x3c);
lcd_w_cmd(0x0c);
lcd_w_cmd(0x01);
lcd_w_cmd(0x06);
lcd_w_cmd(0x80);
}
void lcd_w_cmd(unsigned char com)
{ unsigned char i;
do
{i=lcd_r_start();
i&=0x80;
delay(2);
}while(i!=0);
RW=0;
delay(1);
RS=0;
delay(1);
E=1;
delay(1);
P0=com;
delay(1);
E=0;
delay(1);
RW=1;
delay(2);
}
void lcd_w_dat(unsigned char dat)
{ unsigned char i;
do
{i=lcd_r_start();
i&=0x80;
delay(2);
}while(i!=0);
RW=0;
delay(1);
RS=1;
delay(1);
E=1;
delay(1);
P0=dat;
delay(1)
E=0;
delay(1);
RW=1;
delay(2);
}
unsigned char lcd_r_start()
{ unsigned char s;
RW=1;
delay(1);
RS=0;
delay(1);
E=1;
delay(1);
s=P0;
delay(1);
E=0;
delay(1);
RW=0;
delay(1);
return(s);
}
5 仿真測試
(1)點擊proteus軟件下方最左邊按鈕,使電路開始運行,圖5-1為電路運行后狀態,LCD液晶顯示出Please Input,輸入密碼進行開鎖:
圖5-1 初始化界面
(2)通過矩陣按鍵,輸入數據,會顯示在LCD液晶上,按C按鍵可以刪除上個輸入數字。連續輸入6個數后,按D鍵系統自動判斷密碼的對錯,如圖 5-2輸入錯誤密碼后,會提示密碼錯誤,并提示點擊任意按鍵退出:
圖5-2 輸入錯誤密碼
(3)按鍵輸入000000后,LCD液晶會顯示密碼正確,同時LED“鎖”被打開,LED顯示Hello Welcome:
圖5-3 輸入正確密碼
(4)在開鎖狀態下,點擊F鍵,此時聽到兩聲提示,輸入新的六位密碼并按“D”(重設)鍵,會聽到兩聲提示音,表示重設密碼成功。
圖5-4 重新設置密碼
-
繼電器
+關注
關注
132文章
5320瀏覽量
148584 -
控制器
+關注
關注
112文章
16203瀏覽量
177415 -
LCD顯示器
+關注
關注
0文章
87瀏覽量
20162 -
AT89C51單片機
+關注
關注
1文章
56瀏覽量
17992
發布評論請先 登錄
相關推薦
評論