typora-root-url: ./
【毕业设计】20-基于单片机的指纹识别系统设计(原理图工程+源代码工程+实物操作图+答辩论文+答辩PPT)
文章目录
- typora-root-url: ./
- 【毕业设计】20-基于单片机的指纹识别系统设计(原理图工程+源代码工程+实物操作图+答辩论文+答辩PPT)
- 设计说明书
- 摘要
- 设计框架架构
- 设计说明书及设计文件
- 源码展示
设计说明书
摘要
对于如何实现家庭防盗这一问题,传统机械锁由于构造简单,被撬事件屡见不鲜;电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的青睐。本设计以单片机STC89C52作为密码锁监控装置的检测和控制核心,采用矩阵键盘输入的电子密码和指纹密码解锁两种解锁方式。系统采用LCD12864液晶显示屏实时更新显示信息,并设有修改密码功能,在解锁或修改密码时如果在未确定时发现自己按错了可以进行退格或重输的操作,如果发现旁边有人看着或者不想输入密码了可以进行退出输入的操作,从一定程度上将确保安全性。测试结果表明,本系统各项功能已达到本设计的所有要求。
资料链接
原理图工程文件
原理图截图
搭建视频
答辩论文低重复率文档,25354字
英文文献及翻译
答辩PPT
实物操作图
设计框架架构
前 言… 1
第一章 绪论… 2
第一节 研究背景与研究意义… 2
第二节 指纹识别应用及前景… 3
第三节 本文的主要研究内容… 4
第四节 本章小结… 4
第二章 基于单片机的指纹识别系统设计系统方案分析… 5
第一节 系统设计方案需求… 5
第二节 系统元器件方案选择… 5
一、主控芯片选择… 5
二、指纹模块选择… 6
三、显示器选择… 6
四、数据存储芯片选择… 7
五、人机交互按键选择… 7
第三节 系统结构总框图… 7
第四节 本章小结… 8
第三章 基于单片机的指纹识别系统硬件设计… 9
第一节 单片机最小系统电路设计… 9
一、单片机介绍… 9
二、单片机最小系统电路设计… 10
第二节 电源电路设计… 11
第三节 按键电路设计… 12
第四节 LED显示模块电路… 12
第五节 LCD液晶显示模块电路… 13
一、LCD12864介绍… 13
二、LCD12864电路设计… 13
第六节 指纹识别电路设计… 14
第七节 蜂鸣器报警模块电路… 15
第八节 24C02存储电路设计… 16
一、24C02芯片介绍… 16
二、24C02电路设计… 16
第九节 继电器电路设计… 17
第十节 系统总电路图… 18
第十一节 本章小结… 18
第四章 基于单片机的指纹识别系统软件设计… 19
第一节 Keil软件介绍… 19
第二节 主函数设计… 19
一、主函数流程… 19
二、主函数程序源码… 21
第三节 按键程序设计… 22
一、按键程序流程… 22
二、按键程序源码… 23
第四节 LCD程序设计… 25
一、LCD程序流程… 25
二、LCD程序源码… 26
第五节 蜂鸣器及LED程序设计… 26
一、蜂鸣器及LED程序流程… 26
二、蜂鸣器及LED程序源码… 27
第六节 本章小结… 28
第五章 基基于单片机的指纹识别系统的实现… 29
第一节 系统调试及遇到的问题… 29
第二节 系统功能测试… 31
第三节 本章小结… 34
总 结… 35
致 谢… 36
参考文献… 37
附 录… 39
一、英文原文… 39
二、英文翻译… 44
三、工程图纸… 48
四、源代码… 49
设计说明书及设计文件
源码展示
#include<reg52.h> //头文件
#include<LCD12864.h>
#include<AT24C02.h>
#include<KEY.h>
#include<FPM10A.h>
#define uchar unsigned char //宏定义
#define uint unsigned int
#define ulong unsigned long
#define MAX 5 //指纹最大数量
#define ID_MAX 3//输入ID最大位数
sbitjdq=P3^6;
sbit buzz=P3^7;
sbit led=P0^0;
uint T0_num=0;
uchar mode=0; //0正常打卡,1管理界面,2注册模式,3删除模式,4查询模式,5修改密码,6校准时钟,7工作时间
uchar mode_num=0;
uint ID=0; //存储输入编号ID
uchar n=0; //输入的位数
bit zhiwen_f=0; //1=标记进入指纹采集
uchar shu;
uchar a; //存储按键值
uchar num; //记录输入的密码位数
bit in_f; //输入密码的标志
bit reset_f; //重设密码的标志
bit input_f; //六位密码按完的标志
uchar reset_num; //标记修改密码阶段,=1输入旧密码,=2输入新密码,=3再次输入新密码
ulonglow_mima=0;//系统密码
ulongin_mima=0; //暂存输入的密码
ulongnew_mima=0;//暂存输入新密码
uchar set_f=0;
uchar temp[5]=" \0";
/********************************************************
函数名称:void delayms(uintms)
函数作用:毫秒延时函数
参数说明:
********************************************************/
void delayms(uintms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/********************************************************
函数名称:void didi(uchar i)
函数作用:蜂鸣器鸣叫
参数说明:i为鸣叫次数
********************************************************/
void didi(uchar i)
{
uchar j;
for(j=0;j<i;j++)
{
led=0;
buzz=0;
delayms(20);
led=1;
buzz=1;
delayms(15);
}
}
/********************************************************
函数名称:void diaplay_mode0()
函数作用:显示打卡主界面
参数说明:
********************************************************/
void diaplay_mode0()
{
LCD12864_display_string(1,1,"指纹密码锁");
LCD12864_display_string(0,2,"编号: ");
LCD12864_display_string(0,3,"状态: ");
}
/********************************************************
函数名称:void xunzhiwen()
函数作用:查找指纹
参数说明:
********************************************************/
void xunzhiwen()
{
searchnum=search();
if((searchnum>=1&&searchnum<=MAX)||searchnum==255)//最多是N个指纹
{
if(searchnum>=1&&searchnum<=MAX)//指纹识别成功
{
temp[0]=searchnum%1000/100+0x30;
temp[1]=searchnum%100/10+0x30;
temp[2]=searchnum%10+0x30;
temp[3]=' ';
LCD12864_display_string(3,2,temp);
LCD12864_display_string(3,3,"指纹解锁");
LCD12864_display_string(1,4," ");
in_mima=0;
num=0;
input_f=0;
jdq=0;
T0_num=0;
}
else//不正确的指纹
{
LCD12864_display_string(3,3,"无效指纹");
didi(3);
}
delay1ms(500);
LCD12864_display_string(3,2," ");
LCD12864_display_string(3,3," ");
}
}
/********************************************************
函数名称:void cunchu()
函数作用:存储指纹
参数说明:
********************************************************/
void cunchu()
{
LCD12864_display_string(0,3,"状态: ");
if(ID>0&&ID<=MAX)
{
if(enroll()==1)//采集两次,生成1个指纹模板成功
{
if(savefingure(ID)==1)//保存也成功
{
LCD12864_display_string(3,3,"录入成功");
AT24C02_write_date(ID,1);
}
else
LCD12864_display_string(3,3,"存储失败");
}
else
LCD12864_display_string(3,3,"采集失败");
}
else
LCD12864_display_string(3,3,"编号错误");
n=0;
ID=0;
zhiwen_f=0;
}
/********************************************************
函数名称:void shanchu()
函数作用:删除指纹
参数说明:
********************************************************/
void shanchu()
{
uinti;
LCD12864_display_string(0,3,"状态: ");
if(ID>0&&ID<=MAX)
{
if(dellfingure(ID)==1)
{
LCD12864_display_string(3,3,"删除成功");
AT24C02_write_date(ID,0);
}
else
LCD12864_display_string(3,3,"删除失败");
}
else
{
if(ID==999)
{
if(Clear_All()==1)
{
for(i=1;i<6;i++)
AT24C02_write_date(i,0);
LCD12864_display_string(3,3,"清空指纹");
}
else
LCD12864_display_string(3,3,"清空失败");
}
else
LCD12864_display_string(3,3,"编号错误");
}
n=0;
ID=0;
zhiwen_f=0;
}
/********************************************************
函数名称:void display_guanli()
函数作用:显示管理界面
参数说明:
********************************************************/
void display_guanli()
{
LCD12864_display_string(0,1," 管理系统界面 ");
LCD12864_display_string(0,2," 录入指纹 ");
LCD12864_display_string(0,3," 删除指纹 ");
LCD12864_display_string(0,4," 修改密码 ");
switch(mode_num)
{
case 0: LCD12864_display_string(0,2," >> "); break;
case 1: LCD12864_display_string(0,3," >> "); break;
case 2: LCD12864_display_string(0,4," >> "); break;
default: break;
}
}
/*********************************************************
函数名称:void chuli()
函数作用:对所按下的按键进行处理
参数说明:
*********************************************************/
void chuli()
{
if(key_f==1) //先判断是否有按键按下
{
if(a==11&&mode==0&&in_f==0)
{
shu++;
if(shu>=4)
{
AT24C02_write_date(200,0);
AT24C02_write_date(201,0);
AT24C02_write_date(202,0);
low_mima=0;
shu=0;
}
}
else
shu=0;
if((mode==2||mode==3)&&a<10) //如果输入ID状态,并且按下的是数字键
{
if(n<ID_MAX)//判断是否为输入状态,并且输入未满最大整数位数,才可以继续输入
{
if(n==0) //判断为编号第1位
{
LCD12864_display_string(3,2," ");
LCD12864_display_string(0,3," ");
}
LCD12864_display_char(3+n,2,a+0x30);//显示出输入的数字 ASCII[a]
ID=ID*10+a;//编号计算
n++; //编号输入位数+1
}
}
if((mode==0||mode==4)&&input_f==0&&a<10)//如果在in_f=1(输入密码状态),并且按下的是数字键
{
if(in_f==1||mode==4)
{
if(num==0) //清除显示后、显示输入新密码
LCD12864_display_string(1,3," ");
if(reset_f==1&&reset_num>1)
LCD12864_display_char(num+1,2,a+0x30);//ASCII[a]
else
LCD12864_display_char(num+1,2,'*');//显示“*”
}
else
LCD12864_display_char(num+1,4,'*');//显示“*”
in_mima=in_mima*10+a;//读入密码
num++; //密码输入次数加一
if(num==6) //六位密码输入完成
input_f=1; //标记六位密码输入完成
}
if(a==10)
{
if(mode==0&&in_f==0)//输入密码
{
num=0;
in_f=1;
in_mima=0;
input_f=0; //清除确定标志
write_com(0x01);
LCD12864_display_string(0,1,"请输入管理密码: ");//显示输入密码
}
}
if(a==15) //返回上一级菜单
{
if(mode>1) //在管理操作中
{
write_com(0x01);
LCD12864_clear12864();
mode=1; //回到管理选择界面
}
else
{
if(mode!=0||in_f==1)
{
write_com(0x01);
mode=0;
diaplay_mode0();
in_f=0;
num=0;
input_f=0;
}
}
if(jdq==0)
{
jdq=1;
T0_num=0;
}
}
if(a==11)//选择上一项
{
if(mode==1)//选择上一项管理
{
if(mode_num==0)
mode_num=2;
else
mode_num--;
}
}
if(a==12)//选择下一项
{
if(mode==1)//选择下一项管理
{
if(mode_num>=2)
mode_num=0;
else
mode_num++;
}
}
if(a==13) //退格
{
if(mode==0||mode==4)//在输入密码状态
{
if(num!=0)
{ //输入密码个数减1
num--;
if(in_f==1||mode==4)
LCD12864_display_char(num+1,2,' ');
else
LCD12864_display_char(num+1,4,' ');
in_mima=in_mima/10;
input_f=0;
}
}
if(mode==2||mode==3)//在ID编号输入状态
{
if(n!=0)
{
LCD12864_display_char(2+n,2,' ');
n--;
ID=ID/10;
zhiwen_f=0;
}
}
}
if(a==14)//确定
{
if(mode==1) //确定选择管理操作
{
write_com(0x01);
mode=mode_num+2;
n=0;
ID=0;
zhiwen_f=0;
input_f=0; //清除确定标志
num=0;
in_mima=0;
new_mima=0;
switch(mode_num)
{
case 0:
LCD12864_display_string(0,1,">>录入指纹");
LCD12864_display_string(0,2,"编号: ");
break;
case 1:
LCD12864_display_string(0,1,">>删除指纹");
LCD12864_display_string(0,2,"编号: ");
break;
case 2:
reset_f=1;
reset_num=1;
LCD12864_display_string(0,1,"请输入旧密码: ");
break;
default: break;
}
}
else
{
if(input_f==1)//密码输入完成确定
{
if(reset_f==1/*&&num==6*/) //修改密码区间
{
if(reset_num==3)
{
if(new_mima==in_mima)
{
low_mima=new_mima;
AT24C02_write_date(200,low_mima/10000);
AT24C02_write_date(201,low_mima%10000/100);
AT24C02_write_date(202,low_mima%100);
write_com(0x01);
LCD12864_display_string(1,1,"密码修改成功");
LCD12864_display_string(1,3,"请妥善保管好");
}
else
{
LCD12864_display_string(1,3,"密码修改失败");
}
reset_num=0;
reset_f=0;
}
if(reset_num==2)
{
write_com(0x01);
LCD12864_display_string(0,1,"请再次输入新密码");
new_mima=in_mima;
reset_num++;
}
if(reset_num==1)
{
if(low_mima==in_mima)
{
write_com(0x01);
reset_num++;
LCD12864_display_string(0,1,"请输入新密码: ");//显示输入新密码
}
else
{
LCD12864_display_string(2,3,"密码错误");//显示密码错误
reset_num=1;
LCD12864_display_string(1,2," ");
}
}
}
if(in_f==1) //进入管理输入密码时候
{
if(low_mima==in_mima)
{
mode=1;
write_com(0x01);
in_f=0;
}
else
{
LCD12864_display_string(2,3,"密码错误"); //显示密码错误
LCD12864_display_string(1,2," ");
}
}
if(mode==0&&in_f==0)
{
if(low_mima==in_mima)
{
LCD12864_display_string(3,3,"解锁成功");
jdq=0;
T0_num=0;
}
else
{
LCD12864_display_string(3,3,"密码错误"); //显示密码错误
didi(3);
}
LCD12864_display_string(1,4," ");
delay1ms(500);
LCD12864_display_string(3,3," ");
}
in_mima=0;
num=0; //清除密码计数。重新计算输入的密码个数
input_f=0; //清除确定标志
}
if((mode==2||mode==3)&&n==ID_MAX)
{
zhiwen_f=1;
}
}
}
key_f=0; //清除按键标志
}
}