基于AT89S52单片机的密码锁设计.docx

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于 AT89S52 单片机的密码锁设计 一、项目概述 很多行业的许多地方都需要密码锁,但普通密码锁的密码容易被多次试探而 破译。此项目给出了一种能防止多次试探密码的密码锁设计方法,从而有效地克 服了上述缺点。这种能防止多次试探密码的单片机密码锁应用前景广泛。 二、项目要求 基于 AT89S52 单片机的密码锁设计,具体功能如下: 总共可以设置 8 位密码,每位密码值范围为 1~8. 用户可以自行设定和修改密码。 按每个键时都有声音提示。 若键入的 8 位开锁密码不完全正确,则报警 5s,以提醒他人注意。 (5)开锁密码连续错 3 次要报警 1 分钟,报警期间输入密码无效,以防止窃贼 多次试探密码。 键入 8 位开锁密码完全正确才能开锁,开锁时有 1s 的提示音。 电磁锁的电磁线圈每次通电 5s,然后恢复初态 密码键盘上只允许有 8 个密码按键。锁内有备用电池,只有内部上电复位 时才能设置和修改密码,因此,仅在门外按键是不能修改或设置密码的。 (9)密码设定完毕后要有 2s 的提示音。 三、系统框图设计 按照系统设计的要求和功能,将系统分为主控模块、按键扫描模块、蜂鸣器、 电源电路、复位电路、晶振电路、驱动电路几个模块,系统组成框图如下。主控 模块采用 AT89S52 单片机。 系统组成框图 四、硬件设计 4.1 电路原理图 系统硬件电路图如下所示,P1 口接密码按键,开锁脉冲由 P3.2 输出,报警 和提示音由 P3.7 输出,按键 a~h 分别代表数字 1~8.若没有键按下,则 P1.0~P1.7 全是高电平;若某键被按下,则相应的口线为低电平。 系统硬件电路图 4.2 元件清单 基于 AT89S52 单片机的密码锁元件清单如表所示。 元件名称 型号 个数 用途 单片机 AT89S52 1 晶振 12MHz 1 电容 30Pf 2 电解电容 20Μ f/10V 1 控制核心 晶振电路 晶振电路 复位电路 按键 9 按键电路 三极管 8550 2 二极管 IN4004 1 蜂鸣器 1 放大电路 报警电路 电阻 1kΩ 电阻 10kΩ 电阻 4.7kΩ 1 上拉电路 复位电路 放大电路 继电器 5V 1 电源 +5V/0.5A 1 控制对象 提 供 +5V 电 源 五、软件设计 5.1 程序流程图 如图所示给出了该单片机密码锁电路的软件流程图。图中 AA1~AA8 以及 START、SET、SAVE 是程序中的标号,是为了理解程序而专门标在流程图的对应 位置的,分析程序时可以仔细参考对照。 该密码锁中的 RAM 存储单元的分配方案如下。 31H~38H:依次存放 8 位设定的密码,首位密码存放在 31H 单元中。 R0:指向密码地址。 R2:已经输入密码位数。 R3:存放允许错误密码次数 3 与实际错误密码次数的差值。 R4~R7:延时用。 00H:错码标志位。 对于 ROM 存储单元的分配,由于程序比较短,而且占用的存储空间比较少, 因此,在无特殊要求时,可以从 0030H 单元开始存放主程序。 单片机密码锁电路的软件流程图 5.2 程序清单 基于 AT89S52 单片机的密码锁程序清单如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit SPK=P3^7; sbit ACT=P3^2; bit ok_flag; static uchar indata[8]; static uchar status=0x01; static uchar l,m; uchar i,j; void BP(); void DELAY(); void PASSWORD_SET(); void PASSWORD_IN(); void main() { BP(); PASSWORD_SET(); for (i=0;i<22;i++) BP(); while(1) { if(l<3) { PASSWORD_IN(); if(!ok_flag) { ACT=0; for(i=0;i<8;i++) BP(); ACT=1; l=0; } else { l++; for(i=0;i<40;i++) BP(); ok_flag=0; } } l=0; for(i=0;i<24;i++) { for(j=0;j<200;j++) BP(); } } } void PASSWORD_SET(void) { if(m<8) { switch(status) { case 0x01: { if(P1==0xFF) { status=0x01; } else { DELAY(); status=0x02; } break; } case 0x02

文档评论(0)

liuxingmeng + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档