单片机电子密码锁可以修改设置密码基于51单片机与AT24C02与LCD1602显示.docx
《单片机电子密码锁可以修改设置密码基于51单片机与AT24C02与LCD1602显示.docx》由会员分享,可在线阅读,更多相关《单片机电子密码锁可以修改设置密码基于51单片机与AT24C02与LCD1602显示.docx(15页珍藏版)》请在冰点文库上搜索。
单片机电子密码锁可以修改设置密码基于51单片机与AT24C02与LCD1602显示
单片机电子密码锁(可以修改设置密码)——基于51单片机与AT24C02与LCD1602显示
其电路图连接如下:
本人已经用硬件实验,程序可用。
正确~~
本程序特点:
装载后读者可以自改密码,然后需要再次载入程序时:
可以把主程序aa=Sendstring(0xa0,1,table2,6);这一句去掉。
然后程序的电子锁密码就是你个人设置的密码。
程序代码为:
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLCDIOP2
#definedelay4us()_nop_();_nop_();_nop_();_nop_();
ucharbuffer[6]={0};
sbitsda=P3^7;
sbitscl=P3^6;
sbitbeep=P3^5;
bitflag=0,aa;//用户蹲渊义定时溢出标志位
ucharDSY_BUFFER[16]="";
ucharDSY_BUFFER1[16]="";
ucharUserpassword[6]={0};
sbitrs=P0^4;
sbitrd=P0^3;
sbitlcden=P0^2;
sbitled=P3^0;
ucharcodetable2[]="123456";
ucharcodetable[]="YourPassword...";
voiddelayms(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddelay()//短延时,两个机器周期,做总线的延时用
{;;}
voidwrite_com(ucharcom)
{
rs=0;
rd=0;
lcden=0;
P2=com;
delayms(3);
lcden=1;
delayms(3);
lcden=0;
}
voidwrite_date(uchardate)
{
rs=1;
rd=0;
lcden=0;
P2=date;
delayms(3);
lcden=1;
delayms(3);
lcden=0;
}
voidDisplay_String(uchar*p,ucharcom)
{uchari;
write_com(com);
for(i=0;i<16;i++)
{
write_date(p[i]);
}
}
voidinit_lcd()
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
Display_String(table,0x80);
Display_String("LockOK!
",0xc0);
}
voidstart()
{
sda=1;
scl=1;
delay4us();
sda=0;
delay4us();
scl=0;
}
voidstop()
{
sda=0;
scl=1;
delay4us();
sda=1;
delay4us();
scl=0;
}
voidinit()//初始化
{
sda=1;
delay();
scl=1;
delay();
}
voidack()
{
sda=0;
scl=1;
delay4us();
scl=0;
sda=1;
}
voidnoack()
{
sda=1;
scl=1;
delay4us();
scl=0;
sda=0;
}
ucharrecbyte()
{
uchari,rd;
rd=0x00;
sda=1;
for(i=0;i<8;i++)
{
scl=1;
rd<<=1;
rd|=sda;
delay4us();
scl=0;
delay4us();
}
scl=0;
delay4us();
returnrd;
}
ucharsendbyte(ucharwd)
{
uchari;
bitack0;
for(i=0;i<8;i++)
{
sda=(bit)(wd&0x80);
_nop_();
_nop_();
scl=1;
delay4us();
scl=0;
wd<<=1;
}
delay4us();
sda=1;
scl=1;
delay4us();
ack0=!
sda;
scl=0;
delay4us();
returnack0;
}
ucharRecstring(ucharslave,ucharsubaddr,uchar*buffer,ucharn)
{
uchari;
start();
if(!
sendbyte(slave))return0;
if(!
sendbyte(subaddr))return0;
start();
if(!
sendbyte(slave+1))return0;
for(i=0;i{
buffer[i]=recbyte();
ack();
}
buffer[n-1]=recbyte();
noack();
stop();
return1;
}
ucharSendstring(ucharslave,ucharsubaddr,uchar*buffer,ucharn)
{
uchari;
start();
if(!
sendbyte(slave))return0;
if(!
sendbyte(subaddr))return0;
for(i=0;i{
if(!
sendbyte(buffer[i]))return0;
}
stop();
return1;
}
voidclear_password()
{uchari;
for(i=0;i<6;i++)
{
Userpassword[i]='';
}
for(i=0;i<16;i++)
{
DSY_BUFFER[i]='';
}
}
ucharKeys_Scan()
{
uchartemp,keynum;
P1=0x0F;
delayms(5);
temp=P1^0x0F;
switch(temp)
{
case1:
keynum=0;break;
case2:
keynum=1;break;
case4:
keynum=2;break;
case8:
keynum=3;break;
break;
}
P1=0xF0;
delayms(5);
temp=P1>>4^0x0F;
switch(temp)
{
case1:
keynum+=0;break;
case2:
keynum+=4;break;
case4:
keynum+=8;break;
case8:
keynum+=12;break;
break;
}
delayms(600);
returnkeynum;
}
voidmain()
{uchartemp,i=0,j=0,k=0,n;
ucharIS_valid_user;
beep=1;
init();
init_lcd();
delayms(5);
aa=Sendstring(0xa0,1,table2,6);
delayms(5);
aa=Recstring(0xa0,1,buffer,6);
delayms(10);
P1=0x0f;
while
(1)
{
if(P1!
=0x0f)
{
temp=Keys_Scan();
switch(temp)
{
case0:
case1:
case2:
case3:
case4:
case5:
case6:
case7:
case8:
case9:
if(i<=5)//密码限制在6位以内
{
Userpassword[i]=temp;
DSY_BUFFER[i]='*';
Display_String(DSY_BUFFER,0xc0);
i++;
}
break;
case10:
//按A键开锁
for(k=0;k<6;k++)
{
if(buffer[k]==(Userpassword[k]+48))
flag=1;
else
flag=0;
}
if(flag==1)
{flag=0;
i=0;
led=0;//点亮LED
clear_password();
Display_String("OPENOK!
",0xc0);
IS_valid_user=1;
j=0;
}
else
{
j++;
led=1;//关闭LED
clear_password();
Display_String("ERROR!
Havetry",0xc0);
write_com(0xcf);
write_date(0x30+j);
IS_valid_user=0;
}
i=0;
break;
case11:
//按B键上锁
led=1;
clear_password();
Display_String(table,0x80);
Display_String("LockOK!
",0xc0);
i=0;
IS_valid_user=0;
break;
case12:
//按C键设置新密码
//如果是合法用户则提示输入新密码
if(!
IS_valid_user)
{
i=0;
Display_String("Norights!
",0xc0);
delayms(1000);
Display_String("YourPassword...",0x80);
Display_String("LockOK!
",0xc0);
}
else
{
i=0;
Display_String("NewPassword:
",0x80);
Display_String("",0xc0);
}
break;
case13:
//按D键保存新密码
if(!
IS_valid_user)
{i=0;
Display_String("Norights!
",0xc0);
delayms(1000);
Display_String("YourPassword...",0x80);
Display_String("LockOK!
",0xc0);
}
else
{i=0;
init();
delayms(5);
for(k=0;k<6;k++)
{
Userpassword[k]=Userpassword[k]+48;
}
aa=Sendstring(0xa0,1,Userpassword,6);
delayms(5);
aa=Recstring(0xa0,1,buffer,6);
delayms(5);
clear_password();
Display_String(table,0x00);
Display_String("PasswordSaved!
",0xc0);
delayms(1000);
Display_String("Dolockagian?
",0xc0);
}
break;
case14:
//按E键消除所有输入
i=0;
clear_password();
Display_String("",0xc0);
break;
case15:
//清除一位
if(i!
=0)i--;
for(n=0;n
{
DSY_BUFFER1[n]='*';
}
Display_String(DSY_BUFFER1,0xc0);
}
P1=0x0f;
}
if(j==3)
{Display_String("THIEF!
!
!
THIEF!
!
!
",0xc0);
j=0;
beep=0;
}
}
}