单片机电子密码锁可以修改设置密码基于51单片机与AT24C02与LCD1602显示.docx
- 文档编号:25639184
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:15
- 大小:23.58KB
单片机电子密码锁可以修改设置密码基于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[]="";
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; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子 密码锁 可以 修改 设置 密码 基于 51 AT24C02 LCD1602 显示