当前位置: 首页 > news >正文

基于51单片机的指纹考勤机密码锁系统

全套资源下载地址:https://download.csdn.net/download/sheziqiong/86769799
全套资源下载地址:https://download.csdn.net/download/sheziqiong/86769799
目录
第1章 概述 4
1.1 指纹识别技术的发展 4
1.2 指纹识别原理 5
1.3 系统设计目的及意义 6
1.4 工作流程 6
第2章 硬件介绍和设计 8
2.1 单片机及最小系统 8
2.1.1 STC89C52单片机介绍 8
2.1.2 外部晶振的设计 10
2.1.3 复位电路的设计 11
2.2 液晶显示模块 12
2.2.1 12864系列液晶的引脚功能 12
2.2.2 控制器接口说明 14
2.2.3 指令说明 14
2.2.4 12864引脚与单片机连接图 19
2.3 按键控制部分电路 20
2.4 指纹模块 22
2.4.1 指纹模块简介 22
2.4.2 指纹模块引脚接法 24
2.4.3 指纹模块命令 24
2.5 本章小结 26
第3章 系统软件的设计 28
3.1 系统程序工作分析 28
3.2 串口初始化 28
3.3 主程序流程图 29
3.3.1键盘管理程序设计流程 31
3.3.2 LCD显示模块程序设计流程 31
3.3.3 指纹模块的通信程序设计流程 32
3.4 Keil编程 33
3.5 本章小结 34
第4章 硬件调试 35
4.1 电路的焊接 35
4.2 程序的烧写 36
4.3 小灯、继电器的调试 37
4.4 液晶的调试 37
4.5 指纹模块、按键的调试 38
4.6 本章小结 38
结 论 39
参考文献 40
致 谢 41
1)开机:按下电源,电源指示灯点亮,液晶显示:“请先按键再刷指纹”,按下按键后,液晶显示:“请按指纹”,同时指纹模块绿灯亮起,可以进行指纹识别开锁功能。若指纹识别成功,继电器动作,LED指示灯亮起,开锁成功,人员可以进入,液晶显示:“指纹已找到,请进”; 若指纹识别不成功,继电器不动作,LED指示灯不亮,将不能开锁,人员不能进入,液晶显示:“没有搜索到指纹 请按任意键继续”。
2)管理员模式:按下按键进入管理员模式首先要输入6位密码,密码正确可以进入管理员模式,密码错误不能进入管理员模式,在管理员模式下可以完成录入指纹、删除指纹、应急开锁和修改密码的功能。进入录入指纹模式后,指纹模块绿灯亮起,将手指放到指纹头上,录入同一手指两次,此时液晶显示“指纹采集成功”。在删除指纹模式下,液晶显示“输入删去的指纹号”,输入后按确认键即可完成指定指纹的删除功能,同时液晶显示“删指纹号成功”。在非正常的情况下,如指纹模块不好用或者紧急情况下,可以使用紧急开锁功能。密码修改的功能是指可以修改并保存进入管理员的6位密码。
系统设计的总体框图如图1-3所示。
在这里插入图片描述
图1-3 系统总体框架图
2.4 指纹模块
2.4.1 指纹模块简介
本设计选择的指纹模块型号是ZFM60,指纹模块电路如下所示:
在这里插入图片描述
图2-7 指纹模块接口图
指纹模块里面主要是DSP芯片,型号为AS606,加上外面的CMOS芯片,CMOS芯片主要是对指纹进行“照相”,生成指纹特征,如下图所示就是一个指纹模板,录入两次这样的指纹特征就能生成一个指纹模板。
具体的工作过程是:扫描指纹(录入图像)、生成特征、合成模板(建立一个指纹库文件,成功录入一个指纹)。
在这里插入图片描述
图2-8 指纹模版
指纹模板就是“照一次相”,将指纹模块里面的CMOS芯片采集一次指纹信息,然后进行模糊处理生成0和1两种记录信息,存入指纹模块的FLASH芯片里面。
当切换到识别模式的时候,指纹模块就会先让CMOS芯片采集一次指纹,然后和FLASH芯片的数据进行对比。看是不是存在,如果存在就能返回是几号指纹。这样我们就能通过单片机或者电脑进行指纹识别与登记了。
具体指纹模块介绍如下:此指纹模块型号是:ZFM60,此模块上里面包含了:
1、光学头2、通信连接线3、DSP芯片4、稳压芯片5、FLASH芯片6、CMSO传感器等部件组成。
主要技术指标:
供电电压:DC 3.8~7.0V
背光颜色:绿色
亮灯方式:长亮/闪烁
供电电流:工作电流:<65mA
峰值电流:<95mA
指纹图像录入时间:<0.5秒
窗口面积:14.5×19.4mm
匹配方式:比对方式(1:1)
搜索方式(1:N)
特征文件:256字节
模板文件:512字节
存储容量:1000枚
安全等级:3级(从低到高:1、2、3、4、5)
认假率(FAR):<0.001%(安全等级为3时)
拒真率(FRR):<1.0%(安全等级为3时)
搜索时间:<1.0秒(1:500时,均值)
上位机接口:UART(TTL逻辑电平)
通讯波特率(UART):(9600×N)bps其中N=1~12(默认值N=6,即57600bps)

#include"reg52.h"
#include"12864.h"
#include"eeprom.h"
#include"matrixkey.h"
#include"AT24CXX.h"
#include"finger.h"
uchar code table1[]="A:签到  B:添加  ";
uchar code table2[]="C:清空  D:上课  ";
uchar code table3[]=" *查询缺勤人员  ";
uchar code table4[]=" #查询迟到人员  ";
uchar code table5[]="请输入删去密码: ";

uchar code table6[]="    开始签到    ";
uchar code table7[]="  请按指纹签到  ";
uchar code table8[]="               ";
uchar code table9[]="按D:  开始上课  ";
uchar code table10[]="请输入密码:     ";
uchar code table11[]="    签到成功    ";
uchar code table12[]="请按任意按键继续";
uchar code table13[]="  编号为:      ";
uchar code table14[]="    请按手指    ";
uchar code table15[]="    请再按一次  ";
uchar code table16[]="  采集指纹成功  ";
uchar code table17[]="输入删去的指纹号";
uchar code table18[]="删去指纹库成功  ";
uchar code table19[]="删去指纹库失败  ";
uchar code table20[]="  请输入新密码  ";
uchar code table21[]="请再次输入新密码";
uchar code table22[]="  密码修改成功  ";
uchar code table23[]="  两次密码不一样";
uchar code table24[]="  输入密码错误  ";
uchar code table25[]="  还有  机会    ";
uchar code table26[]="  该指纹已存储  ";
uchar code table27[]="  采集指纹失败  ";
uchar code table28[]="确定删去指纹库?";
uchar code table29[]="按D:  本节课结束";
uchar code table30[]="当前缺勤      人";
uchar code table31[]="当前迟到      人";
uchar code digital[15]={0x90,0x92,0x94,0x96,0x88,0x8a,0x8c,0x8e,0x98,0x9a,0x9c,0x9e};
uchar  xdata table_qiandao[100];
uchar queqing=0;//缺勤人数
uchar zz;
uchar chidao=0;//迟到人数
uchar code     admin[6]={1,3,1,4,2,0};//管理员的固定密码
uchar code init_code[6]={0,0,0,0,0,0};//上电第一次一般的初始化密码

uchar   now_code[6]={0,0,0,0,0,0};//当前存储器中存储的密码
uchar        user[6]={0,0,0,0,0,0};//用户输入的密码
uchar       user2[6]={0,0,0,0,0,0};//输入第二次修改的密码
sbit relay=P3^7;//开锁继电器
sbit wake=P3^6;//检测手指按压,有手指按下就是高电平
uchar jishu=0;
uchar  err_user=3;//用户三次输入错误密码
uchar err_admin=3;//管理员三次输入错误密码
uchar num;//存储矩阵键盘转换的对应按键值
uchar number=0;//输入密码的个数默认0
uchar key_flag=0;//进入手动密码标志
uchar i;
uchar code_flag=0;//密码修改标志第一次输入密码时候是等于0再次输入是等于1
void init_dispay(void)//初始化界面
{
	  PutStr(0,0,table1);
    PutStr(1,0,table2);
		PutStr(2,0,table3);
		PutStr(3,0,table4); 
}
void admin_dispay(void)//管理员界面
{
	 PutStr(0,0,table6);	
   PutStr(1,0,table7);
   PutStr(2,0,table8);	
   PutStr(3,0,table9);				
}
void init_shuju(void)
{
	 uchar i;
	 for(i=0;i<100;i++)
	    {
				 table_qiandao[i]=0x00;
			}
}
void  que_renshu(void)
{  queqing=0;//缺勤人数
//	  WriteCommand(0x80+2);	
//			 WriteData(jishu/10+0x30);
//			 WriteData(jishu%10+0x30);
	 for(i=0;i<jishu;i++)
	    {
				 if(table_qiandao[i]==0x00)
				 { 
					  queqing++;
					  WriteCommand(digital[queqing-1]);
					  WriteData((i+1)/10+0x30);
			      WriteData((i+1)%10+0x30); 
					 
				 }
			}
}
void  chidao_renshu(void)
{  queqing=0;//缺勤人数
//	 WriteCommand(0x80+2);	
//	 WriteData(jishu/10+0x30);
//	 WriteData(jishu%10+0x30);
	 for(i=0;i<jishu;i++)
	    {
				 if(table_qiandao[i]>=2)
				 { 
					  queqing++;
					  WriteCommand(digital[queqing-1]);
					  WriteData((i+1)/10+0x30);
			      WriteData((i+1)%10+0x30); 
					 
				 }
			}
}
void key(void)
{    
	   num=keynum();
	   if((num==12)&&(key_flag==0))//查看缺勤人数
		 {
			 LcmClearTXT();//清屏
			 PutStr(0,0,table30);
			 que_renshu();
			 WriteCommand(0x80+6);	
			 WriteData(queqing/10+0x30);
			 WriteData(queqing%10+0x30); 
			 while((keynum()>=16));	
       init_dispay();	 	 
		 }
		 if((num==14)&&(key_flag==0))//查看迟到人数
		 {
			 LcmClearTXT();//清屏
			 PutStr(0,0,table31);
			 chidao_renshu();
       WriteCommand(0x80+6);	
			 WriteData(queqing/10+0x30);
			 WriteData(queqing%10+0x30);
       while((keynum()>=16));	
       	init_dispay();	 
		 }
		 if((num==11)&&(key_flag==0))//如果按下C按键进
		 {
			 key_flag=1;
			 //只显示“请输入密码开锁:“
			 LcmClearTXT();//清屏
			 PutStr(0,0,table28);
       PutStr(1,0,table5);		 
		 }
		 if((num==7)&&(key_flag==0))//如果按下B按键进入添加指纹
		 {
			
			  LcmClearTXT();//清屏
          PutStr(1,0,table14);	//显示请按指纹
					if(regist(0)==1)//如果第一次按手指成功
					 {
						   PutStr(1,0,table15);	//显示请再按一次
						   Delay(10);//延时一会
						   if(regist(1)==1)//两次采集手指成功
							 {
								   PutStr(1,0,table16);	//采集指纹成功
                   PutStr(2,0,table13);	//指纹编号:
								   WriteCommand(0x88+5);//指定第三行显示位置
									 WriteData(' ');
								   id=id+1;
									 WriteData(id/100+0x30);
									 WriteData(id%100/10+0x30);
									 WriteData(id%10+0x30);			
									 SectorErase(0x2200);
								   jishu=id%256;
                   byte_write(0x2200, id%256);
								 
							 }
							 else PutStr(1,0,table27);	//采集指纹失败 
					 }
					 else   if(regist(0)==2)//已经注册过指纹
									 {
											 PutStr(1,0,table26);	//指纹已经存储
									 }
					
					 PutStr(3,0,table12);	//请按任意键退出
					 while(keynum()>=16);	   
					 init_dispay();//管理员设置界面	
					 key_flag=0;
					 num=0xff;
		 }
		 if((num==3)&&(key_flag==0))//如果按下A按键管理员模式
		 {
			 key_flag=2;//进入输入管理员密码界面
			 //只显示“请输入密码:“
			 LcmClearTXT();//清屏
       PutStr(1,0,table10);		
		 }
		 if((key_flag==1)&&(num!=0xff))//非管理员模式下输入密码
		 {
			  num=coding(num);//转换成可以识别的
			  if((number<6)&&(num<10))
				{ 
					user[number]=num;//用户输入的密码进行记忆
					WriteCommand(0x88+number);		//指定第三行显示位置
					WriteData('*');
					//WriteData(num+0x30);//明码显示	
					number++;
				}
				if((num=='B')&&(number>0))//密码删除按键
						{  number--;
							WriteCommand(0x88+number);		//指定第三行显示位置
					    WriteData(' ');	
						}
				if(number==6)//按下D键确定按键并且输入六位密码之后
					{  
						   LcmClearTXT();//清屏
						   number=0;
							 key_flag=0;
						  //如果管理员密码正确,进入添加指纹,删除指纹,收到开锁,修改密码界面
							 if((user[0]==now_code[0])&&(user[1]==now_code[1])&&(user[2]==now_code[2])&&(user[3]==now_code[3])&&(user[4]==now_code[4])&&(user[5]==now_code[5]))
							 {   
								  if(cancel(0x63)==1)
											{
												 PutStr(0,0,table18);//输入删去的指纹号成功
												 SectorErase(0x2200);
                         byte_write(0x2200, 0x00);			
											}
											else
											{
												 PutStr(0,0,table19);//输入删去的指纹号失败
											}	
									 Delay(80);
						    }
							 else//密码错误
							   { 
									  PutStr(1,0,table24);//显示输入密码错误
									
									 
								 }
							 PutStr(3,0,table12);		
							 while((keynum()>=16)&&(err_user!=0));
							 init_dispay();//初始化界面	 
					}
			  
		 }
		 if((key_flag==2)&&(num!=0xff))//签到模式下输入数字按键
		 {
						num=coding(num);//转换成可以识别的
						if((number<6)&&(num<10))
						{ 
							user[number]=num;//用户输入的密码进行记忆
							WriteCommand(0x88+number);		//指定第三行显示位置
							WriteData('*');
					   // WriteData(num+0x30);	//明码显示
							number++;
						}
						if(number==6)//输入六位以后进行密码校验
						{  //如果管理员密码正确,进入添加指纹,删除指纹,收到开锁,修改密码界面
							 if((user[0]==admin[0])&&(user[1]==admin[1])&&(user[2]==admin[2])&&(user[3]==admin[3])&&(user[4]==admin[4])&&(user[5]==admin[5]))
							 {     
								     key_flag=55;
								     admin_dispay();//进入签到页面
                     err_admin=3;
						 				 num=0XFF;
                     init_shuju();							 
							 }
							 else//管理员密码错误
							     {   
										
											PutStr(1,0,table24);//显示输入密码错误
                      PutStr(3,0,table12);										 
											while((keynum()>=16)&&(err_admin!=0));
											init_dispay();//初始化界面
                      number=0;
                      key_flag=0;										 
									 }
			      }
						if((num=='B')&&(number>0))
						{  
							number--;
							WriteCommand(0x88+number);		//指定第三行显示位置
					    WriteData(' ');	
						}
						
			  
		 }
		 if(key_flag==55)//进入签到指纹巡查
		 {      num=coding(num);//转换成可以识别的
			      if(num=='D')//按下就进入开始上课
						{
							 key_flag=56;
							 PutStr(3,0,table29);
						}
			   	  if(wake==1)//如果有手指按下
						{
							if(check()==1)//进行指纹匹配
								 {   err_admin=3;
										 err_user=3;
										 LcmClearTXT();//清屏
										 PutStr(1,0,table11);
										 PutStr(2,0,table13);
										 WriteCommand(0x88+5);		//指定第三行显示位置
										 WriteData(' ');
									   zz=id%256;
									   table_qiandao[zz]=0x01;
									   id++;
										 WriteData(id/100+0x30);
										 WriteData(id%100/10+0x30);
										 WriteData(id%10+0x30);
                     
//	                   WriteData(table_qiandao[zz]%100/10+0x30);
//										 WriteData(table_qiandao[zz]%10+0x30);		 								 
										 relay=0;
										 Delay(80);
										 relay=1;
										 Delay(20);
										 PutStr(3,0,table12);		
										 number=0;
										 key_flag=55;
										 admin_dispay();//回到初始界面
										 num=0xff;
										 
								 }
						} 
		 }
		  if(key_flag==56)//迟到的
		 {      num=coding(num);//转换成可以识别的
			      if(num=='D')//按下就进入开始上课
						{
							 key_flag=0;
							 number=0;
							 init_dispay();
						}
			   	  if(wake==1)//如果有手指按下
						{
							if(check()==1)//进行指纹匹配
								 {  
										 LcmClearTXT();//清屏
										 PutStr(1,0,table11);
										 PutStr(2,0,table13);
										 WriteCommand(0x88+5);		//指定第三行显示位置
										 WriteData(' ');
									   zz=id%256;
									   table_qiandao[zz]=table_qiandao[zz]+0x02;
									   id++;
										 WriteData(id/100+0x30);
										 WriteData(id%100/10+0x30);
										 WriteData(id%10+0x30);	
									 
//									   WriteData(table_qiandao[zz]%100/10+0x30);
//										 WriteData(table_qiandao[zz]%10+0x30);		 
										 relay=0;
										 Delay(80);
										 relay=1;
										 Delay(20);
										 PutStr(3,0,table12);		
										 number=0;
										 key_flag=56;
										 admin_dispay();//回到初始界面
										 PutStr(3,0,table29);
										 num=0xff;
								 }
						} 
		 }
		 
}
void main()	
{  
	for(i=0;i<6;i++)//读取存储器中的密码
     {
			  now_code[i]=read_add(20+i);
	      Delay(5);
		 }	
	 for(i=0;i<6;i++)
		 {
			  if(now_code[i]>9)
				{
					 i=10;
					 break;
				}
		 }
	 if(i>9)//设置初始化密码
	 
	 {
		    for(i=0;i<6;i++)
				 {
						now_code[i]=init_code[i];
						Delay(5);
				 }	
	 }								
     			
   LcmInit();//初始化12864
	 
	 
	 
	 jishu=byte_read(0x2200);
//	 WriteCommand(0x88);	
//	 WriteData(jishu/10+0x30);
//	 WriteData(jishu%10+0x30); 
//   	Delay(30);
//   	Delay(50);
	 init_dispay();//进入初始化显示界面
   UART_Init();	//初始化串口9600
	 init_shuju();
	 while(1)
	 {  
		  key();

	 }
}




在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
全套资源下载地址:https://download.csdn.net/download/sheziqiong/86769799
全套资源下载地址:https://download.csdn.net/download/sheziqiong/86769799

相关文章:

  • 科研小白上路的必备工具链
  • HTML5七夕情人节表白代码 (动态3D相册) HTML+CSS+JS
  • 【云原生 | 从零开始学istio】一、Istio介绍—服务网格
  • 花咲の姫君(異時層ツキハ) / 花咲(异时层妖刀)
  • 体系结构实验(6)—— Cache映射策略
  • 牛客网专项练习30天Pytnon篇第16天
  • 【DS】6.堆知识总结!!!
  • kali工具熟悉——存活主机识别
  • 剖释C++内存管理底层细节 | 明晰池化技术中内存管理的原理
  • LVGL v8学习笔记 | 10 - Tabview控件的使用方法
  • 【漏洞复现-dedecms-文件上传】vulfocus/dedecms-cve_2019_8933
  • 罗克韦尔AB PLC安装Studio5000提示未安装Microsoft .NET Framework 3.5的解决方法
  • C++类和对象详解(下篇)
  • 李沐论文精读笔记( ResNet、Transformer、GAN、BERT)
  • 机器学习SVM算法原理
  • python3.6+scrapy+mysql 爬虫实战
  • 10个确保微服务与容器安全的最佳实践
  • express + mock 让前后台并行开发
  • github指令
  • jdbc就是这么简单
  • Python爬虫--- 1.3 BS4库的解析器
  • React组件设计模式(一)
  • Spring Boot MyBatis配置多种数据库
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 汉诺塔算法
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 我的业余项目总结
  • 小试R空间处理新库sf
  • 学习HTTP相关知识笔记
  • 白色的风信子
  • MyCAT水平分库
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • $(function(){})与(function($){....})(jQuery)的区别
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)逆序输出字符串
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (WSI分类)WSI分类文献小综述 2024
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (办公)springboot配置aop处理请求.
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (力扣)循环队列的实现与详解(C语言)
  • (推荐)叮当——中文语音对话机器人
  • (转)Oracle存储过程编写经验和优化措施
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • /proc/vmstat 详解
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [android] 练习PopupWindow实现对话框
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C#][DevPress]事件委托的使用
  • [C++]四种方式求解最大子序列求和问题
  • [Deep Learning] 神经网络基础
  • [DNS网络] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案