单片机智能密码锁.docx
《单片机智能密码锁.docx》由会员分享,可在线阅读,更多相关《单片机智能密码锁.docx(15页珍藏版)》请在冰豆网上搜索。
单片机智能密码锁
目录
第1章概述1
1.1设计内容:
1
1.2设计要求:
1
1.3主要设计条件:
1
第2章系统总体方案设计2
2.1单片机系统:
2
2.2矩阵键盘接口电路:
2
2.3数码管显示:
2
2.4开锁提示…………………………………………………………………………2
第3章硬件电路设计4
3.1键盘电路设计4
3.2数码管显示电路设计5
3.3开锁机构设计5
第4章软件设计6
4.1软件总体设计6
4.2各子程序的设计6
4.3密码比较及对错处理………………………………………………………………9
第5章实物连接效果图10
5.1正确输入密码实物图……………………………………………………………..10
5.2正确密码时按下确认键实物图…………………………………………..………11
5.3输入错误密码实物图…………………………………………………………….11
5.4错误密码时按下确认键的实物图………………………………………………11
设计总结12
参考文献13
附录14
附录1源程序清单14
附录2硬件原理图18
第1章概述
在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。
为满足人们对锁的使用要求,用密码代替钥匙的密码锁应运而生。
此次关于智能密码锁的单片机课程设计内容及要求如下:
1.1设计内容:
(1)密码的设定,此密码是固定在程序存储器ROM中,假设预设的密码为“11111111”共8位密码。
(2)密码的输入:
采用两个按键来完成密码的输入,其中一个按键为功能键,另一个按键为数字键。
在密码都已经输入完毕并且确认功能键之后,才能完成密码的输入过程。
然后进入密码的判断比较处理状态并给出相应的处理过程。
(3)按键禁止功能:
初始化时,允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态是在3次密码输入不正确的情况下发生的。
1.2设计要求:
(1)设计方案要合理、正确;
(2)系统硬件设计及焊接制作;
(3)系统软件设计及调试;
(4)系统联调;
第2章系统总体方案设计
本次密码锁采用了键盘读入数据,数码管显示读入密码,P1^0led作为开锁提示标志。
密码为固定在rom中的8个1组成的密码,当在键盘读入时,输入密码会依次显示在数码管上,当输入密码与固有密码相同时,密码正确,P1^0led点亮,表示锁开,当输入密码与固有密码不相同时,P1^0led不会点亮,即锁不会打开,当3次输入密码与固有密码不相同时,则会启动禁止键盘读入密码功能。
这样就组成了智能密码锁。
2.1单片机系统:
单片机作为整个硬件系统的核心,它既是协调整机工作的控制器,又是数据处理器。
它由单片机、时钟电路、复位电路等组成。
为了简化电路、降低成本、提高可靠性,本系统采用AT89C54作为主控制器。
利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,进行智能密码锁的设计。
此次课题用单片机P3口与键盘相连,做输入口,P0口与显示器相连,做显示,P2口做显示器扫描,键盘16号键为确认键。
单片机的时钟信号用来提供单片机片内各种微操作的时间基准,时钟信号通常用两种电路形式得到:
内部振荡和外部振荡。
由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,这次课题采用内部方式进行定时计数。
2.2矩阵键盘接口电路:
此次课程设计采用4*4矩阵键盘,4行4列分别与P3口相连,采用行列反转扫描法。
设有0—E`15个数字密码,和,1个功能键。
15个数字键用来输入密码,F键功能键用来确认。
2.3数码管显示:
此次课程设计设置8位密码,按键后数码管显示器显示,采用动态显示。
P0口送显示数据,P2口显示扫描,根据按键顺序,显示器第一位显示第一次按的密码,第二位显示第二次按的密码,依此类推第8位显示第8次按的密码,按键完成后按确认键后,系统进行密码比较密码对则执行开锁动作,对应的发光二极管亮。
2.4开锁提示:
当输入密码和固有密码相同时,将点亮P1^0LED灯,否则熄灭,当3次输入的密码都与固有密码不同时,将锁定键盘,不再读入数据。
第3章硬件电路设计
3.1键盘电路设计
3.1.1矩阵式键盘电路如图3.1:
图3.14x4矩阵键盘
3.1.2矩阵式键盘工作原理:
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图3.1所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如p3口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,在需要的键数比较多时,采用矩阵法来做键盘。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,图3.1中,如果将行线扫描为全0,当按键没有按下时,所有的列线都是高电平,代表无键按下。
一旦有键按下,则列线就会被拉低。
这样,通过读入列线的状态就可得知是否有键按下了。
3.1.3矩阵式键盘的识别方法:
确定矩阵式键盘上何键被按下介绍一种“行扫描法”。
行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示。
判断键盘中有无键按下具体步骤如下:
(1)先将列线p3.7-p3.4置0111,然后检测行线的状态。
如果p3.3-p3.0为0111,则k0被按下;如果p3.3-p3.0为1011,则k1被按下;如果p3.3-p3.0为1101,则k2被按下,如果p3.3-p3.0为1110,则k3被按下。
(2)以此类推,对键盘进行循环扫描,实现对键盘的读入数据。
3.2数码管显示电路设计
3.2.1.数码管显示电路图:
图3.2LED显示电路
3.2.2数码管显示原理:
LED发光二极管显示器是一种当外加电压加在发光二极管上可产生可见光的器件它适用于在光线暗的环境中使用。
显示器显示接口按驱动方式可分为静态显示和动态显示,静态显示时,除变更显示数据期间外,各显示器均处于通电显示状态,每个显示器的通电占空比约为100%,静态显示的优点是显示稳定,亮度高,缺点是占用硬件电路多;动态显示时,N个显示器共占用一个显示数据驱动器,每个显示器通电占空比时间为1/N,动态显示的优点是节省硬件电路,缺点是采用软件扫描时占用CPU时间多。
对于多位LED显示器,通常都是采用动态扫描的方法进行显示,即逐个地循环点亮各位显示器,这样虽然在任一时刻只有一显示器被点亮,但是由于人眼具有视觉残留效应,看起来与全部显示器持续点亮效果完全一样。
为了实现LED显示器的动态扫描,除了给显示提供段(字形代码)的输入之外,还有对显示器选择位的控制,这就是通常所说的段控和位控。
因此,多位LED显示器接口电路需要有两个输出口,其中一个用于输出8条段控线,另一个用于输出位控线,位控线的数目等于显示器的位数。
3.3开锁机构设计
信号通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而达到开锁的目的,其原理如图3.3所示:
图3.3密码锁开锁机构示意图
当用户输入的密码正确,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁,达到开门的目的,此次设计无电磁锁,利用一个发光二极管来代表门锁,亮表示锁开,灯灭表示锁合。
第4章软件设计
4.1软件总体设计
软件的设计主要包括:
主程序、密码的固定、键盘识别判断、密码比较、密码对错处理。
主程序主要完成初始化、检查有无按键按下、密码比较等等。
主程序模块如图4.1所示:
图4.1主程序模块
4.2各子程序的设计
4.2.1延时程序:
voiddelay(uinti)//延时函数
{
while(i--);
}
4.2.2调用显示程序:
for(x=0;x<8;x++)//按键显示
{
P2=x;
P0=disp[x];
delay(10);
}
此显示程序依次显示输入密码,当x=0时,P2=000;第一位数码管显示disp[0]值,即第一位密码值,经过for循环后,显示8位输入密码。
4.2.3密码比较程序:
{
for(n=0;n<8;n++)disp[n]=0;//清显示
m=8;
for(d=0;d<8;d++)
if(keyw[d]!
=passw[d])f=1;
if(f==1)//密码错,闭锁
{
led=1;
f=0;
t=t-1;
}
elseled=0;
}
当确认信号有效时,执行密码比较程序,首先清显示,8位数码管都不显示数据,然后进行密码比对,一个for循环后,对8位密码进行8次比对,只要有一次不同,f则等于1,执行led=1,即密码错误,led熄灭。
否则led亮,密码正确。
4.2.4键盘扫描程序:
ucharkeyscan()
{
ucharcord_h,cord_l;//行列值
P3=0x0f;//列线输出全为0,扫描行
cord_h=P3&0x0f;//读入行线值
if(cord_h!
=0x0f)//先检测有无按键按下
{
delay(100);//去抖
if(cord_h!
=0x0f)
{
led=1;//有按键按下闭锁
cord_h=P3&0x0f;//读入行线值
P3=0xf0;//行线输出全为0,扫描列
cord_l=P3&0xf0;//读入列线值
do//等待键释放
{
P3=0x0f;
for(x=0;x<8;x++)//按键显示,延时
{
P2=x;
P0=disp[x];
delay(10);
}
del=P3;
}while(del!
=0x0f);
return(cord_h+cord_l);
}
}
return(0xff);//返回该值
确定矩阵式键盘上何键被按下介绍一种“行扫描法”。
行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。
判断键盘中有无键按下具体步骤如下:
先将列线p3.7-p3.4置0111,然后检测行线的状态。
如果p3.3-p3.0为0111,则k0被按下;如果p3.3-p3.0为1011,则k1被按下;如果p3.3-p3.0为1101,则k2被按下,如果p3.3-p3.0为1110,则k3被按下。
以此类推,对键盘进行循环扫描,实现对键盘的读入数据。
4.2.5密码组成程序:
if(key!
=0xff)
{
for(j=0;j<15;j++)
{
if(key==keyd[j])
{
disp[m-1]=seg[j];
keyw[m-1]=keyd[j];
}
}
}
当有按键按下后,经过for循环15次后,检测是按下第几号建,然后依次放入keyw[m-1]中,组成一个8位的输入密码。
4.3密码比较及对错处理:
密码输入完成之后,进行密码比较,即将设定密码11111111与输入密码进行一一比较,如果相同,则密码正确,P1^0置低电平,发光二极管亮,开锁,如果密码错误,重新等待输入密码,如果三次错,将会启动禁止键盘读入数据功能。
第5章实物连接效果图
单片机应用系统的调试,包括硬件调试和软件调试两部分,软件调试是设计一个很重要的环节。
硬件调试和软件调试并不能完全分开,许多软件错误都是在硬件调试过程中被发现和纠正的。
5.1正确输入密码实物图:
图5.1输入密码后数码管显示
图5.1是未按确认建时的8位输入密码。
5.2正确密码时按下确认键实物图:
图5.2正确密码时LED亮
图5.2是正确密码时按下确认键,led灯亮,即P1^0=0,开锁。
5.3输入错误密码实物图:
图5.3错误密码显示
图5.3显示的是随机输入的错误密码,未按下确认键。
5.4错误密码时按下确认键的实物图:
图5.4LED灭
图5.4显示的是错误密码下按下确认键后的实物图,led没有亮,即P1^0=1,闭锁。
设计总结
两星期的单片机原理与应用课程设计结束了,我学到了很多同时认识到自己所学知识的不足,以前学习书本知识都只是用来应付考试的,现在感觉到了知识的灵活性和实用性,设计过程中遇到这样那样的问题,有的通过看书或者仔细研究能弄懂,有的东西从来没学过或是学的时候只是学到了皮毛,似懂非懂,用到实际上来确实比较困难,比如矩阵键盘的扫描,微机接口和单片机原理上课的时候只是粗略的讲了一下行扫描法的最简单的实现方法,智能密码锁需用到4x4矩阵键盘的扫描,原理我还是懂的,具体到编程我就遇到困难了,怎么样让程序一直在执行键盘扫描,不断调用显示,变量与存储空间的分配问题等。
这些问题都需要重新学习,慢慢解决,程序编译后进行仿真的时候会出现原本意料不到的问题,跟自己想象的调试结果完全不一样,只能联系现象回到程序中去寻找相关问题,一直在执行编译与调试的步骤,知道出现理想的结果为止。
不少同学一起讨论相互帮助,解决问题,解决不了的问题找别人帮忙或是找老师解答,能学到不少自己欠缺的东西。
课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
课程设计是结束了,不过学习单片机知识的过程还没有终结,探索学习的奥妙,培养学习的兴趣,养成良好的学习习惯对我们来说才是最重要的,学习不仅仅是学习书本知识,不是为了学习本身而去学习,方法很重要,以后要更加努力,多搞一些实际性的东西,做对自己有用的事。
参考文献
[1]许立梓.微型计算机原理及应用[M].机械工业出版社.2002
[2]刘乐善.微型计算机接口技术及应用[M].华中理工大学出版社.2000
[3]邹逢兴.计算机硬件技术基础试验教程[M].高等教育出版社.2000
[4]周佩玲.16位微型计算机原理接口及其应用[M].中国科学技术大学出版社.2000
[5]吴秀清.微型计算机原理与接口技术[M].中国科学技术出版社.2001
[6]邓亚平.微型计算机接口技术[M].清华大学出版社.2001
[7]王迎旭.单片机原理与应用[M].机械工业出版社.2001
[8]周航慈.单片机应用程序设计技术[M].北京航空航天大学出版社.2002
[9]谢宜仁.单片机实用技术问答[M].人民邮电出版社.2002
附录1源程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitled=P1^0;
ucharpassw[8]={0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde};
ucharkeyw[8];//按键
uchardisp[8];//按键显示代码
unsignedcharconstseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-f显示代码
unsignedcharconstkeyd[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//0-F按键代码
bitf;//f为开、闭锁标志,
ucharm,n,j,x,d,key,del,t,k;
ucharkeyscan();
voiddelay(uinti);
voidmain()/*主函数*/
{t=3;
f=0;
m=8;//按键次数
while
(1)
{if(t==0)continue;
key=keyscan();
if(key!
=0xff)//有按键按下,保存按键代码
{
for(j=0;j<15;j++)
{
if(key==keyd[j])
{
disp[m-1]=seg[j];//显代码
keyw[m-1]=keyd[j];//按代码
}
}
m--;
if(m==0)
{
m=8;
}
}
if(key==0x77)//确认键按下,判断密码是否正确
{
for(n=0;n<8;n++)disp[n]=0;//清显示
m=8;
for(d=0;d<8;d++)
if(keyw[d]!
=passw[d])f=1;//判断密码
if(f==1)//密码错,闭锁
{
led=1;
f=0;
t=t-1;
}
elseled=0;//密码正确,开锁
}
for(x=0;x<8;x++)//按键显示
{
P2=x;
P0=disp[x];
delay(10);
}
}
}
ucharkeyscan()//键盘扫描函数,使用行列反转扫描
{
ucharcord_h,cord_l;//行列值
P3=0x0f;//列线输出全为0,扫描行
cord_h=P3&0x0f;//读入行线值
if(cord_h!
=0x0f)//先检测有无按键按下
{
delay(100);//去抖
if(cord_h!
=0x0f)
{
led=1;//有按键按下闭锁
cord_h=P3&0x0f;//读入行线值
P3=0xf0;//行线输出全为0,扫描列
cord_l=P3&0xf0;//读入列线值
do//等待键释放
{
P3=0x0f;
for(x=0;x<8;x++)//按键显示,延时
{
P2=x;
P0=disp[x];
delay(10);
}
del=P3;
}while(del!
=0x0f);
return(cord_h+cord_l);//返回键盘最后组合码
}
}
return(0xff);//返回该值
voiddelay(uinti)//延时函数
{
while(i--);
}
附录2硬件实物图