湖南工程学院智能密码锁.docx
《湖南工程学院智能密码锁.docx》由会员分享,可在线阅读,更多相关《湖南工程学院智能密码锁.docx(31页珍藏版)》请在冰豆网上搜索。
湖南工程学院智能密码锁
湖南工程学院
课程设计
课程名称单片机原理与应用
课题名称智能密码锁设计
专业
班级
学号
姓名
指导教师
年月日
湖南工程学院
课程设计任务书
课程名称单片机原理与应用
课题智能密码锁设计
专业班级
学生姓名
学号
指导老师
审批
任务书下达日期2012年月日
任务完成日期2012年月日
设计内容与设计要求
设计内容:
1、密码的设定,此密码是固定在程序存储器ROM中,假设预设的密码为“12345”共5位密码。
2、密码的输入:
采用两个按键来完成密码的输入,其中一个按键为功能键,另一个按键为数字键。
在密码都已经输入完毕并且确认功能键之后,才能完成密码的输入过程。
然后进入密码的判断比较处理状态并给出相应的处理过程。
3、按键禁止功能:
初始化时,允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态是在3次密码输入不正确的情况下发生的。
设计要求:
1、设计方案要合理、正确;
2、系统硬件设计及焊接制作;
3、系统软件设计及调试;
4、系统联调;
5、写出设计报告。
主要设计条件
1、MCS-51单片机实验操作台1台;
2、PC机及单片机调试软件;
3、单片机应用系统板1套;
4、制作工具1套;
5、系统设计所需的元器件。
说明书格式
1.封面
2.课程设计任务书
3.目录
4.系统总体方案设计
5.系统硬件设计
6.软件设计(包括流程图)
7.系统的安装调试说明
8、总结
9、参考文献
10、附录(源程序清单及硬件原理图等);
11、课程设计成绩评分表。
进度安排
设计时间为两周
第一周
星期一、上午:
布置课题任务,讲课及课题介绍
下午:
借阅有关资料,总体方案讨论
星期二、确定总体设计方案
星期三、硬件模块方案设计
星期四、软件模块方案设计
星期五、设计及调试
第二周
星期一、设计及调试
星期二、设计及调试
星期三、总调
星期四、写说明书
星期五、上午:
写说明书,整理资料
下午:
交设计资料,答辩
参考文献
[1]、《微型计算机原理及应用》许立梓编机械工业出版社2002
[2]、《微型计算机接口技术及应用》刘乐善编华中理工大学出版社2000
[3]、《计算机硬件技术基础试验教程》邹逢兴编高等教育出版社2000
[4]、《16位微型计算机原理接口及其应用》周佩玲编中国科学技术大学出版社
2000
[5]、《微型计算机原理与接口技术》吴秀清编中国科学技术出版社2001
[6]、《微型计算机接口技术》邓亚平编清华大学出版社2001
[7]、《单片机原理及及应用》王迎旭编机械工业出版社2001
[8]、《单片机应用程序设计技术》周航慈著北京航空航天大学出版社2002
[9]、《单片机实用技术问答》谢宜仁主编人民邮电出版社2002
第1章概述
1.1该课题的发展现状与趋势简述:
在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。
为满足人们对锁的使用要求,各类电子产品应运而生,智能密码锁就是其中之一。
智能密码锁的研制,在20世纪30年代就开始了,在一些特殊场所早就有所应用。
这种锁是通过键盘输入一组密码来完成解锁过程,由于智能密码锁的密码量极大,不易被破解,避免了因钥匙被仿制而留下的安全隐患。
并且可以与机械钥匙配合使用,双重守护,大大提高了其安全性能,因而到现在应用得越来越广泛了。
1.2设计内容:
(1)密码的设定:
此密码是固定在程序存储器ROM中,假设预设的密码为“12345”共5位密码。
(2)密码的输入:
采用两个按键来完成密码的输入,其中一个按键为功能键,另一个按键为数字键。
在密码都已经输入完毕并且确认功能键之后,才能完成密码的输入过程。
然后进入密码的判断比较处理状态并给出相应的处理过程。
(3)按键禁止功能:
初始化时,允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态是在3次密码输入不正确的情况下发生的。
1.3设计要求:
(1)设计方案要合理、正确;
(2)系统硬件设计及焊接制作;
(3)系统软件设计及调试;
(4)系统联调;
(5)写出设计报告。
第2章系统方案设计
本次密码锁采用了键盘读入数据,数码管显示读入密码,当在键盘读入时,输入密码会依次显示在数码管上,当输入密码后按确认,如与固有密码相同时,密码正确,LED上显示如图:
如与固有密码不相同时,密码错误,LED上现实如图:
当三次输入密码与固有密码不相同时,蜂鸣器长响报警,并且会启动禁止键盘读入密码功能。
这样就组成了智能密码锁。
2.1系统组成框图:
系统主要以MCS-51单片机为核心,结合具体的电路,组合成一个智能密码锁系统,该系统的其他电路主要包括:
密码输入模块、密码检测系统、报警显示电路、开锁电路、液晶显示电路、密码锁存电路、六个主要模块。
如下图2.1所示:
图2.1系统组成框图
2.2单片机系统:
单片机作为整个硬件系统的核心,它既是协调整机工作的控制器,又是数据处理器。
它由单片机、时钟电路、复位电路等组成。
为了简化电路、降低成本、提高可靠性,本系统采用AT89C54作为主控制器。
利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,进行智能密码锁的设计。
此次课题用单片机P3口与键盘相连,做输入口,P0口与显示器相连,做显示,P2口做显示器扫描,键盘16号键为确认键。
单片机的时钟信号用来提供单片机片内各种微操作的时间基准,时钟信号通常用两种电路形式得到:
内部振荡和外部振荡。
由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,这次课题采用内部方式进行定时计数。
2.3矩阵键盘接口电路:
此次课程设计采用4*4矩阵键盘,4行4列分别与P3口相连,采用行列反转扫描法。
设有0—E`15个数字密码,和,1个功能键。
15个数字键用来输入密码,F键功能键用来确认。
2.4LED显示电路:
此次课程设计设置5位密码,按键后数码管显示器显示,采用动态显示。
P0口送显示数据,P2口显示扫描,根据按键顺序,显示器第一位显示第一次按的密码,第二位显示第二次按的密码,依此类推第5位显示第5次按的密码,按键完成后按确认键后,系统进行密码比较密码对则执行开锁动作,对应的发光二极管亮。
2.5报警显示模块:
通过4*4矩阵键盘输入信息时,不仅在液晶屏幕上显示相关内容,同时也通过声光显示模块反映出来,增加了用户的感光性。
2.6开锁提示模块:
当输入密码和固有密码相同时,LED灯闪烁伴随的蜂鸣器响,同时控制继电器打开密码锁装置,当3次输入的密码都与固有密码不同时,将死锁定键盘,不再读入数据。
重启后方可重新输入。
2.7密码锁存电路:
该系统的密码在初始化的时候就被写在24C02E2PROM中。
初始密码为“12345”。
修改初始密码需要用24C02程序直接重新写入密码所在地址中的值,以后修改的密码,也都讲被系统直接写入24C02E2PROM中。
然后系统直接从24C02中读取当前密码。
并与用户输入密码相比较。
防止掉电丢失修改后的密码。
第3章硬件电路设计
3.1键盘电路设计
3.1.1矩阵式键盘电路图:
图3.14x4矩阵键盘
3.1.2矩阵式键盘工作原理:
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图3.1所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如p3口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,在需要的键数比较多时,采用矩阵法来做键盘。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,图3.1中,如果将行线扫描为全0,当按键没有按下时,所有的列线都是高电平,代表无键按下。
一旦有键按下,则列线就会被拉低。
这样,通过读入列线的状态就可得知是否有键按下了。
3.1.3矩阵式键盘的识别方法:
确定矩阵式键盘上何键被按下介绍一种“行扫描法”。
行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示。
3.2LED显示电路设计
图3.2LED显示电路
3.3报警电路设计
主要有LED灯和蜂鸣器组成,当密码输入正确时,LED-green亮。
当密码输入错误时LED-yellow会亮,当输入三次错误时,LED-red亮并伴有蜂鸣器长响报警。
如图3-3所示。
图3-3报警显示电路
3.4开锁机构设计
信号通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而达到开锁的目的,其原理如图3.3所示:
图3.3密码锁开锁机构示意图
当用户输入的密码正确,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁,达到开门的目的,此次设计无电磁锁,利用一个发光二极管来代表门锁,亮表示锁开,灯灭表示锁合
第4章软件设计
4.1软件总体设计
软件的设计主要包括:
密码的固定、键盘识别判断、密码显示、密码比较、密码对处理、错报警。
软件设计总流程图如下:
图4-1软件设计总流程图
4.2各子程序的设计
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
#defineKeyPortP3
sbitLATCH1=P2^0;//定义锁存使能端口段锁存
sbitLATCH2=P2^1;//位锁存
sbitled1=P2^4;//led灯1
sbitled2=P2^5;//led灯2
sbitled3=P2^6;//led灯3
sbitBeep=P2^7;//报警器
UnsignedcharcodeDuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//显示段码值0~F
unsignedcharcodeWeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsignedcharTempData[8];//存储显示值的全局变量
unsignedcharcodepassword[5]={1,2,3,4,5};
voidbeep(void);
voidDelayUs2x(unsignedchart);//us级延时函数声明
voidDelayMs(unsignedchart);//ms级延时
voidDisplay(unsignedcharFirstBit,unsignedcharNum);//数码管显示函数
unsignedcharKeyScan(void);//键盘扫描
unsignedcharKeyPro(void);
voidInit_Timer0(void);//定时器初始化
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
unsignedcharnum,i,j;
unsignedcharinputtimes;
unsignedchartemp[6];
bitFlag;
Init_Timer0();
while
(1)//主循环
{num=KeyPro();
if(num!
=0xff)
{if(i==0)
{for(j=0;j<8;j++)//清屏
TempData[j]=0;
}
if(i<5)
{temp[i]=DuanMa[num];//把按键值输入到临时数组中
for(j=0;j<=i;j++)//通过一定顺序把临时数组中的值赋值到显示缓冲区,从右往左输入
TempData[7-i+j]=temp[j];
}
if(num==10)//退格
{i=i-2;
for(j=0;j<8;j++)//清屏
TempData[j]=0;
for(j=0;j<=i;j++)
TempData[7-i+j]=temp[j];
}
i++;//输入数值累加
if(num==11)//按下确认键
{i=0;
Flag=1;//先把比较位置1
for(j=0;j<5;j++)//循环比较5个数值,如果有一个不等则最终Flag值为0?
Flag=Flag&&(temp[j]==DuanMa[password[j]]);
//比较输入值和已有密码
for(j=0;j<8;j++)//清屏
TempData[j]=0;
if(Flag)//如果比较全部相同,标志位置1
{TempData[2]=0x3f;//"o"
TempData[3]=0x73;//"p"
TempData[4]=0x79;//"E"
TempData[5]=0x54;//"n"
//说明密码正确,输入对应操作显示"open"
inputtimes=0;
Flag=0;//密码正确指示灯闪烁蜂鸣器响
led1=0;
DelayMs(2000);
led1=1;}
else
{TempData[2]=0x79;//"E"
TempData[3]=0x50;//"r"
TempData[4]=0x50;//"r"
//否则显示"Err"
inputtimes++;
if(inputtimes<3)
{led2=0;
DelayMs(2000);
led2=1;}
if(inputtimes==3)
{TempData[0]=0x7f;
TempData[1]=0x7f;
TempData[2]=0x7f;
TempData[3]=0x7f;
TempData[4]=0x7d;
for(i=10;i>0;i--)
{led3=!
led3;
DelayMs(200);
beep();}
while
(1);
}}}
if(num==12)//清除
{i=0;
for(j=0;j<8;j++)//清屏
TempData[j]=0;}}}}
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{while(--t);}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{while(t--)
{//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);}}
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数FirstBit表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
voidDisplay(unsignedcharFirstBit,unsignedcharNum)
{staticunsignedchari=0;
DataPort=0;//清空数据,防止有交替重影
LATCH1=1;//段锁存
LATCH1=0;
DataPort=WeiMa[i+FirstBit];//取位码
LATCH2=1;//位锁存
LATCH2=0;
DataPort=TempData[i];//取显示数据,段码
LATCH1=1;//段锁存
LATCH1=0;
i++;
if(i==Num)
i=0;}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
voidInit_Timer0(void)
{TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00;//给定初值
//TL0=0x00;
EA=1;//总中断打开
ET0=1;//定时器中断打开
TR0=1;//定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
voidTimer0_isr(void)interrupt1
{TH0=(65536-2000)/256;//重新赋值2ms
TL0=(65536-2000)%256;
Display(0,8);//调用数码管扫描}
voidbeep(void)
{unsignedchari;
for(i=0;i<100;i++)
{DelayMs(5);
Beep=!
Beep;//BEEP取反}
Beep=1;//关闭蜂鸣器}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsignedcharKeyScan(void)//键盘扫描函数,使用行列反转扫描法
{unsignedcharcord_h,cord_l;//行列值中间变量
KeyPort=0x0f;//行线输出全为0
cord_h=KeyPort&0x0f;//读入列线值
if(cord_h!
=0x0f)//先检测有无按键按下
{DelayMs(10);//去抖
if((KeyPort&0x0f)!
=0x0f)
{cord_h=KeyPort&0x0f;//读入列线值
KeyPort=cord_h|0xf0;//输出当前列线值
cord_l=KeyPort&0xf0;//读入行线值
while((KeyPort&0xf0)!
=0xf0);//等待松开并输出
return(cord_h+cord_l);//键盘最后组合码值
}}return(0xff);//返回该值}
/*------------------------------------------------
按键值处理函数,返回扫键值
------------------------------------------------*/
unsignedcharKeyPro(void)
{switch(KeyScan())
{case0x7d:
return0;break;//0按下相应的键显示相对应的码值
case0xeb:
return1;break;//1
case0xed:
return2;break;//2
case0xee:
return3;break;//3
case0xdb:
return4;break;//4
case0xdd:
return5;break;//5
case0xde:
return6;break;//6
case0xbb:
return7;break;//7
case0xbd:
return8;break;//8
case0xbe:
return9;break;//9
case0x7b:
return10;break;//清除键
case0x7e:
return11;break;//退格键
case0x77:
return12;break;//确认键
default:
return0xff;break;}
}
第5章系统调试
5.1初始化仿真图:
5.2正确输入密码仿真图:
5.3正确密码时按下确认键仿真图:
5.4输入错误密码仿真图:
5.5错误密码时按下确认键的仿真图:
5.6三次错误密码时按下确认键的仿真图:
设计总结
在课程设计2个星期里,学到很多东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过课程设计我认识到理论与实际相结合的重要性,只有理论知识是远远不够的,把所学的理论知识与实际相结合起来,从理论中得出结论,才能真正提高自己的独立思考的能力。
在设计的过程中我遇到各式各样的问题,同时也发现自己的许多不足之处。
整了个设计过程对我而言可以说是困难重重,譬如对以前所学过的知识理解得不够深刻,掌握得不够牢固,不会查阅资料,觉得无从下手等等。
但课程设计提供了一个同学们互相交流学习的平台和环境,同时也是将平时掌握的知识融会贯通的过程。
所以,我很珍惜每次课程设计的机会。
不仅学到课专业知识,同时锻炼的