电子密码锁设计基于51单片机

电子密码锁设计基于51单片机,第1张

[1]单片机多功能密码系统/防火防盗系统设计

实现功能:

1、 密码锁功能/可以修改密码, 下次开机后新密码仍然有效

2、 支持一键恢复初始密码

3、 可添加防火防盗报警功能

4、 可进行功能定制

☆已作出的实物优酷视频演示地址:

>

#define uint unsigned int

char leab[]={0x7f,0x7f,0x7f,0x7f,0x7f,0x7f};

delay(uint z)

{

uint x;

for(;z<0;z--)

for(x=0;x<10;x++);//1ms

}

disp()

{

char x,y;

for(x=5;x>=0;x--)

{for(y=0;y<10;y++)

{P0=0;

P2=x;

P0=leab[x];

delay(10);

P0=0;}

}

}

char sao(char g)

{ char d;

switch(g)

{

case 1:d=1; break;

case 2:d=2; break;

case 4:d=3; break;

case 8:d=4; break;

default:d=0; break;

}

return d;

}

char key()

{

char H=0,L=0,d,d1,d2;

while(1)

{ d=0;

P1=0xf0;

if(P1!=0xf0)

{

delay(10);

if(P1!=0xf0)

{

H=(~(P1^0x0f))>>4;

P1=0xff;

P1=0x0f;

L=~(P1^0xf0);

d2=sao(L);

d1=sao(H);

d=(d1-1)4+d2;

P2=d;

}}

if(d!=0) break;

disp();

}

return d;

}

main()

{

char leab1[]={0x00,0x00,0x00,0x00,0x00,0x00};

char leab2[]={0x09,0x08,0x00,0x06,0x01,0x01};

char a,b,d,e=0;

int f;

while(1)

{

P3=0xff;

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

{

leab[a]=0x7f;

leab1[a]=0x00;

}

for(b=0;b<100;b++)

{

disp();

}

//for(c=0;c<6;c++)

//{

// leab[c]=0x00;

//}

while(1)

{

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

{

e=key();

if((e>=1)&(e<=10))

{

leab[d] =0x71;

disp();

leab1[d]=e-1;

}

else

{d=d-1; disp();}

if(e==15) break;

}

if(e==15) break;

while(e!=16)

{ disp();

e=key();

if(e==16)break;

if(e==15) break;

}

if(e==15) break;

if((leab1[0]==leab2[0])&(leab1[0]==leab2[0])&

(leab1[0]==leab2[0])&(leab1[0]==leab2[0])&

(leab1[0]==leab2[0])&(leab1[0]==leab2[0]))

{

for(f=0;f<800;f++)

{P3=0x02;

delay(100);

disp();

}

}

else

{for(f=0;f<800;f++)

{P3=0x01;

delay(100);

disp();

}}

break;

}

}}

#include <reg52h>

#define uint unsigned int

#define uchar unsigned char

#define KEY P3 //键盘输入端口

#define No_key 20 //无按键时的返回值

#define lcddata P2 //1602的数据输入端口

sbit lcden= P1^2;

sbit lcdrs= P1^0;

sbit lcdrw= P1^1;

sbit light= P1^3;

sbit light1= P1^4;

uchar j ; //用来统计输入 个数的全局变量

uchar aa; //用来在定时器中计数的 全局变量

uchar code table[]= " Hello!";

uchar code table1[]=" OK! " ;

uchar code table2[]="Enter please:" ;

uchar code key_table[16] =

{

1,2,3,10,

4,5,6,11,

7,8,9,12,

0,13,14,15

};

uchar password[]={2,0,1,0,9,3} ; //设定初始密码

uchar save[6]; //保存输入的数据

uchar conflag ; //确认标志

uchar lockflag; //锁键盘标志

uchar startflag; //开始标志

void delay(uint z); //延时子函数

void wright_com(uchar com); //写指令函数

void wright_data(uchar date) ; //写数据函数

void init(); //初始化

void display_OK(); // 显示OK

void delete(); //删除输入的最后一个数

uchar keyscan() ; //带返回值的键盘扫描程序

void enter_code(uchar t); //输入密码函数,把输入的数据存入数组中并在屏幕上显示相应的东西,

void confirm(); //确认密码对不对,把输入的数据与密码逐一对比,完全一样刚正确,

void succeed_an(); //输入密码成功时的 响应,

void fail_an(); //输入密码 失败时 响应

void lockkey(); //锁键盘三秒

void alarm(); //发出警报声

void reset(); //复位函数

void display_enter(); //显示输入

void main(void)

{

uchar temp;

init();

while(1)

{

if(lockflag)

{

temp=keyscan(); // 锁键期间也要进行键盘扫描

if(temp!=No_key) //重新记时三秒

{

aa=0; //重新在定时器中计数

}

}

else

{

temp=keyscan(); //反复扫描输入,等待随时输入

if(temp!=No_key) //有按键按下才进行下面的 *** 作

{

if(temp==10)

{

reset();

startflag=1; //开始标志置位

}

if(startflag)

{

enter_code(temp); //每扫描一次键盘就要进行一次处理,保存输入的数值

if(temp==13) //按下确认键盘就要进行密码确认

{

confirm(); //进行确认判断

if(conflag) //密码确认为正确

{

succeed_an(); //密码正确,作出相应的反应

}

else

{

fail_an(); //密码错误,作相应反应

}

}

if(temp==14)

{

delete(); //作删除 *** 作

}

}

}

}

}

}

/ 显示enter/

void display_enter()

{

uchar num;

wright_com(0x80);

for(num=0;num<13;num++)

{

wright_data(table2[num]);

}

}

/ 显示OK/

void display_OK()

{

uchar num;

wright_com(0x80);

for(num=0;num<13;num++)

{

wright_data(table1[num]);

}

}

/ 删除最后一个/

void delete()

{

wright_com(0x80+0x40+j); //确定删除对象

wright_data(' '); //显示空格即为删除

save[--j]=0; //删除后数据清零

wright_com(0x80+0x40+j); //为下次输入数据时写好位置,必须是在最后一个后面

}

/ 对各种变量进行复位/

void reset()

{

uchar num;

display_enter();

wright_com(0x80+0x40); //擦除屏幕上的显示

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

{

save[num]=0; //对输入的数值进行清零

wright_data(' '); //显示的是空格

}

wright_com(0x80+0x40); //下次再输入时可以又从起始位置输入

lockflag=0; //各种变量要清零回起始状态

conflag=0;

j=0;

}

/ 输入密码正确进行响应/

void succeed_an()

{

light=0; //灯亮

display_OK(); //显示成功

delay(1000);

light=1; //灯灭

}

/ 输入密码错误进行响应/

void fail_an()

{

alarm();

lockkey();

}

/ 发出警报声/

void alarm() //这个以后再扩展它

{

}

/锁键盘三秒/

void lockkey()

{

lockflag=1;

}

/输入密码并在屏幕上显示星号/

void enter_code(uchar t)

{

if(t>=0&&t<10)

{

if(j==0)

{

wright_com(0x80+0x40) ; //第一输入时要先写入地址指令,否则无法显示

wright_data('') ;

}

else

{

wright_data('') ;//不是第一个输入则不用再写地址

}

save[j++]=t; //保存输入的数据

}

}

/校对密码以确定是不是正确的/

void confirm()

{

uchar k;

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

{

if(password[k]!=save[k]) //对数组中的内容进行逐一比较,一旦有数据不对马上退出循环

{

break;

}

}

if(k==6) //要是条件退出的话说明六个数全对密码

{

conflag=1; // 进行标志密码正确

}

}

/中断服务程序/

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256; //重装初值

if(lockflag)

{

aa++;

light1=0;

if(aa>=60) //三秒到了

{

aa=0; //清零可以方便下次再使用

light1=1; //关闭警报

lockflag=0; //标志清零解除键锁,方便下次使用

}

}

}

/初始化/

void init()

{

uchar num;

/定时器初始化/

TMOD=1;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

ET0=1;

EA=1; //开启总中断

TR0=1;//把定时器关闭

/1602初始化/

lcdrw=0; //这个必须要置 零,否则无法正常显示

lcden=0;

wright_com(0x38) ; //初始化

wright_com(0x0c) ; //打开光标 0x0c不显示光标 0x0e光标不闪,0x0f光标闪

wright_com(0x01) ; //清显示

wright_com(0x80) ;

for(num=0;num<9;num++)

{

wright_data(table[num]);

delay(1);

}

}

/1602写入指令/

void wright_com(uchar com)

{

lcdrs=0;

lcddata=com;

delay(1);

lcden=1;

delay(1);

lcden=0;

}

/1602写入数据/

void wright_data(uchar date)

{

lcdrs=1;

lcddata=date;

delay(1);

lcden=1;

delay(1);

lcden=0;

}

/延时函数/

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

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

}

/4x4矩阵键盘扫描函数/

uchar keyscan()

{

uchar temp,num=No_key; //num的初值要为无键盘按下时的返回值

/扫描第一行/

KEY=0xfe;

temp=KEY;

temp=temp&0xf0; //读出高四位

while(temp!=0xf0)

{

delay(5); //延时消抖

temp=KEY;

temp=temp&0xf0;

while(temp!=0xf0) //确认确实有按键按下

{

temp=KEY;

switch(temp) //根据这八个电平可以确定是哪个按键按下

{

case 0xee:num=1;

break;

case 0xde:num=2;

break;

case 0xbe:num=3;

break;

case 0x7e:num=10;

break;

}

while(temp!=0xf0) //等待松手

{

temp=KEY;

temp=temp&0xf0;

}

}

}

/扫描第二行/

KEY=0xfd;

temp=KEY;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=KEY;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=KEY;

switch(temp)

{

case 0xed:num=4;

break;

case 0xdd:num=5;

break;

case 0xbd:num=6;

break;

case 0x7d:num=11;

break;

}

while(temp!=0xf0)

{

temp=KEY;

temp=temp&0xf0;

}

}

}

/扫描第三行/

KEY=0xfb;

temp=KEY;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=KEY;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=KEY;

switch(temp)

{

case 0xeb:num=7;

break;

case 0xdb:num=8 ;

break;

case 0xbb:num=9;

break;

case 0x7b:num=12;

break;

}

while(temp!=0xf0)

{

temp=KEY;

temp=temp&0xf0;

}

}

}

/扫描第四行/

KEY=0xf7;

temp=KEY;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=KEY;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=KEY;

switch(temp)

{

case 0xe7:num=0;

break;

case 0xd7:num=13;

break;

case 0xb7:num=14;

break;

case 0x77:num=15;

break;

}

while(temp!=0xf0)

{

temp=KEY;

temp=temp&0xf0;

}

}

}

return num;

}

以上就是关于电子密码锁设计基于51单片机全部的内容,包括:电子密码锁设计基于51单片机、怎么设计一个由51单片机控制的电子密码锁、单片机电子密码锁设计,采用4×4键盘实现密码的输入功能,当密码输入正确之后,锁就打开,如果输入的密码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9288597.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存