基于单片机的密码锁设计Word格式.docx

上传人:b****3 文档编号:17937652 上传时间:2022-12-12 格式:DOCX 页数:24 大小:1.09MB
下载 相关 举报
基于单片机的密码锁设计Word格式.docx_第1页
第1页 / 共24页
基于单片机的密码锁设计Word格式.docx_第2页
第2页 / 共24页
基于单片机的密码锁设计Word格式.docx_第3页
第3页 / 共24页
基于单片机的密码锁设计Word格式.docx_第4页
第4页 / 共24页
基于单片机的密码锁设计Word格式.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

基于单片机的密码锁设计Word格式.docx

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

基于单片机的密码锁设计Word格式.docx

随着人们生活水平的提高和安全意识的加强,对安全的要求也就越来越高。

锁自古以来就是把守护门的铁将军,人们对它要求甚高,既要安全可靠的防盗,又要使用方便,这也是制锁者长期以来研制的主题。

随着电子技术的发展,各类电子产品应运而生,电子密码锁就是其中之一。

据有关资料介绍,电子密码锁的研究从20世纪30年代就开始了,在一些特殊场所早就有所应用。

这种锁是通过键盘输入一组密码完成开锁过程。

研究这种锁的初衷,就是为提高锁的安全性。

由于电子锁的密钥量(密码量)极大,可以与机械锁配合使用,并且可以避免因钥匙被仿制而留下安全隐患。

电子锁只需记住一组密码,无需携带金属钥匙,免除了人们携带金属钥匙的烦恼,而被越来越多的人所欣赏。

电子锁的种类繁多,例如数码锁,指纹锁,磁卡锁,IC卡锁,生物锁等。

但较实用的还是按键式电子密码锁。

20世纪80年代后,随着电子锁专用集成电路的出现,电子锁的体积缩小,可靠性提高,成本较高,是适合使用在安全性要求较高的场合,且需要有电源提供能量,使用还局限在一定范围,难以普及,所以对它的研究一直没有明显进展。

在我国电子锁整体水平尚处于国际七十年代左右,电子密码锁的成本还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先进水平,现国内有几个厂生产供应市场。

但国内自行研制开发的电子锁,其市场结构尚未形成,应用还不广泛。

国内的不少企业也引进了世界上先进的技术,发展前景非常可观。

希望通过不断的努力,使电子密码锁在我国也能得到广泛应用。

2设计要求

1、总共可以设置8位密码,每位密码值范围为1~8.

2、用户可以自行设定和修改密码。

3、按每个密码键时都有声音提示。

4、若键入的8位开锁密码不完全正确,则报警5s,以提醒他人注意。

5、开锁密码连续错3次要报警1分钟,报警期间输入密码无效,以防窃贼多次试探密码。

6、键入的8位开锁密码完全正确才能开锁,开锁时要有1s的提示音。

7、电磁锁的电磁线圈每次通电5s,然后恢复初态。

8、密码设定完毕后要有提示音。

3设计内容

本设计的系统总方案设计方框图如图1所示。

图1系统总设计方框图

3.1、具体硬件电路设计

3.1.1、键盘输入模块设计:

键盘选用4*4矩阵,具有数字键0-9、开锁键、删除键、修改密码键和消除报警键等。

4*4键盘输入模块如图2所示。

图24*4键盘输入模块电路图

3.1.2、单片机最小系统设计:

本设计选用STC89C51单片机作为控制核心。

STC89C51是具有高性能和低功耗优点的8位可编程控制器,内核具有丰富的指令集和32个通用工作寄存器,可以通过软件编程来实现电子密码锁设计中的各项要求和功能,而且单片机的I/O口也足够使用,硬件电路连接比较简单。

单片机最小系统如图3所示[3]。

图3单片机最小系统电路图

3.1.3、LCD显示模块设计:

LCD显示模块选用LCD1602作为主液晶显示器。

此液晶显示屏能输入两行的字母或数字,功能比较简单,通用性强。

本次设计中要显示输入密码的数据值和各功能的提示,使用LCD1602液晶来作为显示模块比较直观形象。

LCD显示模块如图4所示。

图4LCD显示模块电路图

3.1.4、声光报警模块设计:

采用声和光两种方式的双重效果进行报警,如果错误密码输入次数超过三次则报警灯闪烁而且蜂鸣器会报警,这样就能多角度进行密码错误报警。

声光报警模块如图5所示。

图5声光报警模块电路图

3.2、软件设计

3.2.1、主程序流程图:

主程序主要完成LCD初始化、检查有无按键按下、以及调用显示、密码修改程序等等。

主程序流程图如图6所示。

图6主程序流程图

3.2.2、LCD显示模块流程图:

本系统使用LCD1602实现显示,参照LCD1602的使用手册进行初始化和程序编写就可以显示,即在程序编写中添加LCD1602的驱动程序。

这里的驱动程序主要包括:

初始化函数、设置显示坐标、写字符函数及写字符串函数。

在时钟界面时显示时间的运行,在密码锁界面时主要显示提示信息和输入的密码,当然,当输入密码数字时,输出不是显示数字,而是用“*”显示代替。

LCD1602的部分读写控制时序程序如图7所示。

图7LCD显示模块流程图

总结与致谢

这一次做的电子密码锁及LCD显示。

原理看似简单,但过程让我深深感受到再简单的电路图,理论与实际也会有一定的差入。

在参考书原理图的基础上经过了个人的改进,让功能更完善,特别是程序的调试,花的时间最多,也是最难的一个地方。

通过本次设计,培养了创新意识和综合素质,更好地掌握了电子产品设计与制作的工艺和流程,提高个人基本能力、实验及设计能力和独立工作能力,基本知识更加牢固,会看图、会测量、会查资料在设计的过程和设计说明书的撰写过程中,老师给予了我热心的帮助和大力的支持,给我提了诸多的宝贵意见,拓宽了我的思路。

在此我向老师致以崇高的敬意和衷心的感谢!

参考文献

[1]李朝青,单片机原理及接口技术(简明修订版)[M].北京:

北京航空航天大学出版社,1998

[2]李全利.单片机原理及接口技术[M].高等教育出版社,2003

[3]PROTEL99SE电路设计与制板[M].械工业出版社,2007

[4]StevenF.Barrett.DaneilJ.Pack.EmbeddedSystem[M].北京:

电子工业出版社,2006

[5]周立功.LPC900系列Flash单片机应用技术[J].北京航空航天大学出版社,2004

[6]黄智伟.全国大学生电子设计竞赛训练教程[M].北京:

电子工业出版社,2005

附录一:

系统设计总原理图

附录二:

系统设计程序

/*头文件*/

#include<

reg52.h>

intrins.h>

#defineulongunsignedlong

#defineuintunsignedint

#defineucharunsignedchar

#definescan_key_portP1/*定义矩阵按键端口*/

#definelcd_data_portP0/*定义LCD控制端口*/

ucharcodemun_to_char[]={"

0123456789ABCDEF"

};

/*定义数字跟ASCII码的关系*/

uchartemp,num,flag,sum=0,r;

ucharcodetable1[]="

Welcome!

(^_^)"

;

ucharcodetable2[]="

/*定义数字跟ASCII码的关系*/

ucharcodetable3[]="

*********"

ucharcodetable4[]="

Codeiswrong!

"

ucharcodetable5[]="

Youareright!

ucharcodetable6[]="

Thesecondtime!

ucharcodetable7[]="

Thelasttime!

ucharcodetable8[]="

Inputnewcode:

ucharcodetable9[]="

Modifyright!

!

ucharcodetable10[]="

Password:

ucharcodetable11[]="

Wuzirong"

ucharcodetable12[]="

Calling...."

ucharcodetable13[]="

"

ucharcodetable14[]="

Inputagain:

ucharcodetable15[]="

Modifyerror!

ucharinit_pswd[8]={1,2,3,4,5,6,7,8};

//初始化密码

ucharpswd[8]={0};

sbitlcdrs=P1^7;

/*定义LCD控制端口*/

sbitlcdrw=P1^6;

sbitlcden=P2^4;

sbitSpeaker_port=P2^7;

/*喇叭控制端口*/

/*****************************************子函数声明*/

voiddelay(uintz);

voidinit();

//初始化子函数

voidwrite_com(ucharcom);

//写指令子函数

voidwrite_data(uchardat1);

//写数据子函数

voidkeyscan();

voidmima();

voidmima1();

voiddelete();

voiddelay_1ms(ucharx);

/************************************************液晶驱动*/

/*********************/

/*喇叭发声简单程序*/

voidSpeaker_output()

{

uchari;

for(i=0;

i<

100;

i++)

{

Speaker_port=0;

delay_1ms(0.5);

Speaker_port=1;

delay_1ms

(1);

}

}

voidSpeaker_output2()

50;

voidSpeaker_output3()

delay_1ms

(2);

/*1MS为单位的延时程序*/

voiddelay_1ms(ucharx)

ucharj;

while(x--){for(j=0;

j<

125;

j++);

}

voidinit()

lcden=0;

write_com(0x38);

write_com(0x0e);

write_com(0x06);

write_com(0x01);

write_com(0x80);

voidwrite_com(ucharcom)//写指令

lcdrs=0;

lcdrw=0;

P0=com;

delay(5);

lcden=1;

}

voidwrite_data(uchardat1)

lcdrs=1;

P0=dat1;

voiddelay(uintz)

uintx,y;

for(x=z;

x>

0;

x--)

for(y=110;

y>

y--);

voidkeyscan()

ucharsccode,recode,out;

scan_key_port=0xf0;

/*发全"

0"

的行扫描码,列线输入*/

if((scan_key_port&

0xf0)!

=0xf0)/*若有键按下*/

delay_1ms

(2);

/*延时去抖动*/

sccode=0xfe;

/*逐行扫描初值*/

while((sccode&

0x10)!

=0)

scan_key_port=sccode;

/*输出行扫描码*/

=0xf0)/*本行有键按下*/

recode=(scan_key_port&

0xf0)|0x0f;

scan_key_port=0xff;

/*释放按键扫描端口*/

out=((~sccode)+(~recode));

switch(out)

{case~0xe7:

num=0;

flag=1;

Speaker_output();

/*喇叭发出声音*/break;

case~0xd7:

num=1;

case~0xb7:

num=2;

case~0x77:

num=3;

case~0xeb:

num=4;

case~0xdb:

num=5;

case~0xbb:

num=6;

case~0x7b:

num=7;

case~0xed:

num=8;

case~0xdd:

num=9;

}

{

case~0xbd:

num=10;

break;

case~0x7d:

num=11;

case~0xee:

num=12;

case~0xde:

num=13;

case~0xbe:

num=14;

case~0x7e:

num=15;

elsesccode=(sccode<

<

1)|0x01;

/*行扫描左移一位*/

}

/**********************主程序*****************************/

voidmain()

ucharm=0,w=0;

init();

for(r=0;

r<

15;

r++)

write_data(table1[r]);

write_com(0x80+0x40);

for(r=0;

write_data(table11[r]);

write_com(0x0c);

do

{

keyscan();

while(num!

=15);

mima();

while((pswd[m]==init_pswd[m])&

m<

8)//密码比较

m++;

if(m>

=8)//密码正确

delay(200);

Speaker_output3();

/*喇叭发出声音*/

keyscan();

while(flag==1&

&

num==13);

mima1();

else//密码有误

m=0;

write_com(0x80+0x40);

14;

delay_1ms(5);

write_data(table4[r]);

delay(1000);

16;

{

delay(20);

write_data(table6[r]);

mima();

while((pswd[m]==init_pswd[m])&

8)//再次比较

m++;

if(m>

=8)

mima1();

else

m=0;

write_com(0x80+0x40);

for(r=0;

{

delay_1ms(5);

write_data(table4[r]);

Speaker_output2();

/*喇叭发出声音*/

}

init();

delay(20);

write_data(table7[r]);

delay(1000);

mima();

while((pswd[m]==init_pswd[m])&

8)//第三次比较

m++;

if(m>

{

mima1();

else

{

init();

write_com(0x80+0x40);

for(r=0;

{

delay_1ms(100);

write_data(table12[r]);

if(flag==1&

num==13)

{delay(100);

break;

}

else{}

}

120;

{delay_1ms(100);

Speaker_output3();

keyscan();

else{}

write_com(0x0c);

}

voidmima()

{

ucharw=0;

//局部变量很重要

9;

write_data(table10[r]);

{

flag=0;

write_com(0x80+9+w);

if(flag==1&

num<

=9)

pswd[w]=num;

write_data(table3[w]);

w

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

当前位置:首页 > 成人教育 > 专升本

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

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