您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页(完整版)单片机电子密码锁(可以修改设置密码)——基于51单片机毕业论文

(完整版)单片机电子密码锁(可以修改设置密码)——基于51单片机毕业论文

来源:五一七教育网


单片机电子密码锁 (可以修改设置密码)――

基于51单片机与AT24C02与LCD1602显示

其电路图连接如下:本人已经用硬件实验,程序可用。正确

~~

本程序特点:装载后读者可以自改密码,然后需要再次载入程 序时:

可以把主程序aa=Sendstring(0xa0,1,table2,6)这一句去掉。然后 程序的电子锁密码就是你个人设置的密码。

LCD1

Vour Password* ・・ EEJ KBBI&flEK

・丿一 r^35 4|E - 一■ «* L凰 XrMJ

Rir

F7.!|

i A A —i nJllJ31m 3 ■

ir^

OTT EF

P?E7T

■理・—

Trr W

口 t

・U1

am

HP WK

TTS■?T

■ i* -

■3

TF

4 LSl^fc 』 _ W>M. _ _

, l

J-p— ...... 』 =]初始密码:〕23456

程序代码为:

#includeuchar code table[]=\"Your Password...\"; void delayms(uint z)

{

uint x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void delay() 短延时,两个机器周期 {;;}

void write_com(uchar com)

{

rs=0; rd=0; lcden=0; P2=com; delayms(3); lcden=1; delayms(3); lcden=0;

}

void write_date(uchar date)

{

rs=1; rd=0; lcden=0;

,做总线的延时用

P2=date; delayms(3); lcden=1; delayms(3); lcden=0;

}

void Display_String(uchar *p,uchar com) { uchar i;

write_com(com); for(i=0;i<16;i++)

{

write_date(p[i]);

}

}

void init_lcd()

{

lcden=0;

write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80);

Display_String(table,0x80);

Display_String(\"Lock OK! }

\

void start() {

sda=1; scl=1; delay4us(); sda=0; delay4us(); scl=0;

}

void stop()

{

sda=0; scl=1; delay4us(); sda=1; delay4us(); scl=0;

}

void init() 初始化sda=1; delay(); scl=1; delay();

}

{

void ack()

{

sda=0;

scl=1; delay4us(); scl=0; sda=1;

}

void noack()

{

sda=1;

scl=1; delay4us(); scl=0; sda=0;

}

uchar recbyte()

{

uchar i,rd; rd=0x00; sda=1;

for(i=0;i<8;i++) {

rd<<=1;

scl=1;

rd|=sda; delay4us(); scl=0; delay4us();

}

scl=0; delay4us(); return rd;

}

uchar sendbyte(uchar wd)

{

uchar i; bit ack0; 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(); return ack0;

}

uchar Recstring(uchar slave,uchar subaddr,uchar *buffer,uchar n) uchar i; start();

if(!sendbyte(slave)) return 0; if(!sendbyte(subaddr)) return 0; start();

if(!sendbyte(slave+1)) return 0; for(i=0;i{

buffer[i]=recbyte(); ack();

}

buffer[n-1]=recbyte(); noack(); stop();

return 1;

{

uchar Sendstring(uchar slave,uchar subaddr,uchar *buffer,uchar n) {

uchar i; start();

if(!sendbyte(slave)) return 0;

if(!sendbyte(subaddr)) return 0; for(i=0;i{

if(!sendbyte(buffer[i])) return 0;

}

stop(); return 1;

}

void clear_password() {

uchar i;

for(i=0;i<6;i++)

{

Userpassword[i]=' ';

}

for(i=0;i<16;i++)

{

DSY_BUFFER[i]=' ';

}

}

uchar Keys_Scan()

uchar temp,keynum; P1=0x0F; delayms(5); temp=P1A0x0F;

switch(temp)

{

case 1:keynum=0;break; case 2:keynum=1;break; case 4:keynum=2;break; case 8:keynum=3;break; break;

}

P1=0xF0; delayms(5); temp=P1>>4A0x0F; switch(temp)

{

case 1:keynum+=0;break; case 2:keynum+=4;break; case 4:keynum+=8;break;

case 8:keynum+=12;break; break;

}

delayms(600); return keynum;

void main()

{ uchar temp,i=0,j=0,k=0,n;

uchar IS_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)

{

case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9:

if (i<=5)

密码在 6 位以

{

Userpassword[i]=temp; DSY_BUFFER[i]='*'; Display_String(DSY_BUFFER,0xc0); i++;

}

break;

case 10: 按 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(\"OPEN OK! IS_valid_user = 1; j=0;

\

else

{

j++;

led=1; 关闭 LED clear_password();

Display_String(\"ERROR!Have try write_com(0xcf); write_date(0x30+j); IS_valid_user=0;

}

\

i=0; break;

case 11: 按 B 键上锁 led=1; clear_password();

Display_String(table,0x80); Display_String(\"Lock OK! i=0; IS_valid_user=0; break;

\

case 12: 按 C 键设置新密码

如果是合法用户则提示输入新密码

if ( !IS_valid_user)

{

i=0;

Display_String(\"No rights ! delayms(1000);

Display_String(\"Your Password...\Display_String(\"Lock OK! \

}

\

else

{

i=0;

Display_String(\"New Password: \Display_String(\" \}

break;

case 13: 按 D 键保存新密码 if ( !IS_valid_user) { i=0;

Display_String(\"No rights ! delayms(1000);

Display_String(\"Your Password...\

\

Display_String(\"Lock OK! \

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(\"Password Saved! \delayms(1000);

Display_String(\"Do lock agian ?

}

\

break;

case 14: 按 E 键消除所有输入 i=0;

clear_password();

Display_String(\" \

case 15: 清除一位 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!!!\

j=0; beep=0;

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务