基于STC89C52单片机的电子密码锁完整版附仿真图原理图.docx
《基于STC89C52单片机的电子密码锁完整版附仿真图原理图.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的电子密码锁完整版附仿真图原理图.docx(39页珍藏版)》请在冰豆网上搜索。
基于STC89C52单片机的电子密码锁完整版附仿真图原理图
基于STC89C52单片机的电子密码锁(完整版)-附-仿真图-原理图
2电子密码锁的总体设计方案
2.1方案论证
2.1.1方案一采用单片机控制方案
选用单片机STC89C52作为本设计的核心元件,利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,实现基本的密码锁功能。
在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接LCD显示器用于显示作用。
框图如下图2.1所示。
图2.1系统框图
1)中央控制部分
采用STCT89C52单片机,该型单片机有8KB的ROM,512B的RAM,5个中断源,3个16位定时器/计数器。
2)显示部分
采用1602LCD显示屏组成显示电路来提示信息。
当输入密码时,只显示*,当密码位数输入完毕按下确认键之后,对输入的密码进行比较,正确就发出‘叮当’声,同时门打开;若密码输入不正确时显示错误,并计次录数,当次数超过三次就触动蜂鸣器发出报警声。
3)键盘输入部分
本设计所采用键盘为4×4行列式。
每一条水平线(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要4条行线和4条列线,即可组成4×4个按键的键盘。
在行线所接的单片机4个I/O口作为输出端,而列线所接的I/O口则作为输入端。
当按键没有被按下时所有的输出端都是高电平,代表无键按下。
一旦有键按下,则输入线就会被拉低,这样通过读入输入线的状态就可知是否有键按下。
按键功能分配分为数字键和功能键,数字键主要是用于密码输入,功能键主要是用于修改密码、确认密码、删除密码等。
4)报警电路部分
当输入密码错误超过3次,就会触动报警电路中蜂鸣器。
5)开锁电路部分
用发光二极管代替开锁的电路,发光表示开锁。
2.1.2方案二采用数字电路控制方案
用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过10秒(一般情况下,用户不会超过10秒,若用户觉得不便,还可以修改)电路将报警20秒,若电路连续报警三次,电路将锁定键盘2分钟,防止他人的非法操作。
电路由两大部分组成:
密码锁电路和备用电源(UPS),其中设置UPS电源是为了防止因为停电造成的密码锁电路失效,使用户免遭麻烦。
密码锁电路包含:
键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输入次数锁定电路。
电路框图如图2.2所示。
图2.2密码锁电路
2.1.3方案三采用EDA控制方案
1)整体结构设计
电子密码锁包括键盘控制、密码设置和报警提示三大功能模块。
2)硬件描述语言VHDL描述电路
首先在合适的路径下建立本设计的文件夹。
然后用VHDL语言编辑。
最后仿真测试及编程下载配置。
2.2方案比较以及可行性
方案一采用基于单片机实现的电子密码锁,其中硬件电路设计具有按键有效提示、输入错误提示、控制开锁电平、控制报警电路、修改密码电路等多种功能。
密码锁内部的单片机是核心处理设备,单片机有体积小、质量轻、价格便宜诸多优点。
单片机软件部分软件的设计主要是51单片机的程序编写且单片机是靠程序运行的,如果需要修改只需要修改程序,不需要将整个硬件电路做整修,这不仅以节约资源而且可以节约时间,提高工作效率。
因为通过不同的程序可以实现不同的功能,尤其是特殊的独特的一些功能。
这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的,但是单片机却可以轻松解决。
通过编写的程序可以实现高智能,高效率,以及高可靠性,比起数电中逻辑器件这个优点显而易见,因此方案一比方案二合适。
对比方案三,虽然都可通过编程来实现各种功能,但是单片机是软件编程,而EDA技术是在软件平台下,用硬件描述语言VHDL来实现的。
设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件。
对于我个人来说,EDA方面的知识有限,不太会运用,因此我个人不选择这个方案。
综上,本次设计最优选择为方案一即采用AT89C51为核心的单片机控制,其方案的可行性如下:
⏹单片机价格实惠,因而毕业设计成本不高。
⏹单片机型号、种类多,在市场上容易购买。
⏹电路的安装和调试都比较容易方便,比较易于实现。
3电子密码锁硬件电路的设计
本设计主要由中央控制模块、键盘输入模块、LCD显示密码模块、开锁电路模块、蜂鸣器报警电路模块五大模块组成。
3.1中央控制模块的设计
中央控制主要由STC89C52单片机构成,辅以复位电路和时钟电路。
3.1.1主控芯片STC89C52单片机的简介
1)STC89C52单片机的主要特性如下:
1)增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051。
2)用户应用程序空间为8K字节,片上集成512字节RAM。
3)通用I/O口(32个),P1/P2/P3/P4是准双向口/电阻上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
2)STC89C52RC引脚功能说明:
1)VCC(40引脚):
电源电压
2)VSS(20引脚):
接地
3)P0端口(P0.0~P0.7,39~32引脚):
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入每个引脚能驱动写入“1”时,可以作为高阻抗输入。
4)P1端口(P1.0~P1.7,1~8引脚):
P1口是一个内部带上拉电阻的8位双向I/O口。
P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。
5)P2端口(P2.0~P2.7,21~28引脚):
P2口是一个内部带上拉电阻的8位双向I/O端口。
P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流(I)。
6)P3端口(P3.0~P3.7,10~17引脚):
P3口是一个带内部上拉电阻的8位双向I/O端口。
7)RST(9引脚):
复位输入,当输入连续两个机器周期以上高电平时为有效,用来完成单片机的复位初始化操作。
8)ALE/ROG(30引脚)地址锁存控制信号:
(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
图3.1STC单片机管脚图
3.1.2时钟电路的设计
时钟信号用来提供单片机片内的各种微操作的时间基准,时钟信号通常用两种电路形式得到:
内部振荡和外部振荡。
MCS-51单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,如图2-2所示在其外接晶体振荡器(简称晶振)或陶瓷谐振器就构成了内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器并产生振荡时钟脉冲。
图3.1.2中外接晶体以及电容C2和C3构成并联谐振电路,它们起稳定振荡频率、快速起振的作用,其值为30pF左右,晶振频率选11.0592MHz,其连接电路如图3.2所示。
图3.2晶振电路
3.1.3复位电路的设计
单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。
单片机系统的复位方式有:
手动按钮复位和上电复位,其连接电路如图3.3所示。
1)手动按钮复位
手动按钮复位需要人为在复位输入端RST上加入高电平(图1)。
一般采用的办法是在RST端和正电源VCC之间接一个按钮。
当人为按下按钮时,则VCC的+5V电平就会直接加到RST端。
手动按钮复位的电路如所示。
由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。
2)上电复位
上电复位电路只要在RST复位输入引脚上接电容至VCC端,下接一个电阻到地即可。
对于CMOS型单片机,由于在RST内部有一个下拉电阻,故可将外部电阻去掉,而将外接电容减至1?
F。
上电复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,此高电平信号随着VCC对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。
为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。
上电时,VCC的上升时间约为10ms,而起振荡器的起时间取决于振荡频率,如晶振频率为10MHz,起振时间为1ms;晶振频率为1MHz,起振时间则为10ms。
在图2的复位电路中,当VCC掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。
另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“l”态。
如果系统在上电时得不到有效的复位,则程序计数器PC将得不到一个合适的初值,因此,CPU可能会从一个未被定义的位置开始执行程序。
图3.3手动按钮复位电路
3.2键盘输入模块的设计
3.2.1矩阵键盘工作原理
矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线,组成键盘的。
在行线和列线的每一个交叉点上,设置一个按键。
这样键盘中按键的个数是4×4个。
这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。
行列式键盘的工作方式是先利用列线发送扫描字,然后读取行线的状态,查看是否有按键按下。
键盘部分提供一种扫描的工作方式能对键盘不断扫描、自动消抖、自动识别按下的键,并给出编码。
在显示部分,它可以为发光二极管、荧光管及其他显示器提供按扫描方式工作的显示接口,而且为显示器提供多路复用信号,可以显示多达16位的字符或数字。
键盘中有无按键按下是由列线送入全扫描字、行线读入行线状态来判断的,其方法是由列线逐列置低电平后,检查行输入状态来判断,其方法是依次给列线送低电平,然后检查所有行线状态,如果全为1,则所按下的键不在此列,如果不全为1,则所按下的键必在此列,而且是在与0电平线相交的交点上的那个键。
3.2.2单片机键盘扫描法
扫描法是在判定有键按下后逐列果行(或列)的状态出现非全1状态,如果(或列)的状态出现非全1状态,这时0状态的行、列交点的键就是所按下的键。
扫描法的特点是逐行(或逐列)扫描查询,这时相应行(或列)应有上拉电阻接高电平。
行列式键盘扫描程序就是采用扫描法来确定哪个键按下的。
确定矩阵式键盘上哪个键被按下时运用扫描法,又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,过程如下:
1)判断键盘中有无键按下,将全部行线Y0~Y3置为低电平,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。
若所有列线,均为高电平,则键盘中无键按下。
2)判断闭合键所在的位置,在确认有键按下后,即可进入确定具体闭合键的过程。
其方法是:
依次将行线置为为低电平,即在置某根行线为低电平时,其他线为高电平,在确定某根行线位置为低电平后,再逐行检测各列线的电平状态,若某列为则该列线与置为低电平的行线交叉处的按钮就是闭合的按键,其连接电路如图3.4所示。
图3.4矩阵键盘电路与单片机连接图
3.3LCD显示密码模块的设计
显示模块主要由LCD1602显示屏组成,他显示的是键盘输入的密码,以及密码正确与错误的提示。
当输入密码时,出于安全性的考虑,显示的密码是有*号代替,为暗密。
当输入六位密码后按下确认键,系统会与存于ROM的密码对比,若密码错误,显示屏会显示Error,若密码正确,显示屏会显示Right。
3.3.1LCD1602简介
1)1602功能介绍
1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
2)1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表3.1所示:
表3.1引脚功能说明
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
其引脚图如下图所示:
图3.5LCD1602引脚图
3)LCD寄存器的选择
表3.2LCD寄存器的选择
E
R/W
RS
功能说明
1
1
0
写入命令寄存器
1
1
1
写入数据寄存器
1
1
0
读取忙碌标志及RAM地址
1
1
1
读取RAM数据
0
X
1
不动作
3.3.2LCD1602液晶显示模块与单片机连接电路
图3.6连接电路
3.4开锁模块的设计
通过单片机送给开锁执行机构,电路驱动原本是利用电磁锁吸合原理来进行开锁的的。
本设计为节约资源,通过P3.0接一个发光二极管作为电磁阀线圈,当发光二级管亮则表示实现,密码正确门开,若二极管不亮则表示输入的密码不正确,门不开,其连接电路如图3.7所示。
图3.7开锁电路
3.5报警模块的设计
报警模块由蜂鸣器和单片机组成。
选择一只压电式蜂鸣器,压电式蜂鸣器工作时约需要100mA驱动电流。
蜂鸣器电路如图3.5所示。
当89C51的P3.3口输出为高电平时,蜂鸣器产生蜂鸣音,89C51输出为低电平时,蜂鸣器不发声,其连接电路如图3.5所示。
图3.8报警电路
3.6硬件电路总体设计
本次设计的各大模块在上述章节中已仔细介绍了,将各大模块融合在一起后组成电子密码锁硬件电路,键盘输入模块和LCD显示模块是最主要的两大模块,键盘主要是完成密码的输入、修改密码、消除密码等等任务。
而显示模块则是主要完成输入密码的显示以及密码输入正确或者错误的提示。
而剩余的就是报警模块、开锁模块以及单片机的最小系统。
开锁顾名思义就是密码输入正确后打开大门,而报警主要是为安全着想,当有人非法入侵时便于抓住犯人。
单片机最小系统则是单片机正常运行的保障。
总的硬件电路如图3.9所示。
图3.9总的硬件电路
4电子密码锁的软件设计
电子密码锁的软件设计是整个电子密码锁可靠安全运行的关键,密码锁软件程序分为主程序、延时子程序、LCD显示子程序、修改密码子程序、扫描键盘输入子程序、报警子程序。
密码通过矩阵键盘输入,并且在液晶显示屏上显示,如果输入密码正确,则可以直接开锁。
如果不正确,并且3次以上输入不正确,则启动报警系统,触发蜂鸣器发声。
如果要修改密码,则需要在输入基础密码判别正确后,输入修改后的密码,通过系统确认后方可修改密码。
为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。
而本次设计分为四大模块,分别是键盘输入模块、LCD显示模块、开锁和报警模块以及修改密码模块,通过主程序来实现控制。
4.1主程序流程介绍
主程序主要内容是各子程序模块的调用,并利用各模块进行电子密码锁功能的实现,即是键盘输入密码并在LCD液晶显示屏上显示密码,当密码输入完成后,单片机会将输入进的密码与原单片机内部所储存的密码进行对比,如若密码正确,则代表电磁吸合器的发光二极管会显示红色,同时LCD液晶显示屏会显示出right;如若密码错误,会启动计数器计数,当错误次数超过三次时,报警系统会启动即是蜂鸣器会发出报警声,以提醒保安。
流程图如图4.1所示。
图4.1主程序流程图
4.2键盘模块流程图
键盘输入模块主要包含键盘的扫描、延时去抖、找到键值以及返回键值。
键盘扫描时循环的,程序编写是会使其进入是循环,这样可以检验出是否有按键按下,如果无按键按下就会进入等待有按键按下的状态,如果有按键按下的话就进入延时去抖的步骤,这样可以肯定的确定扫描到的按键是否被按下。
经过去抖之后就是确定按键的位置即是第几行和第几列,找到按键后,就是确定键值并返回按键值,每一次扫描到有键按下后,最后都要有释放闭合按键的步骤,这是为了避免影响下一次键盘的扫描和按键值的读取。
流程图如图4.2所示。
图4.2键盘扫描流程图
按键的消抖子程序所示:
if(press_on!
=0XF0)//--按键消抖---(时间自定)
{
delay(50);
press_on=KEY_IO;
}
确定键值的子程序如下所示:
switch(row)
{
case0xe0:
row=0;break;
case0xd0:
row=1;break;
case0xb0:
row=2;break;
case0x70:
row=3;break;
}
switch(col)
{
case0x07:
col=0;break;
case0x0b:
col=1;break;
case0x0d:
col=2;break;
case0x0e:
col=3;break;
}
recieve=key_value[row][col];
}
4.3显示模块流程图
LCD显示模块的软件设计主要包含开始、初始化LCD、清除LCD、写LCD四个过程。
其中写包含写数据和写字符。
写数据的部分程序:
//写数(5位数据)
voidprintf_data(ucharrow,ucharcol,ucharcount,uintdat)
{
ucharsh1,sh2,sh3,sh4,sh5;
sh5=dat/10000;
sh4=dat%10000/1000;
sh3=dat%1000/100;
sh2=dat%100/10;
sh1=dat%10;
write_adr(0x0c);
switch(row)
{
case1:
row=0x80;break;
case2:
row=0xc0;break;
default:
break;
}
write_adr(row+col-1);
delay(500);
if(count>=5)
write_data(sh5+48);
if(count>=4)
write_data(sh4+48);
if(count>=3)
write_data(sh3+48);
if(count>=2)
write_data(sh2+48);
if(count>=1)
write_data(sh1+48);
写字符的小程序为:
//写一段字符
voidprintf_char(ucharrow,ucharcol,ucharInbuffer[31])
{
uchari;
write_adr(0x0c);
switch(row)
{
case1:
row=0x80;break;
流程图如图4.3所示:
图4.3LCD显示流程图
4.4修改密码流程图
修改密码模块主要是在输入密码正确之后,按下14键即是修改密码键就能进入修改密码界面,其流程分为四个步骤,分别为按下14键并启动定时、输入修改的密码、按下确认键11键、LCD的显示。
修改密码的部分程序如下:
//改密码
voidch_word(void)
{
unsignedcharrecieve=0xff,b[10],j=0;
LCD_CLR();
printf_char(1,1,"new_password%d");
while(recieve!
=11)
{
recieve=keypad();
delay(10000);
if(recieve<=9&&recieve>=0)
{
b[j]=recieve;
printf_data(2,j+1,1,recieve);
j++;
}
elseif(recieve==12)
{
if(j!
=0)
{
a[j]='\0';
printf_char(2,j,"%d");
j--;
}
}
流程图如图4.4所示:
图4.4修改密码流程图
4.5开锁和报警模块流程图
开锁和报警模块主要任务是把从键盘输入到单片机的密码和本身保存在单片机中的密码进行对比,如果正确就开锁,如果错误的话就进行计数并显示在LCD液晶显示屏上,当输入密码的错误次数达到3次就进入报警模式,启动蜂鸣器报警。
其流程图如图4.5所示。
图4.5报警流程图
5电子密码锁的系统调试及分析
5.1硬件电路调试及结果分析
硬件调试首先检查电路板焊接是否有误,检查有是否出现虚焊、漏焊、线路短接、元器件引脚是否错误焊接等等问题,然后检查电路中某些元器件是否起作用,最后利用一些小程序测试LCD1602是否完好无损。
检测单片机是否工作可通过观察示波器显示的波形是否衰减,或者利用万用表测一下18,19脚的电压,应该有个2-3V就说明起振了,另外,ALE如果有信号或者有电压也说明单片机工作了。
我采用利用万用表侧18、19脚的电压,其结果显示为2.3V。
检测电路有无虚焊可用万用表的二极管档来检测,当把万用表的红黑两表笔接触在焊接线路的两端后,万用表发出声音,则说明没有虚焊。
检查电路是否短路也是利用同一原理。
5.2软件调试及功能分析
软件调试即是把已经写好的C语言程序载入到软件调试工具,检查软件是否有设法错误,再根据软件提示对本程序进行修改,直到没有错误再生成单片机能运行的机器码,再用51开发板或其它单片机写入工具把机器码写入单片机进行实际的程序调试,根据实际情况再对程序的不足加以修改,直到满足设计要求。
本设计采用Proteus和KEIL软件进行仿真、调试,首先在在Proteus软件上进行硬件电路的描绘,其次在KEIL软件编写电子密码锁的源程序,源程序经过汇编后产生Hex文件,最后将生成的目标文件添加到单片机中仿真调试。
5.2.1调试过程
首先打开KEILC51主程序,新建工程,新建文本框写入程序,保存,检查是否有语法错误,经反复检查无误后汇编,生成51单片机可执行的HEX文件。
然后用与51开发板相匹配的写入软件把HEX文件写入单片机。
图5.1KEILc51调试介面
图5.2程序写入界面
5.2.2仿真结果分析
当系统通电进入初始化状态后,LCD显示屏会显示Welcome