基于51单片机指纹识别管理门禁密码锁系统设计
本系统由STC89C52单片机最小系统电路、LCD1602显示、指纹模块传感器、继电器驱动电路、按键电路及电源组成。【1】系统上电,有两个模式选择“指纹管理”、“控制系统”。指纹管理模式进入搜索、添加、删除指纹界面,添加指纹时指纹ID号可设置进行区分。控制系统模式,直接对比指纹进行对比的正常使用模式,也可以通过按键输入6位密码进行开关操作,密码可以通过输入管理员密码进行设置,密码具有掉电不丢失功能
·
基于51单片机指纹识别管理门禁密码锁系统设计
1、系统功能介绍
-
系统构成:
- 本系统由STC89C52单片机最小系统电路、LCD1602显示、指纹模块传感器、继电器驱动电路、按键电路及电源组成。
-
系统功能:
- 【1】系统上电,有两个模式选择“指纹管理”、“控制系统”。指纹管理模式进入搜索、添加、删除指纹界面,添加指纹时指纹ID号可设置进行区分。控制系统模式,直接对比指纹进行对比的正常使用模式,也可以通过按键输入6位密码进行开关操作,密码可以通过输入管理员密码进行设置,密码具有掉电不丢失功能。在任何模式下,都可以通过按键进行相互的切换到不同模式。
- 【2】指纹管理模式下有搜索指纹、增加指纹、删除指纹,添加指纹时指纹ID号可设置进行区分,添加指纹后可以在搜索指纹中进行搜索,如果存在则返回对应显示及ID号,删除指纹直接对录入的指纹进行清空。指纹数据具有掉电不丢失功能。
- 【3】系统控制模式下,如果如果指纹和录入的指纹库的指纹一致,则继电器闭合,3S左右后断开,也可以通过按键输入6位密码,如果密码和存储密码一致则继电器动作,3S左右后断开。如果密码和管理员密码一致继电器动作3秒,则下一次输入的6位密码即为新密码进行存储(设置密码时有"<<"指示)。修改密码后只有输入新密码才能开锁。(密码6位只能是1-3中的数字,组合有729种组合)。
- 【4】通过单独按键可以开门,模拟门禁中从里向外出时,直接开门按钮
- 【5】继电器开关状态再也液晶上有显示;对比指纹是否正确通过,也有相关提示“ Search OK ID*”表示成功;在输入密码前显示“******”,在输入6位密码后,有相应提示,"intSet!"表示进入设置,“PW OK!”表示密码输入正确开锁,"PW Err!"表示密码错误,"SET OK!"密码设置成功。
- 【6】管理员密码:123123 (默认不可修改,不然遗忘无法找回)
- 【7】默认开锁密码:112233(可修改,必须管理登陆后能够修改,用户修改后,则为修改后密码),密码存储在Flash中,有掉电不丢失功能。
-
根据本篇文章完成毕业设计的开题报告、任务书、设计、毕业论文等
2、资料下载
- 资料下载链接:https://download.csdn.net/download/qq_39020934/85082751
- 更多设计视频: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、AS608 光学指纹识别模块电路设计
- 指纹模块是指纹锁的核心部件,安装在如指纹门禁或者硬盘等器件上,用来完成指纹的采集和指纹的识别的模块。指纹模块主要由指纹采集模块、指纹识别模块和扩展功能模块(如锁具驱动模块)组成。指纹模块按其指纹识别方式可以分为:
- 光学指纹模块:靠光的折射和反射原理识别指纹。
- 电容指纹模块:通过电容的数值变化来采集指纹。
- 射频指纹模块(刮擦指纹模块):利用微量射频信号来探测纹路。
电路原理图:
实物图:
3.3、LCD1602液晶显示模块电路设计
- LCD显示器分为字段显示和字符显示两种。其中字段显示与LED显示相似,只要送对应的信号到相应的管脚就能显示。字符显示是根据需要显示基本字符。本设计采用的是字符型显示。系统中采用LCD1602作为显示器件输出信息。与传统的LED数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机应用设计中最常用的显示器件了。LCD1602可以显示2行16个汉字。
LCD1602控制指令说明:
- LCD1602液晶模块内部的控制器共有11条控制指令,说明下表所示:
电路原理图:
实物图:
3.4、按键电路设计
- 轻触按键是按键产品下属的一款分类产品,它其实相当于是一种电子开关,只要轻轻的按下按键就可以是开关接通,松开时是开关就断开连接,实现原理主要是通过轻触按键内部的金属弹片受力弹动来实现接通和断开的。在本系统中,按键作为系统的输入,起到了人机交互的枢纽作用。按键的单片机控制引脚默认为高电平,当按键按下后,单片机的相关引脚则变成低电平。进而实现对系统的手动输入。
电路原理图:
4、程序设计
4.1、系统初始化
void SysInit() //独立按键程序
{
Init_Timer0(); //定时器0初始化
UART_Init(); //初始化串口
OpenRelay (); //打开继电器
DelayMs(100);
CloseRelay ();
UartSendString("123\r\n");//测试串口用
init_eeprom();//初始化参数
LCD_Init();//初始化液晶显示
LCD_Clear();
}
4.2、LCD1602液晶显示程序
/*******************************************
函数名称: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;
}
4.3、AS608 指纹识别程序
//发送包头
void FPM10A_Cmd_Send_Pack_Head(void)
{
for(i_mid=0;i_mid<5;i_mid++) //包头
{
Uart_Send_Byte(FPM10A_Pack_Head[i_mid]);
}
}
//发送指令
void FPM10A_Cmd_Check(void)
{
FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
for(i_mid=0;i_mid<10;i_mid++)
{
Uart_Send_Byte(FPM10A_Get_Device[i_mid]);
}
}
//接收反馈数据缓冲
void FPM10A_Receive_Data(unsigned char ucLength)
{
uCount = 0; //指纹发送命令后 立刻返回数据 防止接收遗漏 uCount = 0;放在发送数据是就清零了
//对于STM32单片机处理较快 可以放到此处指纹数据等待中清零
while (uCount < ucLength)
{
DelayUs2x(2);
}
// for (i_mid=0;i_mid<ucLength;i_mid++)
// FPM10A_RECEICE_BUFFER[i_mid] = Uart_Receive_Byte();
}
//FINGERPRINT_获得指纹图像命令
void FPM10A_Cmd_Get_Img(void)
{
FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
for(i_mid=0;i_mid<6;i_mid++) //发送命令 0x1d
{
Uart_Send_Byte(FPM10A_Get_Img[i_mid]);
}
}
//讲图像转换成特征码存放在Buffer1中
void FINGERPRINT_Cmd_Img_To_Buffer1(void)
{
FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
for(i_mid=0;i_mid<7;i_mid++) //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
{
Uart_Send_Byte(FPM10A_Img_To_Buffer1[i_mid]);
}
}
//将图像转换成特征码存放在Buffer2中
void FINGERPRINT_Cmd_Img_To_Buffer2(void)
{
for(i_mid=0;i_mid<6;i_mid++) //发送包头
{
Uart_Send_Byte(FPM10A_Pack_Head[i_mid]);
}
for(i_mid=0;i_mid<7;i_mid++) //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
{
Uart_Send_Byte(FPM10A_Img_To_Buffer2[i_mid]);
}
}
//搜索全部用户999枚
void FPM10A_Cmd_Search_Finger(void)
{
FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
for(i_mid=0;i_mid<11;i_mid++)
{
Uart_Send_Byte(FPM10A_Search[i_mid]);
}
}
void FPM10A_Cmd_Reg_Model(void)
{
FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
for(i_mid=0;i_mid<6;i_mid++)
{
Uart_Send_Byte(FPM10A_Reg_Model[i_mid]);
}
}
//删除指纹模块里的所有指纹模版
void FINGERPRINT_Cmd_Delete_All_Model(void)
{
for(i_mid=0;i_mid<6;i_mid++) //包头
Uart_Send_Byte(FPM10A_Pack_Head[i_mid]);
for(i_mid=0;i_mid<6;i_mid++) //命令合并指纹模版
{
Uart_Send_Byte(FPM10A_Delete_All_Model[i_mid]);
}
}
//保存指纹
void FPM10A_Cmd_Save_Finger( unsigned int storeID )
{
unsigned long temp = 0;
FPM10A_Save_Finger[5] =(storeID&0xFF00)>>8;
FPM10A_Save_Finger[6] = (storeID&0x00FF);
for(i_mid=0;i_mid<7;i_mid++) //计算校验和
{temp = temp + FPM10A_Save_Finger[i_mid]; }
FPM10A_Save_Finger[7]=(temp & 0x00FF00) >> 8; //**All notes can be deleted and modified**//
FPM10A_Cmd_Send_Pack_Head(); //发送通信协议包头
for(i_mid=0;i_mid<9;i_mid++)
Uart_Send_Byte(FPM10A_Save_Finger[i_mid]); //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
}
4.4、毫秒延时程序
/*------------------------------------------------
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);
}
}
更多推荐
所有评论(0)