導航:首頁 > 操作系統 > 基於單片機的密碼鎖摘要

基於單片機的密碼鎖摘要

發布時間:2023-09-13 23:38:18

① 基於單片機數字密碼鎖的課程設計

根據設定好的密碼,採用二個按鍵實現密碼的輸入功能,當密碼輸入正確之後,鎖就打開,如果輸入的三次的密碼不正確,就鎖定按鍵3秒鍾,同時發現報警聲,直到沒有按鍵按下3種後,才打開按鍵鎖定功能;否則在3秒鍾內仍有按鍵按下,就重新鎖定按鍵3秒時間並報警。 圖4.32.1系統板上硬體連線(1). 把「單片機系統」區域中的P0.0/AD0用導線連接到「音頻放大模塊」區域中的SPK IN端子上;(2). 把「音頻放大模塊」區域中的SPK OUT端子接喇叭和;(3). 把「單片機系統」區域中的P2.0/A8-P2.7/A15用8芯排線連接到「四路靜態數碼顯示」區域中的任一個ABCDEFGH端子上;(4). 把「單片機系統「區域中的P1.0用導線連接到「八路發光二極體模塊」區域中的L1端子上;(5). 把「單片機系統」區域中的P3.6/WR、P3.7/RD用導線連接到「獨立式鍵盤」區域中的SP1和SP2端子上;程序設計內容(1). 密碼的設定,在此程序中密碼是固定在程序存儲器ROM中,假設預設的密碼為「12345」共5位密碼。(2). 密碼的輸入問題:由於採用兩個按鍵來完成密碼的輸入,那麼其中一個按鍵為功能鍵,另一個按鍵為數字鍵。在輸入過程中,首先輸入密碼的長度,接著根據密碼的長度輸入密碼的位數,直到所有長度的密碼都已經輸入完畢;或者輸入確認功能鍵之後,才能完成密碼的輸入過程。進入密碼的判斷比較處理狀態並給出相應的處理過程。(3). 按鍵禁止功能:初始化時,是允許按鍵輸入密碼,當有按鍵按下並開始進入按鍵識別狀態時,按鍵禁止功能被激活,但啟動的狀態在3次密碼輸入不正確的情況下發生的。C語言源程序
#include <AT89X52.H>

unsigned char code ps[]={1,2,3,4,5};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,<br>0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};

unsigned char pslen=9;
unsigned char templen;
unsigned char digit;
unsigned char funcount;
unsigned char digitcount;
unsigned char psbuf[9];
bit cmpflag;
bit hibitflag;
bit errorflag;
bit rightflag;
unsigned int second3;
unsigned int aa;
unsigned int bb;
bit alarmflag;
bit exchangeflag;
unsigned int CC;
unsigned int dd;
bit okflag;
unsigned char oka;
unsigned char okb;

void main(void)
{
unsigned char i,j;
P2=dispcode[digitcount];
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
ET0=1;
EA=1;

while(1)
{
if(cmpflag==0)
{
if(P3_6==0) //function key
{
for(i=10;i>0;i--)
for(j=248;j>0;j--);
if(P3_6==0)
{
if(hibitflag==0)
{
funcount++;
if(funcount==pslen+2)
{
funcount=0;
cmpflag=1;
}
P1=dispcode[funcount];
}
else
{
second3=0;
}
while(P3_6==0);
}
}

if(P3_7==0) //digit key
{
for(i=10;i>0;i--)
for(j=248;j>0;j--);
if(P3_7==0)
{
if(hibitflag==0)
{
digitcount++;
if(digitcount==10)
{
digitcount=0;
}
P2=dispcode[digitcount];
if(funcount==1)
{
pslen=digitcount;
templen=pslen;
}
else if(funcount>1)
{
psbuf[funcount-2]=digitcount;
}
}
else
{
second3=0;
}
while(P3_7==0);
}
}
}
else
{
cmpflag=0;
for(i=0;i<pslen;i++)
{
if(ps[i]!=psbuf[i])
{
hibitflag=1;
i=pslen;
errorflag=1;
rightflag=0;
cmpflag=0;
second3=0;
goto a;
}
}
cc=0;
errorflag=0;
rightflag=1;
hibitflag=0;
a: cmpflag=0;
}
}
}

void t0(void) interrupt 1 using 0
{
TH0=(65536-500)/256;
TL0=(65536-500)%256;

if((errorflag==1) && (rightflag==0))
{
bb++;
if(bb==800)
{
bb=0;
alarmflag=~alarmflag;
}
if(alarmflag==1)
{
P0_0=~P0_0;
}

aa++;
if(aa==800)
{
aa=0;
P0_1=~P0_1;
}
second3++;
if(second3==6400)
{
second3=0;
hibitflag=0;
errorflag=0;
rightflag=0;
cmpflag=0;
P0_1=1;
alarmflag=0;
bb=0;
aa=0;
}
}

if((errorflag==0) && (rightflag==1))
{
P0_1=0;
cc++;
if(cc<1000)
{
okflag=1;
}
else if(cc<2000)
{
okflag=0;
}
else
{
errorflag=0;
rightflag=0;
hibitflag=0;
cmpflag=0;
P0_1=1;
cc=0;
oka=0;
okb=0;
okflag=0;
P0_0=1;
}
if(okflag==1)
{
oka++;
if(oka==2)
{
oka=0;
P0_0=~P0_0;
}
}
else
{
okb++;
if(okb==3)
{
okb=0;
P0_0=~P0_0;
}
}
}
}

② 51單片機關於密碼鎖的畢業設計,論文

程序設計內容

(1).&nbsp;密碼的設定,在此程序中密碼是固定在程序存儲器ROM中,假設預設的密碼為「12345」共5位密碼。

(2).&nbsp;密碼的輸入問題:由於採用兩個按鍵來完成密碼的輸入,那麼其中一個按鍵為功能鍵,另一個按鍵為數字鍵。在輸入過程中,首先輸入密碼的長度,接著根據密碼的長度輸入密碼的位數,直到所有長度的密碼都已經輸入完畢;或者輸入確認功能鍵之後,才能完成密碼的輸入過程。進入密碼的判斷比較處理狀態並給出相應的處理過程。

(3).按鍵禁止功能:初始化時,是允許按鍵輸入密碼,當有按鍵按下並開始進入按鍵識別狀態時,按鍵禁止功能被激活,但啟動的狀態在3次密碼輸入不正確的情況下發生的。

C語言源程序

#includeunsignedcharcodeps[]={1,2,3,4,5};

unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};

unsignedcharpslen=9;unsignedchartemplen;

unsignedchardigit;unsignedcharfuncount;

unsignedchardigitcount;

unsignedcharpsbuf[9];

bitcmpflag;

bithibitflag;

biterrorflag;

bitrightflag;

unsignedintsecond3;

unsignedintaa;

unsignedintbb;

bitalarmflag;

bitexchangeflag;

unsignedintcc;

unsignedintdd;

bitokflag;

unsignedcharoka;

unsignedcharokb;

voidmain(void)

{&nbsp;

unsignedchari,j;&nbsp;

P2=dispcode[digitcount];&nbsp;

TMOD=0x01;&nbsp;

TH0=(65536-500)/256;&nbsp;

TL0=(65536-500)%6;&nbsp;

TR0=1;&nbsp;

ET0=1;&nbsp;

EA=1;&nbsp;

while(1)&nbsp;&nbsp;

&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

if(cmpflag==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

if(P3_6==0)//functionkey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

for(i=10;i>0;i--)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

for(j=248;j>0;j--);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(P3_6==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;if(hibitflag==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcount++;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(funcount==pslen+2)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcount=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmpflag=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1=dispcode[funcount];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second3=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(P3_6==0);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(P3_7==0)//digitkey

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=10;i>0;i--)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=248;j>0;j--);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(P3_7==0)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(hibitflag==0)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digitcount++;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(digitcount==10)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digitcount=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2=dispcode[digitcount];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(funcount==1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pslen=digitcount;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

templen=pslen;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif(funcount>1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;psbuf[funcount-2]=digitcount;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second3=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(P3_7==0);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmpflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ps[i]!=psbuf[i])

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hibitflag=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=pslen;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorflag=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rightflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmpflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second3=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gotoa;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc=0;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorflag=0;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rightflag=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hibitflag=0;

a:&nbsp;&nbsp;&nbsp;cmpflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

}

}

voidt0(void)

interrupt1using0{&nbsp;TH0=(65536-500)/256;&nbsp;

TL0=(65536-500)%6;&nbsp;

if((errorflag==1)&&(rightflag==0))&nbsp;

{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb++;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bb==800)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alarmflag=~alarmflag;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(alarmflag==1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_0=~P0_0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa++;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(aa==800)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_1=~P0_1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second3++;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(second3==6400)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second3=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hibitflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rightflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmpflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_1=1;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alarmflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb=0;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa=0;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;}

&nbsp;if((errorflag==0)&&(rightflag==1))

&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_1=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc++;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cc<1000)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okflag=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif(cc<2000)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rightflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hibitflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmpflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_1=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc=0;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oka=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okb=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okflag=0;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_0=1;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(okflag==1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oka++;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(oka==2)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oka=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_0=~P0_0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okb++;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(okb==3)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okb=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_0=~P0_0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;}

}

③ 單片機指紋密碼鎖的特色與創新

隨著人民生活水平的提高,如何實現家庭防盜這一問題也變得尤其突出,傳統的機械鎖由於其構造簡單,安全性低,無法滿足人們的需求。隨著電子產品向智能化和微型化的不斷發展,單片機已成為電子產品研製和開發中首選的控制器,所以具有防盜報警功能的電子密碼鎖控制系統逐漸代替傳統的機械式密碼控制系統,克服了機械式密碼鎖控制的密碼量少,安全性能差的缺點。

在傳統的身份認證中,我們往往使用密碼加密法,但是這種方法只是"防君子不防小人"。在高明的黑客眼裡,由幾個字元組成的密碼脆弱得不堪一擊。現在,科技的發展讓我們有了新的選擇——生物識別技術。將生物識別技術應用於筆記本、門鎖等方面,可以對文件、財產起保護作用,並且可以進行身份識別。生物識別技術的發展主要起始於指紋研究,它亦是目前應用最為廣泛的生物識別技術。

本設計開發了一款基於單片機的指紋識別電子密碼鎖系統。該系統以STC89C52單片機作為模塊核心,通過串口通信控制ZFM-60指紋模塊實現錄取指紋並存儲指紋數據,並通過HS12864-15C液晶顯示比對流程及比對結果,輔以直流繼電器與發光二極體模擬開鎖的動作。本系統具有體積小、性價比高、傳輸速度快、適合家庭及單位使用。

關鍵詞:單片機,密碼鎖,指紋識別

④ 基於單片機課程設計密碼鎖

採用數字密碼鎖電路的好處就是設計簡單。用以74LS112雙JK觸發器構成的數字邏輯電路作為密碼鎖的核心控制,共設了9個用戶輸入鍵,其中只有4個是有效的密碼按鍵,其它的都是干擾按鍵,若按下干擾鍵,鍵盤輸入電路自動清零,原先輸入的密碼無效,需要重新輸入;如果用戶輸入密碼的時間超過40秒(一般情況下,用戶不會超過40秒,若用戶覺得不便,還可以修改)電路將報警80秒,若電路連續報警三次,電路將鎖定鍵盤5分鍾,防止他人的非法操作。
電路由兩大部分組成:密碼鎖電路和備用電源(UPS),其中設置UPS電源是為了防止因為停電造成的密碼鎖電路失效,使用戶免遭麻煩。
密碼鎖電路包含:鍵盤輸入、密碼修改、密碼檢測、開鎖電路、執行電路、報警電路、鍵盤輸入次數鎖定電路。

⑤ 基於51單片機的密碼鎖程序

用STC52編的,下面是C程序,調試已經成功,自己看程序吧……
#include<reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

#define LCD_data P0
sbit SDA=P3^5;
sbit SCL=P3^4;//24C08控制口設置
sbit LCD_RS = P3^3; //寄存器選擇輸入
sbit LCD_RW = P3^6; //液晶讀/寫控制
sbit LCD_EN = P3^7; //液晶使能控制
sbit LCD_PSB = P3^2; //串/並方式控制
sbit FM=P2^4;//蜂鳴器控制口
sbit RS=P2^5;
sbit T_CLK = P2^0; //實時時鍾時鍾線引腳 //
sbit T_IO = P2^1; //實時時鍾數據線引腳 //
sbit T_RST = P2^2; //實時時鍾復位線引腳 //
sbit ds=P2^3;
sbit EN=P2^6;
sbit ZZ=P2^7;
sbit FZ=P3^1;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;

uint temp1,s_temp; //定義整形變數
float f_temp; //定義浮點型變數

uchar time[]=" : : ";
uchar day[]=" 20 / / ( ) ";
uchar temp0[]=" 溫度: . 度 ";
uchar num,num1,flag,count,a,b;
uchar unlock_i;//解密標志位

uchar t[4];
uchar t1[4];

void delay_ms(uint z)//長延時
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void delay() //短延時,大約5us
{
; ;
}
void reshi()
{
if(RS==1)
{ unlock_i=1;
}
else
{
unlock_i=0;
}
}
uchar code mima[]={'0','1','2','3','4','5','6','7','8','9','0','*'};

void lcd_xieping0(uchar x,uchar y,uchar date);
void lcd_xieping(uchar x,uchar y,uchar *str);
//********************************************************
// 開機顯示
//********************************************************
void kjxs()
{
uint i,j;
lcd_xieping(0,0,"****************");
lcd_xieping(1,0," 歡迎進入 ");
lcd_xieping(2,0," 密碼鎖系統! ");
lcd_xieping(3,0,"****************");
delay_ms(4000);
lcd_xieping(0,0," 系統初始化中 ");
lcd_xieping(1,0," 請稍後… ");
lcd_xieping(2,0,"————————");
lcd_xieping(3,0," ");
for(j=3;j>0;j--)
{
for(i=0;i<8;i++)
{
lcd_xieping(3,i,"*");
delay_ms(250);
}
lcd_xieping(3,0," ");
}
}
//********************************************************
// 12864顯示
//********************************************************
void write_cmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = cmd;
delay_ms(5);
LCD_EN = 1;
delay_ms(5);
LCD_EN = 0;
}
void write_dat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delay_ms(5);
LCD_EN = 1;
delay_ms(5);
LCD_EN = 0;
}
void lcd_xieping0(uchar x,uchar y,uchar date)
{
switch(x)
{
case 0: write_cmd(0x80+y); break;
case 1: write_cmd(0x90+y); break;
case 2: write_cmd(0x88+y); break;
case 3: write_cmd(0x98+y); break;
}
write_dat(date);
}
void lcd_xieping(uchar x,uchar y,uchar *str)
{
switch(x)
{
case 0: write_cmd(0x80+y); break;
case 1: write_cmd(0x90+y); break;
case 2: write_cmd(0x88+y); break;
case 3: write_cmd(0x98+y); break;
}
while (*str)
{
write_dat(*str);
str++;
}
}
void lcd_init()
{
LCD_PSB = 1; //並口方式
write_cmd(0x30); //基本指令操作
delay_ms(5);
write_cmd(0x0C); //顯示開,關游標
delay_ms(5);
write_cmd(0x01); //清除LCD的顯示內容
delay_ms(5);
}
//**************************************************************
// 鍵盤掃描函數
//**************************************************************
uchar keyscan1() //矩陣鍵盤掃描函數
{
uchar temp;
while(!num)
{P1=0xfe; //賦值
temp=P1; //讀回數據
temp=temp&0xf0; //與運算
if(temp!=0xf0) //判斷
{
delay_ms(2); //延時消抖
temp=P1; //讀回數據
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp) //多分支選擇
{
case 0x70:num=1;break; //跳出
case 0xb0:num=2;break;
case 0xd0:num=3;break;
case 0xe0:num=4;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}//等待按鍵釋放
}
}
P1=0xfd; //賦值
temp=P1; //讀回數據
temp=temp&0xf0; //與運算
if(temp!=0xf0) //判斷
{
delay_ms(2); //延時消抖
temp=P1; //讀回數據
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp) //多分支選擇
{
case 0x70:num=5;break; //跳出
case 0xb0:num=6;break;
case 0xd0:num=7;break;
case 0xe0:num=8;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}//等待按鍵釋放
}
}
P1=0xfb; //賦值
temp=P1; //讀回數據
temp=temp&0xf0; //與運算
if(temp!=0xf0) //判斷
{
delay_ms(2); //延時消抖
temp=P1; //讀回數據
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp) //多分支選擇
{
case 0x70:num=9;break; //跳出
case 0xb0:num=10;break;
case 0xd0:num=11;break;
case 0xe0:num=12;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}//等待按鍵釋放
}
}
}
return(num); //返回值
}

uchar keyscan2()
{
uchar temp;
while(!num1)
{P1=0xf7; //賦值
temp=P1; //讀回數據
temp=temp&0xf0; //與運算
if(temp!=0xf0) //判斷
{
delay_ms(2); //延時消抖
temp=P1; //讀回數據
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp) //多分支選擇
{
case 0x70:num1=1;break; //跳出
case 0xb0:num1=2;break;
case 0xd0:num1=3;break;
case 0xe0:num1=4;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}//等待按鍵釋放
}
}
}
return(num1);
}
//**************************************************************
// 直流電機
//**************************************************************
void dianjiZZ()
{
EN=1;
ZZ=1;
FZ=0;
}
void dianjiFZ()
{
EN=1;
ZZ=0;
FZ=1;
}
void dianji_stop()
{
EN=0;
}
//**************************************************************
// EPPROM
//**************************************************************
void start() //啟動信號
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}

void stop() //停止信號
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}

void respons() //響應信號
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay();

}

void writebyte(uchar date) //寫一個位元組
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1; //釋放匯流排
delay();

}

uchar readbyte() //讀一個位元組
{
uchar i,k;
SCL=0;
delay();
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
delay();
k=(k<<1)|SDA;
SCL=0;
delay();
}
delay();
return(k);

}
void write(uchar add,uchar date) //在一個地址寫一個位元組
{
start();
writebyte(0xa0);
respons();
writebyte(add);
respons();
writebyte(date);
respons();
stop();

}
uchar read(uchar add) //在一個地址讀一個位元組
{
start();
writebyte(0xa0);
respons();
writebyte(add);
respons();
start();
writebyte(0xa1);
respons();
b=readbyte();
respons();
stop();
return(b);
}
//**************************************************************
// 時間日期函數
//**************************************************************
void v_WTInputByte(uchar ucDa)
{
uchar i;
ACC= ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC0; //*相當於匯編中的 RRC
T_CLK = 1;
T_CLK = 0;
ACC =ACC>> 1;
}
}
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC>>1; //*相當於匯編中的 RRC
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
v_WTInputByte(ucDa); /* 寫1Byte數據*/
T_CLK = 1;
T_RST =0;
}
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); // 地址,命令 //
ucDa = uc_RTOutputByte(); // 讀1Byte數據 //
T_CLK = 1;
T_RST =0;
return(ucDa);
}
void Init1302(void)
{
v_W1302(0x8e,0x00); //控制寫入WP=0
v_W1302(0x80,0x80);
v_W1302(0x90,0xa9);
v_W1302(0x80,0x00); //秒
v_W1302(0x82,0x24); //分
v_W1302(0x84,0x12); //時
v_W1302(0x86,0x29); //日
v_W1302(0x88,0x10); //月
v_W1302(0x8a,0x05); //星期
v_W1302(0x8c,0x10); //年 //
v_W1302(0x8e,0x80);
}
void donetime(void)
{
uchar d;
d=uc_R1302(0x87);
day[10]=(d&0x0f)+48;
day[9]=((d>>4)&0x03)+48;
d=uc_R1302(0x89);
day[7]=(d&0x0f)+48;
day[6]=((d>>4)&0x01)+48;
d=uc_R1302(0x8b);
day[13]=(d&0x07)+48;
d=uc_R1302(0x8d);
day[4]=(d&0x0f)+48;
day[3]=(d>>4)+48;
d=uc_R1302(0x81);
time[15]=(d&0x0f)+48;
time[14]=(d>>4)+48;
d=uc_R1302(0x83);
time[12]=(d&0x0f)+48;
time[11]=(d>>4)+48;
d=uc_R1302(0x85);
time[9]=(d&0x0f)+48;
time[8]=(d>>4)+48;
}
//**************************************************************
// 溫度檢測函數
//**************************************************************
void dsreset(void) //18B20復位,初始化函數
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //讀1位函數
{
uint i;
bit dat;
ds=0;i++; //i++ 起延時作用
ds=1;i++;i++;
dat=ds; //讀數據
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void) //讀1個位元組
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
return(dat);
}
void tempwritebyte(uchar dat) //向18B20寫一個位元組數據
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01; //判斷最後一位是1還是0
dat=dat>>1;
if(testb) //寫 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0; //寫 0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}

void tempchange(void) //DS18B20 開始獲取溫度並轉換
{
dsreset(); //初始化,每次對18B20的操作都首先要初始化
delay_ms(1);
tempwritebyte(0xcc); // 寫跳過讀ROM指令
tempwritebyte(0x44); // 寫溫度轉換指令
}
void get_temp() //讀取寄存器中存儲的溫度數據
{
uchar a,b;
dsreset(); //初始化
delay_ms(1);
tempwritebyte(0xcc); // 寫跳過讀ROM指令
tempwritebyte(0xbe); //寫讀指令
a=tempread(); //讀低8位
b=tempread(); //讀高8位
temp1=b;
temp1<<=8; //兩個位元組組合為1個字
temp1=temp1|a;
f_temp=temp1*0.0625; //溫度在寄存器中為12位 解析度位0.0625°
}
//**************************************************************
// 解密函數
//**************************************************************
void unlock()
{
uchar in,i;
if(num==0)
{
lcd_xieping(0,0,"**密碼鎖系統** ");
lcd_xieping(1,0,"—————————");
lcd_xieping(2,0," 請輸入密碼: ");
lcd_xieping(3,0," ");
for(i=0;i<4;i++)
{
t1[i]=keyscan1();
lcd_xieping(3,i,"*");
num=0;
}//輸密碼
}
in=keyscan1();
if(in==12)//in-確定鍵標志位
{
in=0;
num=0;
if((t1[0]==t[0])&&(t1[1]==t[1])&&(t1[2]==t[2])&&(t1[3]==t[3]))
{
flag=1;//解密成功與否標志位
//unlock_i=1;
a=0;//功能鍵標志
lcd_xieping(0,0,"**密碼鎖系統** ");
lcd_xieping(1,0,"——————————");
lcd_xieping(2,0," 密碼正確! ");
lcd_xieping(3,0," 您的身份已確認");
delay_ms(1500);
lcd_xieping(1,0,"————————");
lcd_xieping(2,0,"功能 I 開鎖 ");
lcd_xieping(3,0," II修改密碼");
}
else
{
flag=0;
count++;
if(count==3)
{
count=0;
num=1;
lcd_xieping(1,0,"——————————");
lcd_xieping(2,0,"您的機會已用完 ");
lcd_xieping(3,0,"對不起**無法進入");
FM=0;
delay_ms(1000);
FM=1;
}
}
}
}
//**************************************************************
// 修改密碼函數
//**************************************************************
void xiugaimima()
{ uchar i,j,l,im,ib;
uchar t2[4];
uchar t3[4];
num=0;
lcd_xieping(1,0,"————————");
lcd_xieping(2,0,"請輸入新密碼: ");
lcd_xieping(3,0," ");
for(i=0;i<4;i++)
{
t2[i]=keyscan1();
lcd_xieping0(3,i,mima[num]);
num=0;
}
im=keyscan1();
if(im==12)//im,in,ib,同為確定鍵標志位
{
im=0;
num=0;
lcd_xieping(1,0,"————————");
lcd_xieping(2,0,"請再次輸入新密碼");
lcd_xieping(3,0," ");
for(i=0;i<4;i++)
{
t3[i]=keyscan1();
lcd_xieping0(3,i,mima[num]);
num=0;
}
}
ib=keyscan1();
if(ib==12)
{
ib=0;
num=0;
if(t2[0]==t3[0]&&t2[1]==t3[1]&&t2[2]==t3[2]&&t2[3]==t3[3])
{
t[0]=t3[0];
t[1]=t3[1];
t[2]=t3[2];
t[3]=t3[3];
lcd_xieping(1,0,"————————");
lcd_xieping(2,0," 祝賀您! ");
lcd_xieping(3,0," 密碼修改成功 ");
flag=0;
for(j=0;j<4;j++)
{
l=j+1;
write(l,t[j]);
delay_ms(10);
}//24C08寫數據
delay_ms(1000);
}
else
{
lcd_xieping(2,0,"兩次輸入密碼不同");
lcd_xieping(3,0," 密碼修改失敗 ");
flag=1;
delay_ms(500);
}
}
}
//**************************************************************
// 顯示函數
//**************************************************************
void xianshi()
{
donetime();
tempchange();
get_temp();
s_temp=f_temp*100;
temp0[7]=(s_temp/1000)+48;
temp0[8]=(s_temp%1000/100)+48;
temp0[10]=(s_temp%100/10)+48;
temp0[11]=(s_temp%10)+48;
lcd_xieping(0,0,"**密碼鎖系統** ");
lcd_xieping(1,0,temp0);
lcd_xieping(2,0,day);
lcd_xieping(3,0,time);
num=0;
}
//**************************************************************
// 開鎖函數
//**************************************************************
void kaisuo()
{
uchar i;
lcd_xieping(2,0," 開鎖中…… ");
lcd_xieping(3,0,"——耐心等待——");
for(i=3;i>0;i--)
{
FM=0;
delay_ms(100);
FM=1;
delay_ms(100);
flag=0;
}
dianjiZZ();
delay_ms(10000);
dianji_stop();
lcd_xieping(2,0,"—開鎖過程結束—");
lcd_xieping(3,0," 請開門 ");
delay_ms(5000);
dianjiFZ();
delay_ms(10000);
dianji_stop();
flag=0;
}
//**************************************************************
// 主函數
//**************************************************************
void main()
{
uchar m;
unlock_i=1;
lcd_init(); //液晶初始化
//Init1302();
kjxs(); //開機顯示
for(m=0;m<4;m++)
{
t[m]=read(m+1);
delay_ms(10);
}//24C08讀數據
while(1)
{
reshi();
if(!unlock_i)
{
unlock();//解密函數
}
else
{
xianshi();//時間、日期、溫度顯示函數
}
if(flag==1)
{
num1=0;
a=keyscan2();
if(a==1)
{
kaisuo();//開鎖函數
}
if(a==2)
{
xiugaimima();//修改密碼函數
}
}
}
}

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

這里有 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

閱讀全文

與基於單片機的密碼鎖摘要相關的資料

熱點內容
黑上宏命令 瀏覽:644
mac解壓壓縮包有密碼 瀏覽:704
命令與征服知乎 瀏覽:561
小時代pdf 瀏覽:221
化工設備第三版答案pdf 瀏覽:465
防火卷簾控制器單片機程序 瀏覽:16
rdlcpdf 瀏覽:109
鏈表實現快速排序python 瀏覽:590
php輸出命令 瀏覽:987
d站app叫什麼名字 瀏覽:172
oppor系列如何解除應用加密 瀏覽:601
程序員那麼可愛姜逸城初戀 瀏覽:499
modbustcp編程 瀏覽:493
實況為什麼安卓看不了 瀏覽:129
Java多線程Queue 瀏覽:95
雲伺服器499元三年 瀏覽:980
nbd源碼 瀏覽:847
x86在arm上編譯 瀏覽:8
linux怎麼配置網路 瀏覽:307
程序員想要的小禮物 瀏覽:188