基于单片机和C语言的电子密码锁.docx

上传人:b****5 文档编号:28766823 上传时间:2023-07-19 格式:DOCX 页数:36 大小:2.57MB
下载 相关 举报
基于单片机和C语言的电子密码锁.docx_第1页
第1页 / 共36页
基于单片机和C语言的电子密码锁.docx_第2页
第2页 / 共36页
基于单片机和C语言的电子密码锁.docx_第3页
第3页 / 共36页
基于单片机和C语言的电子密码锁.docx_第4页
第4页 / 共36页
基于单片机和C语言的电子密码锁.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

基于单片机和C语言的电子密码锁.docx

《基于单片机和C语言的电子密码锁.docx》由会员分享,可在线阅读,更多相关《基于单片机和C语言的电子密码锁.docx(36页珍藏版)》请在冰豆网上搜索。

基于单片机和C语言的电子密码锁.docx

基于单片机和C语言的电子密码锁

 

电子密码锁

 

 

辅导老师:

***

2013年1月

 

摘要

电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。

它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。

现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。

本文以STC89C52单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的基本功能,其主要具有如下功能:

●密码通过键盘输入,若密码正确,则将锁打开

●密码输入错误,蜂鸣器将报警提示

●用户可以自由设定密码

本密码锁具有设计方法合理,简单易行成本低,安全实用等特点,具有一定的推广价值。

关键词:

STC89C52;电子密码锁;功能

1绪论

随着人们生活水平的提高,日常生活和工作中的住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存等一系列安全防盗问题变的尤其突出。

传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,且人们常需携带多把钥匙,使用极不方便,一旦钥匙丢失安全性即大打折扣。

随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。

为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。

密码锁因具有安全性高、成本低、功耗低、易操作等优点,受到了广大用户的青睐。

现今常见的密码锁设计主要有两种方案,一种是中规模集成电路控制的方案,另一种是单片机控制的方案。

对于采用集成电路控制的方案,其中的编码电子锁电路分为编码电路、控制电路、复位电路、解码电路、防盗报警电路、门铃电路,而电子锁主要由输入元件、电路(包括电源)以及锁体三部分组成。

显然此种方案的物理实现结构较为复杂且重新设置密码、输入密码的操作过程也会给用户带来一定的不方便;而利用单片机控制的方案,由于单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加掉电存储、声光提示甚至添加遥控控制功能,但其也有一定的局限性,就在于其控制原理的复杂以及要求设计人员具有更加良好的程序设计能力,调试较为繁琐,否则程序一旦跑飞将造成意想不到的损失。

通过对这两种方案的优缺点比较,再考虑到本人自己对单片机设计具有一定的基础,所以此次选择利用单片机来进行密码锁的设计。

本文以STC89C52单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的基本功能。

系统能实现如下的功能:

(1)密码通过键盘输入,若密码正确,则将锁打开

(2)密码输入错误,蜂鸣器将报警提示

(3)用户可以自由设定密码

系统功能实用,成本低廉,具有一定的实用价值。

2系统的总体设计和主要元器件介绍

2.1设计要求

²以STC89C52单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的以下基本功能:

²

(1)输入密码时不显示所输入的数字,有一定的防偷窥特点

²

(2)密码通过键盘输入,若密码正确,则显示灯发光,将锁打开

²(3)密码输入错误,蜂鸣器将报警提示

²(4)用户可以自由设定密码

²本密码锁具有设计方法合理,简单易行成本低,安全实用等特点,具有一定的推广价值。

 

2.2系统的总体思路设计

以STC89C52单片机为主控制单元,键盘为主要输入单元,结合开锁装置、报警器和显示器完成整个系统设计。

系统的运行过程大致如下:

假设初始状态为闭锁,此时整个系统只等待按键输入,数码管也不显示。

每按下一个数据键(即每输入一个密码),数码管相应的显示一个“-”标志,当密码全部输入完成后,需按下确认键“#”,此时系统判断密码是否正确,正确则开锁(仿真中以继电器动作导致发光二级管点亮为标志),错误则报警,此后数码管熄灭继续等待按键;若按下密码重置键“*”,则需先输入原密码,正确后请输入新密码,输入密码过程中,数码管显示如上“-”。

2.3主要元器件介绍

2.3.1STC89C52介绍

STC89C52引脚图

本次毕业设计选用的是STC89C52,STC89C52是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。

单片机的可擦除只读存储器可以反复擦除1000次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的STC89C52是一种高效微控制器。

STC89C52单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89C51主要特性:

1.与MCS-51兼容

2.4K字节可编程FLASH存储器

3.寿命:

1000写/擦循环

4.数据保留时间:

10年

5.全静态工作:

0Hz-24MHz

6.三级程序存储器锁定

7.128×8位内部RAM

8.32可编程I/O线

9.两个16位定时器/计数器

10.5个中断源

11.可编程串行通道

12.低功耗的闲置和掉电模式

13.片内振荡器和时钟电路

STC89C52单片机引脚:

VCC:

供电电压。

  GND:

接地。

  P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P0口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。

  P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为低八位地址接收。

  P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

  P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

  P3口也可作为STC89C52的一些特殊功能口,如下表所示:

  口管脚备选功能

  P3.0RXD(串行输入口)

  P3.1TXD(串行输出口)

  P3.2/INT0(外部中断0)

  P3.3/INT1(外部中断1)

  P3.4T0(记时器0外部输入)

  P3.5T1(记时器1外部输入)

  P3.6/WR(外部数据存储器写选通)

  P3.7/RD(外部数据存储器读选通)

  P3口同时为闪烁编程和编程校验接收一些控制信号。

  RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

  ALE/PROG:

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:

每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

  /PSEN:

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

  /EA/VPP:

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

  XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

  XTAL2:

来自反向振荡器的输出。

  

振荡器特性:

XTAL1和XTAL2分别为反向放大器的输入和输出。

该反向放大器可以配置为片内振荡器。

石晶振荡和陶瓷振荡均可采用。

如采用外部时钟源驱动器件,XTAL2应不接。

有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

2.3.2继电器介绍

继电器是一种电控制器件。

它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。

通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。

故在电路中起着自动调节、安全保护、转换电路等作用。

当输入量(如电压、电流、温度等)达到规定值时,继电器被所控制的输出电路导通或断开。

输入量可分为电气量(如电流、电压、频率、功率等)及非电气量(如温度、压力、速度等)两大类。

继电器具有动作快、工作稳定、使用寿命长、体积小等优点。

广泛应用于电力保护、自动化、运动、遥控、测量和通信等装置中。

电磁继电器工作原理和特性:

图2.5继电器原理图

电磁继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。

只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。

当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。

这样吸合、释放,从而达到了在电路中的导通、切断的目的。

对于继电器的“常开、常闭”触点,可以这样来区分:

继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。

继电器一般有两股电路,为低压控制电路和高压工作电路。

2.3.3LED数码管介绍

图2.6数码管

LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。

这些段分别由字母a,b,c,d,e,f,g,dp来表示。

当数码管特定的段加上电压后,这些特定段就会发亮,以形成我们眼睛看到的样子。

以“2”为例,应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。

LED数码管有一般亮和超亮等不同之分,也有0.5寸、1寸等不同的尺寸。

小尺寸数码管的显示笔画常用一个发光二极管组成,而大尺寸的数码管由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。

发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。

常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。

在本次实验中我们用的是四位一体的数码管,图如下:

3、硬件设计

3.1单片机主控制模块(含晶振、复位基本工作电路)

图3.1主控制模块

3.2键盘输入模块

图2.7矩阵键盘

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成3*4=12个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。

这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。

行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。

按键功能介绍:

第一行自左至右依次是1,2,3键,第二行自左至右依次是4,5,6键,第三行自左至右依次是7,8,9键,第四行自左至右依次是*,0,#键

表3.1按键功能

按键

键名

功能说明

0-9键

数字键

输入密码

*键

重设密码键

设定新密码

#键

确认键

确认密码输入完毕

 

3.3显示模块

图3.3显示模块

此设计中,使用了四个共阴极数码管,使用动态显示技术控制数码管。

其4个位选信号与P2.0-P2.3相连,当其中某位为低电平时表示选中该位;8段段选信号与P0口相连,当其中某段为高电平时导通该段,特殊的,由于STC89C52的P0口的驱动能力较弱,不足以驱动数码管点亮,故在此又引入上拉电阻以驱动数码管。

关于上拉电阻有如下介绍:

1、当TTL电路驱动CMOS电路时,如果电路输出的高电平低于CMOS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。

2、OC门电路必须加上拉电阻,以提高输出的高电平值。

  

3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。

  

4、在CMOS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗,提供泄荷通路。

  

5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。

6、提高总线的抗电磁干扰能力。

管脚悬空就比较容易接受外界的电磁干扰。

7、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。

 

3.4报警和开锁模块

图3.4报警和开锁模块

报警模块由蜂鸣器、PNP三极管和单片机组成。

选择一只压电式蜂鸣器,压电式蜂鸣器工作时约需要100mA驱动电流。

特殊的,此处为加强驱动能力,选用三极管来放大电流驱动蜂鸣器。

当STC89C52的P3.0口输出为低电平时,三极管导通,蜂鸣器产生蜂鸣音,STC89C52输出为高电平时,蜂鸣器不发声。

此处以继电器的动作来模拟锁的开闭。

同样,为了增强驱动能力添加了PNP三极管以放大电流,当P3.1口为低电平时,三极管导通,此时继电器动作(锁开),灯亮;二极管具有续流作用以保护器件安全

4、软件设计

4.1系统框图

 

4.2系统程序设计流程图

图3.6总程序流程图

 

4.2系统程序设计

重要端口定义说明:

sbitbuzzer=P3^0;

sbitrelay=P3^1;

ucharcodetable[2]={0x40,0x00};//共阴极数码管编码显示‘-’和熄灭

ucharkeyword[4]={1,1,1,1};

ucharkeycmp[4];

ucharkey=0,num=0,flg=0;

报警子程序:

(通过控制buzzer端口的高低电平来控制三极管的通断,从而控制蜂鸣器)

voidalarm()

{num=0;

buzzer=0;

delay(100);

buzzer=1;

}

 

数码管显示子程序:

LED显示器工作方式有两种:

静态显示方式和动态显示方式。

静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。

当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。

这种方法的优点是占用CPU时间少,显示便于监测和控制。

缺点是硬件电路比较复杂,成本较高;动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。

选亮数码管采用动态扫描显示。

所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

动态显示的亮度比静态显示要差一些。

本设计使用动态显示方法。

voiddisplay()

{uchari,j,cs=0x7f;

for(i=num;i>0;i--)

{

P0=table[0];

cs=_crol_(cs,1);

P2=cs;

delay(10);

}

for(j=4-num;j>0;j--)

{

P0=table[1];

cs=_crol_(cs,1);

P2=cs;

delay(10);

}

}

按下确认键后执行功能子程序:

(使用标志变量flg,根据其值来选择执行相应的功能)

voidok()

{uchari=0;

display();//P0=(flg+1);delay(1000);

if(flg==0)

{

for(i=0;i<4;i++)

if(keyword[i]!

=keycmp[i]){alarm();break;}

if(num==4){relay=0;num=0;}

}

if(flg==2)

{

num=0;

for(i=0;i<4;i++)keyword[i]=keycmp[i];

flg=0;

}

if(flg==1)

{

for(i=0;i<4;i++)

if(keyword[i]!

=keycmp[i]){alarm();break;}

if(num==4)

{

num=0;

display();//P0=0x07;delay(1000);

flg=2;

}

}

}

键盘扫描子程序:

(运用矩阵键盘逐行逐列扫描法,一次检测各个按键)

键盘是单片机常用输入设备,在按键数量较多时,为了节省I/O口等单片机资源,一般采取扫描的方式来识别到底是哪一个键被按下。

即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。

查找哪个按键被按下的方法为:

一个一个地查找。

先第一行输出0,检查列线是否非全高;否则第二行输出0,检查列线是否非全高;否则第三行输出0,检查列线是否非全高;如果某行输出0时,查到列线非全高,则该行有按键按下;根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。

voidkeyscan()

{

uchartemp1,temp2;

P1=0xfe;//令第一列为低电平,检测第1列

temp1=P1;

if(temp1!

=0xfe)

{

delay(5);//去抖

temp2=P1;

if(temp1==temp2)

{

switch(temp2)

{

case0xf6:

if(num<4){key=1;keycmp[num]=key;num++;display();}

elsealarm();

break;

case0xee:

if(num<4){key=4;keycmp[num]=key;num++;display();}

elsealarm();

break;

case0xde:

if(num<4){key=7;keycmp[num]=key;num++;display();}

elsealarm();

break;

case0xbe:

set();break;

}

}

}

while(temp1!

=0xfe)temp1=P1;//等待按键释放

P1=0xfd;//检测第2列

temp1=P1;

if(temp1!

=0xfd)

{

delay(5);//去抖

temp2=P1;

if(temp1==temp2)

{

switch(temp2)

{

case0xf5:

if(num<4){key=2;keycmp[num]=key;num++;display();}

elsealarm();

break;

case0xed:

if(num<4){key=5;keycmp[num]=key;num++;display();}

elsealarm();

break;

case0xdd:

if(num<4){key=8;keycmp[num]=key;num++;display();}

elsealarm();

break;

case0xbd:

if(num<4){key=0;keycmp[num]=key;num++;display();}

elsealarm();

break;

}

}

}

while(temp1!

=0xfd)temp1=P1;//等待按键释放

P1=0xfb;//检测第3列

temp1=P1;

if(temp1!

=0xfb)

{

delay(5);//去抖

temp2=P1;

if(temp1==temp2)

{

switch(temp2)

{

case0xf3:

if(num<4){key=3;keycmp[num]=key;num++;display();}

elsealarm();

break;

case0xeb:

if(num<4){key=6;keycmp[num]=key;num++;display();}

elsealarm();

break;

case0xdb:

if(num<4){key=9;keycmp[num]=key;num++;display();}

elsealarm();

break;

case0xbb:

if(num==4)ok();

elsealarm();

break;

}

}

}

while(temp1!

=0xfb)temp1=P1;//等待按键释放

d

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1