电子密码锁设计文档格式.docx
《电子密码锁设计文档格式.docx》由会员分享,可在线阅读,更多相关《电子密码锁设计文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
基于以上思路,本次设计使用stm32设计,其主要具有如下功能:
密码通过键盘输入,若密码正确,则将锁打开。
电子密码锁的设计主要由三部分组成:
4矩阵键盘接口电路、密码锁的控制电路、输出八段显示电路。
密码锁设计的关键问题是实现密码的输入、清除、更改、开锁等功能:
(1)密码输入功能:
按下一个数字键,一个“-”就显示在最右边的数码管上,同时将先前输入的所有“-”向左移动一位。
(2)密码清除功能:
当按下清除键时,清除前面输入的所有值,并清除所有显示。
(3)开锁功能:
当按下开锁键,系统将输入与密码进行检查核对,如果正确锁打开,否则不打开。
输入密码用矩形键盘,包括数字键和功能键。
LCD1602显示输入密码。
打开电源后,显示器显示“000000”,设原始密码为“12345”,只要输入此密码便了开门。
这样可预防停电后再来电时无密码可用。
按“C”键,清除显示器为“000000”。
欲重新设定密码,先输入密码在案“*”。
输入密码,再按“D”键。
若密码与设定密码相同,则开门。
否则显示器清为“000000”。
软件的设计主要包括键盘键值的读取,LCD显示程序,密码比较程序。
2硬件电路设计
2.1键盘电路设计
使用矩阵键盘,所以本设计就采用行列式键盘。
其原理如图2.1
图2.1矩阵键盘
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×
M个按键的键盘。
在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。
当确认有按键按下后,下一步就要识别哪一个按键按下。
对键的识别通常有两种方法:
一种是常用的逐行扫描查询法;
另一种是速度较快的线反转法。
具体的功能设计如表2.1:
表2.1按键功能
按键
键名
功能说明
1-9键
数字键
输入密码
*键
重设密码键
设定新密码
D键
确定键
比较密码
#键
清除键
使显示器清零
2.2LCD1206显示电路
现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。
1602型LCD显示模块具有体积小,功耗低,显示容丰富等特点。
1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。
3.3.1接口信号说明1602型LCD的接口信号说明如表3-3所示:
表3-31602型LCD的接口信号说明
⑵管脚功能
1602采用标准的16脚接口,其中:
第1脚:
VSS为电源地
第2脚:
VCC接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端,高电平
(1)时读取信息,负跳变时执行指令。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
指令集
1602通过D0~D7的8位数据端传输数据和指令。
显示模式设置:
(初始化)
00110000[0x38]设置16×
2显示,5×
7点阵,8位数据接口;
显示开关及光标设置:
00001DCBD显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)
000001NSN=1(读或写一个字符后地址指针加1&
光标加1),
N=0(读或写一个字符后地址指针减1&
光标减1),
S=1且N=1(当写一个字符后,整屏显示左移)
s=0当写一个字符后,整屏显示不移动
数据指针设置:
数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)
其他设置:
01H(显示清屏,数据指针=0,所有显示=0);
02H(显示回车,数据指针=0)。
图2.21602显示电路
2.3响应电路
在本次设计中,基于节省材料的原则,暂时用发光二极管代替,发光管亮,表示开锁;
灭,表示没有开锁。
电路图如3.3所示。
当P2.0口输出低电平时,二极管发光,表示开锁。
图2.3响应电路
3软件设计
3.1软件设计思路
电子密码锁工作的主要过程是LCD显示器提示开始输入密码,通过键盘输入密码,同时LCD显示密码输入情况,按下确认键后判断密码的正确性,作出开锁处理。
密码的设定,假设预设的密码为"
123456"
共6位密码。
由于采用两个按键来完成密码的输入,那么其中一个按键为功能键,另一个按键为数字键。
在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;
或者输入确认功能键之后,才能完成密码的输入过程。
进入密码的判断比较处理状态并给出相应的处理过程。
主要的设计实施过程:
首先,选购电子元器件。
第二步,使用DXP设计硬件电路原理图,并设计PCB图完成人工布线。
第三步,使用KeiluVision4软件编写C语言程序、仿真、软件调试。
第四步,使用PROTEUS软件进行模拟软、硬件调试。
最后,联合软、硬件调试电路板,完成本次毕业设计。
3.2子程序设计
(1)键盘扫描子程序如下:
#ifndef_KEY_H
#define_KEY_H
#include"
stm32f10x.h"
voidDelay(__IOuint32_tnCount);
intkey(void);
#endif
#include"
key.h"
voidInitKey(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_Init(GPIOA,&
GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
}
intkey(void)
intKeyVal=0;
//u16WriteVal=0;
GPIO_Write(GPIOA,(GPIOA->
ODR&
0xfff0|0xf));
if((GPIOA->
IDR&
0x00f0)==0x0000)
return-1;
else
{
Delay(0xfffff);
if((GPIOA->
IDR&
0x00f0)==0x0000)
}
0xfff0|0x1));
switch(GPIOA->
0x00f0)
case0x0010:
KeyVal=15;
break;
case0x0020:
KeyVal=11;
case0x0040:
KeyVal=7;
case0x0080:
KeyVal=3;
GPIO_Write(GPIOA,(GPIOA->
0xfff0|0x2));
case0x0010:
KeyVal=14;
case0x0020:
KeyVal=10;
case0x0040:
KeyVal=6;
KeyVal=2;
0xfff0|0x4));
KeyVal=13;
KeyVal=9;
KeyVal=5;
case0x0080:
KeyVal=1;
0xfff0|0x8));
0x00f0)
KeyVal=12;
KeyVal=8;
KeyVal=4;
KeyVal=0;
returnKeyVal;
voidDelay(__IOuint32_tnCount)//简单的延时函数
{
for(;
nCount!
=0;
nCount--);
}
(2)密码比较
密码比较流程图如4.2.3
图3.1密码比较和报警流程
4系统调试
本次调试采用Protues软件仿真。
首先设计电子密码锁的源程序,源程序经过汇编后,生成的目标文件经过仿真调试。
依次按下1,2,3,4,5,6后,LCD显示如图4.1
图5.1LCD显示
按下确定键后,二极管亮,表示密码正确开门。
如图4.2
图5.2密码正确开门
5心得体会
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,ARM已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握ARM的开发技术是十分重要的。
回顾起此次ARM课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对汇编语言掌握得不好,通过这次课程设计之后,一定把以前所学过的知识重新温故。
对我而言,知识上的收获重要,精神上的丰收更加可喜。
挫折是一份财富,经历是一份拥有。
这次实习必将成为我人生旅途上一个非常美好的回忆!
6参考文献
1.连华.基于FPGA的电子密码锁设计[J].中国科技信息,2006
2.许琦.基于FPGA的电子密码锁的设计[J].科技信息,2006
3.阎石数字电路技术基础[M].高等教育,2005
4.童诗白华成英模拟电子技术基础[M].高等教育,2006
5.国栋月飞电路设计入门与提高化学工业,2009
附录
1.源程序
LCD_gpio.h"
#include"
lcd1602.h"
voidgaimima(void);
voiddelay_ms(unsignedintq);
#defineucharunsignedchar
ucharnm0[5];
ucharnm1[5];
ucharQ=0,W=1,R=2,Y=3,P=4;
ucharA,B,C,D,G,l;
ucharjz,k=0;
//键值
intmain(void)
{
key();
L1602_string(1,1,"
Pleaseinputthepassword"
);
L1602_string(2,1,"
"
while
(1)
{
jz=key();
if(jz!
=0)
{
k++;
if(k>
5){k=0;
else
switch(k)
{
case1:
{A=jz;
nm0[0]=jz;
L1602_string(2,1,"
A"
*"
break;
case2:
{B=jz;
nm0[1]=jz;
AB"
**"
case3:
{C=jz;
nm0[2]=jz;
ABC"
***"
case4:
{D=jz;
nm0[3]=jz;
ABCD"
****"
case5:
{G=jz;
nm0[4]=jz;
ABCDG"
*****"
}
}
}
for(l=1;
l<
5;
l++)
{if(nm0[l]==nm1[l])
{LCD1
(1);
L1602_string(2,4,"
wele"
delay_ms(6000);
gaimima();
}
else
LCD2
(1);
L1602_string(2,3,"
PasswordError"
L1602_string(1,1,"
}
}
}
voiddelay_ms(unsignedintq)
unsignedinto,f;
for(o=q;
o>
0;
o--)
for(f=255;
f>
f--);
voidgaimima(void)
ucharj=0;
if(jz==15)
delay_ms(6000);
if(jz>
0&
&
jz<
10)
j++;
if(j>
5){j=0;
else
Switch(j)
case1:
{Q=jz;
nm1[0]=jz;
Q"
case2:
{W=jz;
nm1[1]=jz;
QW"
case3:
{R=jz;
nm1[2]=jz;
QWR"
case4:
{Y=jz;
nm1[3]=jz;
QWRY"
{P=jz;
nm1[4]=jz;
QWRYP"
#ifndef__STM32F10x_IT_H
#define__STM32F10x_IT_H
#ifdef__cplusplus
extern"
C"
#endif
voidNMI_Handler(void);
voidHardFault_Handler(void);
voidMemManage_Handler(void);
voidBusFault_Handler(void);
voidUsageFault_Handler(void);
voidSVC_Handler(void);
voidDebugMon_Handler(void);
voidPendSV_Handler(void);
voidSysTick_Handler(void);
2.硬件原理图