单片机——电子密码锁设计报告

本文介绍了基于STC89C52单片机的电子密码锁设计,包括密码设定、输入、修改功能,采用C语言编程,使用Proteus仿真和实物焊接。电子密码锁利用矩阵键盘输入,1602A液晶显示,具备声光报警、断电密码保护、解锁次数设定等功能。设计中涉及LCD、EEPROM和矩阵键盘的硬件设置,以及软件设计思路和程序流程。

信息学院
课程设计报告

课程名称: 单片机原理与应用
题 目: 电子密码锁设计
学生姓名:XXX 学 号: xxxxx
学生姓名: XXXX 学 号:XXXX
学 院: 信息学院
专业年级: XXXX
指导教师: XXXX
职 称: 讲 师

湖南人文科技学院信息学院制

来自于个人blog老廖&&Gameshttp://www.lhwblog.top/index.php/archives/4/
目 录
第一章 电子密码锁介绍
1.1电子密锁概述
1.2电子密码锁及发展与应用
1.3 设计目标及要求
第二章 软件设置
2.1 软件设计思路
2.2 程序流程
第三章 硬件设置
4、1 LCD
4、2 EEFROM
4、3矩阵键盘
第四章 总结与体会
5.1 总结
5. 2体会
附录A C语言源代码
参考文献

第1章电子密码锁介绍
1.1电子密码锁概述
本设计中,电子密码锁使用STC89C52单片机控制,采用C语言编写,通过Proteus软件仿真并进行了实物焊接。电子密码锁通过矩阵键盘进行密码输入,1602A液晶显示模块进行显示。其可实现的功能有: (1) 通过切换对输入的4位密码进行显示或隐藏; (2) 通过发光二极管和蜂鸣器,对解密正确或者错误进行声光报警; (3) 4位密码修改; (4) 在密码遗失情况下,通过初始密码进行密码再设置;
(5)采用AT24C02外部存储器,完成断电密码保护功能;
(6)具有1-9次的解锁次数任意设定功能; (7) 模拟密码箱随机产生密码,并进行解码。本设计特色为采用1602A液晶显示模块,这使得显示更加直观、使用更加方便。密码可实现显示和隐藏切换,通过隐藏密码实现密码保护。
1.2电子密码锁的发展应用
在日常地生活和工作中,住宅与部门地安全防范、单位地文件
档案、财务报表以及一些个人资料地保存多以加锁地办法来解决.
若使用传统地机械式钥匙开锁,人们常需携带多把钥匙,使用极
不方便,且钥匙丢失后安全性即大打折扣.随着科学技术地不断发
展,人们对日常生活中地安全保险器件地要求越来越高.为满足人
们对锁地使用要求,增加其安全性,用密码代替钥匙地密码锁应
运而生.密码锁具有安全性高、成本低、功耗低、易操作等优点.
在安全技术防范领域,具有防盗报警功能地电子密码锁逐渐代替传统地机械式密码锁,克服了机械式密码锁密码量少、安全性能差地缺点,使密码锁无论在技术上还是在性能上都大大提高一步.随着大规模集成申,路技术地发展,特别是单片机地问世,出现了带微处理器地智能密码锁,它除具有电子密码锁地功能外,还引入了智能化管理、家分析系统等功能,从而使密码锁具有很高地安全性、可靠性,应用日益广泛.随着人们对安全地重视和科技地发展,许多电子智能锁(指识别、IC卡辨认)已在国内外相继面世.但是这些产品地特点是针对特定地指纹和有效卡,只能适用于保密要求地箱、柜、门等.而且指纹识识别器若在公共场所使用存在容易机械损坏,IC 卡还存在容易丢失、损坏等特点加上其成本较高,一定程度 上限制了这类产品地普及和推广鉴于目前地技术水平与市场地接收程度,电子密码锁是这类电子防盗产品地主流.二、系统所要完成地功能。
1.3设计目标及要求
功能:
1、密码的设定,此密码是固定在程序存储器ROM中,假设预设的密码为“123456”共6位密码。
2、密码的输入: 用4*4矩阵键盘中的10个按键分别表示0~9的数字,完成6位密码的输入。
3、密码的修改:能够修改密码,修改以后的密码掉电不丢失,即下一次上电以后用新设定密码进入系统。
4、密码错误蜂鸣器发出报警音。

第2章 软件设置
2.1 软件设计思路
电子密码锁工作的主要过程是LCD1602液晶显示器提示开始输入密码,通过矩阵键盘输入密码,同时由液晶显示器显示输入的情况,到输入完成后系统自动作出判断,作出开锁或闭锁处理。
密码的设定,在本设计中的程序中输入的密码是保存在30H- -46H 中的。在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;或者输入确认功能键之后,才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。

2.2程序流程
在这里插入图片描述
;-图3主程序流程图
第三章、硬件设置
3、1 LCD
LCD为液晶显示器,主要由LCD控制器、LCD驱动器、LCD显示装置。
它的16条引脚定义如下:在这里插入图片描述

对这个表的说明:

3.2 EEPROM
EEPROM 用于保存数据。一般保存在单片机RAM中的数据,掉电后就丢失了,为使掉电后数据不丢失,故使用EEPROM,其特点就是掉电后数据不丢失。

3.3 矩阵键盘
由于本设计中要求使用16个按键输入,为减少键盘与单片机接口时所占用的I/O线的数目,故使用矩阵键盘,本设计中,矩阵键盘行线和单片机的P1.0-P1.3相连,列线与单片机P1.4-P1.7相连。矩阵键盘设计电路图,如图2所示。
键盘扫描采用行扫描法,即依次置行线中的每一行为低电平,其余均为高电平,扫描列线电平状态,为低电平即表示该键按下。
在这里插入图片描述

第4章 总结与体会
4.1 总结
1.根据原理和芯片引脚图,分功能设计原理图,并根据接线顺序分步骤验证。
2.利用开发板来实现设计功能,先要对开发板进行了解。线路搭建时可参考开发板的原理图,对照着进行连接。
3.导线连接时对开发板内部连接不清楚,易造成连线不正确。
4.注意6个数码管的放大电路的组建。
5.检查故障时除测试输入、输出信号外,要注意电源、接地和控制引脚。
6.程序编写的细微差错,引起程序编译不通过。
4.2 体会
单片机课程设计是电类专业学生重要基础实践课是工科专业的必修课。经过查资料、选方案、设计电路、撰写设计报告、使我得到一次较全面的工程实践训练。理论联系实际,提高和培养创新能力,为后续课程的学习,毕业设计,毕业后的工作打下基础。进过此次的实践,我学会了很多。通过这次设计,我受益匪浅。课程设计是一次综合性的实践,它将各种知识结合到一起综合运用到实践上来扩展、弥补、串联所学的知识。通过本次课程设计我得到了很多收获。首先,了解了单片机的基本知识和在控制领域的作用和地位。其次掌握了C语言的编写程序,学会了使用PROTUTES和KEIL的仿真来实现,同时掌握了如何收集、查阅、应用文献资料,如何根据实际需要有选择的阅读书籍和正确确定系统所要使用的元器件的类型。再次,在精神方面锻炼了思想、磨练了意志。不仅可以充分的体会到自己动手实践的乐趣,获得哪怕是前进一小步时候的那种成功的喜悦,还有利于我们学习能力的提高,有利于我们团队精神的培养,有利于我们心理素质的锻炼。
在此次的基于单片机的电子密码锁设计过程中,更进一步地熟悉了芯片的结构及掌握了频率计的工作原理和其具体的使用方法.在设计电路中,往往是先仿真后连接实物图,但有时候仿真和电路连接并不是完全一致的,例如仿真的连接示意图中,往往没有接高电平以及接低电平,因此在实际的电路连接中往往容易遗漏。在这段时间内我们积极查找有关资料,相互讨论,不断总结经验,吸取教训。虽然在此期间我们也有过分歧,遇到过很多的问题。

附录A
2.C语言源代码分析:
`/**************************************
电子密码锁
**************************************/
//密码锁
#include<reg52.h>
#include <intrins.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^5;
sbit I2C_SCL = P3^7;
sbit I2C_SDA = P3^6;
sbit buzz=P1^6;
bit buz=0;
extern void InitLcd1602();
extern void LcdShowDat(uchar x, uchar y, uchar dat);
extern void LcdShowStr(uchar x, uchar y, uchar *str);
extern void I2CStart();
extern void I2CStop();
extern bit I2CWrite(unsigned char dat);
extern unsigned char I2CReadNAK() ;
extern unsigned char E2ReadByte(addr);
extern void E2WriteByte(unsigned char addr, unsigned char dat);
bit ksetf=0;
bit kokf=0;
bit kinf=0;
bit jflag=0;
bit rflag=0;
void setpassword();
void inputpassword();
extern void LcdWriteCmd(uchar cmd);

uchar str[10]=“mi ma suo”;
uchar str1[17]=“set the password”;
uchar str2[15]=“input password”;
uchar str3[12]=“set success”;
uchar str4[7]=“unlock”;
uchar str5[6]=“error”;

void judge(uchar s);
unsigned char key=17;

unsigned char code keycode[]={
0xe7,0xd7,0xb7,0x77,
0xeb,0xdb,0xbb,0x7b,
0xed,0xdd,0xbd,0x7d,
0xee,0xde,0xbe,0x7e,
};

void delay_ms(unsigned int cnt)
{
unsigned char i;
while(cnt–){
for(i=0;i<=110;i++);
}
}

void ScanKeyboard()
{
unsigned char s1,s2,keyboard;
unsigned char i;
P2=0xf0;
s1=P2;
if((s1&0xf0)!=0xf0)
{
delay_ms(30);
s1=P2;
if((s1&0xf0)!=0xf0)
{
P2=0x0f;
s2=P2;
keyboard=s1|s2;
while((P2&0x0f)!=0x0f);
for(i=0;i<=15;i++)
{
if(keyboard==keycode[i])
key=i+1;
jflag=1;
}
}
}
}

void clock()
{
if(buz==1)
{buzz=~buzz;}

}
void main()
{

uchar t;
InitLcd1602();
buzz=1;	
while(1)
{	
   	clock();
	LcdShowStr(0,0,str);
	delay_ms(11);
    ScanKeyboard();
	t=key;
    judge(t);
	if(ksetf==1)/t the password
	{
		kokf=0;
		LcdWriteCmd(0x01);	  // 清屏
		
		LcdShowStr(0,0,str1);
		setpassword();

		LcdWriteCmd(0x01);	  // 清屏
		
		LcdShowStr(0,0,str3);//success
		delay_ms(1000);
		ksetf=0;
	}
	if(kinf==1)	//input password
	{
		kokf=0;
		LcdWriteCmd(0x01);	  // 清屏
		buz=0;
		LcdShowStr(0,0,str2);
		inputpassword();
		//result
		if(rflag)
		{
		LcdWriteCmd(0x01);	  // 清屏			
		LcdShowStr(0,0,str4); //unlock
		delay_ms(2000);
		rflag=0;
		}
		else
		{	buz=1;
			LcdWriteCmd(0x01);
			LcdShowStr(0,0,str5);//error
			delay_ms(2000);
			rflag=0;
		}
		kinf=0;
	}
	LcdWriteCmd(0x01);	  // 清屏
}

}
//判断功能键
void judge(uchar s)
{
if(s14)ksetf=1;
if(s
15)kinf=1;
if(s16)kokf=1;
}
//设置密码
void setpassword()
{
uchar t,x=0,y=0x2a,i,n;
uint m=0;
idata uchar password[16];
while(1)
{
jflag=0;
ScanKeyboard();
t=key;
judge(t);
if(kokf
1)
{
kokf=0;
for(i=0;i<x;i++)
{
n=password[i];
E2WriteByte(i,n);
delay_ms(8);
}
E2WriteByte(0x0f,m);//密码写入ROM保存
x=0;m=0;
break;
}
t+=0x30;
if(jflag)
{
password[x]=t;
LcdShowDat(x,1,t);
delay_ms(800);
LcdShowDat(x,1,y);
x++;m++;
jflag=0;
}
if(x>=16)break;
}
}
//输入密码
void inputpassword()
{
uchar t,x=0,y=0x2a,i;
uint m=0;
idata uchar l[16];
idata uchar password[16];
while(1)
{

		jflag=0;
		ScanKeyboard();
		t=key;
		judge(t);
		if(kokf==1)
		  {
			kokf=0;	
			m=E2ReadByte(0x0f);			
			for(i=0;i<m;i++)
			{
			 	l[i]=E2ReadByte(i);	//读取密码							
			}							
			if(strcmp((char*)password,(char*)l)==0){rflag=1;buz=0;}
			
			for(i=0;i<x;i++)
			{password[i]='\0';}	
			x=0;					
			break;
		  }
		t+=0x30;
		if(jflag)
		{
			password[x]=t; 	
			LcdShowDat(x,1,t);
			delay_ms(800);
			LcdShowDat(x,1,y);
			x++;
			jflag=0;
		}
		if(x>=16)break;
	}

}

//ROM
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define I2CDelay() {nop();nop();nop();nop();}
sbit I2C_SCL = P3^7;
sbit I2C_SDA = P3^6;

/* 产生总线起始信号*/
void I2CStart()
{
I2C_SDA = 1; //首先确保SDA、SCL都是高电平
I2C_SCL = 1;
I2CDelay()
I2C_SDA = 0; //先拉低SDA
I2CDelay()
I2C_SCL = 0; //再拉低SCL
}
/* 产生总线停止信号*/
void I2CStop()
{
I2C_SCL = 0; //首先确保SDA、SCL都是低电平
I2C_SDA = 0;
I2CDelay();
I2C_SCL = 1; //先拉高SCL
I2CDelay();
I2C_SDA = 1; //再拉高SDA
I2CDelay();
}
/* I2C总线写操作,dat-待写入字节,返回值-从机应答位的值*/
bit I2CWrite(unsigned char dat)
{
bit ack; //用于暂存应答位的值
unsigned char mask; //用于探测字节内某一位值的掩码变量
for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行
{
if ((mask&dat) == 0) //该位的值输出到SDA上
I2C_SDA = 0;
else
I2C_SDA = 1;
I2CDelay();
I2C_SCL = 1; //拉高SCL
I2CDelay();
I2C_SCL = 0; //再拉低SCL,完成一个位周期
}
I2C_SDA = 1; //8位数据发送完后,主机释放SDA,以检测从机应答
I2CDelay();
I2C_SCL = 1; //拉高SCL
ack = I2C_SDA; //读取此时的SDA值,即为从机的应答值
I2CDelay();
I2C_SCL = 0; //再拉低SCL完成应答位,并保持住总线
return ack; //返回从机应答值
}

unsigned char I2CReadNAK()
{
unsigned char mask;
unsigned char dat;
I2C_SDA = 1; //首先确保主机释放SDA
for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行
{
I2CDelay();
I2C_SCL = 1; //拉高SCL
if(I2C_SDA == 0) //读取SDA的值
dat &= ~mask; //为0时,dat中对应位清零
else
dat |= mask; //为1时,dat中对应位置1
I2CDelay();
I2C_SCL = 0; //再拉低SCL,以使从机发送出下一位
}
I2C_SDA = 1; //8位数据发送完后,拉高SDA,发送非应答信号
I2CDelay();
I2C_SCL = 1; //拉高SCL
I2CDelay();
I2C_SCL = 0; //再拉低SCL完成非应答位,并保持住总线
return dat;
}
/* 读取 EEPROM 中的一个字节, addr -字节地址 */
unsigned char E2ReadByte(addr)
{
unsigned char dat;
I2CStart();
I2CWrite(0x50<<1); //寻址器件,后续为写操作
I2CWrite(addr); //写入存储地址
I2CStart(); //发送重复启动信号
I2CWrite((0x50<<1)|0x01); //寻址器件,后续为读操作
dat = I2CReadNAK(); //读取一个字节数据
I2CStop();
return dat;
}
/向EEPROM中写入一个字节,addr-字节地址/
void E2WriteByte(unsigned char addr, unsigned char dat)
{
I2CStart();
I2CWrite(0x50<<1); //寻址器件,后续为写操作
I2CWrite(addr); //写入存储地址
I2CWrite(dat); //写入一个字节数据
I2CStop();
}

//LCD
#include<reg52.h>
#define uchar unsigned char
#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^5;
void InitLcd1602();
void LcdShowStr(uchar x, uchar y, uchar str);
void LcdShowDat(uchar x, uchar y, uchar dat);
/
等待液晶准备好 */
void LcdWaitReady()
{
uchar sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do
{
LCD1602_E = 1;
sta = LCD1602_DB; //读取状态字
LCD1602_E = 0;
}while(sta & 0x80); //bit7=1表示液晶正忙,重复检测直到其等于0为止
}

/* 向LCD1602液晶写入一字节命令,cmd为待写入命令值*/
void LcdWriteCmd(uchar cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}

/* 向LCD1602液晶写入一字节数据,dat为待写入数据值*/
void LcdWriteDat(uchar dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}

/* 设置显示RAM起始地址, (x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(uchar x, uchar y)
{
uchar addr;
if(y == 0) //由输入的屏幕坐标计算显示RAM的地址
addr = 0x00+x; //第一行字符地址从0x00起始
else
addr = 0x40+x; //第二行字符地址从0x40起始
LcdWriteCmd(addr | 0x80); //设置RAM地址
}

/在液晶上显示数字,(x,y)-对应屏幕上的起始坐标,dat为待显示数字/
void LcdShowDat(uchar x, uchar y, uchar dat)
{
LcdSetCursor(x, y); //设置起始地址
LcdWriteDat(dat); //写入数据
}

/初始化1602液晶/
void InitLcd1602()
{
LcdWriteCmd(0x38); // 162显示,57点阵,8位接口
LcdWriteCmd(0x0C); // 显示器开,光标关闭
LcdWriteCmd(0x06); // 文字不动,地址自动加1
LcdWriteCmd(0x01); // 清屏
}

//在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,
void LcdShowStr(uchar x, uchar y, uchar *str)
{
LcdSetCursor(x, y); //设置起始地址
while(*str != ‘\0’) //连续写入字符串数据,直到检测到结束符
{
LcdWriteDat(*str++); //先取str指向的数据,然后str自加1
}
}`

参考文献

[1] 楼然苗、李光飞.单片机课程设计指导(第2版)[M].北京:北京航空航天大学出版社,2013.
[2] 杨恢先、黄辉先.单片机原理及应用 [M].湘潭:湘潭大学出版社,2003.
[3] 周兴华.手把手教你学单片机C语言程序设计[M].北京:北京航空航天大学出版社,2007.
[4] 彭伟. 单片机C语言程序设计实训100例[M].电子工业出版社,2009.
[5]康华光.电子技术基础(数字部分)[M]. 高等教育出版社. 1998.
[6]康华光.电子技术基础(模拟部分)[M]. 高等教育出版社. 1998.

一、 引言 随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。 设计本课题时构思了两种方案:一种是用以AT89s51为核心的单片机控制方案;另一种是用以74LS112双JK触发器构成的数字逻辑电路控制方案。考虑到数字电路方案原理过于简单,而且不能满足现在的安全需求,所以本文采用前一种方案。 二、方案论证与比较 方案一:采用数字电路控制。其原理方框图如图1-1所示。 图2-1 数字密码锁电路方案 采用数字密码锁电路的好处就是设计简单。用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过40秒(一般情况下,用户不会超过40秒,若用户觉得不便,还可以修改)电路将报警80秒,若电路连续报警三次,电路将锁定键盘5分钟,防止他人的非法操作。 电路由两大部分组成:密码锁电路和备用电源(UPS),其中设置UPS电源是为了防止因为停电造成的密码锁电路失效,使用户免遭麻烦。 密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输入次数锁定电路。 方案二:采用一种是用以AT89S51为核心的单片机控制方案。利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能。其原理如图1-2所示。 图2-2单片机控制方案 通过比较以上两种方案,单片机方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级,所以我们采用后一种方案。 三、电路的功能单元设计 1.开锁机构 通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而达到开锁的目的。其原理如图2-1所示。 图3-1密码锁开锁机构示意图 当用户输入的密码正确而且是在规定的时间(普通用户要求在12s内输入正确的密码,管理员要求在5s输入正确的密码)输入的话,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁,达到开门的目的。其实际电路如图2-2所示。 电路驱动和开锁两级组成。由D5、R1、T10组成驱动电路,其中T10可以选择普通的小功率三极管如9014、9018都可以满足要求。D5作为开锁的提示;由D6、C24、T11组成。其中D6、C24是为了消除电磁锁可能产生的反向高电压以及可能产生的电磁干扰。T11可选用中功率的三极管如8050,电磁锁的选用要视情况而定,但是吸合力要足够且由一定的余量。 在本次设计中,基于节省材料的原则,暂时用发光二极管代替电磁锁,发光管亮,表示开锁;灭,表示没有开锁。 图3-2密码锁开锁机构电路图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GAME LIAO

感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值