導航:首頁 > 操作系統 > 單片機33矩陣密碼鎖設計

單片機33矩陣密碼鎖設計

發布時間:2023-01-27 17:00:51

1. 基於單片機的密碼鎖設計

可按你的具體要求任意更改,模擬文件和原理圖是完全免費的。

有個現成的,ProteUS模擬誰的下載地址:

1602密碼鎖.rar(http://ishare.iask.sina.com.cn/f/7054562.html)

要求如下:

密碼長度自由可設;

密碼設定必須加密存儲;

三次錯碼輸入報警提示,且10分鍾內不接受再次輸入;

具有超級密碼功能,長度或格式特殊。

16個按鍵說明

10個數字輸入鍵

6個功能鍵

具體說明如下:

CLR鍵:在輸入密碼時如果輸入錯誤,可以按這個鍵清除已經輸入的內容

OK鍵:是確認鍵

CHANGE在開鎖後可以修改密碼

FREE在系統因為錯誤密碼報警以後解除報警的的功能(當然這個時候是要超級密碼的)

CLOSE在開鎖狀態下可以上鎖

OPEN在系統啟動以後,按下這個鍵會出現操作界面(啟動系統屏幕不會有文字顯示,按下後才有)

且實物已經做出,還可用熱轉印的方法製作電路板。

2. 基於單片機的電子密碼鎖設計

功能鍵
S6---S15 數字鍵0-9
S16---更改密碼 S17---更改密碼完畢後確認
S18---重試密碼、重新設定 S19---關閉密碼鎖
初始密碼:000000 密碼位數:6位
注意:掉電後,所設密碼會丟失,重新上點時,密碼恢復為原始的000000
與P1相連的8位發光LED點亮代表鎖被打開;熄滅代表鎖被鎖上

程序功能: 本程序結合了24C02存儲器的存儲功能,可以掉電保存密碼。
第一次運行時,若輸入000000原始密碼後無反應,可以試驗著將主程序中前面的
一小段被注釋線屏蔽的程序前的注釋線刪掉,然後重新編譯下載(可以將密碼還原為000000)。
此後,再將這小段程序屏蔽掉,再編譯下載。方可正常使用。
1、開鎖:
下載程序後,直接按六次S7(即代表數字1),8位LED亮,鎖被打開,輸入密碼時,
六位數碼管依次顯示小橫杠。
2、更改密碼:
只有當開鎖(LED亮)後,該功能方可使用。
首先按下更改密碼鍵S16,然後設置相應密碼,此時六位數碼管會顯示設置密碼對應
的數字。最後設置完六位後,按下S17確認密碼更改,此後新密碼即生效。
3、重試密碼:
當輸入密碼時,密碼輸錯後按下鍵S18,可重新輸入六位密碼。
當設置密碼時,設置中途想更改密碼,也可按下此鍵重新設置。
4、關閉密碼鎖:
按下S19即可將打開的密碼鎖關閉。
推薦初級演示步驟:輸入原始密碼000000---按下更改密碼按鍵S16---按0到9設置密碼---按S17
確認密碼更改---按S18關閉密碼鎖---輸入新的密碼打開密碼鎖
*******************************************************************************/
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

uchar old1,old2,old3,old4,old5,old6; //原始密碼000000
uchar new1,new2,new3,new4,new5,new6; //每次MCU採集到的密碼輸入
uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入數碼管顯示的變數
uchar wei,key,temp;

bit allow,genggai,ok,wanbi,retry,close; //各個狀態位

sbit la=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
sbit sda=P2^0; //IO口定義
sbit scl=P2^1;

unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

/*****************IIC晶元24C02存儲器驅動程序************************************/

void nop()
{
_nop_();
_nop_();
}
/////////24C02讀寫驅動程序////////////////////
void delay1(unsigned int m)
{ unsigned int n;
for(n=0;n<m;n++);
}

void init() //24c02初始化子程序
{
scl=1;
nop();
sda=1;
nop();
}

void start() //啟動I2C匯流排
{
sda=1;
nop();
scl=1;
nop();
sda=0;
nop();
scl=0;
nop();
}

void stop() //停止I2C匯流排
{
sda=0;
nop();
scl=1;
nop();
sda=1;
nop();
}

void writebyte(unsigned char j) //寫一個位元組
{
unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
nop();
sda=CY; //temp左移時,移出的值放入了CY中
nop();
scl=1; //待sda線上的數據穩定後,將scl拉高
nop();
}
scl=0;
nop();
sda=1;
nop();
}

unsigned char readbyte() //讀一個位元組
{
unsigned char i,j,k=0;
scl=0; nop(); sda=1;
for (i=0;i<8;i++)
{
nop(); scl=1; nop();
if(sda==1)
j=1;
else
j=0;
k=(k<<1)|j;
scl=0;
}
nop();
return(k);
}

void clock() //I2C匯流排時鍾
{
unsigned char i=0;
scl=1;
nop();
while((sda==1)&&(i<255))
i++;
scl=0;
nop();
}

////////從24c02的地址address中讀取一個位元組數據/////
unsigned char read24c02(unsigned char address)
{
unsigned char i;
start();
writebyte(0xa0);
clock();
writebyte(address);
clock();
start();
writebyte(0xa1);
clock();
i=readbyte();
stop();
delay1(100);
return(i);
}

//////向24c02的address地址中寫入一位元組數據info/////
void write24c02(unsigned char address,unsigned char info)
{
start();
writebyte(0xa0);
clock();
writebyte(address);
clock();
writebyte(info);
clock();
stop();
delay1(5000); //這個延時一定要足夠長,否則會出錯。因為24c02在從sda上取得數據後,還需要一定時間的燒錄過程。
}
/****************************密碼鎖程序模塊********************************************************/

void delay(unsigned char i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}

void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
{
la=0;
P0=table[a];
la=1;
la=0;

wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);

P0=table[b];
la=1;
la=0;

P0=0xfd;
wela=1;
wela=0;
delay(5);

P0=table[c];
la=1;
la=0;

P0=0xfb;
wela=1;
wela=0;
delay(5);

P0=table[d];
la=1;
la=0;

P0=0xf7;
wela=1;
wela=0;
delay(5);

P0=table[e];
la=1;
la=0;

P0=0xef;
wela=1;
wela=0;
delay(5);

P0=table[f];
la=1;
la=0;

P0=0xdf;
wela=1;
wela=0;
delay(5);
}

void keyscan()
{
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
wei++;
break;

case 0xde:
key=1;
wei++;
break;

case 0xbe:
key=2;
wei++;
break;

case 0x7e:
key=3;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
wei++;
break;

case 0xdd:
key=5;
wei++;
break;

case 0xbd:
key=6;
wei++;
break;

case 0x7d:
key=7;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
wei++;
break;

case 0xdb:
key=9;
wei++;
break;

case 0xbb:
genggai=1;
wei=0;
break;

case 0x7b:
if(allow)
ok=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
retry=1;
break;

case 0xd7:
close=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
}

void shumima() //對按鍵採集來的數據進行分配
{
if(!wanbi)
{
switch(wei)
{
case 1:new1=key;
if(!allow) a=17;
else a=key; break;
case 2:new2=key;
if(a==17) b=17;
else b=key; break;
case 3:new3=key;
if(a==17) c=17;
else c=key; break;
case 4:new4=key;
if(a==17) d=17;
else d=key; break;
case 5:new5=key;
if(a==17) e=17;
else e=key; break;
case 6:new6=key;
if(a==17) f=17;
else f=key;
wanbi=1; break;
}
}
}

void yanzheng() //驗證密碼是否正確
{
if(wanbi) //只有當六位密碼均輸入完畢後方進行驗證
{
if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))
allow=1; //當輸入的密碼正確,會得到allowe置一
}
}

void main()
{

init(); //初始化24C02
/*********下面的一小段程序的功能為格式化密碼存儲區。************
******當24c02中這些存儲區由於其他程序的運行而導致***************
*******所存數據發生了變化,或者密碼遺忘時, ********************
******可以刪掉其前面的注釋線,然後重新編譯下載。****************
******而將密碼還原為000000後,請將下面的程序用******************
******注釋屏蔽掉,重新編譯、下載,方可正常使用****************/
// write24c02(110,0x00);
// write24c02(111,0x00);//24c02的第110到115地址單元作為密碼存儲區
// write24c02(112,0x00);
// write24c02(113,0x00);
// write24c02(114,0x00);
// write24c02(115,0x00);
/*******************************************************************/

old1=read24c02(110);
old2=read24c02(111);
old3=read24c02(112);
old4=read24c02(113);
old5=read24c02(114);
old6=read24c02(115);

while(1)
{
keyscan();
shumima();
yanzheng();
if(allow) //驗證完後,若allow為1,則開鎖
{
P1=0x00;
if(!genggai)
wanbi=0;
}
if(genggai) //當S16更改密碼鍵被按下,genggai會被置一
{
if(allow) //若已經把鎖打開,才有更改密碼的許可權
{
while(!wanbi) //當新的六位密碼沒有設定完,則一直在這里循環
{
keyscan();
shumima();
if(retry|close) //而當探測到重試鍵S18或者關閉密碼鎖鍵S19被按下時,則跳出
{ wanbi=1;
break;
}
display(a,b,c,d,e,f);
}
}
}
if(ok) //更改密碼時,當所有六位新密碼均被按下時,可以按下此鍵,結束密碼更改
{ //其他時間按下此鍵無效
ok=0; wei=0;
genggai=0;
old1=new1;old2=new2;old3=new3; //此時,舊的密碼將被代替
old4=new4;old5=new5;old6=new6;
//新密碼寫入存儲區。
write24c02(110,old1);
write24c02(111,old2);
write24c02(112,old3);
write24c02(113,old4);
write24c02(114,old5);
write24c02(115,old6);
a=16;b=16;c=16;d=16;e=16;f=16;
}
if(retry) //當重試按鍵S18被按下,retry會被置位
{
retry=0; wei=0;wanbi=0;
a=16;b=16;c=16;d=16;e=16;f=16;
new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;
}
if(close) //當關閉密碼鎖按鍵被按下,close會被置位
{
close=0;genggai=0;//所有變數均被清零。
wei=0; wanbi=0;
allow=0;
P1=0xff;
a=16;b=16;c=16;d=16;e=16;f=16;
new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;
}
display(a,b,c,d,e,f); //實時顯示
}
}
對著代碼自己做吧,,要是還做不出來,,那我就不說什麼了,,

3. 怎麼用單片機設計這個密碼鎖,幫幫忙,在線等,急

可以用矩陣鍵盤+LCD1602+繼電器來實現。
矩陣鍵盤實現密碼輸入功能,
LCD1602實現顯示功能,
繼電器用來控制電磁鎖的開關。
懂事電子設計 Vgz

4. 基於單片機電子密碼鎖設計~

以前我在網上找到過密碼鎖的源代碼,你可以找找。給你一個思路吧,先用7個埠做成3*4矩陣鍵盤,0~9 * #共12個鍵,另外用4個埠做紅燈輸出、綠燈輸出、報警輸出、開鎖輸出。*鍵為取消鍵,#鍵為確認鍵,密碼可存入單片機的ROM中(不能改密碼)或存入24CXX串列E2PROM(可改密碼)。鍵盤處理方法可以用兩種,一種是在主程序里不停掃描埠檢測按鍵消抖動後處理按鍵。另一種方法是鍵盤通過與門接到外部中斷,當有鍵按下時會引起中斷,然後在中斷程序中消抖動後處理按鍵。經過鍵盤處理程序後就可以知道按下什麼鍵,是數字就存入你自己指定的密碼緩存寄存器,是取消就清除密碼緩存寄存器,是確認就讀出密碼與密碼緩存寄存器的值比較。密碼的存放(不加密8位數):設ABCD,4個位元組存放密碼,A中高4位與低4位各存入一位數,其它的跟A一樣。再就是用一個位元組的寄存器存放錯誤次數,錯一次加1,達到3次報警埠輸出信號,如果密碼正確就清零這個寄存器。

5. 基於單片機的電子密碼鎖設計 畢業論文

這里有 http://www.zytxs.com/web2/mj09b33489.html

畢業論文 基於單片機的電子密碼鎖設計
AT89S51|矩陣鍵盤|電子密碼鎖|畢業設計
文件格式:word

畢業論文 基於單片機的電子密碼鎖設計
論文正文共49頁。共19073個字元數(不計空格)。
如需下載,請點擊頁面最下方「下載地址 點擊下載」。

基於單片機的電子密碼鎖設計

摘 要

隨著人們對安全的重視和科技的發展,對日常生活中的安全保險器件的要求越來越高。為滿足人們對鎖的使用要求 ,增加其安全性 ,用密碼代替鑰匙的密碼鎖應運而生。電子鎖由於具有報警功能,保密性高,使用靈活性好,安全系數高,設計方法合理,簡單易行,成本低,符合住宅、辦公室用鎖要求 , 具有推廣價值。受到了廣大用戶的親睞。這種應用以單片機為核心 ,通過編程來實現整體基本功能和安全性要求設計。

系統將能完成開鎖、超時報警、超次鎖定、管理員解密、修改用戶密碼基本的密碼鎖的功能。能用PROTEL99SE繪制電路原理圖,並做出調試好基於單片機的電子密碼鎖的實物。

關鍵詞:AT89S51,矩陣鍵盤,電子密碼鎖

Microcontroller-based design of electronic locks

ABSTRACT

As people focus on security and technology development, life insurance for the safety devices in increasingly high demand. To meet people』s use of the lock request to increase their safety, replace the key with a password lock came into being. Electronic lock as an alarm, high secrecy, use good flexibility, high safety factor, design reasonable, simple, low cost, consistent with residential, office lock request is worth promoting. By the user pro-gaze. This application to SCM is the core of the overall program to achieve the basic functions and design safety requirements.

System will be able to complete the unlock, alarm out, and Ultra lock, decrypt administrator, modify the basic user password lock feature. Can PROTEL99SE circuit schematic drawing and make a good debugging MCU-based electronic code lock of the kind.

Key words: AT89S51, matrix keyboards, electronic lock

目 錄
第一章 緒論 1
1.1 引言 1
1.2 電子密碼鎖的研究現狀 1
1.3 課題研究方法 2
第二章 開發環境和開發工具 3
2.1 Protel 99se簡介 3
2.2 keil介紹 4
2.3 開發工具在系統中的作用 5
2.4 主要元器件介紹 5
2.4.1 主控晶元AT89S51 5
2.4.2 數碼管 7
2.4.3 掉電存儲模塊AT24c02 8
第三章 電子密碼鎖設計硬體部分 9
3.1 電子密碼鎖總原理圖 9
3.2 開鎖電路設計 9
3.3 按鍵電路設計 9
3.4 顯示電路設計 10
3.4 掉電存儲電路設計 12
3.5 電源電路設計 12
第四章 電子密碼鎖軟體部分 13
4.1主程序流程圖: 13
4.2鍵功能流程圖: 14
第五章 電子密碼鎖實物製作和調試過程 15
5.1 電路板製作中的問題和調試結果分析 15
5.2 製作好的實物的圖片 16
第六章 總結 20
設計總結 20
參考文獻 21
致 謝 22
附錄一 電子密碼鎖的電路圖 23
附錄二 電子密碼鎖3D截圖 24
附錄三 電子密碼鎖程序清單 24

閱讀全文

與單片機33矩陣密碼鎖設計相關的資料

熱點內容
安卓系統如何重啟 瀏覽:174
小天才app鬧鍾怎麼改 瀏覽:962
司馬彥PDF 瀏覽:885
動力轉向編程 瀏覽:831
史瓦格期貨基本分析pdf 瀏覽:811
怎麼更改appid名字 瀏覽:235
抖音很解壓的東西 瀏覽:520
怎麼在app上進行機場升艙 瀏覽:133
fx3ga用什麼編程軟體 瀏覽:498
深度學習演算法樣本數量 瀏覽:966
電腦文件夾打開畫面塊狀 瀏覽:790
固態硬碟與機械盤的加密方法 瀏覽:634
unix編譯軟體 瀏覽:563
影視製作中西書局中央編譯出版社 瀏覽:822
變數作用域是編譯器決定的嗎 瀏覽:755
linux結構分析 瀏覽:812
程序員記錄歷史 瀏覽:798
編譯器怎麼調用構造函數的 瀏覽:97
高質量cpdf 瀏覽:824
福建電信代理伺服器雲主機 瀏覽:618