电子密码锁.docx
《电子密码锁.docx》由会员分享,可在线阅读,更多相关《电子密码锁.docx(27页珍藏版)》请在冰豆网上搜索。
电子密码锁
课程设计报告
课程名称:
单片机原理及应用课程设计
设计题目:
电子密码锁设计
系别:
通信与控制工程系
专业:
电子信息工程
班级:
学生姓名:
学号:
起止日期:
指导教师:
教研室主任:
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
权重
成绩
1、设计过程中出勤、学习态度等方面
0.2
2、课程设计质量与答辩
0.5
3、设计报告书写及图纸规范程度
0.3
总成绩
教研室审核意见:
教研室主任签字:
年月日
教学系审核意见:
主任签字:
年月日
摘要
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
随着科技的发展和人们生活水平的提高,如何实现保密防盗这一问题变的尤其的突出,传统的机械锁由于其构造的简单,失效的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,因而广泛使用。
本设计围绕电子密码锁系统的设计与开发进行研究和实践,详细介绍了电子密码锁系统的整体结构。
基于在系统可编程技术和STC89C52编译器配有集成开发的新型电子密码锁的设计方案,阐述其工作原理和软硬件设计,由单片机系统、矩阵键盘、LED显示和报警系统组成的系统能完成开锁、修改用户密码、报警基本的密码锁的功能。
关键字:
STC89C52芯片;8255芯片;keil软件
电子密码锁设计
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。
现在应用较广的电子密码锁是以芯片为核心,通过编程来实现。
1设计要求与内容
1.1设计要求
利用单片机作为控制核心,完成一个电子密码锁可以修改密码设计具体要求
如下:
1、密码的设定,此密码是固定在程序存储器ROM中,假设预设的密码为“12345共6位密码;
2、密码的输入:
采用两个按键来完成密码的输入,其中一个按键为功能键,另一个按键为数字键。
输入确认功能键之后,才能完成密码的输入过程。
进入密码的判断比较处理状态并给出相应的处理过程;
3、密码输入正确按确认键,绿灯亮,输入密码错误、红灯亮蜂鸣器响。
1.2设计内容
1、设计合理、正确的方案;
2、系统硬件设计及焊接制作;
3、系统软件设计及调试;
4、系统联调。
1.3主要设计条件
1、MCS-51单片机实验操作台1台;
2、PC机及单片机调试软件;
3、单片机应用系统板1套;
4、系统设计所需的元器件。
2方案论证与对比
2.1方案一
采用数字电路控制,其原理方框图如1-1所示。
图1-1数字电路控制图
采用数字密码锁电路的好处就是设计简单。
用74LS112双JK触发器构成的数字逻辑电路做为密码锁的核心控制,共设了9用户输入键,其中只有5个是有效的密码按键,其它的都是干扰按键,如果按下干扰按键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入,。
电路有两大部分组成:
密码锁电路和备用电源,其中备用电源是防止停电造成的密码锁电路失效,是用户免遭麻烦。
密码锁电路包含:
键盘输入,密码检测,开锁电路,执行电路,报警电路。
2.2方案二
2.2.1单片机系统
是用以STC98C52为核心的单片机控制方案。
利用单片机灵活编程设计和丰富的I/O端口,及其控制的准确性,进行电子密码锁的设计。
此次课题用8255课编程芯片的PC口与键盘相连,做输入口,PA,PB口与数码管相连,做显示。
2.2.2矩阵键盘接口电路
此次课程设计采用4*4矩阵键盘,与PC相连,采用扫描法。
设有0——十个数字密码,和功能键。
输入密码,按确认键后,密码比较。
2.2.3LED显示
此次课程设计用数码管动态显示。
根据按键次数,第一位显示器显示第一次按的密码,第二位显示器显示第二次按的密码,第三位显示器显示第三次按的密码,依此第六位显示器显示第六次按的密码,按键完成后按确认键后,密码对则执行相关动作。
2.2.4比较显示系统
此次课程设计,当输入密码正确时,LED灯亮(绿灯亮);当输入密码错误时,LED灯亮(红灯亮)且蜂鸣器响。
2.2.5系统总框图
系统包括:
单片机系统、矩阵键盘接口电路、LED显示、比较显示器、系统总框图如下:
图2-5系统总框图
2.3方案论证与选择
通过比较以上两种方案,单片机方案有较大的活动空间,不但能实现所要求的功能,而且能在很大程度上扩张功能,而且还可以方便的对系统进行升级,以及对设计条件的综合考虑,我们选择方案二。
3硬件电路设计
3.1键盘电路设计
3.1.1矩阵式键盘电路图
图3-1键盘电路图图3-2键盘图
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
本次因需要使矩阵键盘当独立键盘使用。
3.1.2矩阵键盘的识别方法
矩阵键盘的识别方法有很多种,比如行反转法,扫描法等。
最常用的方法是扫描法,本次采用扫描法。
3.2LED显示电路设计
LED就是lightemittingdiode,发光二极管的英文缩写,简称LED。
它是一种通过控制半导体发光二极管的显示方式,用来显示文字、图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。
显示器显示接口按驱动方式可分为静态显示和动态显示,静态显示时,除变更显示数据期间外,各显示器均处于通电状态,每个显示器的通电占空比为100%,静态显示的优点是显示稳定,亮度高,缺点是占用硬件电路多;动态显示的优点是节省硬件电路,缺点是占用软件扫描时占用CPU时间多。
对于多位LED显示器,通常都是采用动态扫描的方法进行显示,即逐个地循环点亮各位显示器,这样虽然在任一时刻只有一显示器被点亮,但是由于人眼具有视觉残留效应,看起来与全部显示器持续点亮效果完全一样。
图3-2数码管显示电路图
为了实现LED显示器的动态扫描,除了要给显示器的输入之外,还有对显示器选择位的控制,这就是通常所说的段控和位控。
因此,多位LED显示器接口电路需要有两个输出口,其中一个用于8条段控线,另一个用于输出位控线,位控线的数目等于显示器的位数。
为了方便编写程序,通常在内部RAM中设置显示缓冲区,存放显示的数字或字符,显示缓冲区单元个数与LED显示器位数相同。
此次基于单片机的电子密码锁,我选用动态显示,通过与软件配合,每输入一个密码,进行显示一次,扫描,密码输入完后,进行比较,密码正确则开锁。
3.3STC89C52芯片与8255芯片的介绍
STC89C52是低功耗、高性能的CMOS8位微控制器。
8字节的flash,256字节的RAM,32位的I/O口线,看门狗定时器,2个数据指针,3个16位定时器/计数器。
全双工串行口,片内晶振及时钟电路,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,内容被保存,振荡器被冻结。
STC89C52芯片如图2-3所示:
图3-3STC89C52芯片图图3-48255芯片引脚图
8255芯片引脚图如图3-4所示:
8255芯片是一种典型的课编程通用并行接口芯片,用来扩展单片机的端口,它具有3个8位的并行口,有三位工作方式,可作为单片与各种外部设备连接的接口电路。
CS:
片选信号线,当该引脚为低电平时,8255被选中,允许8255与CPU通讯。
RESET:
复位输入线,当该引脚为高电平时,内部寄存器被清除,所有I/O口均被置成输入方式。
A0、A1:
地址输入线。
当A0A1=00时,PA口被选中;
当A0A1=01时,PB口被选中;
当A0A1=10时,PC口被选中;
当A0A1=11时,控制寄存器被选中。
4软件设计
4.1软件总体设计
软件的设计主要包括:
密码的固定、键盘识别判断、密码显示、密码比较、密码对处理。
软件设计总流程图如下:
YN
图4-1总流程图
4.2各子程序的设计
4.2.1密码的固定定
将密码固定在程序存储器ROM中,设定密码,密码固定在ROM中。
4.2.2键盘的扫描识别判断
用矩阵式键盘,扫描法对键盘进行识别判断,具体流程图如下:
首先选着一行或者一列,低电平有效,然后进行扫描,如果发现一行(列)出现低电平信号则有键按下,然后在数码管显示相应的数或者现象。
在扫描时,会出现电信号抖动,所以一般我们要加上去抖动语句。
根据此原理,我们给键盘编码0-9,以及其他的一些功能按键,这就是电子密码锁按键。
图4-2键盘扫描流程图
4.2.3密码显示和比较处理
采用LED动态显示,密码输入完成之后,进行密码比较,并显示相应现象。
图4-3密码显示图
5系统功能的测试与整体指标
5.1软件调试步骤
1、打开keil软件后,在project菜单中选择NewProject命令,打开一个新项目,保存项目,输入工程文件名后,并保存工程文件的目录;
2、为项目文件选择一个目标器件,即选择8051的类型,在Database列表框中选择“ATML89C52”,确定
3、上述设置好后,创建源程序文件并输入程序代码。
输入好代码后点击“文件/保存”;
4、把源文件添加到项目中,用鼠标指在目标工作区的目标1,点击右键在弹出的菜中选择添加文件到源代码组,在弹出的添加文件框中,选择需要添加到项目中的件;
5、开始编辑,对项目文件进行编辑,若没有错误后进行硬件调试。
5.2程序调试步骤
1、矩阵4*4键盘的调试
键盘程序是整个程序的基础,我们必须保证其正确。
调试方法:
先把程序下载到单片机,让数码管显示,在有键按下时显示的是否为设定的值。
2、数码管程序调试
正确的显示数值是整个储蓄的关键。
调试方法:
先把程序下载到单片机,让
数码显示数值。
5.3测试结果
实例测试:
将程序下载到单片机,按下功能键,再输入初始密码“123456”再按确认键,绿灯亮,解锁成功,若输入密码错误,则亮红灯,蜂鸣器响;按修改密码键,再输入新密码,按确认键密码修改成功;若不按功能键则无法进行密码输入。
6、详细仪器清单
详细仪器清单表
仪器名称
数量
STC89C52芯片
1
8255芯片
1
1K电阻
22
型号为9015的三极管
6
电容
1
8段共阳极数码管
6
二极管
1
石英晶振
1
矩形按键
6
7总结及致谢
本次单片机课程设计历时两个星期,在这了两个星期中我们深深体会到了课程设计的苦与乐。
当程序调试出现问题时,我们就一步步调试,一步步查看,修改,这过程确实很枯燥,也很辛苦,但是,当程序调试成功并且能够下载到单片机中运行时,有说不出的高兴,感觉我们所有的付出都是值得的。
总的来说,这次课程设计,让我们领悟到理论与实践结合的重要性。
懂得拥有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从中得到收获,从而提高自己的实际动手能力和独立思考的能力,做到全面发展,这样才能真正为社会服务。
因为这是第一次做单片机课程设计,所以我们遇到过各种各样的问题,面对这些难题,我们没有妥协,以求学的心态去解决,从中发现了自己的不足之处,正是这些难题让我们看到了自己的不足,对以前所学过的知识理解得不够深刻,基础掌握得不够牢固。
只学到了表面的知识,并没有深入了解知识的内涵。
所以很庆幸有这次课程设计,它教会了我们到底要学些什么知识,给我们以后的学习指明了一个方向,促使我们更加努力的学习,补充自己的不足。
这次课程设计终于顺利完成了,其中离不开老师的耐心指导和同学们的热心帮助,在此表示衷心的感谢,另外特别感谢指导老师谭老师的耐心指导,他的讲解让我们有豁然开朗的感觉,让我们得以顺利完成这次课程设计。
参考文献
[1]张鑫.单片机原理及应用[M].电子工业出版社,2009
[2]郭天祥.51单片机C语言教程[M].电子工业出版社,2009
[3]邹逢兴.计算机硬件技术基础试验教程[M].高等教育出版社,2000
[4]周佩玲.16位微型计算机原理接口及其应用[M].中国科学技术大学出版社,
2000
[5]吴秀清.微型计算机原理与接口技术[M].中国科学技术出版社,2001
▪附录一:
仿真图
附录二:
源程序
#include
#include/*调用库函数*/
#defineucharunsignedchar/*自定义无符号字符型为uchat*/
#definePAXBYTE[0xD9FF]/*8255芯片PA口地址*/
#definePBXBYTE[0xDAFF]/*PB口地址*/
#definePCXBYTE[0xDDFF]/*PC口地址*/
#defineCONXBYTE[0xDFFF]/*控制字地址*/
sbitD1=P1^1;/*位声明把P1.1口赋给D1*/
sbitD2=P1^0;/*把P1.0口赋给D2*/
sbitbeep=P3^3;/*蜂鸣器端口*/
ucharcodetable[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xef};
ucharnum,num1,num2,num3,num4,num5,num6,tt,temp,i,j,k,t,x,y,n1,a,b,c,d,e,f,xsm;voiddelay(xsm);/*延时函数声明*/
voidkeys();/*键盘函数声明*/
voidkeys1();/*键盘函数声明*/
voidkeys2();/*键盘函数声明*/
voiddisplay(num);/*数码显示函数声明*/
voidmain()/*主函数*/
{
CON=0x80;/*选择8255工作方式1*/
x=6;y=6;/*控制密码位数初值*/
a=1;b=2;c=3;d=4;e=5;f=6;/*定义密码锁的原始密码为123456*/
while
(1)/*循环函数*/
{
display(num);
keys();
keys1();
keys2();
}
}
voiddisplay(num)/*数码显示函数*/
{
if(tt==0||tt>6)/*tt控制按键次数,tt=0,没有数字键按下*/
{
tt=0;
PA=0xc0;/*把6个数码管位选打开*/
PB=table[10];/*数码管显示"_"*/
}
if(tt==1)/*tt=1,第一次按键*/
{
num1=num;/*把按键值num赋给num1*/
num2=b;num3=c;num4=d;num5=e;num6=f;/*密码位数控制*/
if(t==1){a=num;y=x-5;}/*判断是否修改密码*/
PA=0xfe;/*开第一个数码管*/
PB=table[num1];/*显示第一个数值*/
if(num==10)/*取消输入健值判断*/
tt--;
}
if(tt==2)/*tt=2,第二次按键*/
{
num2=num;
num3=c;num4=d;num5=e;num6=f;
if(t==1){b=num;y=x-4;}
PA=0xfd;/*用第二个数码管显示第二次按键的值*/
PB=table[num2];
delay(18);/*延时10ms*/
PA=0xfe;/*保持第一次按键的健值亮*/
PB=table[num1];
delay(18);
if(num==10)/*取消键判断*/
tt--;
}
if(tt==3)/*tt=3,第三次按键*/
{
num3=num;
num4=d;num5=e;num6=f;
if(t==1){c=num;y=x-3;}
PA=0xfb;/*用第三个数码管显示第三次按键的值*/
PB=table[num3];
delay(18);/*延时10ms*/
PA=0xfd;/*保持第二次键值亮*/
PB=table[num2];
delay(18);
PA=0xfe;/*保持第一次键值亮*/
PB=table[num1];
delay(18);
if(num==10)/*取消键判断*/
tt--;
}
if(tt==4)/*tt=4,第四次按键*/
{
num4=num;
num5=e;num6=f;
if(t==1){d=num;y=x-2;}
PA=0xf7;/*用第四个数码管显示第四次按键的值*/
PB=table[num4];
delay(18);/*延时10ms*/
PA=0xfb;/*保持第三次键值亮*/
PB=table[num3];
delay(18);
PA=0xfd;/*保持第二次键值亮*/
PB=table[num2];
delay(18);
PA=0xfe;/*保持第一次键值亮*/
PB=table[num1];
delay(18);
if(num==10)/*取消键判断*/
tt--;
}
if(tt==5)/*tt=5,第五次按键*/
{
num5=num;
num6=f;
if(t==1){e=num;y=x-1;}
PA=0xef;/*用第五个数码管显示第五次按键的值*/
PB=table[num5];
delay(18);/*延时10ms*/
PA=0xf7;/*保持第四次键值亮*/
PB=table[num4];
delay(18);
PA=0xfb;/*保持第三次键值亮*/
PB=table[num3];
delay(18);
PA=0xfd;/*保持第二次键值亮*/
PB=table[num2];
delay(18);
PA=0xfe;/*保持第一次键值亮*/
PB=table[num1];
delay(18);
if(num==10)/*取消键判断*/
tt--;
}
if(tt==6)/*tt=6,第六次按键*/
{
num6=num;
if(t==1){f=num;y=6;}
PA=0xdf;/*用第六个数码管显示第六次按键的值*/
PB=table[num6];
delay(18);/*延时10ms*/
PA=0xef;/*保持第五次键值亮*/
PB=table[num5];
delay(18);
PA=0xf7;/*保持第四次键值亮*/
PB=table[num4];
delay(18);
PA=0xfb;/*保持第三次键值亮*/
PB=table[num3];
delay(18);
PA=0xfd;/*保持第二次键值亮*/
PB=table[num2];
delay(18);
PA=0xfe;/*保持第一次键值亮*/
PB=table[num1];
delay(18);
if(num==10)/*取消键判断*/
tt--;
}
}
voidkeys1()/*复位键*/
{
PC=0xfd;/*第三行第一个按键*/
if(PC==0xed)/*判断是否有健按下*/
{
delay(10);
if(PC==0xed)
{
k=1;/*k为控制数字键条件k=1,可以按键*/
tt=0;/*输入键值和密码比较完,数字控制键清屏*/
D1=1;/*按下数字控制键灯灭*/
D2=1;
n1=0;
}
}
}
voidkeys2()/*功能键函数*/
{
PC=0xfe;/*功能键1,修改密码键*/
if(PC==0xde)/*判断是否有健按下*/
{
delay(10);
if(PC==0xde)
{
if(n3==1)
{
k=1;/*开数字按键*/
t=1;/*记忆密码条件*/
}
elsek=0;
}
}
PC=0xfe;/*功能键2,修改密码确认键*/
if(PC==0xbe)/*判断是否有健按下*/
{
delay(10);
if(PC==0xbe)
{
k=0;/*关数字按键*/
t=0;/*不再记忆密码*/
n1=1;
}
}
if(n1!
=1)
{PC=0xfe;/*功能键3,输入密码确认键*/
if(PC==0x7e)/*判断是否有健按下*/
{
delay(10);
if(PC==0x7e)
{
k=0;/*关数字按键*/
if(tt!
=0)
{
if(y==tt)/*判断输入值的长度是否等于密码长度*/
{
if(a==num1&&b==num2&&c==num3&&d==num4&&e==num5&&f==num6)
{
n3=1;/*密码输入正确,修改密码标志*/
D1=0;/*如果输入按键值与密码值相等,D1灯亮*/
}
else
{
D2=0;/*数值不相等,D2灯亮,蜂鸣器响*/
n3=0;
}
}
else
{
D2=0;/*长度不相等,D2灯亮,蜂鸣器响*/
n3=0;
}
}
}
}
}
}
voidkeys()/*数字键函数,编码数字键盘*/
{
if(k==1)/*判断是否按数字键*/
{
PC=0xf7;/*扫描键盘*/
temp=PC;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=PC;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=PC;
switch(temp)
{
case0x77:
/*按键位置*/
tt++;/*tt表示数码管亮的位置,亮一次,自加1*/
num=9;/*num表示键盘的键值*/
break;/*按键结束跳出*/
case0xb7:
tt++;
num=8;/*按键8*/
break;
case0xd7:
tt++;
num=7;/*按键7*/