1 概述
1.1 選題背景
安全是現(xiàn)代社會(huì)更加關(guān)注的現(xiàn)象之一。盜竊事件常有發(fā)生,因此更需要一種工具來(lái)維護(hù)門(mén)戶安全。在此之前,掛鎖、子彈鎖和插入式鎖被廣泛使用。這些鎖結(jié)構(gòu)簡(jiǎn)單、安全性低。撬鎖入室和入室盜竊的案件越來(lái)越多。因此,我們的團(tuán)隊(duì)設(shè)計(jì)了一款電子智能密碼鎖。產(chǎn)品的設(shè)計(jì)主要考慮了保證人們安全使用、使用方便、使用方便等綜合因素。電路產(chǎn)品設(shè)計(jì)包括防探鍵盤(pán)輸入、智能控制解鎖、鎖定、報(bào)警、密碼重置等功能。其次,由于采用多位密鑰設(shè)置,具有保密性好、靈敏度高等優(yōu)點(diǎn)。
1.2 方案描述
(1)輸入密碼功能。輸入密碼時(shí),用“*”代替真實(shí)的密碼以防密碼泄露。在輸入密碼時(shí),具有清除前一位/或多位的密碼功能(用清除鍵)。密碼輸入完畢,按(確認(rèn)/開(kāi)鎖鍵)確認(rèn)并生效。
(2)上鎖功能。在鎖開(kāi)狀態(tài)下,通過(guò)上鎖鍵上鎖。
(3)在鎖合的狀態(tài)下,通過(guò)輸入密碼開(kāi)鎖功能。開(kāi)鎖時(shí),先按確認(rèn)/開(kāi)鎖鍵后,再在鍵盤(pán)上輸入六位密碼,然后按確認(rèn)/開(kāi)鎖鍵,如果密碼正確,進(jìn)入鎖開(kāi)狀態(tài)。
(4)在鎖開(kāi)狀態(tài)下,設(shè)置新密碼功能。按設(shè)置新密碼鍵,在鍵盤(pán)上輸入六位新的密碼,按(確認(rèn)/開(kāi)鎖)鍵確認(rèn),代替舊密碼。
(5)在開(kāi)鎖時(shí),如果輸入密碼三次錯(cuò)誤,產(chǎn)生聲、光報(bào)警功能。每錯(cuò)誤一次,告警一次, 若連續(xù)三次錯(cuò)誤,則系統(tǒng)屏蔽輸入功能,直到系統(tǒng)復(fù)位后重新開(kāi)始。
1.3 設(shè)計(jì)的目的
在信息產(chǎn)業(yè)迅速發(fā)展的今天,我們生活中必不可少的設(shè)備都向著小型化、微型化、智能化、自動(dòng)化的方向發(fā)展。避免用鑰匙開(kāi)啟旋芯式鎖的一切煩惱。安全性能高,成本低,功耗低,易操作,從而實(shí)現(xiàn)了對(duì)鎖的電子控制,突破了傳統(tǒng)的機(jī)械鎖的單一性,保密性低,易撬性的缺點(diǎn),具有使用靈活性好,安全系數(shù)高的優(yōu)點(diǎn)。它的主要工作部分是將輸入密碼與設(shè)定密碼進(jìn)行比較,密碼正確時(shí),控制繼電器開(kāi)鎖,密碼錯(cuò)誤時(shí),數(shù)碼管清屏,繼電器保持關(guān)閉狀態(tài)。它的電路結(jié)構(gòu)簡(jiǎn)單,密碼破譯難度較大,操作簡(jiǎn)單。
2 方案設(shè)計(jì)
2.1 硬件選擇
基于AT89C51單片機(jī)的電子密碼鎖硬件設(shè)計(jì)選用AT89C51單片機(jī)作為本設(shè)計(jì)的核心元件, 于AT89C51單片機(jī)的電子密碼鎖硬件設(shè)計(jì)利用AT89C51單片機(jī)靈活的編程設(shè)計(jì)和豐富的I/O端口, 及其控制的準(zhǔn)確性, 基于AT89C51單片機(jī)的電子密碼鎖實(shí)現(xiàn)基本的密碼鎖功能。在AT89C51單片機(jī)的外圍電路外接輸入鍵盤(pán)用于密碼的輸入和一些功能的控制,基于AT89C51單片機(jī)的電子密碼鎖硬件設(shè)計(jì)選用LM016L用于顯示作用。
2.2 功能介紹
當(dāng)用戶需要開(kāi)鎖時(shí), 先按基于AT89C51單片機(jī)的電子密碼鎖的鍵盤(pán)開(kāi)鎖鍵之后按鍵盤(pán)的數(shù)字鍵0-9輸入密碼?;贏T89C51單片機(jī)的電子密碼鎖的密碼輸完后按下確認(rèn)鍵, 如果基于AT89C51單片機(jī)的電子密碼鎖的密碼輸入正確則開(kāi)鎖, 不正確顯示密碼錯(cuò)誤重新輸入密碼, 當(dāng)三次密碼錯(cuò)誤則發(fā)出報(bào)警;當(dāng)用戶需要修改基于AT89C51單片機(jī)的電子密碼鎖的密碼時(shí), 先按下基于AT89C51單片機(jī)的電子密碼鎖的鍵盤(pán)設(shè)置鍵后可以設(shè)置新密碼。新密碼輸入無(wú)誤后按基于AT89C51單片機(jī)的電子密碼鎖的確認(rèn)鍵使新密碼將得到存儲(chǔ), 密碼修改成功。
2.3 總體設(shè)計(jì)
圖2-1 電子密碼鎖結(jié)構(gòu)框架圖
3 硬件設(shè)置
3.1 硬件組成
基于AT89C51單片機(jī)的電子密碼鎖的外圍電路包括基于AT89C51單片機(jī)的電子密碼鎖鍵盤(pán)輸入部分、基于AT89C51單片機(jī)的電子密碼鎖的顯示部分、基于AT89C51單片機(jī)的電子密碼鎖的報(bào)警部分、基于AT89C51單片機(jī)的電子密碼鎖的開(kāi)鎖知識(shí)部分組成, 根據(jù)基于AT89C51單片機(jī)的電子密碼鎖的實(shí)際情況鍵盤(pán)輸入部分選擇4*4矩陣鍵盤(pán), 基于AT89C51單片機(jī)的電子密碼鎖的顯示部分選擇字符型液晶顯示LM016L。
3.2 LCD顯示器設(shè)置
LM016L液晶模塊采用HD44780控制器,hd44780具有簡(jiǎn)單而功能較強(qiáng)的指令集,可以實(shí)現(xiàn)字符移動(dòng),閃爍等功能,LM016L與單片機(jī)MCU通訊可采用8位或4位并行傳輸兩種方式,hd44780控制器由兩個(gè)8位寄存器,指令寄存器(IR)和數(shù)據(jù)寄存器(DR)忙標(biāo)志(BF),顯示數(shù)RAM(DDRAM),字符發(fā)生器ROMA(CGOROM)字符發(fā)生器RAM(CGRAM),地址計(jì)數(shù)器RAM(AC)。
圖3-1 LCD顯示器
3.3 矩陣按鍵電路設(shè)計(jì)
本設(shè)計(jì)中采用的4*4矩陣共有16個(gè)鍵位,4根行線連PI口低4位,4根列線連PI口高4位。在按鍵未被按下時(shí),每條行線與列線的交叉處互不相通,當(dāng)莫格按鍵被按下后,該鍵所在的行線和列線連通。這樣PI口的高4位和低4位中各有一位互相連通。通過(guò)行列掃描檢測(cè)出這兩位,即可識(shí)別出被按下的鍵。
圖3-2 矩陣按鍵設(shè)計(jì)
基于AT89C51單片機(jī)的電子密碼鎖的輸入密碼輸入過(guò)程中可以進(jìn)行退格, 輸入完成后按下確認(rèn)鍵, 電子密碼鎖會(huì)將所輸入與系統(tǒng)密碼進(jìn)行比對(duì)。若輸入密碼正確則顯示“Open”開(kāi)鎖, 按下電子密碼鎖的B選擇上鎖, 鎖重新回到閉鎖狀態(tài), 電子密碼鎖LCD液晶顯示回到初始化狀態(tài)。電子密碼鎖如果密碼輸入錯(cuò)誤, 基于AT89C51單片機(jī)的電子密碼鎖的錯(cuò)誤警告燈亮,電子密碼鎖的LCD液晶顯示器會(huì)顯示錯(cuò)誤, 并顯示輸入錯(cuò)誤限制次數(shù)。一段時(shí)間后, 進(jìn)入閉鎖狀態(tài)。若連續(xù)在電子密碼鎖上操作錯(cuò)誤超過(guò)3次, 一定時(shí)間內(nèi)電子密碼鎖的系統(tǒng)會(huì)鎖定鍵盤(pán), 并報(bào)警用以防止惡意試探密碼。如果在規(guī)定次數(shù)以內(nèi)密碼輸入正確, 則鎖開(kāi), 且錯(cuò)誤次數(shù)清空, 不會(huì)影響到下一次的開(kāi)鎖。
3.4 報(bào)警器設(shè)置
蜂鳴器模塊部分的電路如下圖3-2 報(bào)警器設(shè)置,就是用P2.1口控制一個(gè)有源蜂鳴器發(fā)聲,作為提示音或報(bào)警音。蜂鳴器有兩個(gè)引腳,其中長(zhǎng)腳為正極,短腳為負(fù)極。其發(fā)聲原理是電流通過(guò)電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng)來(lái)驅(qū)動(dòng)振動(dòng)膜發(fā)聲的,因此需要一定的電流才能驅(qū)動(dòng)它。由于單片機(jī)I/O引腳輸出的電流較小,基本上驅(qū)動(dòng)不了蜂鳴器,因此需要增加一個(gè)電流放大的電路,一般使用三極管來(lái)放大電流就可以了。本設(shè)計(jì)中使用三極管,P2.1口高電平時(shí)三極管截至,蜂鳴器不發(fā)聲;P2.1口低電平時(shí),三極管導(dǎo)通,這樣蜂鳴器的電流形成回路,發(fā)出聲音。因此,我們可以通過(guò)程序控制P2.1腳的電平來(lái)使蜂鳴器發(fā)出聲音和關(guān)閉。
圖3-3 報(bào)警器設(shè)置
3.5 系統(tǒng)電路設(shè)置
下圖為基于AT89C51單片機(jī)的電子密碼鎖的系統(tǒng)主電路圖:
圖3-4 電子密碼鎖主電路
4 程序設(shè)計(jì)
4.1 系統(tǒng)流程
系統(tǒng)初始化并讀取密碼完成后,液晶顯示"Password:”,提示用戶可以輸入密碼。此時(shí)程序即不斷測(cè)試按鍵,檢査是否有按鍵被按下。如果有,則進(jìn)行按鍵識(shí)別:行列掃描法識(shí)別出的鍵位與對(duì)應(yīng)BUFF的值。如果沒(méi)有按鍵按下,或者按下的按鍵沒(méi)有被識(shí)別,BUFF賦值0FFH,并跳轉(zhuǎn)至按鍵測(cè)試。
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 仿真測(cè)試
(1)點(diǎn)擊proteus軟件下方最左邊按鈕,使電路開(kāi)始運(yùn)行,圖5-1為電路運(yùn)行后狀態(tài),LCD液晶顯示出Please Input,輸入密碼進(jìn)行開(kāi)鎖:
圖5-1 初始化界面
(2)通過(guò)矩陣按鍵,輸入數(shù)據(jù),會(huì)顯示在LCD液晶上,按C按鍵可以刪除上個(gè)輸入數(shù)字。連續(xù)輸入6個(gè)數(shù)后,按D鍵系統(tǒng)自動(dòng)判斷密碼的對(duì)錯(cuò),如圖 5-2輸入錯(cuò)誤密碼后,會(huì)提示密碼錯(cuò)誤,并提示點(diǎn)擊任意按鍵退出:
圖5-2 輸入錯(cuò)誤密碼
(3)按鍵輸入000000后,LCD液晶會(huì)顯示密碼正確,同時(shí)LED“鎖”被打開(kāi),LED顯示Hello Welcome:
圖5-3 輸入正確密碼
(4)在開(kāi)鎖狀態(tài)下,點(diǎn)擊F鍵,此時(shí)聽(tīng)到兩聲提示,輸入新的六位密碼并按“D”(重設(shè))鍵,會(huì)聽(tīng)到兩聲提示音,表示重設(shè)密碼成功。
圖5-4 重新設(shè)置密碼
-
繼電器
+關(guān)注
關(guān)注
132文章
5314瀏覽量
148352 -
控制器
+關(guān)注
關(guān)注
112文章
16103瀏覽量
177074 -
LCD顯示器
+關(guān)注
關(guān)注
0文章
87瀏覽量
20146 -
AT89C51單片機(jī)
+關(guān)注
關(guān)注
1文章
56瀏覽量
17976
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論