注:此代碼一經(jīng)過驗證,讀者不必懷疑其正確性,如果燒錄進去沒有反應(yīng),請自行檢查引腳端口配置,以及仔細分析代碼實現(xiàn)原理。倘若能靜下心來分析代碼,一定能受益匪淺。
廢話不多說,,直接上代碼。如有問題,請下方評論并私信我,收到后一定及時回復(fù)!
?? ?功能鍵
?? ??? ??? ??? ??? ??? ?S6---S115?? ?數(shù)字鍵0-9
?? ??? ??? ??? ?S16---更改密碼?? ??? ?S17---更改密碼完畢后確認
?? ??? ??? ??? ?S18---重試密碼、重新設(shè)定?? ?S19---關(guān)閉密碼鎖
?? ??? ??? ??? ?初始密碼:000000 ?? ?密碼位數(shù):6位
?? ??? ??? ??? ?注意:掉電后,所設(shè)密碼會丟失,重新上點時,密碼恢復(fù)為原始的000000
?? ??? ??? ??? ?與P1相連的8位發(fā)光LED點亮代表鎖被打開;熄滅代表鎖被鎖上程序功能:
?? ??? ? ?1、開鎖:
?? ??? ? ?下載程序后,直接按六次S6(即代表數(shù)字0),8位LED亮,鎖被打開,輸入密碼時,
?? ??? ? ?六位數(shù)碼管依次顯示小橫杠。
?? ??? ? ?2、更改密碼:
?? ??? ? ?只有當(dāng)開鎖(LED亮)后,該功能方可使用。
?? ??? ? ?首先按下更改密碼鍵S16,然后設(shè)置相應(yīng)密碼,此時六位數(shù)碼管會顯示設(shè)置密碼對應(yīng)
?? ??? ? ?的數(shù)字。最后設(shè)置完六位后,按下S17確認密碼更改,此后新密碼即生效。
?? ??? ? ?3、重試密碼:
?? ??? ? ?當(dāng)輸入密碼時,密碼輸錯后按下鍵S18,可重新輸入六位密碼。
?? ??? ? ?當(dāng)設(shè)置密碼時,設(shè)置中途想更改密碼,也可按下此鍵重新設(shè)置。
?? ??? ? ?4、關(guān)閉密碼鎖:
?? ??? ? ?按下S19即可將打開的密碼鎖關(guān)閉。
推薦初級演示步驟:輸入原始密碼000000按6次S6密碼正確后LED全部亮表示鎖已打開---按下更
改密碼按鍵S16---按S6到S15設(shè)置密碼---按S17
?? ??? ??? ?確認密碼更改---按S19關(guān)閉密碼鎖---輸入新的密碼打開密碼鎖
*******************************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
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; //送入數(shù)碼管顯示的變量
uchar wei,key,temp;
bit allow,genggai,ok,wanbi,retry,close; //各個狀態(tài)位
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
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)
{
dula=0;
P0=table[a];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[b];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=table[c];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
P0=table[d];
dula=1;
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(5);
P0=table[e];
dula=1;
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(5);
P0=table[f];
dula=1;
dula=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() //對按鍵采集來的數(shù)據(jù)進行分配
{
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) //只有當(dāng)六位密碼均輸入完畢后方進行驗證
{
if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))
allow=1; //當(dāng)輸入的密碼正確,會得到allowe置一
}
}
void main()
{
while(1)
{
keyscan();
shumima();
yanzheng();
if(allow) //驗證完后,若allow為1,則開鎖
{
P1=0x00;
if(!genggai)
wanbi=0;
}
if(genggai) //當(dāng)S16更改密碼鍵被按下,genggai會被置一
{
if(allow) //若已經(jīng)把鎖打開,才有更改密碼的權(quán)限
{
while(!wanbi) //當(dāng)新的六位密碼沒有設(shè)定完,則一直在這里循環(huán)
{
keyscan();
shumima();
if(retry|close) //而當(dāng)探測到重試鍵S18或者關(guān)閉密碼鎖鍵S19被按下時,則跳出
{ wanbi=1;
break;
}
display(a,b,c,d,e,f);
}
}
}
if(ok) //更改密碼時,當(dāng)所有六位新密碼均被按下時,可以按下此鍵,結(jié)束密碼更改
{ //其他時間按下此鍵無效
ok=0; wei=0;
genggai=0;
old1=new1;old2=new2;old3=new3; //此時,舊的密碼將被代替
old4=new4;old5=new5;old6=new6;
a=16;b=16;c=16;d=16;e=16;f=16;
}
if(retry) //當(dāng)重試按鍵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) //當(dāng)關(guān)閉密碼鎖按鍵被按下,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); //實時顯示
}
}
這是演示現(xiàn)象:
?
最后,希望我的分享能給你帶來收獲和啟發(fā),敬請關(guān)注,持續(xù)更新中!
考慮到一些讀者需要相關(guān)資料和解決一些疑問,因此我新建立了一個學(xué)習(xí)交流群,我在群文件里上傳了一些資料,需要的讀者可以入群下載。
群中文件資料我會時常更新,主要資料是51單片機開發(fā)、32單片機開發(fā)、編程、嵌入式學(xué)習(xí)、算法控制等。
由于群中文件還在不斷更新上傳,有些方面的資料還不太完善,希望大家理解。若群中涉及違規(guī)行為,歡迎舉報!
文章來源:http://www.zghlxwxcb.cn/news/detail-480702.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-480702.html
到了這里,關(guān)于51單片機“密碼鎖”代碼詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!