基于5单片机的动态密码锁设计.docx
《基于5单片机的动态密码锁设计.docx》由会员分享,可在线阅读,更多相关《基于5单片机的动态密码锁设计.docx(25页珍藏版)》请在冰豆网上搜索。
基于5单片机的动态密码锁设计
基于51单片机的动态密码锁设计
摘要:
本系统是运用STC89C52单片机为控制核心设计出一个安全系数更加强大的时钟密码锁。
如今我们用的电子密码锁大多数是固定的密码,用户可以设置密码,但这样设置的密码是固定的,除非你不停的对它修改。
这样的密码锁保密性相对较差,因为如果在你输密码的时候密码被人剽窃啦,你的密码锁就如同虚设了。
而本项目所研究的时间密码锁将会帮你完全克服这种问题,当你在输密码的时候,即使被人看到了密码也毫无关系,因为密码是随时间时刻变化的!
让我们做到“输自己的密码,让别人去看吧”。
关键词:
时间密码锁;单片机;动态密码
Abstract:
ThissystemisusedSTC89C52designedasafetycoefficientmorepowerfulclockcombinationlock.Nowweuseelectroniccombinationlockmostisfixedpassword,userscansettheirfavoritepassword,butthispasswordisfixed,unlessyoukeeptofixit.Thiscombinationlocksecrecy,becauseifrelativelypoorinwhenyoulosepasswordspasswordtobethere,youplagiarizedthecombinationlockasbrittle.Butthisprojectresearchtimecombinationlockwillhelpyouovercomethisproblem,whenyoulosepasswords,evenifbepeoplesawnorelationship,becausepasswordalsopasswordisovertimeandever-changing!
Letyoudo"losetheirpassword,letothersgoforit".
Keyword:
Timecombinationpasswordlock;Singlechipmadine;Dynamicpassword.
1.方案设计
1.1理论分析
本项目的设计思路是:
将时间模块运用到密码锁上,将时间和密码组合起来产生一个新的密码,因为时间是变化的,所以密码也是不停变化的,这样设计出来的密码锁保密性将会更强。
比如现在时间是:
2011年3月20日11:
23:
46
调用时间时我们不能简单的固定调用哪几个时间参数,为加强保密性我们还需多设置几个时间的模式给用户选择,比如:
A时分模式B分时模式C日分模式D分日模式
等给大家选择(这里只是简单的列举列了几个模式,还有很多模式可以选择在这里就不一一列举了)。
时间模式的作用是在于调用时间参数,比如时分模式的意思就是调用时间的时位和分位组成一个四位数。
除此之外另外使用者还可以自己设一个密码参数如:
密码参数:
1234
设置了密码参数和时间调用模式,怎么将选取的时间数据和密码参数结合起来呢,一种最为简单而有效地方法就是把两组数据加起来。
但为彰显人性化设计,我们不能简单的将两组数据相加在一起,因为这里牵涉到了四位数的计算,需要考虑计算过程中的进位,这样的计算不仅耗费时间,而且对一些计算水平不好的人来说更是不人性啦,因此我们设计在加数据的时候不需要考虑进位。
比如3+9=12,在这里我们将设置为3+9=2。
大大的减少了计算量,使使用者在使用时更加方便,人性化。
举个例子:
比如现在使用者在设置密码的时候选择“B分时模式”,再设置一个密码参数为:
“1234”时间就是以上时间“2011年3月20日11:
23:
46”。
那么生成的密码就为“2311+1234”为“3545”啦,这样生成的密码在下一分钟就会变化,即使被别人看到密码啦也没关系啦,即使看到密码的人知道你是用的时间密码锁,但不知道你所选的时间选择模式和密码参数也是无济于事的!
为防止别人试探你的密码,我们设计了当三次输入密码错误时键盘就会锁定并发出报警声。
以上就是本项目时间密码锁的理论部分。
1.2芯片选择及理由
主控芯片:
采用STC89C52单片机,该芯片易控制,价格低廉,且已完全能够达到设计需求。
指令处理:
采用TTL集成逻辑门芯片74LS00与非门。
通过与非门对输入的两路(红外探测,密码输入)外部信号进行处理。
达到平行控制电磁锁的开关的效果。
实时时钟:
采用DS1302时钟芯片,这种芯片具有一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、时、分、秒进行计时,具有闰年补偿功能。
主要特点是采用串行数据传输,可以为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
采用普通32.768Hz晶振。
红外探测:
采用LM339芯片,LM339电压比较器芯片内部装有四个独立的电压比较器,利用LM339可以方便的组成各种电压比较器电路和振荡器电路。
2系统实现
2.1硬件设计
2.11系统框图
STC89C52单片机主控制器
12864LCD
液晶显示
矩阵键盘
DS1302时钟
模块
继电器控制电磁铁开锁
红外检测人体接近
电源供电
图2.1系统框图
2.1.2功能模块设计
(1)时钟模块
图2.2时钟模块电路
上图为DS1302时钟芯片和单片机的连接图,其中DS1302芯片工作本身就需要一个外部晶振,通常为32.768kHz。
DS1302芯片的第5、6、7脚接单片机,其中第6脚为数据传输口,数据传输量比较大,易产生干扰,所以我们接一个10K的上拉电阻来保持它的稳定性。
(2)12854液晶模块
图2.3液晶显示电路
本系统采用12864LCD液晶显示,我们将编好了的控制程序写入单片机后,通过单片机控制液晶屏,液晶屏会进行时间的实时显示,和密码输入提示。
提供密码重设,等附加显示功能,并且配合外设的矩阵键盘使用。
(3)矩阵键盘
图2.4矩阵键盘电路
为了提供时间的设定和密码输入功能,我们采用4×4的矩阵键盘(matrixkeyboard)来控制实现。
有10个0~9数字、确认键、返回键、左移键和右移键。
通过主控芯片单片机驱动矩阵键盘,并配合着12864液晶屏的使用。
做到了即时输入即时显示。
这些功能键已经完全可以满足整个系统的功能实现。
(4)红外对管探测人体接近电路
图2.5红外对管电路
考虑到本项目所设计的时间密码锁会用在房间的门上,所以单独为其设计了一套红外探测自动开门系统,将这套系统和时间密码锁配合使用,使其在实际使用中更加人性化。
将这套红外探测系统安装在门的靠房间的一面,当房屋里的人要出去时只要他靠近门达到红外探测距离,门就会自动开,使其更加人性化。
(5)门控制电路
图2.6门控制电路
此模块是由输入指令信号处理电路,继电器(electricrelay)驱动电路和开关门电路三部分组成。
其中指令信号包括红外探测信号,及从单片机的I/O口发出的控制信号。
当门外有人输入密码正确时单片机就会给一路信号驱动继电器来控制开门。
当门内有人要出去是,红外探测同样就会发出信号开门。
这两路信号有通过与非门进行处理,使其能够并行控制开锁电路。
实际操作调试中,运用12V的电磁铁作为锁芯,测试效果理想。
(6)电源电路
图2.7电源电路
主要使用的是L7805稳压芯片,我们购买的蓄电池输出的12V电压,而我们设计的电路大部分都只需要5V的供电电压,如主控模块,单片机5V供电,继电器驱动模块5V供电,红外探测模块,5V供电,各个芯片的工作电压也都是5V的。
因此利用稳压电路进行稳压,从而对各个模块的正常工作进行供电意义重大。
实际测试中,我们用万用表经过多次测量,输出的电压为5V+0.2V。
符合设计标准。
2.2软件设计
2.21软件流程图
图2.8软件流程图
2.22作品部分源程序
(1)界面函数
因本作品涉及到12864的多界面切换显示,所以在编程过程中我们把每个界面单独编成一个子函数然后在主函数中循环调用。
以下是各个界面子函数程序:
voidwelcome()/*欢迎界面*/
{
uchari;
i=0;
lcdpos(3,1);
while(welcome1[i]!
='\0')
{
wdata(welcome1[i]);
delay(100);
i++;
}
i=0;
lcdpos(2,2);
while(welcome2[i]!
='\0')
{
wdata(welcome2[i]);
delay(100);
i++;
}
i=0;
lcdpos(3,3);
while(welcome3[i]!
='\0')
{
wdata(welcome3[i]);
delay(100);
i++;
}
i=0;
lcdpos(2,4);
while(welcome4[i]!
='\0')
{
wdata(welcome4[i]);
delay(100);
i++;
}
lcdpos(9,4);//消光标
}
ucharinterface1()/*界面1,首界面,请求输入密码*/
{
uchara;
ucharkey=0;
uchari=0;
ucharidentify=0;//返回标识
ucharmima[4];
wcom(0x01);//清屏
lcdpos(1,3);
i=0;
while(table3[i]!
='\0')
{
wdata(table3[i]);
i++;
}
lcdpos(2,4);
for(i=0;i<4;)
{
lcdpos(1,1);
timeshow();//显示时间
a=keyscan();//键盘扫描
if(a==12)//返回键设置
{
i=4;
key=2;
identify=1;//返回标识设定
}
if(a<=9&&a>=0)
{
lcdpos(2+i,4);
wdata('*');
mima[i]=a;
i++;
}
}
if(identify==0)//没有返回键按下,执行密码判断语句
{
xuanze();//判定密码模式
if(mima[0]==deal(codon[0],time[0]))//
if(mima[1]==deal(codon[1],time[1]))//密码判断
if(mima[2]==deal(codon[2],time[2]))//
if(mima[3]==deal(codon[3],time[3]))//
key=1;
}
return(key);
}
ucharinterface2()/*界面2密码正确,选择选项*/
{
uchartemp;
uchari;
wcom(0x01);
i=0;
lcdpos(1,1);
while(table4[i]!
='\0')
{
wdata(table4[i]);
i++;
}
i=0;
lcdpos(1,2);
while(table5[i]!
='\0')
{
wdata(table5[i]);
i++;
}
i=0;
lcdpos(1,3);
while(table6[i]!
='\0')
{
wdata(table6[i]);
i++;
}
lcdpos(9,4);
temp=keyscan();
while(temp!
=1&&temp!
=2&&temp!
=3&&temp!
=12)//各选项及返回键选择
{
temp=keyscan();
}
return(temp);
}
voidinterface3()/*界面3开门*/
{
uchari;
i=0;
lcdpos(3,2);
while(table7[i]!
='\0')
{
wdata(table7[i]);
i++;
}
lcdpos(9,4);
open=0;//开继电器
delay(5000);//开门延迟
open=1;
}
voidt_change();//申明时间修改初始化函数
voidinterface4()/*界面4时间修改界面*/
{
uchartim[6];
uchara;
ucharc,d;
uchari=0,j,k;
t_change();
a=keyscan();
lcdpos(2,2);
while(a!
=11&&a!
=12)//确定、返回键判断
{
a=keyscan();
if(a==10)
{
wcom(0x10);
}
if(a==15)
{
wcom(0x14);
}
if(a>=0&&a<=9)
{
wdata(table[a]);
i++;
if(i==2)
{
wcom(0x14);
i=0;
}
}
}
if(a==11)//确定键执行修改;返回键跳过修改
{
lcdpos(4,2);
i=rdata();//在12854中读数据
j=rdata();;//在12854中读数据
k=rdata();;//在12854中读数据
c=j-0x30;
d=k-0x30;
tim[1]=c*16+d;
lcdpos(6,2);
i=rdata();
j=rdata();
k=rdata();
c=j-0x30;
d=k-0x30;
tim[2]=c*16+d;
lcdpos(2,4);
i=rdata();
j=rdata();
k=rdata();
c=j-0x30;
d=k-0x30;
tim[3]=c*16+d;
lcdpos(4,4);
i=rdata();
j=rdata();
k=rdata();
c=j-0x30;
d=k-0x30;
tim[4]=c*16+d;
lcdpos(6,4);
i=rdata();
j=rdata();
k=rdata();
c=j-0x30;
d=k-0x30;
tim[5]=c*16+d;
write_ds(0x8e,0x00);
write_ds(0x80,tim[5]);
write_ds(0x82,tim[4]);
write_ds(0x84,tim[3]);
write_ds(0x86,tim[2]);
write_ds(0x88,tim[1]);
write_ds(0x8e,0x80);
}
}
ucharinterface5()/*界面5,密码修改*/
{
uchari;
uchara;
ucharidentify=0;
i=0;
lcdpos(1,1);
while(table11[i]!
='\0')
{
wdata(table11[i]);
i++;
}
i=0;
lcdpos(1,2);
while(table13[i]!
='\0')
{
wdata(table13[i]);
i++;
}
i=0;
lcdpos(1,3);
while(table14[i]!
='\0')
{
wdata(table14[i]);
i++;
}
i=0;
lcdpos(1,4);
while(table12[i]!
='\0')
{
wdata(table12[i]);
i++;
}
lcdpos(7,1);
a=keyscan();
while(a!
=1&&a!
=2&&a!
=3&&a!
=4&&a!
=12)//修改密码模式
{
if(a!
=12)
{
a=keyscan();
mimams=a;
}
if(a==12)
identify=1;
}
if(identify!
=1)
{
wdata(table[mimams]);
lcdpos(6,4);
for(i=0;i<4;)//修改密码参数
{
a=keyscan();
if(0<=a&&a<=9)
{
wdata(table[a]);
codon[i]=a;
i++;
}
}
lcdpos(9,4);
while(keyscan()!
=11);//确认键
}
return(mimams);
}
(2)主函数部分
voidmain()
{
uchartemp=0;
ucharsign=0;//错误密码输入次数标记
uchari=0;
ucharkey;
lcd_init();//液晶初始化
welcome();欢迎界面
delay(1000);
init1302();//DS1302初始化
while
(1)//主循环
{
key=interface1();//界面1
if(key==1)//密码正确进入下一步菜单
{
temp=interface2();//界面2
if(temp==1)//开门判断
{
wcom(0x01);
interface3();//界面3
}
if(temp==2)//改时间判断
{
wcom(0x01);
interface4();//界面4
}
if(temp==3)//修改密码判断
{
interface5();//界面5
}
sign=0;//错误密码输入次数清除
}
if(key==0)//密码输入错误处理
{
error();//密码错误处理函数
sign++;
if(sign==3)//三次密码输入错误就报警
{
sign=0;
wcom(0x01);
i=0;
lcdpos(4,1);
while(table10[i]!
='\0')
{
wdata(table10[i]);
i++;
}
i=0;
lcdpos(1,3);
while(table15[i]!
='\0')
{
wdata(table15[i]);
i++;
}
lcdpos(9,4);
fm=0;
delay(10000);
fm=1;
wcom(0x01);
}
}
}
}
3附录
图3.1作品全景图1
图3.2作品全景图2