当前位置:文档之家› 电子密码锁

电子密码锁

电子密码锁
电子密码锁

课程设计报告课程名称:单片机原理及应用课程设计

设计题目:电子密码锁设计

系别:通信与控制工程系

专业:电子信息工程

班级:

学生姓名:

学号:

起止日期:

指导教师:

教研室主任:

摘要

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

随着科技的发展和人们生活水平的提高,如何实现保密防盗这一问题变的尤其的突出,传统的机械锁由于其构造的简单,失效的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,因而广泛使用。

本设计围绕电子密码锁系统的设计与开发进行研究和实践,详细介绍了电子密码锁系统的整体结构。基于在系统可编程技术和STC89C52编译器配有集成开发的新型电子密码锁的设计方案,阐述其工作原理和软硬件设计,由单片机系统、矩阵键盘、LED显示和报警系统组成的系统能完成开锁、修改用户密码、报警基本的密码锁的功能。

关键字:STC89C52芯片; 8255芯片;keil软件

目录

1 设计要求与内容 (1)

1.1 设计要求 (1)

1.2 设计内容 (1)

1.3 主要设计条件 (1)

2 方案论证与对比 (2)

2.1 方案一 (2)

2.2 方案二 (2)

2.2.1单片机系统 (2)

2.2.2矩阵键盘接口电路 (3)

2.2.3 LED显示 (3)

2.2.4 比较显示系统 (3)

2.2.5 系统总框图 (3)

2.3 方案论证与选择 (3)

3硬件电路设计 (4)

3.1 键盘电路设计 (4)

3.1.1 矩阵式键盘电路图 (4)

3.1.2 矩阵键盘的识别方法 (4)

3.2 LED显示电路设计 (4)

3.3 STC89C52芯片与8255芯片的介绍 (5)

4 软件设计 (7)

4.1 软件总体设计 (7)

4.2 各子程序的设计 (7)

4.2.1 密码的固定定 (7)

4.2.2 键盘的扫描识别判断 (7)

4.2.3密码显示和比较处理 (8)

5 系统功能的测试与整体指标 (9)

5.1 软件调试步骤 (9)

5.2 程序调试步骤 (9)

5.3 测试结果 (9)

6 详细仪器清单 (10)

7 总结及致谢 (11)

参考文献 (12)

附录一仿真图 (13)

附录二源程序 (14)

电子密码锁设计

电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现。

1 设计要求与内容

1.1 设计要求

利用单片机作为控制核心,完成一个电子密码锁可以修改密码设计具体要求如下:

1、密码的设定,此密码是固定在程序存储器ROM中,假设预设的密码为

“12345共6位密码;

2、密码的输入:采用两个按键来完成密码的输入,其中一个按键为功能键,

另一个按键为数字键。输入确认功能键之后,才能完成密码的输入过程。

进入密码的判断比较处理状态并给出相应的处理过程;

3、密码输入正确按确认键,绿灯亮,输入密码错误、红灯亮蜂鸣器响。1.2 设计内容

1、设计合理、正确的方案;

2、系统硬件设计及焊接制作;

3、系统软件设计及调试;

4、系统联调。

1.3 主要设计条件

1、MCS-51单片机实验操作台1台;

2、PC机及单片机调试软件;

3、单片机应用系统板1套;

4、系统设计所需的元器件。

2 方案论证与对比

2.1 方案一

2.2 方案二

2.2.1单片机系统

是用以STC98C52为核心的单片机控制方案。利用单片机灵活编程设计和丰富的I/O端口,及其控制的准确性,进行电子密码锁的设计。此次课题用8255课编程芯片的PC口与键盘相连,做输入口,PA,PB口与数码管相连,做显示。

2.2.2矩阵键盘接口电路

此次课程设计采用4*4矩阵键盘,与PC相连,采用扫描法。设有0——十个数字密码,和功能键。输入密码,按确认键后,密码比较。

2.2.3 LED显示

此次课程设计用数码管动态显示。根据按键次数,第一位显示器显示第一次按的密码,第二位显示器显示第二次按的密码,第三位显示器显示第三次按的密码,依此第六位显示器显示第六次按的密码,按键完成后按确认键后,密码对则执行相关动作。

2.2.4 比较显示系统

此次课程设计,当输入密码正确时,LED灯亮(绿灯亮);当输入密码错误时,LED灯亮(红灯亮)且蜂鸣器响。

2.2.5 系统总框图

系统包括:单片机系统、矩阵键盘接口电路、LED显示、比较显示器、系统总框图如下:

图2-5 系统总框图

2.3 方案论证与选择

通过比较以上两种方案,单片机方案有较大的活动空间,不但能实现所要求的功能,而且能在很大程度上扩张功能,而且还可以方便的对系统进行升级,以及对设计条件的综合考虑,我们选择方案二。

3硬件电路设计

3.1 键盘电路设计

3.1.1 矩阵式键盘电路图

图3-1键盘电路图图3-2 键盘图

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,在需要的键数比较多时,采用矩阵法来做键盘是合理的。本次因需要使矩阵键盘当独立键盘使用。

3.1.2 矩阵键盘的识别方法

矩阵键盘的识别方法有很多种,比如行反转法,扫描法等。最常用的方法是扫描法,本次采用扫描法。

3.2 LED显示电路设计

LED就是light emitting diode ,发光二极管的英文缩写,简称LED。它是一种通过控制半导体发光二极管的显示方式,用来显示文字、图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。显示器显示接口按驱动方式可分

为静态显示和动态显示,静态显示时,除变更显示数据期间外,各显示器均处于通电状态,每个显示器的通电占空比为100%,静态显示的优点是显示稳定,亮度高,缺点是占用硬件电路多;动态显示的优点是节省硬件电路,缺点是占用软件扫描时占用CPU时间多。对于多位LED显示器,通常都是采用动态扫描的方法进行显示,即逐个地循环点亮各位显示器,这样虽然在任一时刻只有一显示器被点亮,但是由于人眼具有视觉残留效应,看起来与全部显示器持续点亮效果完全一样。

图3-2 数码管显示电路图

为了实现LED显示器的动态扫描,除了要给显示器的输入之外,还有对显示器选择位的控制,这就是通常所说的段控和位控。因此,多位LED显示器接口电路需要有两个输出口,其中一个用于8条段控线,另一个用于输出位控线,位控线的数目等于显示器的位数。

为了方便编写程序,通常在内部RAM中设置显示缓冲区,存放显示的数字或字符,显示缓冲区单元个数与LED显示器位数相同。

此次基于单片机的电子密码锁,我选用动态显示,通过与软件配合,每输入一个密码,进行显示一次,扫描,密码输入完后,进行比较,密码正确则开锁。

3.3 STC89C52芯片与8255芯片的介绍

STC89C52是低功耗、高性能的CMOS8位微控制器。8字节的flash,256字节的RAM,32位的I/O口线,看门狗定时器,2个数据指针,3个16位定时器/计数器。全双工串行口,片内晶振及时钟电路,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续

工作。掉电保护方式下,内容被保存,振荡器被冻结。

STC89C52芯片如图2-3所示:

图3-3 STC89C52芯片图图3-4 8255芯片引脚图

8255芯片引脚图如图3-4所示:

8255芯片是一种典型的课编程通用并行接口芯片,用来扩展单片机的端口,它具有3个8位的并行口,有三位工作方式,可作为单片与各种外部设备连接的接口电路。

CS:片选信号线,当该引脚为低电平时,8255被选中,允许8255与CPU通讯。

RESET:复位输入线,当该引脚为高电平时,内部寄存器被清除,所有I/O 口均被置成输入方式。

A0、A1:地址输入线。

当A0A1=00时,PA口被选中;

当A0A1=01时,PB口被选中;

当A0A1=10时,PC口被选中;

当A0A1=11时,控制寄存器被选中。

4 软件设计

4.1 软件总体设计

软件的设计主要包括:密码的固定、键盘识别判断、密码显示、密码比较、密码对处理。

软件设计总流程图如下:

图4-1 总流程图

4.2 各子程序的设计

4.2.1 密码的固定定

将密码固定在程序存储器ROM中,设定密码,密码固定在ROM中。

4.2.2 键盘的扫描识别判断

用矩阵式键盘,扫描法对键盘进行识别判断,具体流程图如下:

首先选着一行或者一列,低电平有效,然后进行扫描,如果发现一行(列)出现低电平信号则有键按下,然后在数码管显示相应的数或者现象。在扫描时,会出现电信号抖动,所以一般我们要加上去抖动语句。根据此原理,我们给键盘编码0-9,以及其他的一些功能按键,这就是电子密码锁按键。

图4-2 键盘扫描流程图

4.2.3密码显示和比较处理

采用LED动态显示,密码输入完成之后,进行密码比较,并显示相应现象。

图4-3 密码显示图

5 系统功能的测试与整体指标

5.1 软件调试步骤

1、打开keil软件后,在project菜单中选择New Project命令,打开一个新项

目,保存项目,输入工程文件名后,并保存工程文件的目录;

2、为项目文件选择一个目标器件,即选择8051的类型,在Data base列表框

中选择“ATML89C52”,确定

3、上述设置好后,创建源程序文件并输入程序代码。输入好代码后点击“文件/

保存”;

4、把源文件添加到项目中,用鼠标指在目标工作区的目标1,点击右键在弹出

的菜中选择添加文件到源代码组,在弹出的添加文件框中,选择需要添加到项目中的件;

5、开始编辑,对项目文件进行编辑,若没有错误后进行硬件调试。

5.2 程序调试步骤

1、矩阵4*4键盘的调试

键盘程序是整个程序的基础,我们必须保证其正确。调试方法:先把程序下载到单片机,让数码管显示,在有键按下时显示的是否为设定的值。

2、数码管程序调试

正确的显示数值是整个储蓄的关键。调试方法:先把程序下载到单片机,让数码显示数值。

5.3 测试结果

实例测试:将程序下载到单片机,按下功能键,再输入初始密码“123456”再按确认键,绿灯亮,解锁成功,若输入密码错误,则亮红灯,蜂鸣器响;按修改密码键,再输入新密码,按确认键密码修改成功;若不按功能键则无法进行密码输入。

6、详细仪器清单

7总结及致谢

本次单片机课程设计历时两个星期,在这了两个星期中我们深深体会到了课程设计的苦与乐。当程序调试出现问题时,我们就一步步调试,一步步查看,修改,这过程确实很枯燥,也很辛苦,但是,当程序调试成功并且能够下载到单片机中运行时,有说不出的高兴,感觉我们所有的付出都是值得的。

总的来说,这次课程设计,让我们领悟到理论与实践结合的重要性。懂得拥有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从中得到收获,从而提高自己的实际动手能力和独立思考的能力,做到全面发展,这样才能真正为社会服务。

因为这是第一次做单片机课程设计,所以我们遇到过各种各样的问题,面对这些难题,我们没有妥协,以求学的心态去解决,从中发现了自己的不足之处,正是这些难题让我们看到了自己的不足,对以前所学过的知识理解得不够深刻,基础掌握得不够牢固。只学到了表面的知识,并没有深入了解知识的内涵。所以很庆幸有这次课程设计,它教会了我们到底要学些什么知识,给我们以后的学习指明了一个方向,促使我们更加努力的学习,补充自己的不足。

这次课程设计终于顺利完成了,其中离不开老师的耐心指导和同学们的热心帮助,在此表示衷心的感谢,另外特别感谢指导老师谭老师的耐心指导,他的讲解让我们有豁然开朗的感觉,让我们得以顺利完成这次课程设计。

参考文献

[1] 张鑫.单片机原理及应用[M].电子工业出版社,2009

[2] 郭天祥.51单片机C语言教程[M].电子工业出版社,2009

[3] 邹逢兴.计算机硬件技术基础试验教程[M]. 高等教育出版社, 2000

[4] 周佩玲.16位微型计算机原理接口及其应用[M].中国科学技术大学出版社,

2000

[5] 吴秀清.微型计算机原理与接口技术[M].中国科学技术出版社, 2001

?附录一:仿真图

附录二:源程序

#include

#include /*调用库函数*/

#define uchar unsigned char /*自定义无符号字符型为uchat*/

#define PA XBYTE[0xD9FF] /*8255芯片PA口地址*/

#define PB XBYTE[0xDAFF] /*PB口地址*/

#define PC XBYTE[0xDDFF] /*PC口地址*/

#define CON XBYTE[0xDFFF] /*控制字地址*/

sbit D1=P1^1; /*位声明把P1.1口赋给D1*/

sbit D2=P1^0; /*把P1.0口赋给D2*/

sbit beep=P3^3; /*蜂鸣器端口*/

uchar code table[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xef}; uchar num,num1,num2,num3,num4,num5,num6,tt,temp,i,j,k,t,x,y,n1,a,b,c,d,e,f,xsm; void delay(xsm); /*延时函数声明*/

void keys(); /*键盘函数声明*/

void keys1(); /*键盘函数声明*/

void keys2(); /*键盘函数声明*/

void display(num); /*数码显示函数声明*/

void main() /*主函数*/

{

CON=0x80; /*选择8255工作方式1*/

x=6;y=6; /*控制密码位数初值*/

a=1;b=2;c=3;d=4;e=5;f=6; /*定义密码锁的原始密码为123456*/ while(1) /*循环函数*/

{

display(num);

keys();

keys1();

keys2();

}

}

void display(num) /*数码显示函数*/

{

if(tt==0||tt>6) /*tt控制按键次数,tt=0,没有数字键按下*/ {

tt=0;

PA=0xc0; /*把6个数码管位选打开*/

PB=table[10]; /*数码管显示"_"*/

}

if(tt==1) /*tt=1,第一次按键*/

{

num1=num; /*把按键值num赋给num1*/

num2=b;num3=c;num4=d;num5=e;num6=f; /*密码位数控制*/

if(t==1) {a=num;y=x-5;} /*判断是否修改密码*/

PA=0xfe; /*开第一个数码管*/

PB=table[num1]; /*显示第一个数值*/

if(num==10) /*取消输入健值判断*/

tt--;

}

if(tt==2) /*tt=2,第二次按键*/

{

num2=num;

num3=c;num4=d;num5=e;num6=f;

if(t==1) {b=num;y=x-4;}

PA=0xfd; /*用第二个数码管显示第二次按键的值*/ PB=table[num2];

delay(18); /*延时10ms*/

PA=0xfe; /*保持第一次按键的健值亮*/

PB=table[num1];

delay(18);

if(num==10) /*取消键判断*/

tt--;

}

if(tt==3) /*tt=3,第三次按键*/

{

num3=num;

num4=d;num5=e;num6=f;

if(t==1) {c=num;y=x-3;}

PA=0xfb; /*用第三个数码管显示第三次按键的值*/ PB=table[num3];

delay(18); /*延时10ms*/

PA=0xfd; /*保持第二次键值亮*/

PB=table[num2];

delay(18);

PA=0xfe; /*保持第一次键值亮*/

PB=table[num1];

delay(18);

if(num==10) /*取消键判断*/

tt--;

}

if(tt==4) /*tt=4,第四次按键*/

{

num4=num;

num5=e;num6=f;

if(t==1) {d=num;y=x-2;}

PA=0xf7; /*用第四个数码管显示第四次按键的值*/

相关主题
文本预览
相关文档 最新文档