① 基於單片機電子密碼鎖設計~
以前我在網上找到過密碼鎖的源代碼,你可以找找。給你一個思路吧,先用7個埠做成3*4矩陣鍵盤,0~9 * #共12個鍵,另外用4個埠做紅燈輸出、綠燈輸出、報警輸出、開鎖輸出。*鍵為取消鍵,#鍵為確認鍵,密碼可存入單片機的ROM中(不能改密碼)或存入24CXX串列E2PROM(可改密碼)。鍵盤處理方法可以用兩種,一種是在主程序里不停掃描埠檢測按鍵消抖動後處理按鍵。另一種方法是鍵盤通過與門接到外部中斷,當有鍵按下時會引起中斷,然後在中斷程序中消抖動後處理按鍵。經過鍵盤處理程序後就可以知道按下什麼鍵,是數字就存入你自己指定的密碼緩存寄存器,是取消就清除密碼緩存寄存器,是確認就讀出密碼與密碼緩存寄存器的值比較。密碼的存放(不加密8位數):設ABCD,4個位元組存放密碼,A中高4位與低4位各存入一位數,其它的跟A一樣。再就是用一個位元組的寄存器存放錯誤次數,錯一次加1,達到3次報警埠輸出信號,如果密碼正確就清零這個寄存器。
② 單片機電子密碼鎖設計
程序:
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
uint num=10; //開始讓數碼管什麼都顯示
bit set=0; //定義設置密碼的位
char count=-1; //開始讓COUNT=-1,方便後面顯示數碼管
sbit Beep=P1^2; //蜂鳴器
uchar temp;
uchar pws[6]={8,8,8,8,8,8}; //原始密碼
uchar pwx[6]; //按下的數字存儲區
bit rightflag; //密碼正確標志位
uchar workbuf[6];
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40
}; //段選碼,共陰極
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf
}; //位選碼
uint keyscan();
void delay(uchar z) //延時,ms級
{
uchar y;
for(;z>0;z--)
for(y=120;y>0;y--);
}
void setpw() //設置密碼函數
{
keyscan();
}
uint keyscan() //鍵盤掃描函數
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5); //鍵盤去抖,最好20ms以上,這里用了5ms
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
count++;//按鍵計數加1
temp=P3;
switch(temp)
{
case 0xee:
{
num=7;
if(count<6) //六位密碼,所以COUNT<6
{
if(set==0) //設置密碼鍵沒有按下時
pwx[count]=num; //存儲按下的數字
else
pws[count]=num; //設置密碼鍵按下時,設置新密碼
workbuf[count]=table[11]; //相應位的數碼管顯示"--",不顯示相應的數字,密碼是保密的
}
}
break;
case 0xde:
{
num=8;
if(count<6) //以下掃描鍵盤的原理差不多同上
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xbe:
{
num=9;
{
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
}
break;
case 0x7e: //設置密碼鍵按下
{
set=1; //設置密碼標志位置1
P1_3=0; //設置密碼指示燈亮
workbuf[0]=0x00;//數碼管第一位不顯示
workbuf[1]=0x00;//......
workbuf[2]=0x00;//......
workbuf[3]=0x00;
workbuf[4]=0x00;
workbuf[5]=0x00;//......
count=-1; //按鍵計數復位為-1
if(count<6) //密碼沒有設置完,繼續設置密碼
{
setpw(); //設置密碼
}
}
break;
}
while(temp!=0xf0) //按鍵抬起檢測
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
count++;
temp=P3;
switch(temp)
{
case 0xed:
{
num=4;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xdd:
{
num=5;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xbd:
{
num=6;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
count++;
temp=P3;
switch(temp)
{
case 0xeb:
{
num=1;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xdb:
{
num=2;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xbb:
{
num=3;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
count++;
temp=P3;
switch(temp)
{
case 0xd7:
{
num=0;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xe7: num=20;break; //確定鍵按下檢測
case 0x77: //復位鍵或者輸入密碼全部一次刪除
{
P1_1=0; //鎖關
P1_3=1; //密碼設置指示燈滅
set=0; //不設置密碼
num=10; //num復位
count=-1; //COUNT復位
workbuf[0]=table[10]; //第一位數碼管不顯示
workbuf[1]=table[10]; //第二位數碼管不顯示
workbuf[2]=table[10];
workbuf[3]=table[10];
workbuf[4]=table[10];
workbuf[5]=table[10]; //......
P1_0=1; //鎖關
}
break;
case 0xb7: //輸入密碼刪除鍵(一位一位刪除)
{
count--;
workbuf[count]=0x00; //因確定鍵按下時,COUNT也會加1,而確定鍵不是密碼,所以這里是COUNT,而不是COUNT+1
count--; //因確定鍵按下時,確定鍵不是密碼,COUNT也會加1,這里COUNT再自減1
if(count<=-1)
count=-1;
}
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return(num);
}
void init() //利用定時顯示數碼管
{
TMOD=0x01;
TH0=(65536-500)/200;
TL0=(65536-500)%200;
ET0=1;
EA=1;
TR0=1;
}
bit compare() //密碼比較函數
{
if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pwx[5]==pws[5]))
rightflag=1;
else
rightflag=0;
return(rightflag);
}
void main()
{
uint i,j;
init();
P0=0;
P1_1=0; //鎖關
while(1)
{
keyscan();
if(num==20) //如果確定鍵按下(修改密碼和輸入密碼共用的確定鍵)
{
if(count==6)
{
if(set==1) //修改密碼確定
{
P1_3=1;
workbuf[0]=0;
workbuf[1]=0;
workbuf[2]=0;
workbuf[3]=0;
workbuf[4]=0;
workbuf[5]=0;
}
else //輸入密碼確定
{
set=0;
compare();
if(rightflag==1) //如果密碼正確
{
P1_0=0; //鎖開
P1_1=1;
workbuf[0]=table[8]; //數碼管第一位顯示"8"
workbuf[1]=table[8]; //數碼管第二位顯示"8"
workbuf[2]=table[8];
workbuf[3]=table[8];
workbuf[4]=table[8];
workbuf[5]=table[8]; //......
}
else
{
P1_1=0; //鎖仍然是關
workbuf[0]=0X71; //數碼管第一位顯示"F"
workbuf[1]=0X71;
workbuf[2]=0X71;
workbuf[3]=0X71;
workbuf[4]=0X71;
workbuf[5]=0X71; //......
for(i=0;i<1000;i++) //密碼錯誤報警
{
for(j=0;j<80;j++);
Beep=~Beep;
}
break;
}
}
}
else //若輸入的密碼位數不為6位時
{
P1_1=0; //鎖仍然關
workbuf[0]=0X71; //數碼管第一位顯示"F"
workbuf[1]=0X71;
workbuf[2]=0X71;
workbuf[3]=0X71;
workbuf[4]=0X71;
workbuf[5]=0X71;
for(i=0;i<1000;i++)
{
for(j=0;j<80;j++);
Beep=~Beep;
}
break;
}
}
}
}
void timer0() interrupt 1 //顯示數碼管
{
uchar i;
TH0=(65536-500)/200;
TL0=(65536-500)%200;
for(i=0;i<6;i++)
{
P0=workbuf[i];
P2=tablewe[i];
delay(5);
P0=0;
}
}
電路圖就不貼出來了是Protues的模擬,你仔細看下程序電路很簡單無非是數碼管和鍵盤。看看程序中定義的引腳即可。
這個我模擬過的放心使用
③ 基於51的用3位數碼管 顯示單片機控制電子密碼鎖的設計
你好:
鍵盤式電子密碼鎖我用51單片機和悉歲pic單片機做弊陸轎出來過,功能和你的要求大致相同,0~9組成的6位密碼,有重新輸入功能,輸入完6位密碼後自動判斷正誤......。
具租肆體的過程你可以到我的網路空間里看看,我把程序共享了的,還有設計方法。
希望我的回答能幫助到你。
④ 51單片機關於密碼鎖的畢業設計,論文
程序設計內容
(1). 密碼的設定,在此程序中密碼是固定在程序存儲器ROM中,假設預設的密碼為「12345」共5位密碼。
(2). 密碼的輸入問題:由於採用兩個按鍵來完成密碼的輸入,那麼其中一個按鍵為功能鍵,另一個按鍵為數字鍵。在輸入過程中,首先輸入密碼的長度,接著根據密碼的長度輸入密碼的位數,直到所有長度的密碼都已經輸入完畢;或者輸入確認功能鍵之後,才能完成密碼的輸入過程。進入密碼的判斷比較處理狀態並給出相應的處理過程。
(3).按鍵禁止功能:初始化時,是允許按鍵輸入密碼,當有按鍵按下並開始進入按鍵識別狀態時,按鍵禁止功能被激活,但啟動的狀態在3次密碼輸入不正確的情況下發生的。
C語言源程序
#includeunsignedcharcodeps[]={1,2,3,4,5};
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
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)
{
unsignedchari,j;
P2=dispcode[digitcount];
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%6;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(cmpflag==0)
{
if(P3_6==0)//functionkey
{
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)//digitkey
{
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;
}
elseif(funcount>1)
{
psbuf[funcount-2]=digitcount;
}
}
else
{
second3=0;
}
while(P3_7==0);
}
}
}
else
{
cmpflag=0;
for(i=0;i
{
if(ps[i]!=psbuf[i])
{
hibitflag=1;
i=pslen;
errorflag=1;
rightflag=0;
cmpflag=0;
second3=0;
gotoa;
}
}
cc=0;
errorflag=0;
rightflag=1;
hibitflag=0;
a: cmpflag=0;
}
}
}
voidt0(void)
interrupt1using0{ TH0=(65536-500)/256;
TL0=(65536-500)%6;
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;
}
elseif(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;
}
}
}
}
⑤ 基於單片機的密碼鎖設計
可按你的具體要求任意更改,模擬文件和原理圖是完全免費的。
有個現成的,ProteUS模擬誰的下載地址:
1602密碼鎖.rar(http://ishare.iask.sina.com.cn/f/7054562.html)
要求如下:
密碼長度自由可設;
密碼設定必須加密存儲;
三次錯碼輸入報警提示,且10分鍾內不接受再次輸入;
具有超級密碼功能,長度或格式特殊。
16個按鍵說明
10個數字輸入鍵
6個功能鍵
具體說明如下:
CLR鍵:在輸入密碼時如果輸入錯誤,可以按這個鍵清除已經輸入的內容
OK鍵:是確認鍵
CHANGE在開鎖後可以修改密碼
FREE在系統因為錯誤密碼報警以後解除報警的的功能(當然這個時候是要超級密碼的)
CLOSE在開鎖狀態下可以上鎖
OPEN在系統啟動以後,按下這個鍵會出現操作界面(啟動系統屏幕不會有文字顯示,按下後才有)
且實物已經做出,還可用熱轉印的方法製作電路板。
⑥ 51單片機的電子密碼鎖程序,用KEIL C寫的
以前幫別人做過一個類似的
#include<reg52.h>
#include <def.h>
#include"lcd.c"
uchar key;
uchar num;
sbit alarm=P2^4;
sbit open=P2^1;
uchar code table[]={' ','1','2','3',
'4','5','6','7',
'8','9','0'};
void keyscan();
uchar hptable[10];
uchar password[6];
uchar wordbuf[6];
uchar fom[]="input password:";
uchar change[]="set mask:";
uchar state1[]="right";
uchar state2[]="error";
uchar sflag;
uchar dflag,cnt;
uchar setf,fset;
uchar flag;
void main ()
{
uchar hp;
alarm=0;
flag=0;
setf=0;
fset=0;
dflag=0;
lcden=0;
lcdrw=1;
lcdrs=1;
P3=0x0f;
for(hp=0;hp<6;hp++)
{
password[hp]='8';
}
write(0x38,0); //0為寫命令
delay(9);
write(0x08,0);
write(0x01,0);
write(0x06,0);
write(0x0c,0);
write(0x80,0);
for(hp=0;hp<15;hp++)
{
write(fom[hp],1);
}
while(1)
{
// alarm=!alarm;
keyscan();
if(setf==0)
{
if(num>=1&&num<=10)
{
write(0x80+0x40+cnt,0);
write('*',1);
wordbuf[cnt]=table[num];
cnt++;
num=0;
}
}
else
{
write(0x01,0);
write(0x80,0);
for(hp=0;hp<9;hp++)
{
write(change[hp],1);
}
fset=1;
cnt=0;
while(fset)
{
keyscan();
if(num>=1&&num<=10)
{
write(0x80+0x40+cnt,0);
write('*',1);
password[cnt]=table[num];
cnt++;
num=0;
}
if(num==11)
{
write(0x80+0x40+cnt-1,0);
write('