基于单片机的密码锁设计
- 格式:pdf
- 大小:966.44 KB
- 文档页数:30
单片机原理及接口技术课程设计报告设计题目:基于单片机的密码锁设计学号:姓名:墨小染Shawn指导教师:信息与电气工程学院二零一三年七月目录引言 (1)第1章设计任务 (3)第2章系统整体方案设计 (4)第3章硬件系统设计 (5)3.1单片机最小系统 (5)3.2 键盘电路 (6)3.3 数码管显示电路 (6)3.4 报警电路 (7)第4章系统程序设计 (8)4.1 主程序流程图 (9)4.1.1 锁住状态 (9)4.1.2 报警状态 (10)4.1.3 密码输入正确状态 (10)4.1.4 解锁完成状态 (10)4.1.5 修改密码状态 (11)4.2 键盘扫描流程图 (11)第 5 章系统仿真、调试及结论 (12)5.1 Proteus软件简介 (12)5.2 进入Proteus ISIS (13)5.3 工作界面 (14)5.4 软件仿真 (14)5.5 硬件调试 (15)第 6 章程序清单 (16)第7 章小结 (30)基于单片机的密码锁设计在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。
随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。
为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。
密码锁具有安全性高、成本低、功耗低、易操作等优点。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。
随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。
随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。
但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。
而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。
加上其成本较高,一定程度上限制了这类产品的普及和推广。
鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。
1. 设计任务结合实际情况,基于AT89C52单片机设计一个密码锁系统。
该系统应满足的功能要求为:(1)总共可设置8位密码,每位密码值范围为1-8;(2)可自行设定和修改密码;密码按键时有声音提示;(3)键入密码错误报警5秒,连续三次键入错误报警1分钟,报警期间输入密码无效;(4)输入密码正确,有1秒的开锁提示音;(5)密码设定完毕后有2秒提示音。
开锁后5秒内未进入,自动锁闭。
主要硬件设备:单片机实验开发系统:矩阵键盘,开关量输入模块,LED 输出模块,数码管(LED)显示器,液晶显示器,点阵显示模块2. 整体方案设计本设计采用STC89C52单片机为主控芯片,结合外围电路矩阵键盘、数码管和蜂鸣器等部分组成。
其中矩阵键盘用于输入数字密码和进行各种功能的实现。
由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到报警电路控制是否报警。
系统的整体设计方案设计图如图所示。
系统的整体方案设计图3. 系统硬件电路设计3.1单片机最小系统晶振电路和复位电路3.2 键盘电路使用矩阵键盘,所以本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O线的数目,在按键比较多的时候,通常采用这样方法。
如图所示。
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N ×M个按键的键盘。
在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。
3.3数码管显示电路本系统设计的显示电路是为了给使用者以提示而设置的。
本系统的显示采用数码管动态扫描的方式,只使用单片机的一个串行口,利用两个74HC573实现对数码管位选信号和段选信号的控制,就可以完成单片机的显示功能,显示电路的电路原理图如图所示。
用P2.6和P2.7分别接两个74HC573的控制端,P0口接两个74HC573的输入端;第一个74HC573的输出口提供段选信号,第二个74HC573的输出口提供位选信号。
用74HC573的锁存功能,实现对段选信号和位选信号的控制,其逻辑功能表如表如下:3.4 报警电路报警模块由蜂鸣器、三极管和单片机组成。
选择一只压电式蜂鸣器,压电式蜂鸣器工作时约需要100mA驱动电流。
蜂鸣器电路如图所示,当89C51的P2.3口输出为低电平时,蜂鸣器产生蜂鸣音,89C51输出为高电平时,蜂鸣器不发声。
4. 系统程序设计4.1 主程序流程图1.锁住状态设定的初始密码是“11111111”,程序刚开始运行的时候是处于锁住状态,此时数码管显示“LOCK”,等待矩阵键盘输入密码,密码输入正确后才能进行解锁或者修改密码操作。
2.报警状态密码输入错误时,蜂鸣器会发出声音,进入报警状态,此时蜂鸣器会报警5S,连续输入密码错误3次,会报警60S,报警期间键盘输入无效,报警结束后自动进入锁住状态,重新输入密码。
3.密码输入正确状态密码输入正确时,数码管显示COOL,此时等待按键操作,如果5秒内无按键操作则自动进入锁住状态,如果有按键操作,进入解锁完成状态。
4.解锁完成状态密码输入正确后,有按键操作,则进入解锁完成状态,此时数码管显示OPEN,并且可以通关按键操作,选择进入修改密码状态或者返回锁住状态。
5.修改密码状态进入密码修改状态,数码管显示CODE,此时可以通过矩阵键盘设定8位1-8的密码,密码修改成功后数码管显示COOL,同时蜂鸣器响2S,然后重新回到锁住状态。
4.2 键盘扫描程序流程图5. 系统调试5.1Proteus软件简介Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。
它运行于Windows操作系统上,可以仿真、分析各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和数字电路仿真相结合。
具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
②支持主流单片机系统的仿真。
目前支持的单片机类型有:68000系列、8051系列、A VR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
③提供软件调试功能。
在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。
④具有强大的原理图绘制功能。
总之,该软件是一款集单片机和电路分析于一身的仿真软件,功能极其强大。
5.2进入Proteus ISIS双击桌面上的ISIS 6 Professional图标或者单击屏幕左下方的“开始”→“程序”→“Proteus 7.1 Professional” →“ISIS 7.1 Professional”,出现如图5-1所示5.3工作界面Proteus ISIS的工作界面是一种标准的Windows界面,如图5-2所示。
包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。
图5- 1 Proteus ISIS的工作界面运行Proteus程序后,进入软件的主界面。
通过左侧工具栏中的P(从库中选择元件命令)命令,在Pick Devices 左侧窗口中选择所需元件的关键字,然后放置元件并调整方向和位置以及参数设置,进行连线。
最后载入hex文件后可以进行模拟仿真,可以全速运行也可以单步调试运行。
Proteus运行按键5.4 Proteus软件仿真我在用Proteus进行仿真时遇到提示说找不到HEX文件,经过查阅相关资料,发现只要双击单片机那个原件,重新加载一下HEX文件所在的路径就能解决问题,如图所示:5.5硬件调试晶振电路,复位电路,STC89C52单片机,数码管,74HC573锁存器,6位数码管,蜂鸣器,矩阵键盘,排阻(使用P0口时需要接上拉电阻)6. 程序清单#include <reg52.h> //包含头文件#define uchar unsigned char#define uint unsigned intsbit beep=P2^3; //定义特殊功能寄存器的位变量sbit dula=P2^6;sbit wela=P2^7;uint num,time,led,set,back,key; //定义全局变量uint shi,ge;uchar code table[]={ //数码管显示“0~F”对应的编码0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff,0x7c,0x39,0x5e,0x79,0x71};uchar code lock[]={0x38,0x3f,0x39,0x78};//数码管显示“LOCK”的编码uchar code open[]={0x3f,0x73,0x79,0x37};//数码管显示“OPEN”的编码uchar code setcode[]={0x39,0x3f,0x5e,0x79}//数码显示“CODE”的编码uchar code complete[]={0x39,0x3f,0x3f,0x38};//数码管显示"COOL"的编码uint tablecod[]={1,1,1,1,1,1,1,1}; //初始密码为11111111uint tempcod[]={1,1,1,1,1,1,1,1}; //输入的密码存放的数表void delayms(uint xms)//延时函数{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void di(uint xms) //蜂鸣器报警函数{beep=0;delayms(xms);beep=1;}void keyscan1() //矩阵键盘输入密码{uchar temp;P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:tempcod[num]=1;key=1;num++;di(10);break;case 0xdd:tempcod[num]=2;key=2;num++;di(10);break;case 0xbd:tempcod[num]=3;key=3;num++;di(10);break;case 0x7d:tempcod[num]=4;key=4;num++;di(10);break;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:tempcod[num]=5;key=5;num++;di(10);break;case 0xdb:tempcod[num]=6;key=6;num++;di(10);break;case 0xbb:tempcod[num]=7;key=7;num++;di(10);break;case 0x7b:tempcod[num]=8;key=8;num++;di(10);break;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:set=1;di(10);break;case 0xd7:set=2;di(10);break;default :break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}}void keyscan2() //矩阵键盘修改密码{uchar temp;P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:tablecod[num]=1;key=1;num++;di(10);break;case 0xdd:tablecod[num]=2;key=2;set=1;num++;di(10);break;case 0xbd:tablecod[num]=3;key=3;num++;di(10);break;case 0x7d:tablecod[num]=4;key=4;num++;di(10);break;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:tablecod[num]=5;key=5;num++;di(10);break;case 0xdb:tablecod[num]=6;key=6;num++;di(10);break;case 0xbb:tablecod[num]=7;key=7;num++;di(10);break;case 0x7b:tablecod[num]=8;key=8;num++;di(10);break;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:di(10);break;case 0xd7:di(10);break;default :break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}void keyscan3() //选择修改密码或者返回锁住状态{uchar temp;P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:di(10);break;case 0xdd:di(10);break;case 0xbd:di(10);break;case 0x7d:di(10);break;break;}while(temp!=0xf0) {temp=P3;temp=temp&0xf0; }}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:di(10);break;case 0xdb:di(10);break;case 0xbb:di(10);break;case 0x7b:di(10);break;break;}while(temp!=0xf0) {temp=P3;temp=temp&0xf0; }}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:set=1;di(10);break;case 0xd7:set=2;di(10);break;default :break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}void display(uchar w1,w2,w3,w4,w5,w6) //数码管显示函数{dula=1;P0=w1;dula=0;P0=0xff;wela=1;P0=0xfe;delayms(2);P0=0xff;dula=1;P0=w2;dula=0;P0=0xff;wela=1;P0=0xfd;delayms(2); P0=0xff;wela=0;dula=1;P0=w3;dula=0;P0=0xff;wela=1;P0=0xfb;delayms(2); P0=0xff;wela=0;dula=1;P0=w4;dula=0;P0=0xff;wela=1;P0=0xf7;delayms(2); P0=0xff;wela=0;dula=1;P0=w5;dula=0;P0=0xff;wela=1;P0=0xef;delayms(2); P0=0xff;wela=0;dula=1;P0=w6;P0=0xff;wela=1;P0=0xdf;delayms(2);P0=0xff;wela=0;}void T0_time() interrupt 1 //中断函数{TH0=(65536-45872)/256;TL0=(65536-45872)%256;time++;if(time==20){time=0;led++;}}void main() //主函数{uint i,tag,error,ledtime,ditime;error=0;while(1){tag=3;keyscan1();display(lock[0],lock[1],lock[2],lock[3],table[key],table[num]); if(num==8){for(i=0;i<8;i++){if(tablecod[i]!=tempcod[i])tag=0;elsetag=1;}}if(tag==0) //密码错误{error++;if(error==3){ledtime=60;}else{ledtime=5;}TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;led=0;num=0;while(1){shi=led/10;ge=led%10;display(lock[0],lock[1],lock[2],lock[3],table[shi],table[ge]); di(10);if(led==ledtime){key=0;break;}}}if(tag==1) //密码正确{TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;led=0;num=0;key=0;while(1){shi=led/10;ge=led%10;display(complete[0],complete[1],complete[2],complete[3],table[ shi],table[ge]);keyscan1();if(key!=0)// 解锁完成{TR0=0;set=0;while(1){display(open[0],open[1],open[2],open[3],table[0],table[0]); keyscan3();if(set==2) //返回锁住状态{num=0;key=0;error=0;break;}if(set==1) //进入修改密码状态{TR0=1;tag=2;key=0;break;}}break;}else{TR0=1;tag=1;}if(led>=1&&led<5) //开锁5秒内未进入,自动锁闭,前2秒声音提示{ditime=0;}else if(led==5){ditime=0;key=0;error=0;break;}else{}}}if(tag==2) //设定密码{TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=0;led=0;num=0;while(1) //设定8位密码{keyscan2();display(setcode[0],setcode[1],setcode[2],setcode[3],table[key] ,table[num]);if(num==8){key=0;break;}}while(1) //密码设定完毕,提示2秒{TR0=1;shi=led/10;ge=led%10;display(complete[0],complete[1],complete[2],complete[3],table[ shi],table[ge]);di(10);if(led==2){num=0;error=0;break;}}}}}7.小结以前做电子设计大赛的时候做过可编程控制交通灯、自动寻迹小车,都是用51单片机来实现的,所以对51单片机有一定的了解,再加上本学期学习了《单片机原理及接口技术》,经过在实验室的试验箱上实际操作,用汇编语言实现了一些简单的功能以及8155和8255的IO口扩展,我对单片机的工作原理有了更清晰的认识,所以这次课程设计还算是比较轻松。