- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)