- 1、本文档共101页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于单片机的电子密码锁设计报告
引言
目前,最常用的锁是20世纪50年代意大利人设计的机械锁,其机构简单、使用方便、价格便宜。但在使用中暴露了很多缺点:一是机械锁是靠金属制成的钥匙上的不同齿形与锁芯的配合来工作的。据统计,每4000把锁中就有两把锁的钥匙齿牙相同或类似,故安全性低。二是钥匙一旦丢失,无论谁捡到都可以将锁打开。三是机械锁的材料大多为黄铜,质地较软,容易损坏。四是机械锁钥匙易于复制,不适于诸如宾馆等公共场所使用。由于人们对锁的安全性,方便性等性能有更高的要求,许多智能锁也相继问世,但这类产品的特点是针对特定指纹或有效卡,但能适用于保密要求高且仅供个别人使用的箱、柜、房间,其成本一般较高,在一定程度上限制了这类产品的普及和推广。
随着人们生活水平的提高,电子密码防盗锁作为防盗卫士的作用日趋重要。电子密码防盗锁用密码代替钥匙,不但省去了佩戴钥匙的烦恼,也从根本上解决了普通门锁保密性差的缺点。随着人们生活水平的提高,如何实现防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,机械锁的这些弊端为一种新型的锁---电子密码锁,提供了发展的空间。
随着人们对安全的重视和科技的发展,许多电子智能锁已在国内外相继面世。但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。加上其成本较高,一定程度上限制了这类产品的普及和推广。电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的欢迎。鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。
主要功能(详细说明见附录1)
1.输入密码正确开锁、密码修改(密码可为1-6位,断电密码不丢失);
2.输入密码错误次数超出设定值报警,并锁定键盘30s(后错误次数并不会改变,除非输入正确密码。时间日期的显示与调整(断电不归零);
3.自动上锁(时间可自行设定);
设计方案
该方案采用的是一种以STC-AT89C52为核心的单片机控制方案,利用单片机灵活的编程设计方式和丰富的I/O端口以及其控制的准确性,不但可以实现密码锁的基本功能,还能添加时间日期显示、无线报警甚至遥控控制等拓展功能。
系统模块电路的设计
系统总电路
系统程序流程:
开锁电路
在本次项目设计中,暂时用发光二极管代替电磁锁,开锁指示灯亮,表示锁开;电路如下所示:
报警电路
本设计的报警装置采用的是蜂鸣器。当用户输入密码错误次数超过设定值时,蜂鸣器将发出报警信号。
按键电路模块设计
本项目设计采用的是3*4矩阵键盘,这样能减少键盘与单片机接口时所占用的I/O线的数目,并增加了长按键的功能,在按键比较多的时候,这样能减少材料并降低成本。电路原理图如下所示:
在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段(即键盘扫描程序段)。
当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描法;另一种是速度较快的线反转法。由于添加了长按键功能,本设计采用逐行扫描法。
线反转法,通过获取行检测得到行值,再将行值做与运算赋给端口,然后检测到列值,最后行值与列值做或运算得到键值。
长按键是本设计的独特处之一,通过长按键可以精简按键版面,使操作更有趣味(看起来就那么多按键但功能有待发掘),同时节约了材料。
这里略谈一下逐行扫描法。此法将一个端口的8位分成高低两个部分(低四位,高四位),通过令一个部分的一位置低电平,检测另一部分与之有交集(按下按键后相交)是哪一个端口从而确定是哪一个按键被按下。
程序编写过程中需要考虑两个方面:去抖和松手检测。
源程序如下(一般矩阵键盘检测,非长按键检测):
uchar keyscan()
{
P3=0xf6;//第一竖扫描
temp=P3;//读取端口数值
temp=temp0xf0;//将端口值运算,便于判断是否有键按下
while(temp!=0xf0)
{
delay(1000);//延时,以消抖
temp=P3;
temp=temp0xf0;
while(temp!=0xf0)//再次判断端口值,检查按键是否仍按下
{
temp=P3;//读取此时端口值
switch(temp)
{
case 0xe6:key=1;
break;
cas
文档评论(0)