完整版单片机电子密码锁可以修改设置密码基于51单片机毕业论文.docx
《完整版单片机电子密码锁可以修改设置密码基于51单片机毕业论文.docx》由会员分享,可在线阅读,更多相关《完整版单片机电子密码锁可以修改设置密码基于51单片机毕业论文.docx(12页珍藏版)》请在冰豆网上搜索。
![完整版单片机电子密码锁可以修改设置密码基于51单片机毕业论文.docx](https://file1.bdocx.com/fileroot1/2023-2/10/505a05bc-9ee0-499d-bf1f-212885766156/505a05bc-9ee0-499d-bf1f-2128857661561.gif)
完整版单片机电子密码锁可以修改设置密码基于51单片机毕业论文
单片机电子密码锁(可以修改设置密码)――
基于51单片机与AT24C02与LCD1602显示
其电路图连接如下:
本人已经用硬件实验,程序可用。
正确~~
本程序特点:
装载后读者可以自改密码,然后需要再次载入程序时:
可以把主程序aa=Sendstring(0xa0,1,table2,6)这一句去掉。
然后程序的电子锁密码就是你个人设置的密码。
LCD1
VourPassword*・・
程序代码为:
#includeucharcodetable[]="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++){
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();
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();
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=P1A0x0F;
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>>4A0x0F;
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;
",0xc0);
led=0;点亮LEDclear_password();Display_String("OPENOK!
IS_valid_user=1;
j=0;
else
{
j++;
led=1;关闭LED
clear_password();
Display_String("ERROR!
Havetrywrite_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!
i=0;
IS_valid_user=0;break;
",0xc0);
",0xc0);
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;
",0xc0);
Display_String("Norights!
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;
}