密码锁设计报告.docx
《密码锁设计报告.docx》由会员分享,可在线阅读,更多相关《密码锁设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
![密码锁设计报告.docx](https://file1.bdocx.com/fileroot1/2023-2/1/688724de-8038-415c-bfa5-5fdbe04a69b5/688724de-8038-415c-bfa5-5fdbe04a69b51.gif)
密码锁设计报告
西南民族大学机器人创新团队
单片机设计报告
项目名称:
基于51单片机的密码锁设计
项目成员:
(第五组)XXXXX
XXXXXXXXX
负责人员:
XXXXXXXX
完成时间:
2014年01月15日
报告成绩:
摘要:
随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。
但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。
而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。
加上其成本较高,一定程度上限制了这类产品的普及和推广。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。
随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。
关键字:
STC89C52RC单片机、LED码管显示、密码锁、C语言
密码锁设计
一、任务要求:
1、设计任务:
设计并制作一个密码锁。
2、设计要求:
●4*4矩阵键盘实现4位密码的输入功能;
●密码输入正确锁开(灯亮);
●密码三次输入错误,锁定三秒钟并报警。
二、成员组成及分工:
XXX:
负责本设计的前期资料搜集与整体布局;
XX:
负责程序的编写与调试;
XXX:
负责后期程序的改进及硬件操作;
三、方案论证:
硬件介绍:
1.STC89C52简介
STC89C52RC是STC系列单片机中应用较为广泛的一种型号,芯片内部有8KB的闪速存储器FlashROM。
内部的8KB存储器用于存放可编程控制器监控程序。
STC89C52RC单片机的40条引脚按功能来分,可以分为3部分,电源及时钟引脚、控制引脚和输入/输出引脚。
STC89C52RC单片机原理图
89C52单片机引脚功能:
主电源及时钟引脚
此类引脚包括电源引脚Vcc、Vss、时钟引脚XTAL1、XTAL2。
(1)Vcc(40脚):
接+5V电源,为单片机芯片提供电能。
(2)Vss(20脚)接地。
(3)XTAL1(18脚)在单片机内部,它是一个反向放大器的输入端,该放大器构成了片内的振荡器,可提供单片机的时钟控制信号。
(4)XTAL2(19脚)在单片机内部,接至上述振荡器的反向输出端。
89C52单片机内部结构图:
2.四位数码管
四位数码管可以分为共阳极与共阴极两种,共阳极就是把所有LED的阳极连接到共同接点com,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有LED的阴极连接到共同接点com,而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点),如下图2-2所示。
通过控制各个LED的亮灭来显示数字。
四、软件方案设计:
选用C51来编程,首先要有初始化程序,通过初始化程序,将对主程序所用到的变量、常量以及各个参数和所调用的子函数定义。
其次还有显示程序、键盘扫描程序、比较函数程序、延时子程序,系统软件流程如图所示:
N
系统流程图
五、设计原理:
本方案采用的是以89C52为核心的单片机控制方案,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。
其原理如图所示
STC89C52
单片机
矩阵
键盘
控制
输入错误锁定键盘
延时报警控制电路
指示电路
数码管显示电路
密码锁设计框图
设计思路如下:
输入密码用矩形键盘,包括0-9数字键和10确定键;
LED数码管显示输入密码,用发光二极管代替开锁的电路,发光长亮表示开锁;
输入密码错误次数超过3次,流水灯闪烁且蜂鸣器报警,键盘锁定3s;
欲重新设定初始密码,只需在初始化函数中直接修改即可;
软件的设计主要包括键盘键值的读取,LED显示程序,密码比较程序和报警程序。
六、设计源程序:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitD1=P1^4;
sbitLED1=P3^4;
sbitbeep=P2^0;//将IN5与P2^0引脚相连蜂鸣器发声
ucharchushi[4];//初始密码存储区
ucharshuru[4];//输入密码存储区
ucharcount;//计数次数
ucharerror_count;//错误次数计数
ucharsureflag;//确认键按下标志
ucharcodetable[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff};
ucharnum,temp,aa;
voiddelay(uintz)
{
uintx,y;;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidshanshuoled()//闪烁灯
{
D1=0;
delay(100);
D1=1;
delay(100);
D1=0;
delay(100);
D1=1;
}
voidbaojing()//蜂鸣器短叫报警
{
intk;
for(k=0;k<10;k++)
{
beep=0;
delay(100);
beep=1;
delay(100);
beep=0;
delay(100);
beep=1;
}
}
voidinit()
{
count=0;//初始计数次数为0
error_count=0;//错误次数归0
beep=1;
chushi[0]=1;//设初始密码为1234,可修改
chushi[1]=2;
chushi[2]=3;
chushi[3]=4;
}
ucharcmp()//密码比较函数cmp比较指令
{
ucharflag=0;//flag标记变量
uchari;
for(i=0;i<4;i++)
{
if(chushi[i]==shuru[i])
{
flag=2;//flag标记为2
}
else
{
flag=3;
i=3;//i=3时跳出for循环
}
}
return(flag);//返回flag值
}
voiddisplay(ucharaa)
{
LED1=0;
P0=table[aa];
}
ucharkeyscan()
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xee:
num=1;
break;
case0xde:
num=2;
break;
case0xbe:
num=3;
break;
case0x7e:
num=4;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xed:
num=5;
break;
case0xdd:
num=6;
break;
case0xbd:
num=7;
break;
case0x7d:
num=8;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xeb:
num=9;
break;
case0xdb:
num=10;//确认键10
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
returnnum;
}
voidmain()
{
init();
num=11;//num=0xff一开始关闭所有管,排除出现是干扰
while
(1)
{
ucharkey;
key=keyscan();//keyscan()扫描到的num值赋值给key
if(count<4)
{
if(key>=0&&key<10)
{
display(key);
shuru[count]=key;//将key值暂存shuru[]数组
count++;
num=11;//num复位
}
}
else//即count=4时
{
ucharright;
if(key==10)//确认键按下
{
sureflag=1;//确认键按下标记为1
num=11;//num复位
right=cmp();//cmp函数返回的flag值赋给right
}
if(sureflag==1)
{
if(right==2)
{
D1=0;
}
elseif(right==3)
{
shanshuoled();
error_count++;//错误次数加1
count=0;//count清零
sureflag=0;//sureflag清零
if(error_count==3)
{
baojing();//报警的3秒时间里亦实现了锁键(键不可用)
error_count=0;//error_count清零
}
}
}
}
}
}
七、单片机显示效果图:
八、调试、实验方法及结果:
1)打开设计软件KeiluVision3,新建project,选择CPU类型,并保存,然后新建一个file并保存为扩展名为c的文件。
2)右击Target1optionforTarget'target1',然后设置output(选中CreateHEX)。
3)编写源程序,编写完之后进行编译,修改错误直至正确。
4)打开程序下载软件,连接好串口和电源,按正确的步骤将HEX文件下载到单片机里面,并冷启动上电。
观察实现的结果和原本设计的是否一样,倘若不理想,则进一步调试程序,直到出现原本设计的结果。
九、设计心得体会:
此次基于51单片机的密码锁设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题、锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在日常生活中可以说是无处不在。
因此作为二十一世纪的大学生来说掌握单片机的开发技术是十分重要的。
回顾此次单片机的项目设计,至今我仍感慨颇多,的确,我小组从选题到定稿,从理论到实践,在假期整整两星期的日子里,可以说是苦多于甜,但是可以学到很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为实际需求服务,从而提高自己的实际动手能力和独立思考的能力,以及组员之间良好的团结协作意识。
在设计的过程中遇到的问题,特别是程序的编写和一次次的反复调试查错过程更是考验耐性和脑力,可以说是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机C语言不够灵活运用,通过这次课程设计之后,一定把以前所学过的知识加以反思和巩固,另外组员们的尽心尽力积极配合才使得本次项目任务得以顺利完成,非常感谢!
十、参考文献:
[1]谭浩强.C程序设计(第二版).清华大学出版社,1999
[2]徐淑华,程退安等.单片微型机原理及应用.哈尔滨工业大学出版社.2005.1
[3]谢维成杨加国.单片机原理与应用及C51程序设计.清华大学出社,2009
N
N
[4]郭天祥,51单片机C语言教程-入门、提高开发、拓展全攻略,工业出版社,2009.1