基于单片机的电子密码锁.docx

上传人:b****4 文档编号:3385931 上传时间:2022-11-22 格式:DOCX 页数:31 大小:146.98KB
下载 相关 举报
基于单片机的电子密码锁.docx_第1页
第1页 / 共31页
基于单片机的电子密码锁.docx_第2页
第2页 / 共31页
基于单片机的电子密码锁.docx_第3页
第3页 / 共31页
基于单片机的电子密码锁.docx_第4页
第4页 / 共31页
基于单片机的电子密码锁.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

基于单片机的电子密码锁.docx

《基于单片机的电子密码锁.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子密码锁.docx(31页珍藏版)》请在冰豆网上搜索。

基于单片机的电子密码锁.docx

基于单片机的电子密码锁

#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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1