基于单片机的电子密码锁.docx
《基于单片机的电子密码锁.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子密码锁.docx(31页珍藏版)》请在冰豆网上搜索。
基于单片机的电子密码锁
#include
#include
#include"eeprom.h"
#defineuintunsignedint
#defineucharunsignedchar
#defineKEYP3//键盘输入端口
#defineNo_key20//无按键时的返回值
#definelcddataP0//1602的数据输入端口
sbitlcden=P2^6;
sbitlcdrs=P2^4;
sbitlcdrw=P2^5;
sbitlight=P1^4;
sbitlight1=P1^3;
sbitSPK=P1^5;
unsignedcharfrq;
ucharj;//用来统计输入个数的全局变量
longintaa;//用来在定时器中计数的全局变量
uchartemp;
ucharcount;
ucharcodetable[]="Hello!
";
ucharcodetable1[]="OK!
";
ucharcodetable2[]="Enterplease:
";
ucharcodetable3[]="Codeisright!
";
ucharcodetable4[]="Codeiswrong!
";
ucharcodetable5[]="Managermodel!
";
ucharcodetable6[]="Overtime!
";
ucharcodetable7[]="Changemodel!
";
ucharcodetable8[]="Oldcode!
";
ucharcodetable9[]="Newcode!
";
ucharcodetable10[]="ChangeisOK!
";
ucharcodetable11[]="Youaremanager";
ucharcodetable12[]="Lockkeyboard!
";
ucharcodetable13[]="Openkeyboard!
";
ucharcodekey_table[16]={1,2,3,10,4,5,6,11,7,8,9,12,0,13,14,15};
ucharpassword[]={2,2,2,2,2,2};//设定初始密码
ucharpassword1[]={1,1,1,1,1,1};
ucharsave[6]={9,9,9,9,9,9};//保存输入的数据
ucharconflag;//确认标志位
ucharlockflag;//锁键盘标志
ucharstartflag;//开始标志
ucharmanflag;
uchartimeflag;
ucharchangeflag=0;
ucharuseflag;
voidsounder();
voiddelay(uintz);//延时子程序
voidwright_com(ucharcom);//写指令
voidwright_data(uchardate);//写数据函数
voidinit();//初始化
voiddisplay_OK();//显示OK
voidfunction12();
voidfunction11();
voiddelete();//删除输入的最后一个数
ucharkeyscan();//带返回值的键盘扫描程序
voidMconfirm();
voidenter_code(uchart);//输入密码函数
voidconfirm();//确认密码正确与否
voidsucceed_an();//输入正确时的响应
voidfail_an();//输入错误时的响应
voidlockkey();//锁键盘三秒
voidalarm();//发出警报
voidreset();//复位函数
voidreset1();
voiddisplay_enter();//显示输入
voiddisplay_wrong();
voiddisplay_manager();
voiddisplay_time();
voiddisplay_change();
voiddisplay_old();
voiddisplay_new();
voiddisplay_chOK();
voiddisplay_you();
voiddisplay_lock();
voiddisplay_open();
voidmain(void)
{//ucharv;
//for(v=0;v<6;v++)
//{Write_IIC(v,password[v]);
//}
init();
while
(1)
{
if(lockflag)
{
temp=keyscan();//锁键期间也要进行键盘扫描
if(temp==12)
{
function12();
}
if(manflag)
{
enter_code(temp);//每扫描一次键盘就要进行一次处理,保存输入的数值
if(temp==15)//按下确认键盘就要进行面膜确认
{
confirm();//进行密码确认
if(conflag)//密码确认为正确
{
count=0;
display_open();//显示成功
delay(1500);
j=0;
lockflag=0;
manflag=0;
init();
}
else
{
fail_an();//密码错误
}
}
if(temp==14)
{
delete();//作删除操作
}
}
}
else
{
temp=keyscan();//反复扫描输入,等待随时输入
if(temp!
=No_key)//有按键按下时进行下面操作
{
if(temp==10)
{
reset();
startflag=1;//开始标志置位
}
if(temp==13)
{
init();
}
if(changeflag)
{
if(temp==11)
{
function11();
}
if(useflag==0)
{
enter_code(temp);//每扫描一次键盘就要进行一次处理,保存输入的数值
if(temp==15)
{
confirm();//进行密码确认
if(conflag)
{
display_new();
}
else
{
fail_an();//密码错误
}
}
if(temp==14)
{
delete();//作删除操作
}
}
if(useflag==1)//按下确认键盘就要进行面膜确认
{
enter_code(temp);//每扫描一次键盘就要进行一次处理,保存输入的数值
if(j==6&&temp==15)
{uintn;
for(n=0;n<6;n++)
{
Write_IIC(n,save[n]);
}
display_chOK();
delay(1500);
init();
changeflag=0;
useflag=0;
}
if(temp==14)
{
delete();//作删除操作
}
}
if(temp==14)
{
delete();//作删除操作
}
}
if(changeflag==0)
{
if(startflag)
{
enter_code(temp);//每扫描一次键盘就要进行一次处理,保存输入的数值
if(temp==12)
{
function12();
}
if(temp==15&&useflag==0)//按下确认键盘就要进行面膜确认
{
confirm();//进行密码确认
if(conflag==1)//密码确认为正确
{
if(manflag)
{
manflag=0;
count=0;
display_you();//显示成功
delay(1500);
}
else
{
succeed_an();
init();
}
}
else
{
fail_an();//密码错误
}
}
if(temp==14)
{
delete();//作删除操作
}
}
}
}
}
}
}
/***********显示enter***********/
voiddisplay_enter()
{
ucharnum;
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table2[num]);
}
}
/***********显示manager***********/
voiddisplay_manager()
{
ucharnum;
wright_com(0x80+0x40);
for(num=0;num<6;num++)
{
wright_data('');//显示的是空格
}
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table5[num]);
}
}
/***********显示进入修改程序***********/
voiddisplay_change()
{
ucharnum;
wright_com(0x80+0x40);
for(num=0;num<6;num++)
{
wright_data('');//显示的是空格
}
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table7[num]);
}
}
/***********显示输入旧密码***********/
voiddisplay_old()
{
ucharnum;
wright_com(0x80+0x40);
for(num=0;num<6;num++)
{
wright_data('');//显示的是空格
}
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table8[num]);
}
}
/***********显示修改成功***********/
voiddisplay_chOK()
{
ucharnum;
wright_com(0x80+0x40);
for(num=0;num<6;num++)
{
wright_data('');//显示的是空格
}
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table10[num]);
}
aa=0;
timeflag=0;
}
/***********显示输入新密码***********/
voiddisplay_new()
{
ucharnum;
wright_com(0x80+0x40);
for(num=0;num<6;num++)
{
wright_data('');//显示的是空格
}
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table9[num]);
}
useflag=1;
j=0;
}
/***********显示键盘锁定***********/
voiddisplay_lock()
{
ucharnum;
wright_com(0x80+0x40);
for(num=0;num<6;num++)
{
wright_data('');//显示的是空格
}
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table12[num]);
}
}
/***********显示开启键盘***********/
voiddisplay_open()
{
ucharnum;
wright_com(0x80+0x40);
for(num=0;num<6;num++)
{
wright_data('');//显示的是空格
}
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table13[num]);
}
}
/***********显示OK***********/
voiddisplay_OK()
{
ucharnum;
wright_com(0x80+0x40);
for(num=0;num<6;num++)
{
wright_data('');//显示的是空格
}
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table3[num]);
}
}
/***********显示管理员***********/
voiddisplay_you()
{
ucharnum;
wright_com(0x80+0x40);
for(num=0;num<6;num++)
{
wright_data('');//显示的是空格
}
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table11[num]);
}
}
/***********显示wrong***********/
voiddisplay_wrong()
{
ucharnum;
wright_com(0x80+0x40);
for(num=0;num<6;num++)
{
wright_data('');//显示的是空格
}
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table4[num]);
}
}
/***********显示超时***********/
voiddisplay_time()
{
ucharnum;
wright_com(0x80+0x40);
for(num=0;num<6;num++)
{
wright_data('');//显示的是空格
}
wright_com(0x80);
for(num=0;num<17;num++)
{
wright_data(table6[num]);
}
}
/*********删除最后一个*********/
voiddelete()
{
j--;
wright_com(0x80+0x40+j);//确定删除对象
wright_data('');//显示空格即为删除
save[j]=0;//删除后数据清零
wright_com(0x80+0x40+j);//为下次输入数据时写好位置,必须是在最后一位后面
}
/**********对各位变量进行复位************/
voidreset()
{
ucharnum;
timeflag=0;
aa=0;
display_enter();
wright_com(0x80+0x40);//擦出屏幕上的显示
for(num=0;num<6;num++)
{
save[num]=0;//对输入的数据进行清零
wright_data('');//显示的是空格
}
wright_com(0x80+0x40);//下次再输入时可以有从起始位置输入
conflag=0;
j=0;
}
voidreset1()
{
ucharnum;
timeflag=0;
aa=0;
display_old();
wright_com(0x80+0x40);//擦出屏幕上的显示
for(num=0;num<6;num++)
{
save[num]=0;//对输入的数据进行清零
wright_data('');//显示的是空格
}
wright_com(0x80+0x40);//下次再输入时可以有从起始位置输入
conflag=0;
j=0;
}
/************输入密码正确进行响应***************/
voidsucceed_an()
{
if(lockflag)
{
lockflag=0;
manflag=0;
count=0;
display_you();//显示成功
delay(1500);
}
else
{
light=0;//灯亮
display_OK();//显示成功
delay(4000);
light=1;//灯灭
count=0;
manflag=0;
}
j=0;
}
/**********输入密码错误进行响应***********/
voidfail_an()
{
light1=0;//灯亮
display_wrong();
delay(4000);
alarm();
light1=1;//灯灭
lockkey();
}
/*********发出警报声**********/
voidalarm()
{
sounder();
}
/***********错误三次锁键盘************/
voidlockkey()
{
count++;
if(count==3)
{
lockflag=1;
display_lock();
}
}
/***********输入密码并在屏幕上显示星号************/
voidenter_code(uchart)
{
timeflag=1;
if(t>=0&&t<10&&j<6)
{
if(j==0)
{
wright_com(0x80+0x40);//第一输入时要先写入地址指令,否则无法显示
wright_data('*');
}
else
{
wright_data('*');//不是第一个输入则不用再写地址
}
save[j++]=t;//保存输入的数据
}
}
/*********校对密码以确定是不是正确的***********/
voidconfirm()
{
uintk;
aa=0;
timeflag=0;
for(k=0;k<6;k++)
{
if(manflag==1)
{
if(password1[k]!
=save[k])//对数组中的内容进行逐一比较,一旦有数据不对马上退出循环
{
break;
}
}
else
{
if(Random_Read(k)!
=save[k])//对数组中的内容进行逐一比较,一旦有数据不对马上退出循环
{
break;
}
}
}
if(k==6)//要是条件退出的话要说明六个数全对密码
{
conflag=1;//进行标志密码正确
changeflag=1;
}
}
/********中断服务程序**********/
voidtimer()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//重装初值
if(timeflag)
{
aa++;
if(aa>=300)//十秒到了
{
aa=0;//清零可以方便下次再使用
display_time();
light1=0;//灯亮
timeflag=0;
alarm();
delay(1000);
light1=1;//灯灭
lockkey();
}
}
}
/*******初始化***********/
voidinit()
{
ucharnum;
/**********定时器初始化*********/
TMOD=1;
TH0=(6553