點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖:
https://download.csdn.net/download/qq_64505944/87760996?spm=1001.2014.3001.5503
源碼獲取
主要內(nèi)容:
(1)本設(shè)計(jì)為了防止密碼被竊取要求在輸入密碼時(shí)在LCD屏幕上顯示*號。
(2)設(shè)計(jì)開鎖密碼位六位密碼的電子密碼鎖。
(3)能夠LCD顯示在密碼正確時(shí)顯示PASSWORD OK,密碼錯(cuò)誤時(shí)顯示PASSWORD ERROR,輸入密碼時(shí)顯示INPUT PASSWORD。
(4)實(shí)現(xiàn)輸入密碼錯(cuò)誤超過限定的三次電子密碼鎖定。
(5)4×4的矩陣鍵盤其中包括0-9的數(shù)字鍵和A-F的功能鍵
(6)本產(chǎn)品具備報(bào)警功能,當(dāng)輸入密碼錯(cuò)誤時(shí)蜂鳴器響并且LED燈亮。
(7)密碼可以由用戶自己修改設(shè)定(只支持6位密碼),修改密碼之前必須再次輸入密碼,在輸入新密碼時(shí)候需要二次確認(rèn),以防止誤操作 。
基本要求:
1.通過課程設(shè)計(jì),提高程序開發(fā)功能,能運(yùn)用合理的控制流程編寫清晰高效的程序。
2.通過課程設(shè)計(jì),訓(xùn)練C程序調(diào)試能力,能將一個(gè)中小型各級組織系統(tǒng)聯(lián)調(diào)通過。
3.通話課程設(shè)計(jì),培養(yǎng)分析問題、解決實(shí)際問題的能力。
1.設(shè)計(jì)要求;
用電子器件設(shè)計(jì)制作一個(gè)密碼鎖,使之在輸入正確的密碼時(shí)開鎖;
在鎖的控制電路中設(shè)-一個(gè)可以修改的4位代碼,當(dāng)輸入的代碼和控制電路的代碼一致時(shí)打開;
用紅燈亮、綠燈滅表示關(guān)鎖,綠燈亮、紅燈滅表示開鎖。
如5s內(nèi)未能將鎖打開,則電路自動復(fù)位進(jìn)入自鎖狀態(tài),并發(fā)報(bào)警信號。
2.硬件設(shè)計(jì):
電子密碼鎖的結(jié)構(gòu)框圖如圖1-1所示,選用單片機(jī)STC89C52作為電子密碼鎖的核心控制器件,在單片機(jī)的外圍電路接矩陣鍵盤,用于輸入密碼并實(shí)現(xiàn)一些控制功能,外接LCD1602顯示模塊顯示開鎖信息,外接繼電器,用繼電器常開觸點(diǎn)閉合模擬開鎖動作,外接指示燈與蜂鳴器作為密碼鎖開鎖成功或不成功的聲光提示。
圖中包括單片機(jī)最簡單應(yīng)用系統(tǒng)、 4╳3矩陣鍵盤、LCD1602顯示電路、繼電器電路和聲光指示電路。
矩陣鍵盤的4根行線接在P2.0P2.3上,3根列線接在P2.4P2.6上。行線作為輸出端,列線作為輸入端,由于P2口內(nèi)部有上拉電阻,無鍵按下時(shí),列線輸入均為高電平。
電子密碼鎖電路原理圖如圖1- 1所示
矩陣鍵盤、LCD1602顯示電路、繼電器電路和聲光指示電路。矩陣鍵盤的4根行線接在P2.0P2.3上,3根列線接在P2.4P2.6上。行線作為輸出端,列線作為輸人端,由于P2口內(nèi)部有上拉電阻,無鍵按下時(shí),列線輸人均為高電平。確定矩陣式鍵盤中的哪個(gè)鍵被按下,采用逐行掃描查詢法,依次將行線置為低電平,再逐行檢測各列線的電平狀態(tài),若某列為低電平,則該列線與置為低電平的行線交叉處的按鍵為閉合鍵。若所有的列線均為高電平,則無按鍵按下。LCD1602字符型液晶顯示器的數(shù)據(jù)端口接單片機(jī)的 P 口,由單片機(jī)的P1.0~P1.2控制 LCD 的 RS 、 RW 和 E 控制端口。
開鎖成功的仿真結(jié)果
3.程序設(shè)計(jì)
程序包括主程序、鍵盤掃描子程序、液晶顯示器程序等。主程序進(jìn)行變量及端口初始化定義,調(diào)用鍵盤掃描子程序,將按下的鍵值顯示在液晶屏上,并很快替換為“*”,等六位密碼全部輸完后,進(jìn)行密碼匹配,如果密碼正確,則液晶顯示“ open”,同時(shí)開鎖成功指示燈亮,否則液晶顯示;“ error”,同時(shí)開鎖失敗指示燈亮。
端口初始化定義,調(diào)用鍵盤掃描子程序,將按下的鍵值顯示在液晶屏上,并很快替換為“*”,等六位密碼全部輸完后,進(jìn)行密碼匹配,如果密碼正確,則液晶顯示“open",同時(shí)開鎖成功指示燈亮,否則液晶顯示“ error”,同時(shí)開鎖失敗指示燈亮。
設(shè)計(jì)的程序如下:
#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit ledg=P1^3;
sbit ledr=P1^7;
sbit relay=P1^4;
sbit buzz=P1^6;
char table0[]="error";
char table1[]="open";
char table2[]="password:";
int temp,ch,m0,m1,p,n0,n1,n2,n3,n4,n5;
void delay(int z)
{ int x,c;
for(x=z;x>0;x--)
for(c=100;c>0;c--);
}
keyscan()
{ temp=P2&0xf0;
P2=0xfe;
delay(1);
temp=P2&0xf0;
while(temp!=0xf0)
{ switch(temp)
{
case 0xe0:ch='7';break;
case 0xd0:ch='8';break;
case 0xb0:ch='9';break;
default:ch=p;break;
}
while (temp!=0xf0)
{ temp=P2;
temp=temp&0xf0;
}
}
P2=0xfd;
delay(1);
temp=P2&0xf0;
while(temp!=0xf0)
{ switch(temp)
{ case 0xe0:ch='4';break;
case 0xd0:ch='5';break;
case 0xb0:ch='6';break;
default:ch=p;break;
}
while(temp!=0xf0)
{ temp=P2;
temp=temp&0xf0;
}
void open()
{
char m2;
wcom(0xc6);
for(m2=0;m2<4;m2++)
{
wdat(table1[m2]);
}
}
void error()
{ char m2;
wcom(0xc6);
for(m2=0;m2<5;m2++)
{ wdat(table0[m2]);
}
}
void pass()
{
char m2;
wcom(0x80);
for(m2=0;m2<9;m2++)
{
wdat(table2[m2]);
}
}
void change(int m)
{
delay(500);
wcom(m);
wdat('*');
}
void main()
{
RW=0;
ledg=0;
ledr=0;
relay=1;
buzz=1;
init();
delay(5);
pass();
wcom(0x89);
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n0=keyscan();
change(0x89);
delay(10);
ch=p;
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n1=keyscan();
change(0x8a);
ch=p;
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n2=keyscan();
change(0x8b);
ch=p;
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n3=keyscan();
change(0x8c);
ch=p;
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n4=keyscan();
change(0x8d);
ch=p;
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n5=keyscan();
change(0x8e);
if(n0=='1'&&n1=='8'&&n2=='0'&&n3=='1'&&n4=='2'&&n5=='2')
{
int m3=1;
open();
relay=0;
delay(3000);
relay=1;
while(m3)
{
int m4,m5;
ledg=0;
for(m4=200;m4>0;m4--)
{
keyscan();
if(keyscan()=='A')
{
m4=0;
m3=0;
}
}
ledg=1;
if(m3!=0)
{
for(m5=200;m5>0;m5--)
{
keyscan();
if(keyscan()=='A')
{
m3=0;
}
}
}
}
}
else
{
ledr=1;
error();
buzz=0;
delay(5000);
}
}
4.仿真與實(shí)驗(yàn)結(jié)果
電子密碼鎖仿真電路及結(jié)果如圖2示,按下預(yù)設(shè)的6位密碼18012”液晶顯示器第1行顯示:“password: *****“, 第2行在中間位置顯示“open”,繼電器后面所接的指示燈PI.3口所接的開鎖成功指示燈亮滅閃爍,如果輸入的密碼不是預(yù)設(shè)的密碼,則液晶第2行在中間位置顯示“error”,表示開鎖失敗,相應(yīng)的指示燈也點(diǎn)亮。
仿真結(jié)果圖如下所示:
5.異常現(xiàn)象分析與解決方法
1.由于代碼過多,在編程中容易出錯(cuò),所以在編程過程中要認(rèn)真仔細(xì)。
2.密碼鎖無法輸入密碼,我積極向老師同學(xué)求助,最后在他們的幫助下,完成課程設(shè)計(jì)
3.按鍵不靈敏。
初步想法是:程序里包含了太多的延時(shí)。解決方法:減少延時(shí)時(shí)間盡量不用,將延時(shí)函數(shù)延時(shí)時(shí)間減短,將標(biāo)志數(shù)增加。
輸入數(shù)字時(shí)顯示數(shù)字,并不顯示‘',存在一定的密碼泄露風(fēng)險(xiǎn)。
解決方法:查閱資料,知道‘’在1602里是0x2a,這樣就可以在顯示的時(shí)候輸入數(shù)據(jù)位“0x2a”
6.心得體會
通過電子密碼鎖的課程設(shè)計(jì)有了很大的收獲。首先,通過學(xué)習(xí)使自己對課本上的知識可以應(yīng)用于實(shí)際,使理論與實(shí)際結(jié)合,加深自己對課本知識的理解。不足道的地方就是因?yàn)闀r(shí)間關(guān)系,沒有能夠?qū)?shí)物做出來驗(yàn)證自己的設(shè)計(jì)。但是在設(shè)計(jì)過程中用到了Multisim仿真驗(yàn)證,對Multisim達(dá)到學(xué)以致用的目的。以前只是泛泛的了解過Multisim 軟件功能,在電路的設(shè)計(jì)過程中通過大量的運(yùn)用,使自己在軟件仿真方面有了很大的提高,有了受益匪淺的感覺。
在做電子密碼鎖的課程設(shè)計(jì)中,我感受到了老師對學(xué)生的悔人不卷的精神,老師細(xì)心的指導(dǎo),使我少走了彎路,學(xué)到了很多電子應(yīng)用技術(shù)的知識,順利完成了課程設(shè)計(jì),在這里對指導(dǎo)老師.表示衷心的感謝!文章來源:http://www.zghlxwxcb.cn/news/detail-435887.html
主要參考資料:
[1]王海軍.一種單片機(jī)和云平臺的電子密碼鎖設(shè)計(jì)[J].電子世界,2020(24):146-147.
[2]郭陽光.基于單片機(jī)的指紋識別電子密碼鎖設(shè)計(jì)[J].電子測試,2020(23):29-30+53.
[3]韓燕楚,余宏.基于51單片機(jī)的電子密碼鎖設(shè)計(jì)與應(yīng)用研究[J].漯河職業(yè)技術(shù)學(xué)院學(xué)報(bào),2020,19(06):21-23.
[4]韓旭,吳華,楊岱霖,鄧昕.基于STC89C52的電子密碼鎖設(shè)計(jì)[J].電子技術(shù),2020,49(10):10-11.
[5]黃田,楊婷婷,姜少維,李佳康,董莉霞.基于單片機(jī)的電子密碼鎖設(shè)計(jì)[J].軟件,2020,41(10):102-104.
[6]孫凱悅.基于單片機(jī)的按鍵電子密碼鎖設(shè)計(jì)[J].科技經(jīng)濟(jì)導(dǎo)刊,2020,28(26):55-56.
[7]陳后全.基于51單片機(jī)設(shè)計(jì)的密碼鎖[J].電子制作,2020(10):37-38.文章來源地址http://www.zghlxwxcb.cn/news/detail-435887.html
到了這里,關(guān)于基于AT89C51單片機(jī)的電子密碼鎖設(shè)計(jì)與仿真的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!