电子密码锁设计

发布时间:2019-05-17 13:28:42

《嵌入式系统》课程设计报告

系: 机电学院

学生姓名:

业:

级: 1 1 1

指导教师:

完成时间: 2014-10-17


3 软件设计………………………………………………………………6


摘要: 随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。加上其成本较高,一定程度上限制了这类产品的普及和推广。鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。

关键词:4×4矩阵键盘;stm32;密码锁;LCD1602

1 系统总体方案设计

1.1 采用数字电路控制

其原理方框图如图11所示。

1.1 数字密码锁电路方案

密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、键盘输入次数锁定电路。

1.2 采用一种是用以stm32为核心的控制方案

利用其灵活的编程设计及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能。其原理如图1.2所示。

1.2 stm32控制方案

通过比较以上两种方案stm32有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级,所以我们采用后一种方案。

初步设计思路如下:

基于以上思路,本次设计使用stm32设计,其主要具有如下功能:

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

电子密码锁的设计主要由三部分组成:4×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 按键功能

2.2 LCD1206显示电路

现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。1602LCD显示模块具有体积小,功耗低,显示内容丰富等特点。1602LCD可以显示216个字符,有8位数据总线D0~D7RSR/WEN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。

3.3.1 接口信号说明 1602LCD的接口信号说明如表3-3所示: 3-3 1602LCD的接口信号说明

⑵管脚功能

1602采用标准的16脚接口,其中:

1脚:VSS为电源地

2脚:VCC5V电源正极

3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。

6脚:E(EN)端为使能(enable),高电平(1)时读取信息,负跳变时执行指令。

714脚:D0D78位双向数据端。

1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。

指令集

1602通过D0~D78位数据端传输数据和指令。

显示模式设置: (初始化)

0011 0000 [0x38] 设置16×2显示,5×7点阵,8位数据接口;

显示开关及光标设置: (初始化)

0000 1DCB D显示(1有效)C光标显示(1有效)B光标闪烁(1有效)

0000 01NS N=1(读或写一个字符后地址指针加1 &光标加1)

N=0(读或写一个字符后地址指针减1 &光标减1)

S=1 N=1 (当写一个字符后,整屏显示左移)

s=0 当写一个字符后,整屏显示不移动

数据指针设置:

数据首地址为80H,所以数据地址为80H+地址码(0-27H40-67H)

其他设置:

01H(显示清屏,数据指针=0,所有显示=0)02H(显示回车,数据指针=0)

2.2 1602显示电路

2.3 响应电路

在本次设计中,基于节省材料的原则,暂时用发光二极管代替,发光管亮,表示开锁;灭,表示没有开锁。电路图如3.3所示。当P2.0口输出低电平时,二极管发光,表示开锁。

2.3 响应电路

3 软件设计

3.1软件设计思路

电子密码锁工作的主要过程是LCD显示器提示开始输入密码,通过键盘输入密码,同时LCD显示密码输入情况,按下确认键后判断密码的正确性,作出开锁处理。

密码的设定,假设预设的密码为"123456"6位密码。

由于采用两个按键来完成密码的输入,那么其中一个按键为功能键,另一个按键为数字键。在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;或者输入确认功能键之后,才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。

主要的设计实施过程:首先,选购电子元器件。第二步,使用 DXP 设计硬件电路原理图,并设计 PCB图完成人工布线。第三步,使用 Keil uVision4 软件编写C 语言程序、仿真、软件调试。第四步,使用 PROTEUS 软件进行模拟软、硬件调试。最后,联合软、硬件调试电路板,完成本次毕业设计。

3.2 子程序设计

1)键盘扫描子程序如下:

#ifndef _KEY_H

#define _KEY_H

#include "stm32f10x.h"

void Delay(__IO uint32_t nCount);

int key(void);

#endif

#include "stm32f10x.h"

#include "key.h"

void InitKey(void)

{

GPIO_InitTypeDef GPIO_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_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_Init(GPIOA,&GPIO_InitStructure);

}

int key(void)

{

int KeyVal=0;

//u16 WriteVal=0;

GPIO_Write(GPIOA,(GPIOA->ODR&0xfff0|0xf)); if((GPIOA->IDR&0x00f0)==0x0000)

return -1;

else

{

Delay(0xfffff);

if((GPIOA->IDR & 0x00f0)==0x0000)

return -1;

}

GPIO_Write(GPIOA,(GPIOA->ODR&0xfff0|0x1)); switch(GPIOA->IDR & 0x00f0)

{

case 0x0010: KeyVal=15; break;

case 0x0020: KeyVal=11; break;

case 0x0040: KeyVal=7; break;

case 0x0080: KeyVal=3; break;

}

GPIO_Write(GPIOA,(GPIOA->ODR&0xfff0|0x2));

switch(GPIOA->IDR & 0x00f0)

{

case 0x0010: KeyVal=14; break;

case 0x0020: KeyVal=10; break;

case 0x0040: KeyVal=6; break;

case 0x0080: KeyVal=2; break;

}

GPIO_Write(GPIOA,(GPIOA->ODR&0xfff0|0x4));

switch(GPIOA->IDR & 0x00f0)

{

case 0x0010: KeyVal=13; break;

case 0x0020: KeyVal=9; break;

case 0x0040: KeyVal=5; break;

case 0x0080: KeyVal=1; break;

}

GPIO_Write(GPIOA,(GPIOA->ODR&0xfff0|0x8)); switch(GPIOA->IDR&0x00f0)

{

case 0x0010: KeyVal=12; break;

case 0x0020: KeyVal=8; break;

case 0x0040: KeyVal=4; break;

case 0x0080: KeyVal=0; break;

}

return KeyVal;

}

void Delay(__IO uint32_t nCount) //简单的延时函数

{

for(; nCount != 0; nCount--);

}

2)密码比较

密码比较流程图如4.2.3

3.1 密码比较和报警流程

4 系统调试

本次调试采用Protues软件仿真。首先设计电子密码锁的源程序,源程序经过汇编后,生成的目标文件经过仿真调试。依次按下123456后,LCD显示如图4.1


5.1 LCD显示

按下确定键后,二极管亮,表示密码正确开门。如图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.源程序


#include "stm32f10x.h"

#include "LCD_gpio.h"

#include"lcd1602.h"

#include "key.h"

void gaimima(void);

void delay_ms(unsigned int q);

#define uchar unsigned char

uchar nm0[5];

uchar nm1[5];

uchar Q=0,W=1,R=2,Y=3,P=4;

uchar A,B,C,D,G,l;

uchar jz,k=0; //键值

int main(void)

{

key();

L1602_string(1,1,"Please input the password");

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");L1602_string(2,1,"*");break;}

case2:{B=jz;nm0[1]=jz;L1602_string(2,1,"AB");L1602_string(2,1,"**"); break;}

case3:{C=jz;nm0[2]=jz;L1602_string(2,1,"ABC");L1602_string(2,1,"***"); break;}

case4:{D=jz;nm0[3]=jz;L1602_string(2,1,"ABCD");L1602_string(2,1,"****"); break;}

case5:{G=jz;nm0[4]=jz;L1602_string(2,1,"ABCDG");L1602_string(2,1,"*****"); break;}

}

}

}

for(l=1;l<5;l++)

{if(nm0[l]==nm1[l])

{LCD1(1);

L1602_string(2,4,"welcome");

delay_ms(6000);

delay_ms(6000);

gaimima();

L1602_string(2,4,"welcome");

}

else

{

LCD2(1);

L1602_string(2,3,"Password Error");

delay_ms(6000);

L1602_string(1,1,"Please input the password");

}

}

}

}

void delay_ms(unsigned int q)

{

unsigned int o,f;

for(o=q;o>0;o--)

for(f=255;f>0;f--);

}

void gaimima(void)

{

uchar j=0;

jz=key();

if(jz==15)

{

delay_ms(6000);

if(jz>0&&jz<10)

{

j++;

if(j>5){j=0;}

else

{

Switch(j)

{

case 1: {Q=jz;nm1[0]=jz;L1602_string(2,1,"Q");L1602_string(2,1,"*");break;}

case 2: {W=jz;nm1[1]=jz;L1602_string(2,1,"QW");L1602_string(2,1,"**"); break;}

case 3: {R=jz;nm1[2]=jz;L1602_string(2,1,"QWR");L1602_string(2,1,"***"); break;}

case 4: {Y=jz;nm1[3]=jz;L1602_string(2,1,"QWRY");L1602_string(2,1,"****"); break;}

case5:{P=jz;nm1[4]=jz;L1602_string(2,1,"QWRYP");L1602_string(2,1,"*****");break;}

}

}

}

}

}

#ifndef __STM32F10x_IT_H

#define __STM32F10x_IT_H

#ifdef __cplusplus

extern "C" {

#endif

#include "stm32f10x.h"

void NMI_Handler(void);

void HardFault_Handler(void);

void MemManage_Handler(void);

void BusFault_Handler(void);

void UsageFault_Handler(void);

void SVC_Handler(void);

void DebugMon_Handler(void);

void PendSV_Handler(void);

void SysTick_Handler(void);

#ifdef __cplusplus

}

#endif

#endif


2.硬件原理图

电子密码锁设计

相关推荐