基于51单片机智能电子密码锁密码箱保险柜系统设计
1、系统功能介绍
-
系统构成:
- 本系统由STC89C52单片机、LCD1602液晶显示、继电器、蜂鸣器报警、存储器、4*4矩阵键盘及电源组成。
-
系统功能:
- 1、可以设置修改密码(6位数的密码)(0-9之间任意数字),修改密码之前必须再次输入原始密码,在输入新密码时要输入两次确认并相同才可以修改成功,否则修改不成功,防止误操作。
- 2、有报警、锁定键盘功能,如果密码输入错误3次,系统会锁住键盘1分钟并有蜂鸣器声音报警提示,1分钟后可以再次输入密码。
- 3、密码支持掉电保存功能,应用AT24C02芯片保存密码,可以随时修改密码,密码输入过程中,可按清除键逐个删除已输入的数字。
- 4、液晶背光可控功能,当没有按键按下30秒后,液晶背光可以自动关闭,再有按键按下就可以重新点亮背光,不管是白天还是晚上都可以节约电能,优点即节能又不影响操作。
- 5、有管理员密码,即使忘记密码也不怕,只要输入管理员密码就可以把密码还原成初始密码。
- 6、双重保护,万一管理员密码忘记了,我们还办法找回密码,按下密码还原键3秒后可以把密码还原成初始密码,要连接按下3秒才能还原,防止误操作。
-
根据本篇文章完成毕业设计的开题报告、任务书、设计、毕业论文等
2、资料下载
- 资料下载链接:https://download.csdn.net/download/qq_39020934/85084505
- 更多设计视频:https://space.bilibili.com/3537120073353692
3、系统电路介绍
3.1、STC89C52单片机核心系统电路设计
- STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
STC89C52主要特性如下:
- (1)8K字节程序存储空间;
- (2)512字节数据存储空间;
- (3)内带4K字节EEPROM存储空间;
- (4)可直接使用串口下载
单片机最小系统电路图如下图所示
实物图:
3.2、LCD1602液晶显示模块电路设计
- LCD显示器分为字段显示和字符显示两种。其中字段显示与LED显示相似,只要送对应的信号到相应的管脚就能显示。字符显示是根据需要显示基本字符。本设计采用的是字符型显示。系统中采用LCD1602作为显示器件输出信息。与传统的LED数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机应用设计中最常用的显示器件了。
电路原理图:
实物图:
3.3、24C02存储电路设计
- 在设计中,经常会用到存储器来存储重要的信息,以防丢失。亦或是单片机内部的存储空间不够,需要外接存储器。
- 本设计中于采用的存储芯片为 Microchip公司提供的24LC02非易失性串行存储器芯片,其具有与微处理器接口简单,占用系统资源少,成本低等特点,非常适合于需要现场数据写入与读出、断电后数据不丢失的场合。
- 它的应用将对智能仪器仪表、工业控制、家电、计算机等领域起到深远的影响。
- 24LC02遵守2线传输协议。总线空闲时方可进行数据传输,但所有操作均起始于初始化条件,结束于停止条件。传送的控制字节、地址及数据均以高位在前低位在后的8位串行格式,都是在SCL时序信号激励下完成的
电路原理图:
实物图:
3.4、矩阵键盘电路设计
- 轻触按键是按键产品下属的一款分类产品,它其实相当于是一种电子开关,只要轻轻的按下按键就可以是开关接通,松开时是开关就断开连接,实现原理主要是通过轻触按键内部的金属弹片受力弹动来实现接通和断开的。
- 矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组。在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
电路原理图:
实物图:
3.5、5V继电器控制电路(低电平有效)设计
- 继电器是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。
- 通讯、自动控制、机电一体化及电力电子设备中,是最重要的控制元件之一故在电路中起着自动调节、安全保护、转换电路等作用。继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。
电路原理图:
实物图:
4、程序设计
4.1、LCD1602显示程序
/***********************************************
函数名称:DispStr
功 能:让液晶从某个位置起连续显示一个字符串
参 数:x--位置的列坐标
y--位置的行坐标
ptr--指向字符串存放位置的指针
返回值 :无
***********************************************/
void DispStr(uchar x,uchar y,uchar *ptr)
{
uchar *temp;
uchar i,n = 0;
temp = ptr;
while(*ptr++ != '\0') n++; //计算字符串有效字符的个数
for (i=0;i<n;i++)
{
Disp1Char(x++,y,temp[i]);
if (x == 0x10)
{
break;
}
}
}
/*******************************************
函数名称:DispNchar
功 能:让液晶从某个位置起连续显示N个字符
参 数:x--位置的列坐标
y--位置的行坐标
n--字符个数
ptr--指向字符存放位置的指针
返回值 :无
*******************************************
void DispNChar(uchar x,uchar y, uchar n,uchar *ptr)
{
uchar i;
for (i=0;i<n;i++)
{
Disp1Char(x++,y,ptr[i]);
if (x == 0x10)
{
x = 0;
y ^= 1;
}
}
}
*/
/*******************************************
函数名称:LocateXY
功 能:向液晶输入显示字符位置的坐标信息
参 数:x--位置的列坐标
y--位置的行坐标
返回值 :无
********************************************/
void LocateXY(uchar x,uchar y)
{
uchar temp;
temp = x&0x0f;
y &= 0x01;
if(y) temp |= 0x40; //如果在第2行
temp |= 0x80;
LcdWriteCommand(temp,1);
}
/*******************************************
函数名称:Disp1Char
功 能:在某个位置显示一个字符
参 数:x--位置的列坐标
y--位置的行坐标
data--显示的字符数据
返回值 :无
********************************************/
void Disp1Char(uchar x,uchar y,uchar data1)
{
LocateXY( x, y );
LcdWriteData( data1 );
}
/*******************************************
函数名称:LcdReset
功 能:对1602液晶模块进行复位操作
参 数:无
返回值 :无
********************************************/
void LcdReset(void)
{
// DataDir = 0xFF; //数据端口设为输出状态
LcdWriteCommand(0x38, 0); //规定的复位操作
DelayMs(5);
LcdWriteCommand(0x38, 0);
DelayMs(5);
LcdWriteCommand(0x38, 0);
DelayMs(5);
LcdWriteCommand(0x38, 1); //显示模式设置
LcdWriteCommand(0x08, 1); //显示关闭
LcdWriteCommand(0x01, 1); //显示清屏
LcdWriteCommand(0x06, 1); //写字符时整体不移动
LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
void LcdClear(void)
{
LcdWriteCommand(0x01,1);
DelayMs(5);
}
/*******************************************
函数名称:LcdWriteCommand
功 能:向液晶模块写入命令
参 数:cmd--命令,
chk--是否判忙的标志,1:判忙,0:不判
返回值 :无
********************************************/
void LcdWriteCommand(uchar cmd,uchar chk)
{
if (chk) WaitForEnable(); // 检测忙信号?
CLR_RS;
CLR_RW;
_NOP();
DataPort = cmd; //将命令字写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
/*******************************************
函数名称:LcdWriteData
功 能:向液晶显示的当前地址写入显示数据
参 数:data--显示字符数据
返回值 :无
********************************************/
void LcdWriteData( uchar data1 )
{
WaitForEnable(); //等待液晶不忙
SET_RS;
CLR_RW;
SET_EN;
_NOP();
DataPort = data1; //将显示数据写入数据端口
_NOP();
//产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
/*******************************************
函数名称:WaitForEnable
功 能:等待1602液晶完成内部操作
参 数:无
返回值 :无
********************************************/
void WaitForEnable(void)
{
unsigned int later=0;
DataPort=0xff;
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();
// while((DataPIN&Busy)!=0);
while(((DataPIN&0x80)!=0)&&(later<1000)) //检测忙标志
{
DelayUs2x(2);
later++;
}
CLR_EN;
// DataDir|=0xFF; //将P4口切换为输出状态
}
4.2、毫秒延时程序
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
4.3、24c02程序
/*****************向24C02写一个字节进去*************************/
void write_24c02(uchar add,uchar dat)
{
start();
write_iic(0xa0);
ack();
write_iic(add);//**All notes can be deleted and modified**//
write_iic(dat);
no_ack();
stop();
}
/******************从24C02读一个字节进去************************/
uchar read_24c02(uchar add)
{
uchar value;
start();
write_iic(0xa1);//**All notes can be deleted and modified**//
ack();
write_iic(add);
ack();
start();
write_iic(0xa0);//**All notes can be deleted and modified**//
ack();
value = read_iic();
no_ack();
stop();
return value;
}