① 基于单片机电子密码锁设计~
以前我在网上找到过密码锁的源代码,你可以找找。给你一个思路吧,先用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('