基于51单片机的密码锁设计

更新时间:2024-03-05 14:02:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于单片机的密码锁设计

1 引言

1.1设计目的

随着电子技术的发展,各类电子产品应运而生,电子密码锁就是其中之一。电子密码锁就是通过键盘输入一组密码完成开锁过程。研究这种锁的初衷,就是为提高锁的安全性。

目前,国内自行研制开发的电子锁,应用还不广泛。国内的不少企业也引进了世界上先进的技术,发展前景非常可观。希望通过不断的努力,使电子密码锁在我国也能得到广泛应用。

1.2设计要求

本次课程设计要求使我们能够掌握并且实际运用课本知识。 通过利用所学的电子技术知识正确分析并设计电路,将适当电路运用到实际电路中,将课本知识转化为实际能力。

1.3设计方法

(1)系能够从键盘中输入密码,并相应地在显示器上显示?*?;能够判断密码是否正确,正确则开锁,错误则输出相应信息。

(2)密码由程序直接设定,不可用户自己设定。

(3)具有自动报警功能。密码不正确,相应红灯亮,蜂鸣器发出报警声来提示。 (4)具有手动复位功能。

2设计方案及原理

2.1系统总体设计

根据以上分析,本次电子密码锁设计的主要重点是以下几个部分:4x3矩阵 键盘设计、LCD信息显示和密码的比较和处理。当然,除了这几个部分外还有报警等功能模块。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路是报警。系统整体框图如图1所示。

单片机原理及系统课程设计报告

键盘输入复位电路密码存储电路晶振电路电源输入显示电路报警电路开锁电路AT89C51

图1 系统整体框图

2.2本设计硬件资源分配

P3.0~P3.7用于LCD液晶显示作用。 P1.6、P1.7用于蜂鸣器和报警灯的控制。 P1.4用于开锁电路的控制。 P2.0~P2.7用于键盘电路的控制。

P1.0~P1.2用于LCD显示模块的控制端口的控制。

3硬件设计

3.1.1芯片选择

本次设计采用AT89C51贴片芯片,AT89C51是一个低电压,高性能CMOS 8位单片机,通过用Keil软件编写程序,然后装到单片机里面去,然后让它对整个系统进行信息的处理,如可以让它处理矩阵键盘传过来的信息,并根据编好的程序来确定哪个按键按下,并处理相应按键对应的功能,然后把相应的信息反应到单片机的各个引脚,来实现按键实现的现象,如:显示是否开启锁,报警等。AT89C51 提供以下标准功能:4k字节Flash闪速存储器128字节内部RAM,32 个I/O 口线两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

AT89C51的引脚图如图2所示。

1

单片机原理及系统课程设计报告

图2 AT89C51

3.1.2 单片机最小系统设计

单片机最小系统就是指能使单片机工作的最少的器件构成的系统。因

为单片机已经包含了数据存储器和程序存储器,所以只要在其外部加上时钟电路和复位电路就可以构成单片机最小系统。

(1)单片机工作需要晶振给CPU提供频率,时钟电路就是给单片机提供晶振频率的电路。图3是时钟电路的PROTEUS仿真图。

图3 时钟电路

2

单片机原理及系统课程设计报告

单片机允许的振荡晶体可在1.2~24MHz之间选择,一般为11.0592MHz,电容C2,C3的取值对振荡频率输出的稳定性、大小及振荡电路起振速度有一定的影响,可在20~100pF之间选择,典型值位30pF

(2)计算机每次开始工作,CPU和系统中的其他部件都必须要有一个确定 的初值,即复位状态。图4是单片机复位电路仿真图。

图4 复位电路

单片机RST引脚是高电平有效。单片机在上电瞬间C1充电,RST引脚端出现正脉冲,只要RST断保持两个机械周期(大约10ms)以上的高电平,单片机就能复位。在单片机工作后,如果还想再次复位,只需按下开关,单片机就能重新变成复位状态。当晶体振荡频率为12MHz时,RC的典型值为C=10μF,R=8.2KΩ。

3.1.3 矩阵键盘设计

一组键或者一个键盘,需要通过接口电路和CPU相连接,CPU可以采用查 询接口或者中断的方式了解有没有键被按下,并检查是哪个键被按下。无论是查询方式还是中断方式都要用到单片机的I/O口。由于单片机I/O口较少的原因,当系统中需要用到较多按键时,为了能够更合理更有效地利用单片机的I/O口,一般采用矩阵键盘的方式来实现多按键的功能。

图5是4x3矩阵键盘在PROTEUS中的电路原理仿真图。

3

单片机原理及系统课程设计报告

图5 4x3矩阵键盘

矩阵键盘又叫做行列式键盘。行列式键盘的硬件结构比较简单,由行输出口和列输出口构成行列式键盘,按键设置在行、列交点上。只有当键被按下时相应的行和列才能相连。如此,只要检测行和列是否相连就可以知道是否有键按下。

由于按键设置在行、列线交点上,行、列分别连接到按键开关的两端,平时无键按下时,行线处于高电平,假设列线为低电平,当有键按下时,按下的键就会将相应的行和列连通,使得对应的行线被列线拉低,也变为低电平。这就是识别矩阵键盘是否有键被按下的关键。

当确定有键被按下时,通过逐行扫描,读出I/O口的值可以知道哪一行的值被改变了,被改变了的行即是被按下的按键所在行。同时,由于每个键都有它的行值和列值,行值和列值得组合就是这个按键的编码,当算法一定时,每个按键的编码是固定的,且各个按键的编码互不相同,所有通过读I/O的值还能具体知道是哪一个键被按下,这样就实现了键盘的识别。

3.1.4 LCD显示模块设计

LCD1602是一种字符型液晶显示器,是一种专门用于显示字母、数字、符号等的点阵式液晶显示器。LCD1602的显示容量为16x2个字符(可以显示2行,每行显示16个字符),芯片工作电压为4.5~5.5V,工作电流为2.0mA(5.0V),模块最佳

4

单片机原理及系统课程设计报告

工作电压是5.0V。

LCD1602具有16个引脚。在LCD1602的有关设计中,主要是通过编写程序控制LCD1602的4、5、6引脚来实现数据或者指令的写入和执行,再通过数据或者指令的写入和执行来进一步实现LCD1602的显示功能。 查资料了解在仿真库中用lm016l代替LCD602图6是PROTEUS中显示模块的仿真图。

由于LCD要正常工作必须提供足够的电流,因此在实际应用为了保证显示器能够正常工作,应在数据端口接一上拉电阻,不过此次仿真就没有另外加上拉电阻。

图6 LCD显示电路

3.1.5报警模块、开锁模块以及表示模块

开锁模块用继电器带一个LED管代替电磁锁。电路如图7所示; 报警模块用蜂鸣器表示,电路如图8所示; 表示模块用发光二极管表示开锁与否。

5

单片机原理及系统课程设计报告

图7 开锁电路

图8 报警电路

3.2硬件连接图

根据电路原理,在PROTEUS中画出各功能模块的仿真图,各个功能

模块验证正确后,将所有模块集合到一个电路设计图中,画出具有所有功能的总体硬件仿真图。 。

图9 硬件连接图

6

单片机原理及系统课程设计报告

在设计过程中,采用单片机AT89C51作为主控芯片,结合键盘输入、显示电路、报警电路、开锁电路、时钟电路、晶振电路,利用合理的连线接成硬件连接图,在Proteus软件平台上选中合适的AT89C51芯片,LCD显示器,键盘,以及其它电子元件,接成电路。

3.3设计原理

系统工作时,用户通过按键输入6位密码,单片机将输入密码与设定密码进行比较,若密码正确,则相应绿灯闪烁,同时发出开锁信号,将门打开,系统不报警;若密码不正确,则相应的红灯亮闪烁,同时蜂鸣器发出报警声音。

4软件设计

4.1程序设计

C语言编程,源程序清单如附录1所示。

4.2程序流程图

流程图如图4。

开始复位输入密码报警电路N密码正确?Y开锁驱动电路单片机微控制器开锁结束 图4 程序的流程图

5系统仿真及实际调试

5.1Proteus 仿真图

仿真结果密码正确,LCD显示器显示“open”,绿灯亮。仿真图如附录2所示。

7

单片机原理及系统课程设计报告

5.2问题分析

电源、晶振电路和复位电路都无异常,LCD显示时出现问题:

(1)刚开始蜂鸣器声音太小几乎听不清楚,后来加了一个三极管放大后声音变大。

(2)接通电源开门灯和报警电路就会工作,分析原因是单片机刚开始各个管脚输出低电平。

(3)开锁电路完成后继电器不吸起,后来经过调试加三极管等等方法后实现了继电器吸起LED灯亮。

6总结

本次设计,采用单片机AT89C51作为主控芯片,结合外围的键盘输入、显示、报警、开锁等电路,用C语言编写主控芯片的控制程序,设计了一款具有报警功能的电子密码锁。

对于本次单片机课程设计,我觉得十分有意义且很有必要。课堂上,我们大多数接触的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?像此次课程设计就为我们提供了良好的实践平台。过程中我发现了很多问题,看似很简单的电路,要动手把它给设计出来,是很难的一件事,主要原因是我没有经常动手设计过电路,还有资料的查找也是一大难题,这就要求我在以后的学习中,应该注意到这一点,更重要的是我要学会把从书本中学到的知识和实际的电路联系起来,这不论是对我以后就业还是学习,都会起到很大的促进和帮助,我相信,通过这次的毕业设计,在以后的学习中我会更加努力,力争把这门课学好,学精。同时,通过本次毕业设计,巩固了我学习过的专业知识,也使我们把理论与实践从真正意义。另外,通过这两周对电子密码锁的研究和学习,我认为本次设计中使用的这种键盘输入密码的方式可以进行改革。在越来越高科技化的今天,遥控控制显的愈发重要,今后的电子密码锁应该具有以红外技术或无线电技术为辅助的密码按键输入远程交互技术,这样就能远程输入密码完成操作。也可以放弃传统的按键输入密码模式,借助传感器技术运用声控来实现密码输入,又或者使用人脸识别技术,或者用户指纹识别技术代替传统的按键输入,这些都可以使开锁的时间更短更方便,同时使锁更安全。 最后也感谢指导老师这两周对我课设中存在的问题进行详细的解答与帮助。

8

单片机原理及系统课程设计报告

参考文献

[1] 谢自美.电子线路设计实验测试[M].武汉:华中理工大学出版社,1992. [2] 刘湘涛.江世明.单片机原理与应用[M]. 北京:电子工业出版社,2006. [3] 李光才.单片机课程设计实例指导[M].北京:北京航空航天大学出版社,2004. [4] 王思明等编著.单片机原理及应用系统设计 .北京:科学出版社,2012.

附录1源程序

#include #include

#define uchar unsigned char

sbit rs=P1^0; //寄存器选择位 将rs定义为p1.0的引脚 sbit rw=P1^1; //读写选择位将rw定义为p1.1的引脚 sbit en=P1^2; //使能信号位将en定义为p1.2的引脚 sbit ledg=P1^3; sbit ledr=P1^7; sbit relay=P1^4; sbit buzz=P1^6;

char table0[]=\char table1[]=\

char table2[]=\ // int temp,ch,m0,m1,p,n0,n1,n2,n3,n4,n5; void delay(int z) {

int x,c;

for(x=z;x>0;x--) for(c=100;c>0;c--); }

keyscan() {

temp=P2&0xf0;

9

单片机原理及系统课程设计报告

P2=0xfe; delay(1);

temp=P2&0xf0; while(temp!=0xf0) {

switch(temp) { case 0xe0:ch='7';break; case 0xd0:ch='8';break; case 0xb0:ch='9';break; default:ch=p; break; }

while(temp!=0xf0) { temp=P2; temp=temp&0xf0; } }

P2=0xfd; delay(1);

temp=P2&0xf0; while(temp!=0xf0) {

switch(temp) { case 0xe0:ch='4';break; case 0xd0:ch='5';break; case 0xb0:ch='6';break; default:ch=p;break; }

while(temp!=0xf0) { temp=P2; temp=temp&0xf0; } }

P2=0xfb; delay(1);

temp=P2&0xf0; while(temp!=0xf0) {

switch(temp)

10

单片机原理及系统课程设计报告

{ case 0xe0:ch='1';break; case 0xd0:ch='2';break; case 0xb0:ch='3';break; default:ch=p;break; }

while(temp!=0xf0) { temp=P2; temp=temp&0xf0; } }

P2=0xf7; delay(1);

temp=P2&0xf0; while(temp!=0xf0) {

switch(temp) { case 0xe0:ch='A';break; case 0xd0:ch='0';break; case 0xb0:ch='B';break; default:ch=p;break; }

while(temp!=0xf0) { temp=P2; temp=temp&0xf0; } }

return ch; }

void wcom(uchar com) {

rs=0; P3=com;

delay(1); //写命令延时可以为1 en=1;

delay(1); //写命令延时可以为1 en=0; }

void wdat(uchar dat)

11

单片机原理及系统课程设计报告

{

rs=1; P3=dat;

delay(1); //此处写数据延时可以为1 en=1;

delay(4); //此处写数据延时至少为4 en=0; }

void init() {

en=0;

wcom(0x38); wcom(0x0c); wcom(0x06); wcom(0x01); }

void error() {

char m2; wcom(0xc6);

for(m2=0;m2<5;m2++) {

wdat(table0[m2]); } }

void open() {

char m2; wcom(0xc6);

for(m2=0;m2<4;m2++) {

wdat(table1[m2]); } }

void pass() {

char m2; wcom(0x80);

for(m2=0;m2<9;m2++) {

wdat(table2[m2]); }

12

单片机原理及系统课程设计报告

}

change(int m) {

delay(500); wcom(m); wdat('*'); }

main() {

rw=0; ledg=0; ledr=0; relay=0; buzz=0; init(); delay(5); pass();

wcom(0x89);

while(keyscan()==p) {

delay(3); keyscan(); }

wdat(keyscan()); n0=keyscan(); change(0x89); delay(10); ch=p;

while(keyscan()==p) {

delay(3); keyscan(); }

wdat(keyscan()); n1=keyscan(); change(0x8a); ch=p;

while(keyscan()==p) {

delay(3); keyscan(); }

13

单片机原理及系统课程设计报告

wdat(keyscan()); n2=keyscan(); change(0x8b); ch=p;

while(keyscan()==p) {

delay(3); keyscan(); }

wdat(keyscan()); n3=keyscan(); change(0x8c); ch=p;

while(keyscan()==p) {

delay(3); keyscan(); }

wdat(keyscan()); n4=keyscan(); change(0x8d); ch=p;

while(keyscan()==p) {

delay(3); keyscan(); }

wdat(keyscan()); n5=keyscan(); change(0x8e);

if(n0=='2'&&n1=='0'&&n2=='1'&&n3=='4'&&n4=='1'&&n5=='9') {

int m3=1; open(); relay=1; delay(3000); relay=0; while(m3) { int m4,m5; ledg=0; for(m4=200;m4>0;m4--)

14

单片机原理及系统课程设计报告

{ keyscan(); if(keyscan()=='A') { m4=0; m3=0; } } ledg=1; if(m3!=0) { for(m5=200;m5>0;m5--) { keyscan(); if(keyscan()=='A') { m3=0; } } } } } else {

ledr=1; error(); buzz=1; delay(5000); }

15

单片机原理及系统课程设计报告

附录2Proteus仿真

16

本文来源:https://www.bwwdw.com/article/5cwa.html

Top